亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

在Oracle運行操作系統命令

2024-08-29 13:46:07
字體:
來源:轉載
供稿:網友

在Oracle運行操作系統命令 

作者:heyongzhou  

在Oracle 8i中,往往會出現要在存儲過程中運行操作系統命令的情況.一般來說,利用Oracle EnterPRise Manager設定作業時可以達到這個目的.但是由于OEM在設定作業缺乏靈活性,設定的作業的參數是固定的.在實際應用當中往往需要在SQL語句當中運行需要隨時運行操作系統命令.Oracle 8i沒有直接運行OS命令的語句,我們可以利用DBMS_PipE程序包實現這一要求. 

DBMS_PIPE通過創建管道,可以讓至少兩個進程進行通信.Oracle的管道與操作系統的管道在概念上有相同的地方,但是在實現機制不同. 
下面介紹實現具體步驟: 

1 創建一個程序包,姑且起名叫DAEMON,SQL語句如下: 

/*創建daemon程序包*/ 
CREATE OR REPLACE PACKAGE BODY daemon AS 
/*execute_system是實現運行os命令的函數*/ 
FUNCTION execute_system(command VARCHAR2, 
timeout NUMBER DEFAULT 10) 
RETURN NUMBER IS 

status NUMBER; 
result VARCHAR2(20); 
command_code NUMBER; 
pipe_name VARCHAR2(30); 
BEGIN 
pipe_name := DBMS_PIPE.UNIQUE_session_NAME; 
DBMS_PIPE.PACK_MESSAGE('SYSTEM'); 
DBMS_PIPE.PACK_MESSAGE(pipe_name); 
DBMS_PIPE.PACK_MESSAGE(command); 
/*向daemon管道發送表示命令的字符*/ 
status := DBMS_PIPE.SEND_MESSAGE('daemon', timeout); 
IF status <> 0 THEN 
RAISE_application_ERROR(-20010, 
'Execute_system: Error while sending. Status = '  status); 
END IF; 

