• 网络学院
  • IT资讯
  • 操作系统
  • 网络技术
  • 软件应用
  • 办公软件
  • 编程技术
  • 网站架设
  • 数据库类
  • 平面设计
  • 多媒体类
  • 游戏资讯
  • 教学论文
  • 认证考试
在Oracle运行操作系统命令
  站点:
  • 首 页
  • 最新软件
  • 文章教程
  • 国内软件
  • 国外软件
  • 绿色软件
  • 源码下载
  • 字体下载
在Oracle运行操作系统命令
软件发布 在Oracle运行操作系统命令
网络软件 系统工具 应用软件 联络聊天 图形图像 多媒体类 行业软件 游戏娱乐 编程开发 安全相关 教育教学 数码软件 绿软下载
热门软件: QQ 瑞星 pplive e话通 木马克星 千千静听 office2000 五笔字根 Photoshop 视频分割
返回文章教程首页 >> 认证考试 >> Oracle认证 >> Oracle指导 >> 在Oracle运行操作系统命令

在Oracle运行操作系统命令

添加时间: 2008-4-19 22:23:35  作者: Oracle指导  阅读次数:71   来源: http://www.d9soft.com

       

       在Oracle 8i中,往往会出现要在存储过程中运行操作系统命令的情况.一般来说,利用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: ");
printf("%.*s ", msg_length, msg_buffer);
printf("Daemon quitting. ");
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: ");
printf("%.*s ", msg_length, msg_buffer);
printf("Daemon continuing. ");
}
main()
{
EXEC SQL WHENEVER SQLERROR DO connect_error();
EXEC SQL CONNECT :uid;
printf("Daemon connected. ");

EXEC SQL WHENEVER SQLERROR DO sql_error();
printf("Daemon waiting... ");
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. ");
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' ", 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 ", status);
}
}
ELSE
{
printf
("Daemon error: invalid command '%s' received. ",
command.arr);
}
}
ELSE
{
printf("Daemon error while waiting for signal.");
printf(" status = %d ", 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的文档.

 

上下文章:

 

上一篇文章: ASP连接11种数据库语法总结 下一篇文章: ORACLE认证基础:ORACLE系统概述(4)

相关文章:

  • Windows操作系统的发展简史
  • 看Office 14运行在浏览器中
  • 将Windows操作系统无毒进行到底
  • 如何手动创建oracle数据库
  • oracle 多元化控制文件

相关软件:

  • Eclipse开发平台运行工具 1.0 简体绿色版
  • AV98 命令行共享版 V0.9.1719
  • CJC自动运行监察机 v1.22 简体中文绿色版
  • Windows 开始运行命令 简体中文绿色版
  • AutoCAD命令助手 V1.1
  • Ecora Enterprise Auditor for Oracle-破解补丁 Cracked v3_6_5185

 

快速导航

  • 网络学院
  • 精品汇聚
  • 字体下载
  • 教程下载
  • ASP源码
  • PHP源码
  • Net源码
  • JSP 源码

Oracle认证分类导航

  • Oracle动态
  • Oracle指导
  • Oracle题库

本类经典文章推荐

  • Oracle中关于逻辑备份与恢复
  • Oracle开发人员JAVA存储过程
  • 为数据库的表自动生成行号
  • Oracle中的OOP概念
  • 用java从oracle取数
  • 冷备份移植到另一台Solaris机器上
  • 如何将excel数据导入oracle中
  • Oracle10.2g安装记录
  • 数据库监控工具ForOraclev1.2
  • oracle双机群集系统

Oracle指导阅读排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle常用的OCI函数上
  • 案例学习Oracle错误:ORA-00060
  • 案例学习Oracle错误:ORA-00604
  • Tomcat+SQLServer连接池配置
  • 如何将excel数据导入oracle中
  • Oracle企业管理器(OEM 2.1)使用...
  • ORACLE数据库简介
  • 案例学习Oracle错误:ORA-00904

Oracle认证阅读总排行

  • Oracle系统表查询
  • 实例:Oracle导出EXCEL文件
  • Oracle常用的OCI函数上
  • 在ORACLE的存储过程中如何做简单的...
  • 案例学习Oracle错误:ORA-00060
  • 案例学习Oracle错误:ORA-00604
  • Tomcat+SQLServer连接池配置
  • 如何将excel数据导入oracle中
  • Oracle企业管理器(OEM 2.1)使用...
  • AIX下自动启动Oracle数据库与监听...

广告位置

字母检索 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 回到顶部

关于我们 | 版权声明 | 免责条款 | 广告联系 | 软件发布 | 下载帮助 | 下载排行 | 网站地图 | 特别鸣谢 | 友情连接

copyright; 2005-2008 D9soft.com 第九软件网 版权所有