oracle的存储过程中调用shell

Gospelanswer 2014-11-22 10:32:21
先贴一下我自己的测试代码,之前在网上查的。但是始终测试不对。请哪位大神帮忙看看。注意是proc调shell。不是shell调proc!!测试机y有jre,但是没有jdk。不知道是不是这个的原因。之前有个包的实现,也做了测试。最后跑job的时候也报错。
1,先写一个java source
create or replace and compile java source named execshellcmd as
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Execshellcmd {
public static String callShell(String path) {
String message = "";

try {
Process process = Runtime.getRuntime().exec(path);
int waitFor = process.waitFor();

InputStream is = process.getErrorStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line = null;
while ((line = br.readLine()) != null) {
message += line;
}

message += " Process waitFor=" + waitFor;
int exitValue = process.exitValue();
message += " Process exitValue=" + exitValue;
} catch (Exception e) {
message = e.getMessage();
e.printStackTrace();
}

return message;
}

}
2,写一个函数去调用java source
create or replace function fun_callshell (p_command IN VARCHAR2) return varchar2
AS LANGUAGE JAVA
NAME'Execshellcmd.callShell (java.lang.String) return java.lang.String';
3,执行一个脚本,脚本内容就是创建一个文件 echo aaa>b.txt
select fun_callshell (‘home/oracle/b.sh’) from dual;
执行结果:
exec failed: /home/oracle/b.sh, Exec format error Process waitFor=255 Process exitValue=255


...全文
1470 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixiaoding11 2016-04-14
  • 打赏
  • 举报
回复
试试exec dbms_java.grant_permission( 'TEST', 'SYS:java.io.FilePermission','/test/*', 'read,write' );
dilemmapr 2014-12-10
  • 打赏
  • 举报
回复
shell里面再把环境变量export下
Gospelanswer 2014-11-26
  • 打赏
  • 举报
回复
引用 4 楼 wildwave 的回复:
系统命令能成功调用并看到结果了? 注意下路径和环境变量
java的环境变量测试过没有问题。单独用这个类在linux下调用shell也能成功,就是一移到数据库里就不行了。 路径是在根目录下建了个test文件夹,给了oracle的属组和777的权限。 实在想不通还有哪需要注意的了。。
小灰狼W 2014-11-25
  • 打赏
  • 举报
回复
系统命令能成功调用并看到结果了? 注意下路径和环境变量
Gospelanswer 2014-11-25
  • 打赏
  • 举报
回复
引用 2 楼 wildwave 的回复:
对java不熟悉。Oracle可以用java存储过程调用服务器中的shell脚本。原先测试过 要注意权限问题 ‘home/oracle/b.sh’ 这个路径有点奇怪
权限都给了777,现在调试的传linux下的命令是可以调用的了,比如ls,ifconfig等。但是自己写的脚本也能调用到。但是不会成功执行。很奇怪。。。单独执行脚本是没问题的。
小灰狼W 2014-11-25
  • 打赏
  • 举报
回复
对java不熟悉。Oracle可以用java存储过程调用服务器中的shell脚本。原先测试过 要注意权限问题 ‘home/oracle/b.sh’ 这个路径有点奇怪
Gospelanswer 2014-11-24
  • 打赏
  • 举报
回复
没有大神解答一下么
在java代码调用执行shell脚本,sqlldr导数与使用sqlplus在shell调用执行存储过程。 linux环境有2个dba的用户:oracle、erm 还有1个web用户:erm 在linux环境,这三个用户都可以直接在任意目录下执行该shell脚本,可是在java代码调用shell脚本时,报了如下4个错误: 1、sqlldr: command not found 2、sqlplus: command not found 3、0750: You may need to set ORACLE_HOME to your Oracle software directory 4、Message 2100 not found; No message file for product=RDBMS, facility=ULMessage 2100 not found; No message file for product=RDBMS, facility=UL$ 检查了dba用户和web用户下关于oracle的所有环境变量发现没有问题 (/home/oracle/.profile 与 /home/erm/.profile 环境变量文件为隐藏文件需使用 ls -a 命令查看) 在网上查了一遍以后有如下几种处理办法: 1、没有oracle_home目录的执行权限,无法进入到bin目录,使用chmod 755 $oracle_home更改目录权限;使用chmod 755 $oracle_home/lib更改目录权限;对目录$oracle_home/rdbms/mesg目录赋予相应权限;当需要给非oracle用户配置使用sqlldr时,不单需要配置环境变量,还需要把相关目录的访问权限赋予该用户。【采用此法测试以后还是出现上面的错误】 2、用sh直接执行shell和在java直接执行shell是有区别的,要在shell文件内增加oracle的环境变量即. /home/oracle/.bash_profile 这句话,否则在执行sqlldr会报如下异常: Message 2100 not found; No message file for product=RDBMS...... facility=UL 【采用此法测试以后继续报错,但是这个方法有引导作用,继续往下看】 因为我在linux环境下执行shell脚本时sqlldr命令和sqlplus命令是正常执行的,没有任何问题,但是在java代码调用脚本时却报错,所有排除了其他原因,只可能是环境变量的问题, 于是我把oracle的所有环境变量直接复制到shell脚本文件,在java调用了一下,然后所有问题迎刃而解! 具体代码参看文件内容

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