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

唐宗成

唐宗成

2016-01-29 14:53

Oracle中如何直接运行OS命令(下),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;

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com)

  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;
  } 

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com)

  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;

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

展开更多 50%)
分享

猜你喜欢

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

电脑网络
Oracle中如何直接运行OS命令(下)

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

编程语言 网络编程
Oracle如何直接运行OS命令(下)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

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

电脑网络
Oracle中如何直接运行OS命令(上)

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

编程语言 网络编程
Oracle如何直接运行OS命令(上)

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

如何实现禁止USB接口直接运行

电脑入门
如何实现禁止USB接口直接运行

IE中直接运行显示当前网页中的图片 推荐

Web开发
IE中直接运行显示当前网页中的图片 推荐

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

教你如何将MySQL数据库的密码恢复

教你如何将MySQL数据库的密码恢复

NT IIS下用ODBC连接数据库

NT IIS下用ODBC连接数据库
下拉加载更多内容 ↓