在Oracle 9i中,往往会出现要在存储过程中运行操作系统命令的情况.一般来说,利用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[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>

DBMS_PIPE的用法见oracle的文档.

小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

oracle在哪些系统运行,Oracle运行操作系统命令相关推荐

  1. c 获取当前时间插入oracle数据库,Oracle如何获取系统当前时间等操作实例,c++获取系统时间...

    Oracle如何获取系统当前时间等操作实例,c++获取系统时间 获取系统当前时间 date类型的 select sysdate from dual; char类型的 select to_char(sy ...

  2. oracle查看服务器的时间,Oracle如何获取系统当前时间等操作实例

    获取系统当前时间 date类型的 ? char类型的 ? 日期操作 ? 常用的时间戳 ? trunc()函数 trunc函数处理数字 该函数不对指定小数前或后的部分做相应舍入选择处理,而统统截去. 其 ...

  3. oracle spool文件名+系统时间,Oracle Spool详解

    转自:http://blog.sina.com.cn/s/blog_6bccf0360101hzsh.html 1.spool的作用是什么? spool的作用可以用一句话来描述:在sqlplus中用来 ...

  4. oracle怎么装系统,【Oracle安装与操作系统用户组】

    Oracle软件在安装维护过程中长要和操作用户组(OS user group)打交道,从早前的只有oracle用户和dba组发展到今天11gr2中的grid用户和asm组,Oracle管理的日新月异可 ...

  5. oracle 查询 非系统表,Oracle冷备----删除非系统表空间

    1.备份文件 define fil=/home/Oracle/cdbk.sql define log=/home/oracle/cdbk.log spool &fil prompt conne ...

  6. linux快速还原oracle,linux系统还原oracle数据库

    linux系统还原oracle数据库 linux系统还原oracle数据库 作为一名测试人员,搜索相关操作,大多数都是先来一大篇理论知识,奈于时间考虑,希望直接上手操作,废话不多说,直接上操作, 前提 ...

  7. linux下的oracle中文乱码,linux系统中oracle出现中文乱码怎么办

    linux系统中oracle出现中文乱码怎么办 发布时间:2020-06-10 10:04:55 来源:亿速云 阅读:148 作者:Leah linux系统中oracle出现中文乱码怎么办?这篇文章总 ...

  8. oracle linux 版本 uek,在运行 Oracle Linux 7.1 UEK3 或 7.2 或者 RHEL 7.1 或 7.2 的系统上,RDMA 服务无法启动...

    在运行 Oracle Linux 7.1 UEK3 或 7.2 或者 RHEL 7.1 或 7.2 的系统上,RDMA 服务无法启动 错误号 20912503 问题: 在运行 Oracle Linux ...

  9. winxp运行html代码,关于WinXP系统实现自动化运行的操作技巧

    关于WinXP系统实现自动化运行的操作技巧 发布时间:2014-06-16 10:00:29   作者:佚名   我要评论 与其他系统相比,WinXP系统的自动化运行已经大大改进,根据经验为大家总结了 ...

最新文章

  1. 推荐系统中基于深度学习的混合协同过滤模型
  2. 畅销榜第7,《魔神英雄传:神龙斗士》制作人复盘研发历程
  3. OptaPlanner - 把example运行起来(运行并浅析Cloud balancing)
  4. MedMNIST:上海交大发布医学影像领域的MNIST(附下载)
  5. Hbase常用数据库操作类
  6. LabelSmoothing标签平滑
  7. Thread调用SaveFileDialog
  8. Java模拟http上传文件请求(HttpURLConnection,HttpClient4.4,RestTemplate)
  9. 西点军校的经典法则[转]
  10. C语言以科学计数法的格式打印
  11. IPD解读——华为的研发管理成功之路
  12. Pollard Rho 质因数分解
  13. 欧姆龙485通讯示例程序_PLC程序结构设计和技巧
  14. mysql数据库拒绝访问的解决过程_记一次MySQL数据库拒绝访问的解决过程
  15. 插座测试仪的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. java找不到或无法加载主类
  17. 找到出问题的地方了啊
  18. 小技巧:systeminfo查看系统信息
  19. Hive 查看和修改 tez 容器的资源
  20. 有一天,如果你和计算机一样思考问题,真是太太太太有趣了

热门文章

  1. 职场写作(二)常见职场写作场景——周报
  2. 如何让简历中的“岗位业绩”打动HR?
  3. Android百度地图显示附近的位置
  4. 百度地图展示附近1公里范围内的目标
  5. web4——bugku
  6. 为什么你的工作总是没能做好呢?
  7. 常用screen命令
  8. Android 网络编程(二) HTTP协议解析
  9. 处理 echarts 数据过多时的展示问题
  10. 混合式步进电机本体建模