Oracleからのシェルの呼び出しの記事を読んだ後
この問題の解決策を共有することにしました。 Javaは問題の解決に使用されるため、このソリューションはOracle XEでは機能しません。
しかし、このソリューションはクロスプラットフォームです-私が遭遇したすべてのOSで動作します。
また、DBMS_OUTPUTで外部コマンドの結果を確認できます。
実装に進みましょう。
ステップ1:それに基づいてJavaソースを作成します。
import java.lang。*;
import java.io. *;
import java.sql.SQLException;
パブリッククラスHost {
public static void executeCommand(文字列コマンド)はSQLException、IOExceptionをスローします
{
#sql {
始める
DBMS_JAVA.set_output(10000000);
終わり;
};
文字列uFullCommand = ""; 文字列nameOS = System.getProperty( "os.name");
if((nameOS.toLowerCase())。indexOf( "lin")!= -1)
{
uFullCommand = "/ bin / sh" + "-c" + command;
}
else if((nameOS.toLowerCase())。indexOf( "win")!= -1)
{
uFullCommand = "%systemroot%\\ system32 \\ cmd.exe" + "/ y" + "/ c" +コマンド。
}
else if((nameOS.toLowerCase())。indexOf( "nix")!= -1)
{
uFullCommand =コマンド;
}
他に
{
uFullCommand =コマンド;
}
ランタイムrt = Runtime.getRuntime();
プロセスp = rt.exec(uFullCommand);
BufferedReader in = new BufferedReader(新しいInputStreamReader(p.getInputStream()));
文字列line = null;
while((line = in.readLine())!= null)
{
System.out.println(行);
}
}
};
ステップ2:PL / SQLでラップします。
作成または置換
PROCEDURE host_command_proc(p_command IN VARCHAR2)AS
言語JAVA
NAME 'Host.executeCommand(java.lang.String)';
/
呼び出し例:
始める
host_command_proc( "ls / tmp");
終わり;
そして、はい、このソリューションのアイデアはTom Kiteから借りたものです。