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