国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > Oracle > 正文

在Oracle運行操作系統命令

2024-08-29 13:31:00
字體:
來源:轉載
供稿:網友
在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 isstatus number;result varchar2(20);command_code number;pipe_name varchar2(30);beginpipe_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 thenraise_application_error(-20010,'execute_system: error while sending. status = ' || status);end if;status := dbms_pipe.receive_message(pipe_name, timeout);if status <> 0 thenraise_application_error(-20011,'execute_system: error while receiving. status = ' || status);end if;/*獲取返回結果*/dbms_pipe.unpack_message(result);if result <> 'done' thenraise_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) isstatus number;begindbms_pipe.pack_message('stop');status := dbms_pipe.send_message('daemon', timeout);if status <> 0 thenraise_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;voidconnect_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);}voidsql_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 executebegin/*接收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 executebegindbms_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 executebegindbms_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 numbersql> execute :rv := daemon.execute_system('ls -la');pl/sql 過程已成功完成。sql> execute :rv := daemon.execute_system('dir');pl/sql 過程已成功完成。sql>dbms_pipe的用法見oracle的文檔.

商業源碼熱門下載www.html.org.cn

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 滨海县| 家居| 嵊泗县| 宝丰县| 柞水县| 古田县| 侯马市| 沁源县| 南投市| 平山县| 芮城县| 任丘市| 景宁| 玉田县| 囊谦县| 临西县| 万安县| 双牌县| 乐陵市| 沐川县| 马公市| 勃利县| 河源市| 临洮县| 丰台区| 集安市| 桂平市| 梁平县| 琼结县| 仁寿县| 平顺县| 岐山县| 福安市| 玉田县| 逊克县| 钟祥市| 武城县| 甘德县| 兰坪| 澄江县| 信宜市|