我没做过,只是一个思路。但我试验过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; /
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>
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>
还有个方式就是利用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;
/
我通过别的class调用Test类 ,可以运行oracle还需要设置???
你好,已经能够通知外部程序启动,但是如何传递参数呢?请指教!
dingding
ding
ding
这个方案对于需要频繁调用外部程序的并不可取,因为连接是在存储过程中建立,存储过程执行完就断,utl_tcp的open_connection需要花较长的时间。
我已经用你说的方法实现了我要的,虽然open_connection需要较长时间,但是现在我必须这样用,即使用bzszp(SongZip) 的方法做外部程序,也是需要用socket通知另外的程序.所以这个问题不太重要.谢谢 bzszp(SongZip) 由于我要的功能很急,所以重新把程序写成java的话很费时间,而且我java也不太熟,但是谢谢你的帮助!