从 Oracle 存储过程调用 os_command.exec

Calling os_command.exec from an Oracle stored procedure

我已经使用 os_command.exec 向 Linux shell 发送命令。我正在使用 Oracle 12c。

这是一个运行良好的示例代码:

select os_command.exec('/home/smucha/app/smucha/product/12.1.0/dbhome_1/bin/sqlldr userid=system/password control=/home/smucha/load_data.cmt')
from dual

我想运行在存储过程中执行类似的命令。有什么办法吗?

我已经尝试了以下方法,但它不起作用。我的程序 运行 没有错误,但没有加载任何记录。

execute immediate 'select os_command.exec(''/home/smucha/app/smucha/product/12.1.0/dbhome_1/bin/sqlldr userid=system/acorp56k control=/home/smucha/IZ/load_data.cmt'') from dual';

您的查询从未执行过。 From the documentation:

If dynamic_sql_statement is a SELECT statement, and you omit both into_clause and bulk_collect_into_clause, then execute_immediate_statement never executes.

您的 execute immdiate 没有 into 子句,因此基本上被忽略了。

虽然你不需要查询,你可以直接调用函数:

procedure foo is
  result pls_integer; -- or whatever type your function actually returns
begin
  result := os_command.exec('/home/smucha/app/smucha/product/12.1.0/dbhome_1/bin/sqlldr userid=system/password control=/home/smucha/load_data.cmt');
  -- do something with the result?
end foo;

顺便说一句,您可能需要考虑使用外部 table 而不是调用 SQL*Loader.