动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.Linux平台数据库大比拚(1).
.教你如何用OMS实现Oracle中数据备.
.从Oracle的FORM中调用REPORT的实.
.9i新特性之四缩小非计划当机时间.
.Oracle Database 10 g : 为 DBA .
.图文:详解数据库Oracle 11g的基.
.利用Oracle的Job Queue实现定时操.
.理解NULL是如何影响IN和EXITS语句.
.32bit oracle 扩展SGA原理.
.用Rsync备份Dreamhost 到Windows.
.ORACLE 服务器的配置及优化.
.不编译完全配置RedHat Linux7.1.
.OMF方式手动创建数据库.
.用Forms编写的数字时钟.
.为你的灾难恢复计划做合适的设备.
.一个小技巧:工资超过5000元的员.
.针对Oracle数据库及其应用程序的.
.关系型数据库:实现正规化.
.Oracle 10G 最佳20位新特性:RMAN.
.Oracle数据库SQLPLUS中几个常用s.

在oracle中运行OS命令

发表日期:2008-2-9 |



  在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:\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);
  }
上一篇:Oracle8i 概述 人气:480
下一篇:Oracle数据库的灾难恢复 人气:468
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-6 Movie34电影搜索引擎 v3.0
2008-9-6 wap2.0仿帝国建站喜用 v2.0
2008-9-6 免费人才招聘网 宽屏版 v3.01
2008-9-6 喜喔喔视频采集程序 v1.0 beta
2008-9-6 ASP客户管理系统
2008-9-6 主流驿站中秋祝福程序
2008-9-6 php实现msn协议的类
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