我在"如何在oracle里使用java存储过程连接db2"这篇文章里已经提到过如何在oracle里用java存储过程连db2 v9 for z/OS,并且我在里面举了用java存储过程在db2 v9 for z/OS上执行一条sql的例子,这篇文章其实就是上述文章的延续,在这篇文章里,我们完整的做了一个调用db2 v9 for z/OS上存储过程的例子。
我们的目的是要调用存储过程XBAIPA.CAAUD,这个存储过程有一个输入参数和一个输出参数,其中输入参数是一个字符串,输出参数也是一个字符串。
注意这里安装完transparent gateway后虽然能连上db2 v9 for z/OS,但是不能执行其中的存储过程,如下所示:
SQL> select deptname from DSN8910.DEPT@PLHI3 where deptno='A00';
DEPTNAME
------------------------------------------------------------------------
SPIFFY COMPUTER SERVICE DIV.
SQL> var temp varchar2(32767);
SQL> set serveroutput on size 1000000;
SQL> begin
2 XBAIPA.CAAUD@PLHI3('A 9999992581970687034 NBEUR 1232542102008120220091222 LEENEN/WERNER MR 5BJ9B9/
3 end;
4 /
begin
XBAIPA.CAAUD@PLHI3('A 9999992581970687034 NBEUR 1232542102008120220091222 LEENEN/WERNER MR 5BJ9B9/
end;
ORA-06550: line 2, column 1:
PLS-00201: identifier 'XBAIPA.CAAUD@PLHI3' must be declared
ORA-06550: line 2, column 1:
PL/SQL: Statement ignored
temp
---------
为什么不能执行上述存储过程的原因我已经在上述文章里说过了。
现在我们来看怎样才能成功调用上述存储过程:
在把JDBC for db2的驱动加载到oracle里后首先创建所需的java存储过程:
SQL> create or replace and compile java source named call_db2 as
2 import java.sql.*;
3 import oracle.jdbc.*;
4 import java.io.*;
5 import java.lang.*;
6
7 public class call_db2
8 {
9 public static String call_db2_procedure_type_1(String ProcedureName, String InputString)
10 {
11 Connection conn = null;
12 CallableStatement proc = null;
13 String callname = null;
14 String OutputString = null;
15
16 try
17 {
18 DriverManager.registerDriver(new com.ibm.db2.jcc.DB2Driver());
19 conn = DriverManager.getConnection("jdbc:db2://
20
21 //执行一个db2存储过程----------begin------------------------------
22 callname = "{CALL " + ProcedureName + "(?,?)}";
23 proc = conn.prepareCall(callname);
24 proc.setString(1, InputString);
25 proc.registerOutParameter(2, Types.VARCHAR);
26 proc.execute();
27 OutputString = proc.getString(2).substring(1,2000);
28 //执行一个db2存储过程----------End--------------------------------
29 }
30 catch(Exception e)
31 {
32 e.printStackTrace();
33 OutputString = "Error Occur: " + e;
34 }
35 finally
36 {
37 try
38 {
39 if(proc != null)
40 {
41 proc.close();
42 }
43
44 if(conn != null)
45 {
46 conn.close();
47 }
48 }
49 catch(Exception ex)
50 {
51 }
52 }
53
54 return OutputString;
55 }
56 }
57 /
Java created
接着创建wrapper function:
SQL> CREATE OR REPLACE Function F_SYS_CALL_DB2_PROC(ProcedureName varchar2, InputString varchar2)
2 return varchar2
3 as language java
4 name 'call_db2.call_db2_procedure_type_1(java.lang.String, java.lang.String) return java.lang.String';
5 /
Function created
好了,现在我们可以来测一下最后的效果了:
SQL> var temp varchar2(32767);
SQL> set serveroutput on size 1000000;
SQL> begin
2 :temp := f_sys_call_db2_proc('XBAIPA.CAAUD','A 9999992581970687034 NBEUR 1232542102008120220091222 LEENEN/WERNER MR 5BJ9B9/
3 end;
4 /
PL/SQL procedure successfully completed
temp
---------
0000000000000+0000000000000+0000000000000+0000000000000 Y
从结果里可以看到,我们已经在oracle里成功调用了db2 v9 for z/OS中的存储过程。
上述蓝色字体标注的部分格式不能错,否则oracle可能会报错:
com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][10243][10940] 对 DB2 z/OS 版的存储过程调用不支持字符串文字
Recent Comments