热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle命令窗口exec,Oracle如何直接运行OS命令(下)

正在看的ORACLE教程是:Oracle如何直接运行OS命令(下)。EXECSQLWHENEVERSQLERRORCONTINUE;sqlglm(msg_buff

正在看的ORACLE教程是:Oracle如何直接运行OS命令(下)。  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的文档。

<



推荐阅读
author-avatar
风中冰雨
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有