oracle存储过程中调用一个shell脚本,用于进行一些操作,已经赋权限,但是执行不了 20
主程序:createorreplaceprocedurerun_ls_data_run_single_step(curOUTRefCursorPkg.tRefCursor...
主程序:
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没有执行,请问怎么办?哪儿出问题了?在线等!谢谢! 展开
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没有执行,请问怎么办?哪儿出问题了?在线等!谢谢! 展开
4个回答
展开全部
shell的环境变量问题,你在shell内部的变量是获取不到外部执行结果的。
追问
我不需要知道执行结果,我只需要调起shell,使得shell能执行就可以了。
那个反悔的结果只是个标识,没有意义的。
现在不指知道是环境变量的问题 还是权限的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
想想SQLPLUS下的执行是否成功。如果不成功,就一个一个的看,先看SH,如果没有问题再看过程,过程没有问题再看JAVA。
更多追问追答
追问
在pl/sql中程序肯定是没问题的,问题是执行不了shell,从而更新不了test.log文件。
追答
SH是手工执行成功不 了?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
试试把要更改的文件test.log附上权限 可能是你的sh脚本没有执行test.log的权限吧?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询