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