免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4416 | 回复: 7
打印 上一主题 下一主题

求助oracle存储过程调用UNIX操作系统命令 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-25 15:10 |只看该作者 |倒序浏览
------------------------------windows下可以成功调用ipconfig等命令---------------------------------------------------------
CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "EvokeOsCmd" AS
import java.io.*;
import java.lang.*;
public class EvokeOsCmd extends Object{
  public static void main(String [] args){
    EvokeOsCmd oscmd = new EvokeOsCmd();
   oscmd.runOsCmd();

   }
   public void runOsCmd(){

      try {
        // Execute a command with an argument that contains a space
        //String[] commands = new String[]{"grep", "hello world", "/tmp/f.txt"};
        //commands = new String[]{"grep", "hello world", "c:\\Documents and Settings\\f.txt"};
          System.out.println("Starting run.sh");
        //String command = "cmd.exe /c dir";
          String command = "ipconfig";        //String command = "notepad";
        Process p = Runtime.getRuntime().exec(command);

              int bufSize=4096;
              BufferedInputStream bis=
                      new BufferedInputStream(p.getInputStream(),bufSize);
                      int len;
                      byte buffer[]=new byte[bufSize];
                      while((len=bis.read(buffer,0,bufSize))!=-1)
                                   System.out.write(buffer,0,len);

                      p.waitFor();
        System.out.println("Starting run.sh successfully complete");
              }catch (Exception e)
              {
           e.printStackTrace();
           }
  }


}
/
-----------------------------
CREATE OR REPLACE PROCEDURE RUN_OSCMD as language java
name 'EvokeOsCmd.main (java.lang.String[])';
/
-----------------------------
begin
  dbms_java.grant_permission(USER,'java.io.FilePermission','*','execute,write,read');
  --dbms_java.grant_permission(USER,'java.io.FilePermission','*','execute,write,read');
  dbms_java.grant_permission(USER,'java.lang.RuntimePermission','*','writeFileDescriptor');
end;
/
-----------------------------
set serveroutput on size 1000000
exec dbms_java.set_output(1000000);
-----------------------------
exec run_oscmd;
/

------------------------------------UNIX下通过存储过程调用操作系统命令不能成功--------------------------------------
create or replace and compile
java source named "EvokeOsCmd"
as
import java.io.*;
import java.lang.*;
public class EvokeOsCmd extends Object{
  public static void main(String [] args){
    EvokeOsCmd oscmd = new EvokeOsCmd();
   oscmd.runOsCmd();

   }
   public void runOsCmd(){

      try {
        
        //String[] commands = new String[]{"ls", "-l",">/oracle/f.txt"};
        //commands = new String[]{"grep", "hello world", "c:\\Documents and Settings\\f.txt"};

        System.out.println("Starting run.sh");
        String command = "ls -l >f.txt";
        Process p = Runtime.getRuntime().exec(command);

              int bufSize=4096;
              BufferedInputStream bis=
                      new BufferedInputStream(p.getInputStream(),bufSize);
                      int len;
                      byte buffer[]=new byte[bufSize];
                      while((len=bis.read(buffer,0,bufSize))!=-1)
                                   System.out.write(buffer,0,len);

                      p.waitFor();
        System.out.println("Starting run.sh successfully complete");
              }catch (Exception e)
              {
           e.printStackTrace();
           }
  }


}
/
------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE RUN_OSCMD as language java
name 'EvokeOsCmd.main (java.lang.String[])';
/
----------------------------------------------------------------------------------------------
set serveroutput on size 1000000
exec dbms_java.set_output(1000000);
----------------------------------------------------------------------------------------------
begin
  dbms_java.grant_permission(USER,'java.io.FilePermission','*','execute,write,read');
  --dbms_java.grant_permission(USER,'java.io.FilePermission','/oracle/try.sh','execute,write,read');
  --dbms_java.grant_permission(USER,'java.io.FilePermission','f.txt','execute,write,read');
  dbms_java.grant_permission(USER,'java.lang.RuntimePermission','*','writeFileDescriptor');
end;
/
----------------------------------------------------------------------------------------------
exec run_oscmd;
/

上面的两套脚本除了WINDOWS和UNIX操作系统命令不同之外,没有任何区别,为什么WINDOWS下可以执行成功,而UNIX下执行也提示存储过程执行成功,就是没什么动作发生,ls -l>f.txt 命令执行之后没有产生 f.txt文件,就象什么都没发生一样,请教各位高手,问题出在那里了。
如果我直接把那段JAVA程序摘录出来,编译并在UNIX命令行执行JAVA程序,就可以成功调用ls -l>f.txt 命令并把输出写到f.txt文件中,但是如果封装到oracle存储过程中,从数据库中执行存储过程就不行了,但是这种方式在WINDOWS下却是可以成功的,我现在怀疑是oracle数据库用户和UNIX操作系统用户之的用户认证之类的原因造成的,就是不清楚为什么?请高手指点

