oracle存储过程中调用一个shell脚本,用于进行一些操作,已经赋权限,但是执行不了

主程序:
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没有执行,请问怎么办?哪儿出问题了?在线等!谢谢!

第1个回答  2013-04-25
shell的环境变量问题,你在shell内部的变量是获取不到外部执行结果的。追问

我不需要知道执行结果,我只需要调起shell,使得shell能执行就可以了。
那个反悔的结果只是个标识,没有意义的。
现在不指知道是环境变量的问题 还是权限的问题。

第2个回答  2013-04-25
想想SQLPLUS下的执行是否成功。如果不成功,就一个一个的看,先看SH,如果没有问题再看过程,过程没有问题再看JAVA。追问

在pl/sql中程序肯定是没问题的,问题是执行不了shell,从而更新不了test.log文件。

追答

SH是手工执行成功不 了?

追问

shell手工只in个,当然可以的。手工都执行不了 ,还搞什么。
我要在存储过程中执行啊

追答

存储过程在哪里跑的,数据库里。
SH的源码也存数据库里了。
如果数据库里没有源码还硬执行呀

第3个回答  2013-04-25
试试把要更改的文件test.log附上权限 可能是你的sh脚本没有执行test.log的权限吧?
第4个回答  2014-07-31
请问你的问题解决了吗

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网