status := DBMS_PIPE.RECEIVE_MESSAGE(pipe_name, timeout); 
IF status <> 0 THEN 
RAISE_APPLICATION_ERROR(-20011, 
'Execute_system: Error while receiving. 
Status = '  status); 
END IF; 
/*獲取返回結果*/ 
DBMS_PIPE.UNPACK_MESSAGE(result); 
IF result <> 'done' THEN 
RAISE_APPLICATION_ERROR(-20012, 
'Execute_system: Done not received.'); 
END IF; 

DBMS_PIPE.UNPACK_MESSAGE(command_code); 
DBMS_OUTPUT.PUT_LINE('System command executed. result = '  
command_code); 
RETURN command_code; 
END execute_system; 
/*stop是讓daemon停止*/ 
PROCEDURE stop(timeout NUMBER DEFAULT 10) IS 
status NUMBER; 
BEGIN 
DBMS_PIPE.PACK_MESSAGE('STOP'); 
status := DBMS_PIPE.SEND_MESSAGE('daemon', timeout); 
IF status <> 0 THEN 
RAISE_APPLICATION_ERROR(-20030, 
'stop: error while sending. status = '  status); 
END IF; 
END stop; 
END daemon; 


通過Sql*Plus運行以上語句,將為當前用戶創建daemon程序包. 

2 創建在OS上運行的守護進程,監聽由上面的daemon程序包發來的要求執行os命令的語句.以下Pro*C的代碼,必須由pro*c先進行預編譯. 

#include 
#include 

EXEC SQL INCLUDE SQLCA; 

EXEC SQL BEGIN DECLARE SECTION; 
char *uid = "scott/tiger";/*在這個地方改為你自己訪問的用戶,密碼,服務名*/ 
int status; 
VARCHAR command[20]; 
VARCHAR value[2000]; 
VARCHAR return_name[30]; 
EXEC SQL END DECLARE SECTION; 

void 
connect_error() 

char msg_buffer[512]; 
int msg_length; 
int buffer_size = 512; 

EXEC SQL WHENEVER SQLERROR CONTINUE; 
sqlglm(msg_buffer, &buffer_size, &msg_length); 
printf("Daemon error while connecting:/n"); 
printf("%.*s/n", msg_length, msg_buffer); 
printf("Daemon quitting./n"); 
exit(1); 


void 
sql_error() 

char msg_buffer[512]; 
int msg_length; 
int buffer_size = 512; 

EXEC SQL WHENEVER SQLERROR CONTINUE; 
sqlglm(msg_buffer, &buffer_size, &msg_length); 
printf("Daemon error while executing:/n"); 
printf("%.*s/n", msg_length, msg_buffer); 
printf("Daemon continuing./n"); 

main() 

EXEC SQL WHENEVER SQLERROR DO connect_error(); 
EXEC SQL CONNECT :uid; 
printf("Daemon connected./n"); 

EXEC SQL WHENEVER SQLERROR DO sql_error(); 
printf("Daemon waiting.../n"); 
while (1) { 
EXEC SQL EXECUTE 
BEGIN 
/*接收deamon發來的字符*/ 
:status := DBMS_PIPE.RECEIVE_MESSAGE('daemon'); 
IF :status = 0 THEN 
/*取出字符*/ 
DBMS_PIPE.UNPACK_MESSAGE(:command); 
END IF; 
END; 
END-EXEC; 
IF (status == 0) 

command.arr[command.len] = '/0'; 
/*假如是stop,該進程就退出*/ 
IF (!strcmp((char *) command.arr, "STOP")) 

printf("Daemon exiting./n"); 
break; 


ELSE IF (!strcmp((char *) command.arr, "SYSTEM")) 

EXEC SQL EXECUTE 
BEGIN 
DBMS_PIPE.UNPACK_MESSAGE(:return_name); 
DBMS_PIPE.UNPACK_MESSAGE(:value); 
END; 
END-EXEC; 
value.arr[value.len] = '/0'; 
printf("Will execute system command '%s'/n", value.arr); 
/*運行os命令*/ 
status = system(value.arr); 
EXEC SQL EXECUTE 
BEGIN 
DBMS_PIPE.PACK_MESSAGE('done'); 
DBMS_PIPE.PACK_MESSAGE(:status); 
:status := DBMS_PIPE.SEND_MESSAGE(:return_name); 
END; 
END-EXEC; 

IF (status) 

printf 
("Daemon error while responding to system command."); 
printf(" status: %d/n", status); 


ELSE 

printf 
("Daemon error: invalid command '%s' received./n", 
command.arr); 


ELSE 

printf("Daemon error while waiting for signal."); 
printf(" status = %d/n", status); 


EXEC SQL COMMIT WORK RELEASE; 
exit(0); 

以上代碼起名為daemon.pc,用proc預編譯: 

proc iname=daemon.pc userid=用戶名/密碼@服務名 sqlcheck=semantics 

得到daemon.c,在用c進行編譯,注重在NT上要把orasql8.lib加上,否則編譯通過,連接沒法通過. 


3 在服務器上運行daemon.exe 


4 在sqlplus運行測試語句: 
SQL> variable rv number 
SQL> execute :rv := DAEMON.EXECUTE_SYSTEM('ls -la'); 
PL/SQL 過程已成功完成。
 
SQL> execute :rv := DAEMON.EXECUTE_SYSTEM('dir'); 
PL/SQL 過程已成功完成。 
SQL> 

DBMS_PIPE的用法見oracle的文檔.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成网站色ww在线| 岛国av一区二区在线在线观看| 国产精品99久久99久久久二8| 午夜精品久久久久久久久久久久久| 欧美做爰性生交视频| 欧美性猛交xxxxx水多| 九九视频直播综合网| 成人两性免费视频| 国产一区二区在线播放| 亚洲日韩中文字幕| 久久久久国产一区二区三区| 亚洲天堂男人的天堂| 色一情一乱一区二区| 欧美一级视频在线观看| 欧美又大又粗又长| 欧美一级大片在线免费观看| 久久精品视频一| 成人www视频在线观看| 久久全国免费视频| 秋霞成人午夜鲁丝一区二区三区| 国产成人高潮免费观看精品| 欧美精品在线极品| 成年人精品视频| 国产成人啪精品视频免费网| 久久久久久久国产精品| 成人黄色av网站| 欧美激情一区二区三区高清视频| 欧美国产亚洲精品久久久8v| 国产91精品久久久久久| 久久亚洲精品一区| 2018中文字幕一区二区三区| 久久精品视频在线| 国产精品电影网| 国内精品中文字幕| 热久久99这里有精品| 中文字幕亚洲字幕| 国产69精品久久久久9| 亚洲人成电影网站色…| 精品国产乱码久久久久久婷婷| 奇米一区二区三区四区久久| 日韩中文字幕在线| 日韩欧美在线一区| 91亚洲国产精品| 亚洲一级免费视频| 国产精品mp4| 久久99精品久久久久久青青91| www.xxxx精品| 亚洲美女精品久久| 中文字幕自拍vr一区二区三区| 国产一区二区三区直播精品电影| 中文国产成人精品久久一| 欧美激情精品久久久久久变态| 成人免费视频a| 成人黄色大片在线免费观看| 欧美极品在线播放| 97成人精品区在线播放| 91日本在线观看| 日韩网站在线观看| 欧美高清视频免费观看| 97在线日本国产| 91在线视频导航| 中文字幕国产精品久久| 亚洲国产日韩欧美在线99| 久久精品91久久久久久再现| 91视频88av| 91亚洲国产精品| 4388成人网| 欧美性理论片在线观看片免费| 91嫩草在线视频| 国产精品自拍小视频| 4388成人网| 精品欧美一区二区三区| 成人免费视频网| 久久久视频免费观看| 亚洲男女自偷自拍图片另类| 亚洲男女自偷自拍图片另类| 日韩av免费观影| 九九九热精品免费视频观看网站| 国产99久久精品一区二区永久免费| 俺去亚洲欧洲欧美日韩| 日韩男女性生活视频| 一区二区成人精品| 亚洲成色999久久网站| 国产精品日日摸夜夜添夜夜av| 91免费精品视频| 日本电影亚洲天堂| 中文字幕成人在线| 欧美一区二区三区四区在线| 欧美午夜久久久| 一本色道久久综合狠狠躁篇的优点| 超碰精品一区二区三区乱码| 亚洲综合自拍一区| 亚洲激情视频网| 欧美精品videosex性欧美| 中文字幕日韩av| 亚洲一区美女视频在线观看免费| 久久乐国产精品| 一个人www欧美| 欧美成人合集magnet| 国产精品高清免费在线观看| 国精产品一区一区三区有限在线| 美女国内精品自产拍在线播放| 2021久久精品国产99国产精品| 亚洲人成77777在线观看网| 136fldh精品导航福利| 国产日产亚洲精品| 国产成人亚洲综合91| 国产精品日日做人人爱| 久久亚洲精品网站| 国外视频精品毛片| 一级做a爰片久久毛片美女图片| 色香阁99久久精品久久久| 色樱桃影院亚洲精品影院| 亚洲国产成人精品久久| 91网在线免费观看| 欧美成人三级视频网站| 日韩av一区在线| 国产精品亚发布| 亚洲激情视频在线播放| 欧美日韩一二三四五区| 成人免费福利视频| 日韩美女免费视频| 欧美亚洲在线播放| 亚洲精品电影在线观看| 51精品在线观看| 国产成人jvid在线播放| 国产精品免费视频xxxx| 久久成人这里只有精品| 精品国产一区二区三区在线观看| 欧美黑人狂野猛交老妇| 亚洲国产女人aaa毛片在线| 91av视频在线免费观看| 日韩在线观看av| 欧美在线观看日本一区| 亚洲色图欧美制服丝袜另类第一页| 国产精国产精品| 国产亚洲欧美一区| 欧美成人午夜免费视在线看片| 美女福利精品视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩美女免费观看| 国产精品久久久久影院日本| 91精品国产91久久久久| 精品久久久久久久中文字幕| 久久久久久久久久久国产| 亚洲欧美变态国产另类| 国产精品情侣自拍| 亚洲va国产va天堂va久久| 亚洲新声在线观看| 欧美电影在线观看网站| 久久久精品久久久久| 日韩成人黄色av| 久久久久久12| 久久99青青精品免费观看| 国产va免费精品高清在线观看| 日本高清不卡在线| 97超碰蝌蚪网人人做人人爽| 日韩高清电影免费观看完整版| 亚洲男人7777| 国产欧美日韩精品在线观看| 91精品国产亚洲| 亚洲精品中文字幕女同| 久久久999成人| 亚洲欧美激情视频|