How do Oracle run OS command of directly
- 2020-05-09 19:31:19
- OfStack
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 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
/* receive characters from deamon */
:status := DBMS_PIPE. RECEIVE_MESSAGE ('daemon');
IF :status = 0 THEN
/* extract character */
DBMS_PIPE. UNPACK_MESSAGE (:command);
END IF;
END;
END - EXEC;
IF (status == 0)
{
command. arr [command len] = '\ 0';
If it is stop, the process exits */
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);
/* run os command */
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;
{
printf
("Daemon error while responding to system command.");
printf (" status: %d\n", status);
}
}
ELSE
{
printf
("Daemon error: invalid '%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);
}
The above code is called daemon.pc and is precompiled with proc:
proc iname= daemon. pc userid= username/password @ service name sqlcheck=semantics
daemon.c, compile with c, please add orasql8.lib to NT, otherwise the compilation will pass and the connection will not pass.
3. Run daemon on the server.exe
4. Run the test statement in sqlplus:
SQL
>
variable rv number
SQL
>
execute :rv := DAEMON. EXECUTE_SYSTEM (' ls-la ');
The PL/SQL process was successfully completed.
SQL
>
execute :rv := DAEMON.EXECUTE_SYSTEM ('dir');
The PL/SQL process was successfully completed.
SQL
>
The usage of DBMS_PIPE is documented in oracle.