oracle在哪些系统运行,如何在Oracle运行操作系统命令?

本文介绍了如何通过Oracle SQL创建一个名为DAEMON的程序包,包括execute_system函数用于执行操作系统命令,并结合Pro*C代码实现守护进程,详细讲解了在服务器上运行守护进程和在SQL*Plus中测试的方法。
摘要由CSDN通过智能技术生成

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>。

全部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值