DB2 外部存储过程(JAVA)

Posted

技术标签:

【中文标题】DB2 外部存储过程(JAVA)【英文标题】:DB2 EXTERNAL STORED PROCEDURE(JAVA) 【发布时间】:2020-08-04 12:07:22 【问题描述】:

我一直在碰运气调用一个 java jar 文件,该文件有一个将 String 和 boolean 作为输入参数的方法。

存储过程如下:

CREATE PROCEDURE TBF_STG.PROC( IN in1 VARCHAR(25), OUT out1 BOOLEAN )
  LANGUAGE java
  PARAMETER STYLE java 
  DYNAMIC RESULT SETS 1
  FENCED 
  EXTERNAL NAME 'name1:connection.Connect.javastp'

我调用如下程序:

CALL TBF_STG.PROC('xyz', ?) 

java类如下:

public class Connect 
    static Connection con = null;
    public static void javastp( String name,
            Boolean outparm, 
            ResultSet[] rs 
            )
                    throws SQLException
    
        Connection con = DriverManager.getConnection( "jdbc:default:connection" );
        PreparedStatement stmt = null;
        String sql = "SELECT NAME FROM TBF_STG.TEST WHERE NAME = ?";

        //Prepare the query with the value of name  
        stmt = con.prepareStatement( sql );
        stmt.setString( 1, name );

        //Execute query and set output parm
        rs[0] = stmt.executeQuery();
        outparm = true;

        //Close open resources
        if (stmt != null) stmt.close();
        if (con != null) con.close();  

        return;
    

当我将布尔参数更改为字符串时,它可以正常工作,但我似乎无法使其适用于布尔参数。

我在 dbeaver 中收到以下错误:

SQL Error [42724]: Java stored procedure or user-defined function "TBF_STG.PROC", specific name "SQL200804144354782" could not call Java method "javastp", signature "(Ljava/lang/String".. SQLCODE=-4306, SQLSTATE=42724, DRIVER=4.8.86

作为 DB2 的新手,谁能指出我正确的方向。

【问题讨论】:

Db2-SERVER 的哪个平台(是 Z/OS 上的数据库,还是 i 系列,还是 Linux/Unix/Windows 上的数据库)?什么是 Db2 服务器版本? Linux Suse db2 版本 11 【参考方案1】:

我很好奇它如何以您提供的方式使用 String 参数。Parameter style JAVA procedures:

SQL 参数 对应于 CREATE PROCEDURE 语句中的输入参数列表。 OUT 或 INOUT 模式参数作为 单元素数组。对于在 CREATE PROCEDURE 语句的 DYNAMIC RESULT SETS 子句,一个 ResultSet 类型的单元素数组附加到参数 列表。

Supported SQL data types in Java routines:

| SQL Column Type | Java Data Type |
+-----------------+----------------+
| BOOLEAN         | boolean        |

您必须使用boolean 原始类型,而不是java.lang.Boolean 类。 所以,试试吧:

public static void javastp( String name,
        boolean[] outparm, 
        ResultSet[] rs 
        )
....
    //Execute query and set output parm
    rs[0] = stmt.executeQuery();
    outparm[0] = true;

【讨论】:

但对于 boolean[],我收到以下错误 SQL 错误 [38501]:过程或用户定义函数“TBF_STG.PROC2”,特定名称“SQL200805103049789”中止,但出现异常“java.lang. NullPointerException".. SQLCODE=-4302, SQLSTATE=38501, DRIVER=4.8.86 查看服务器上的 db2diag.log 以确定引发此异常的代码行。 对于字符串,我使用了 --String[]-- 数组,即 public static void javastp( int inparm, String[] outparm, ResultSet[] rs ) 并且工作正常,但我无法获得boolean[] 工作【参考方案2】:

Db2-LUW 版本 11.x 对设置 boolean 类型的 OUTPUT 参数的 java sproc 存在软件缺陷(在 java 代码中设置布尔输出参数时,sproc 将抛出 NullPointerException)。

第一个修复将出现在 V11.1.m4FP6 中。期望当您应用该修订包时,您的 java 程序将能够成功设置布尔输出参数而不会导致异常。

缺陷编号为 IT35542

根据https://www.ibm.com/support/pages/apar/IT35542

【讨论】:

以上是关于DB2 外部存储过程(JAVA)的主要内容,如果未能解决你的问题,请参考以下文章

从客户端调用 DB2 外部存储过程失败并显示 CPF9810

从外部 UDF 调用 db2ReadLog

sqlserver如何调用外部数据库的存储过程

将 Java 库与 DB2 Java 存储过程捆绑在一起

DB2 Java 存储过程 NoSuchMethodError

使用spring从db2数据库调用存储过程到java代码