主程序:
create or replace procedure run_ls_data_run_single_step(
cur OUT RefCursorPkg.tRefCursor --定义游标变量
) is
x clob;
v_command varchar2(5000); --要传入java执行的shell命令
begin
v_command:='sh /home/etl/ETL_Automation/ETL_PLUS/batch/qijie/batch.sh 111';
x := run_cmd_ls(to_char(v_command));
OPEN cur FOR
select 1 返回结果 from dual;
end run_ls_data_run_single_step;
执行shell程序:
create or replace function RUN_CMD_LS(p_cmd in varchar2) return varchar2
as
language java
name 'LSUtil.RunThis(java.lang.String) return java.lang.String';
create or replace and compile java source named lsutil as
import java.io.*;
public class LSUtil extends Object{
public static String RunThis(String args){
int rc = -1;
String command = " ";
StringBuffer bf = new StringBuffer();
try {
command=command+args;
Runtime rt = Runtime.getRuntime();
Process p = null;
p = rt.exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String msg = null;
while((msg = br.readLine())!=null){
bf.append(msg).append("\n");
}
br.close();
rc = p.waitFor();
if(rc==0){
return bf.toString();
}else{
return "error!";
}
} catch (InterruptedException e) {
e.printStackTrace();
rc = -1;
} finally{
return bf.toString();
}
}
}
batch.sh代码:
#!/bin/sh
echo $1>test.log;
exit;
问题是:我现在用rasetl用户登录linux系统,给batch.sh赋777权限,现在在pl/sql中用etl_user用户登录,执行 run_ls_data_run_single_step存储过程,无法对test.log进行更新,batch.sh没有执行,请问怎么办?哪儿出问题了?在线等!谢谢!
我不需要知道执行结果,我只需要调起shell,使得shell能执行就可以了。
那个反悔的结果只是个标识,没有意义的。
现在不指知道是环境变量的问题 还是权限的问题。
在pl/sql中程序肯定是没问题的,问题是执行不了shell,从而更新不了test.log文件。
追答SH是手工执行成功不 了?
追问shell手工只in个,当然可以的。手工都执行不了 ,还搞什么。
我要在存储过程中执行啊
存储过程在哪里跑的,数据库里。
SH的源码也存数据库里了。
如果数据库里没有源码还硬执行呀