正在看的ORACLE教程是:Oracle如何直接运行OS命令(下)。 EXEC SQL WHENEVER SQLERROR CONTINUE; sqlglm(msg_buffer, &buffer_size, &msg_length); printf("Daemon error while connecting:n"); printf("%.sn", 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("%. sn", 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] = ' '; /如果是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] = ' '; 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: %dn", status); } } ELSE { printf ("Daemon error: invalid command '%s' received.n", command.arr); } } ELSE { printf("Daemon error while waiting for signal."); printf(" status = %dn", 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的文档。 < (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|