ACOUG

| 5 Comments | No TrackBacks

eyglekamus两位大师合作创建了ACOUGAll China Oracle User Group-中国Oracle用户组

对于ACOUGkamus这样说:

"我们希望能够为全中国的Oracle技术爱好者提供一个交流与活动的平台,我们希望能够激发更多人对于Oracle技术以及相关知识的兴趣,我们希望沉浸在这些技术中的人员获得更多的乐趣。这是我跟eygle一直以来的一个理想,但愿我们能为此付出并且有所回报"

 

eygle则这样解释"回报"二字:

另外一个问题是,很多人不愿意为没有收益的事情付出,而我的观点是,有付出一定是有回报的,虽然这个回报可能在很久之后。

 

说来也巧,我这几年真的就是这么想的----我深陷其中,是因为我从学习oracle的过程中不断能体会到乐趣(不为别的,就是觉得很爽),我也坚信付出必有回报!

 

这次有幸得到两位大师提携,能够和两位大师一起在ACOUG的第一次活动中做一个主题演讲,我的初步设想是会围绕"oracle如何深入"这个主题来展开,希望能不辱使命

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

 

呵呵,很搞的错误提示。

Recent Comments

  • cui hua: 谢谢:) read more
  • jlttt: 我挺你~~ read more
  • Kostas Hairopoulos: Your response was really excellent. I really appreciated it. I read more
  • cui hua: 谢谢:) read more
  • ochef: 一如继往的支持你! read more
  • eygle: 尽快确定题目吧,我更新过去! read more
  • ning.wang: 英语这个工具也是起了相当大的作用。呵呵 read more
  • cui hua: 我终于明白x$kcbwds,x$kcbwbpd以及上述蓝色字体标注的含义了。 read more
  • loris: 你写的关于oracle的博文,讲得很清楚 谢谢博主 继续关注中! read more
  • cui hua: 新版metalink中的Knowledge Articles(老版是Knowledge Base)里可以设置filter,设置完后更新的文章就会显示在列表的前面,然后一篇一篇看就行了。 read more

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