一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Oracle - Oracle如何直接運行OS命令

Oracle如何直接運行OS命令

2019-10-21 15:17Oracle教程網 Oracle

在Oracle 8i中,往往會出現要在存儲過程中運行操作系統命令的情況。一般來說,利用Oracle Enterprise Manager設定作業時可以達到這個目的。但是由于OEM在設定作業缺 乏靈活性,設定的作業的參數是

在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;

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的文檔。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲国产成人久久综合一 | 美女脱了内裤打开腿让人桶网站o | 欧美同性猛男野外gay免费 | 99精品国产高清一区二区三区香蕉 | 国产成人精品777 | 操大肥b| 日韩欧美成末人一区二区三区 | 久久福利影院 | 毛片免费的 | 亚洲精品综合一区二区 | a看片| 亚洲福利天堂网福利在线观看 | 欧美成人精品福利在线视频 | 国产欧美一区二区三区免费看 | 好男人在线观看hd中字 | 久久久久久久尹人综合网亚洲 | avtt在线 | 99久视频 | 韩国三级在线观看 完整版 韩国三级视频网站 | 暖暖在线日本 | 欧美性4khd720| 亚洲国产精品久久网午夜小说 | 日本不卡免费新一二三区 | 欧美最猛性xxxxx动态图 | 男人女人日皮视频 | 黑人巨大爆粗亚裔女人 | 俄罗斯一级毛片免费播放 | 欧美gay xxxx| 五月天婷婷精品免费视频 | 成人软件18免费 | 国产美女亚洲精品久久久综合91 | 秋霞啪啪网 | 国产欧美日韩视频在线观看一区二区 | 村妇超级乱淫伦小说全集 | 俄罗斯15一16处交 | 俺来操| videos欧美肥婆 | 无耻之徒第十一季在线观看 | 男人好大好硬好爽免费视频 | 国产在线精品亚洲第一区香蕉 | 四虎最新永久免费视频 |