zoukankan      html  css  js  c++  java
  • Oracle中若何间接运转OS敕令(下)

      泉源:网海拾贝 





      EXEC SQL WHENEVER SQLERROR CONTINUE;
      sqlglm(msg_buffer, &buffer_size, &msg_length);
      printf("Daemon error while connecting:n");
      printf("%.*sn", 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("%.*sn", 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] = '';
      /*要是是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] = '';
      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: %dn", status);
      } 
      } 
      ELSE 
      { 
      printf 
      ("Daemon error: invalid command '%s' received.n",  command.arr);
      } 
      } 
      ELSE 
      { 
      printf("Daemon error while waiting for signal.");
      printf(" status = %dn", 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的文档。





    版权声明: 原创作品,答应转载,转载时请务必以超链接体式格局标明文章 原始情由 、作者信息和本声明。否则将清查功令责任。

  • 相关阅读:
    实现FTP断点续传
    系统软件自动部署实现方案
    QT实现多语言切换
    QTreeWidget实现动态加载本地文件系统
    QuaZip实现多文件打包
    FileZilla命令行实现文件上传以及CreateProcess实现静默调用
    ctkPlugin插件系统实现项目插件式开发
    Windows与Linux下文件操作监控的实现
    QT皮肤系统的动态切换
    OpenGL 学习
  • 原文地址:https://www.cnblogs.com/zgqjymx/p/1975888.html
Copyright © 2011-2022 走看看