我要投稿
  • 您当前的位置:365bet官方 -> 技术教程 -> 数据库教程 -> ORACLE教程 -> 教程内容
  • [ 收藏本页教程 ]
  • Oracle中如何直接运行OS命令(下)ORACLE教程

    教程作者:佚名    教程来源:不详   教程栏目:ORACLE教程    收藏本页
      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;

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


    我要投稿   -   广告合作   -   关于本站   -   友情连接   -   网站地图   -   联系我们   -   版权声明   -   设为首页   -   加入收藏   -   网站留言
    Copyright © 2009 - 20012 www.www.ct131.com All Rights Reserved.365bet官方 版权所有