当前位置: 首页 > 图文教程 > 数据库 > Oracle > Oracle中如何直接运行OS命令(下)

Oracle
Excel VBA连接并操作Oracle
Oracle 外连接实现代码
oracle 存储过程和函数例子
Oracle 数据库操作类
ORACLE 分区表的设计
Oracle 用户权限管理方法
Oracle In和exists not in和not exists的比较分析
利用windows任务计划实现oracle的定期备份
ORACLE11g随RHEL5系统自动启动与关闭的设置方法
在oracle 数据库查询的select 查询字段中关联其他表的方法
plsql和tsql常用函数比对
plsql与tsql的语法不同
ASP.NET调用oracle存储过程实现快速分页
执行drop表操作后数据库无法起动
分析Oracle有时会用索引来查找数据的原因
数据从MySQL迁移到 Oracle的注意事项
快速理解Oracle归档模式的命令及参数
在Oracle里加快SQL执行的三种方法
几条常见的数据库分页 SQL 语句
Oracle9I OCP认证过程

Oracle中如何直接运行OS命令(下)


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-31   浏览: 113 ::
收藏到网摘: n/a

  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的文档。