以上脚本都是在SQLPLUS中运行的,而且数据库跟操作系统在同一台UNIX机器上。

请大家帮忙分析分析或给个可以成功在UNIX中运行的例子(oracle存储过程调用UNIX操作系统命令)

论坛徽章:
0
2 [报告]
发表于 2006-09-25 15:38 |只看该作者
路径 与权限的原因

论坛徽章:
0
3 [报告]
发表于 2006-09-25 15:55 |只看该作者

说明白点啊

路径没有问题,
即使写成也不行,对于权限我就不清楚是怎么回事了,UNIX的操作系统权限到底和ORACLE的数据库用户权限怎么设置才能成功啊!!!
        String command = "ls -l >/oracle/f.txt";

begin
  dbms_java.grant_permission(USER,'java.io.FilePermission','*','execute,write,read');
  --dbms_java.grant_permission(USER,'java.io.FilePermission','/oracle/f.txt','execute,write,read');
  dbms_java.grant_permission(USER,'java.lang.RuntimePermission','*','writeFileDescriptor');
end;
/

论坛徽章:
0
4 [报告]
发表于 2006-09-25 16:19 |只看该作者
我试了一下, 把ls -l改成/bin/ls -l /home/oracle
执行时得到如下结果

  1. Starting run.sh
  2. /home/oracle:
  3. total 32
  4. -rw-r--r-- 1 oracle oinstall  384 2006-09-25 15:20 afiedt.buf
  5. -rw-r----- 1 oracle oinstall 3530 2006-08-09 14:45 control.sql
  6. drwxr-xr-x 6 oracle oinstall 4096 2005-07-03 01:09 database
  7. drwx--S--- 2 oracle oinstall 4096 2006-08-17 14:39 Desktop
  8. -rw-r--r-- 1 oracle oinstall   20 2006-09-21 17:19 inputfile
  9. -rw-r--r-- 1 oracle oinstall 2175 2006-09-25 15:30 ls.sql
  10. -rw-r--r-- 1 oracle oinstall  730 2006-08-16 13:26 sqlscreen
  11. -rw-r--r-- 1 oracle oinstall  469 2006-08-16 11:51 sqlscreen~
  12. Starting run.sh successfully complete
复制代码

但是/oracle下没有生成f.txt文件
这表明ls成功执行了, 但是没有写到/oracle/f.txt文件中.

论坛徽章:
0
5 [报告]
发表于 2006-09-25 16:27 |只看该作者
java我不太懂,不过在存储过程中调用系统命令,用host('command');就可以了

论坛徽章:
0
6 [报告]
发表于 2006-09-25 16:46 |只看该作者

回复 4楼 blue_stone 的帖子

如果把/bin/ls -l /home/oracle
写到一个try.sh文件中,把String command = "ls -l >/oracle/f.txt";
修改成String command = "try.sh";
这样回出现什么情况呢?
我的最终目的是要执行一个名叫run.sh的东西,这个里边写有如下的东西:
REPORTPATH=/bipilot2/ServerBatch
LIB=$REPORTPATH/lib
JAVA_HOME=/usr/java142
cd /bipilot2/batch
$JAVA_HOME/bin/java -Xmx1024m -Dcom.bis.install_path=/bipilot2/ServerBatch -Duser.language=zh -Dfile.encoding=GBK -Duser.country=CN -Xbootclasspath/a:$LIB/pja.jar -Dawt.toolkit=com.eteks.awt.PJAToolkit -Djava.awt.graphicsenv=com.eteks.java2d.PJAGraphicsEnvironment -Djava2d.font.usePlatformFont=false -Djava.awt.fonts=$JAVA_HOME/jre/lib/fonts -Dsun.java2d.fontpath=$JAVA_HOME/jre/lib/fonts -classpath "$LIB/patch_project.zip:$LIB/patchb_2006-08-07.jar:$LIB/rptengine.jar:$LIB/classes12.jar:$LIB/jgf.jar:$LIB/er.jar:$LIB/xml.zip:$LIB/servlet-api.jar:$LIB/antlr.jar:$LIB/tools.jar:$LIB/xmlparserv2.jar:" ParaTask $1

这种方式可行么?我尝试了一下,就好象什么都没有发生过一样,但是存储过程返回执行成功的提示。

[ 本帖最后由 blue_stone 于 2006-9-25 17:05 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2006-09-25 16:55 |只看该作者

回复 5楼 doni 的帖子

host 不行的,我要在存储过程中调用一个外部的跑批程序run.sh,数据库,跑批软件都在同一台UNIX机器上,host 只能在SQLPLUS类似的命令行调用操作系统命令,你想想,问题是不是又绕回来了,呵呵

论坛徽章:
0
8 [报告]
发表于 2006-09-25 20:06 |只看该作者
都来看看啊,有成功的例子发个上来
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP