oracle里如何调用db2 v9上的存储过程

| 2 Comments

我在"如何在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/1A NON-RER REF FEE MAY APPLY    BR0.114200                   0000000019000000000001900000000000190000000000293000000000000Y  0 0N00000000000H',:temp);

  3  end;

  4  /

 

begin

XBAIPA.CAAUD@PLHI3('A 9999992581970687034 NBEUR    1232542102008120220091222 LEENEN/WERNER MR                               5BJ9B9/1A NON-RER REF FEE MAY APPLY    BR0.114200                   0000000019000000000001900000000000190000000000293000000000000Y  0 0N00000000000H',:temp);

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://10.1.21.215:446/LOCDSN3", "xbalhu", "abcd");

 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/1A NON-RER REF FEE MAY APPLY    BR0.114200                   0000000019000000000001900000000000190000000000293000000000000Y  0 0N00000000000H');

  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 版的存储过程调用不支持字符串文字

 

呵呵,很搞的错误提示。

2 Comments

既然能用loadjava加载java类..本身java通过jdbc驱动包能访问数据库的能力..不仅仅调用存储过程 ...当然还能添加/删除/修改/查询DB2数据..甚至DB2表的元数据..表结构..
oracle再调用java...从而使oracle具有访问其它库的能力.
F_SYS_CALL_DB2_PROC这个wrapper function..除了返回varchar2类型外..还能有别的数据类型么..?如对象,集合,二进制..这样..oracle就能利用java有更多的功能..

有啊,绝大多数的数据类型都支持。具体内容你去看Oracle Database JDBC Developer's Guide and Reference - 10g Release 2 (10.2)的439页,里面有一个支持的数据类型的列表。

Leave a comment

Recent Comments

  • cui hua: 有啊,绝大多数的数据类型都支持。具体内容你去看Oracle Database JDBC Developer's Guide and Reference - 10g Release read more
  • jz: 既然能用loadjava加载java类..本身java通过jdbc驱动包能访问数据库的能力..不仅仅调用存储过程 ...当然还能添加/删除/修改/查询DB2数据..甚至DB2表的元数据..表结构.. oracle再调用java...从而使oracle具有访问其它库的能力. F_SYS_CALL_DB2_PROC这个wrapper function..除了返回varchar2类型外..还能有别的数据类型么..?如对象,集合,二进制..这样..oracle就能利用java有更多的功能.. read more

About this Entry

This page contains a single entry by cui hua published on March 2, 2010 2:32 PM.

Oracle中如何dump内存中的块 was the previous entry in this blog.

ACOUG is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.