SQL> HOST NET USER
SQL> ! LS -L -- Unix/Linux 別名
優點:無需額外對象、即時交互。缺點:僅 SQL*Plus 客戶端可用,不可在 PL/SQL / 排程任務中調用。
CREATE OR REPLACE LIBRARY exec_shell AS 'C:\WINDOWS\SYSTEM32\MSVCRT.DLL';
/
CREATE OR REPLACE PACKAGE oracmd IS
PROCEDURE exec(cmd VARCHAR2);
END;
/
CREATE OR REPLACE PACKAGE BODY oracmd IS
PROCEDURE exec(cmd VARCHAR2) IS EXTERNAL
NAME "system" LIBRARY exec_shell LANGUAGE C;
END;
/
-- 調用
EXEC oracmd.exec('DIR > C:\ORACLE.TXT');
實測失敗:ORA-28595: Extproc agent: DLL path invalid。需配置 listener.ora EXTPROC、tnsnames.ora、extproc.ora、權限、EXTPROC_DLLS=ONLY 等,維護成本極大,不推薦生產使用。
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "Util" AS
import java.io.*;
public class Util {
public static int runCmd(String cmd) {
try {
Process p = Runtime.getRuntime().exec(cmd);
BufferedInputStream in = new BufferedInputStream(p.getInputStream(), 4096);
byte[] buf = new byte[4096]; int len;
while ((len = in.read(buf)) != -1) System.out.write(buf, 0, len);
return p.waitFor();
} catch (Exception e) { e.printStackTrace(); return -1; }
}
};
/
CREATE OR REPLACE FUNCTION run_cmd(p_cmd VARCHAR2) RETURN NUMBER
AS LANGUAGE JAVA NAME 'Util.runCmd(java.lang.String) return int';
/
CREATE OR REPLACE PROCEDURE rc(p_cmd VARCHAR2) AS
x NUMBER;
BEGIN x := run_cmd(p_cmd); END;
/
GRANT JAVASYSPRIV TO ;
GRANT JAVAUSERPRIV TO ;
EXEC DBMS_JAVA.SET_OUTPUT(100000);
VARIABLE x NUMBER;
EXEC :x := run_cmd('IPCONFIG'); -- Windows
EXEC :x := run_cmd('LS -L'); -- Linux
優點:純 Java、跨平台、標準接口、可捕獲標準輸出。缺點:需 JVM、CREATE JAVA 權限、OS 層面命令需在白名單/容器內允許。
CREATE JAVA/CREATE LIBRARY 權限,僅 DBA 擁有。Runtime.exec(new String[]{cmd, arg1, arg2}))。