Oracle如何直接运行OS命令(下)第1/2页
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;