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的文档。
版权声明:
原创作品,答应转载,转载时请务必以超链接体式格局标明文章 原始情由 、作者信息和本声明。否则将清查功令责任。
                    
                
                
            
        
浙公网安备 33010602011771号