从 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.
我已经使用 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.