我记得copy是sqlplus命令,不能在存储过程里调用吧...

解决方案 »

  1.   

    我的意思是调用外部的可执行程序!不是用COPY命令,只是举个例子
      

  2.   

    哦,是这样啊...我感觉是行不通的,这跟以前老是有人想在存储过程里运行"exp/imp"或"sqlldr"一样,有人说过用java可以,我不懂java,不知道行不行.
      

  3.   

    看前面的帖子,有个帖子介绍如何在存储过程中执行EXP。原理就是用JAVA或PRO C编写程序,然后在数据库中建立外部过程。但这样做可能会因为外部程序执行过长时间或出错引起不必要的麻烦,还有个方式就是利用TCP实现数据库与外部程序通讯,让数据库服务器通知一个守护程序去执行程序。
      

  4.   

    我刚才尝试了一下,没有成功,谁java比较熟 看一下哪个地方设置的不好--创建一个简单的java程序
    import java.util.*;public class Test{

    public String getValue(){
    return "Test:abc";
    }
    }
    编译后将Test.class打包在d:\test.jar
    然后修改环境变量classpath加上d:\test.jar
    oracle中创建函数
    SQL> create or replace function f_test
      2  return VARCHAR2 as
      3  language java name 'Test.getValue() return java.lang.String';
      4  /函数已创建。已用时间:  00: 00: 00.72
    --调用的时候失败
    SQL> select f_test from dual;
    select f_test from dual
                       *
    ERROR 位于第 1 行:
    ORA-29540: 类Test不存在
    已用时间:  00: 00: 00.80
    SQL>
      

  5.   

    我刚才尝试了一下,没有成功,谁java比较熟 看一下哪个地方设置的不好--创建一个简单的java程序
    import java.util.*;public class Test{

    public String getValue(){
    return "Test:abc";
    }
    }
    编译后将Test.class打包在d:\test.jar
    然后修改环境变量classpath加上d:\test.jar
    oracle中创建函数
    SQL> create or replace function f_test
      2  return VARCHAR2 as
      3  language java name 'Test.getValue() return java.lang.String';
      4  /函数已创建。已用时间:  00: 00: 00.72
    --调用的时候失败
    SQL> select f_test from dual;
    select f_test from dual
                       *
    ERROR 位于第 1 行:
    ORA-29540: 类Test不存在
    已用时间:  00: 00: 00.80
    SQL>
      

  6.   

    bobfang(匆匆过客)  大兄
    还有个方式就是利用TCP实现数据库与外部程序通讯,让数据库服务器通知一个守护程序去执行程序。告诉我怎么实现的?能详细讲解下吗?
      

  7.   

    我没做过,只是一个思路。但我试验过oracle的TCP包,能用,连接过程需要一些时间。
    set serveroutput on size 100000
    DECLARE
          c  utl_tcp.connection;  -- TCP/IP connection to the Web server
          i number;
          j number;
    BEGIN
      c := utl_tcp.open_connection('10.18.1.11', 51000);  -- open connection
      begin
        loop
          i := utl_tcp.available(c);
          exit when i<=0;
          dbms_output.put_line('READ='||To_Char(i));
    --          while i>0 loop
            dbms_output.put(utl_tcp.get_text(c,i));  -- read result
    --            i :=i-1;
    --          end loop;
        end loop;
      exception
        when others then null;
      end;
      dbms_output.put_line('');  i := utl_tcp.write_line(c, 'HELLO WORLD');           
      dbms_output.put_line('WRITE='||To_Char(i));  begin
        j := 0;
        loop
          i := utl_tcp.available(c);
          if (i=0) then
            j := j+1;
            if (j>=50) then 
              exit;
            else
              for i in 0..1000 loop
                 null;
              end loop;
            end if;
          else
            dbms_output.put_line('READ='||To_Char(i));
            dbms_output.put(utl_tcp.get_text(c,i));  -- read result
          end if;
        end loop;
      exception
        when others then null;
      end;
      dbms_output.put_line('');  utl_tcp.close_connection(c);
    end;
    /
      

  8.   

    刚才测了一下,classpath的设置应该没有什么问题。
    我通过别的class调用Test类 ,可以运行oracle还需要设置???
      

  9.   

    我印象中oracle是需要用个工具将JAVA类导入到数据库中。
      

  10.   

    只能调用java程序吗?不能调用其他(如.NET)程序?我以前用sql server的,可以用XP_CMDSHELL调用外部程序,ORACLE知道的很少,不太懂!
      

  11.   

    bobfang(匆匆过客) 可以详细讲解下你写的吗?我不懂哦!:(
      

  12.   

    bobfang(匆匆过客)
    你好,已经能够通知外部程序启动,但是如何传递参数呢?请指教!
      

  13.   

    ding ding
    dingding
    ding
    ding
      

  14.   

    你是说在这里发送吗?utl_tcp.write_line(c, 'HELLO WORLD');
      

  15.   

    就是这个意思。存储过程给守护程序发包,守护程序根据包的内容决定做什么。
    这个方案对于需要频繁调用外部程序的并不可取,因为连接是在存储过程中建立,存储过程执行完就断,utl_tcp的open_connection需要花较长的时间。
      

  16.   

    谢谢 bobfang(匆匆过客) 
    我已经用你说的方法实现了我要的,虽然open_connection需要较长时间,但是现在我必须这样用,即使用bzszp(SongZip) 的方法做外部程序,也是需要用socket通知另外的程序.所以这个问题不太重要.谢谢 bzszp(SongZip) 由于我要的功能很急,所以重新把程序写成java的话很费时间,而且我java也不太熟,但是谢谢你的帮助!