Fosdccf.blog.chinaunix.net
sdccf
全部博文(19283)
Linux酷软(214)
tmp(0)
PostgreSQL(93)
Solaris(383)
AIX(173)
SCOUNIX(575)
DB2(1005)
Shell(386)
C/C++(1187)
MySQL(1750)
Sybase(465)
Oracle(3695)
Informix(548)
HP-UX(0)
IBM AIX(2)
Sun Solaris(0)
BSD(1)
Linux(8597)
SCO UNIX(23)
2011年(1)
2009年(125)
2008年(19094)
2007年(63)
clifford
linky521
曾德标
fengzhan
leon_yu
mcuflowe
yt200902
guanyuji
GY123456
snow888
carlos94
丸喵喵
sean229
cxunix
可怜的猪
cqxc413
xzzgege
wb123456
分类: Oracle
2008-05-24 18:09:58
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;
以上代码起名为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的文档。
上一篇:Oracle密码文件的使用和维护
下一篇:Oracle中如何直接运行OS命令(上)
登录 注册