How do Oracle run OS command of directly

  • 2020-05-09 19:31:19
  • OfStack

The ORACLE tutorial you are looking at is: how Oracle runs the OS command directly (below). EXEC SQL WHENEVER SQLERROR CONTINUE;
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;

IF (status)  

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.



Related articles: