从Oracle存储过程调用os_command.exec

时间:2016-12-22 20:56:43

标签: oracle plsql sql-loader

我使用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';

1 个答案:

答案 0 :(得分:3)

您的查询永远不会执行。 From the documentation

  

如果 dynamic_sql_statement 是SELECT语句,并且您省略了 into_clause bulk_collect_into_clause ,那么 execute_immediate_statement 永远不会执行

您的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;

顺便说一下,您可能需要考虑使用外部表而不是调用SQL * Loader。