我完全被DB2存储过程和java例程所困,我想问一下是否有人看到了类似的东西,并找到了解决方案。基本上,我正在尝试编写一些java例程,将它们打包到一个jar中,并将其复制到DB2示例中。然后,在DB2端,我定义了一些存储过程来调用我的java例程。这样我就可以用像db2 "call sp_1(param1, param2)"
这样的db2命令来触发它们。
因此,对于那些不返回任何内容或仅返回原语数据类型(即sting)的java例程,相关的存储过程完全可以正常工作。问题在于返回ResultSet的java例程。为了简单地测试java例程返回ResultSet,我写了一个类似下面的虚拟java例程(我真实的的Java例程将阅读一些本地文件,并生成实际数据作为ResultSet/将其返回到存储过程),使用Mockrunner包中的MockResultSet返回一些伪ResultSet。
public static synchronized void listUsers(ResultSet[] result) {
MockResultSet rs = new MockResultSet("UserGroups", "cursor");
rs.addColumn("User", new String[] { "user1", "user2" });
rs.addColumn("Team", new String[] { "team1", "team2" });
result[0] = rs;
}
在存储过程方面,我定义了这样一个过程(根据关于java例程的IBM doc,在参数列表中添加了java.sql.ResultSet[]
。
CREATE PROCEDURE LIST_USER ()
SPECIFIC JDBC_ONE_RES_SET
DYNAMIC RESULT SETS 1
NOT DETERMINISTIC
LANGUAGE JAVA
PARAMETER STYLE JAVA
NO DBINFO
FENCED
THREADSAFE
READS SQL DATA
PROGRAM TYPE SUB
EXTERNAL NAME 'MYJAR:test.listUsers(java.sql.ResultSet[])'
有了这个,当我在连接到数据库之后尝试在db2示例上执行db2 "call LIST_USER()
时,我得到了这个,它返回0,这似乎表明存储过程执行成功,但似乎没有返回结果集......
[20:55:06][test][~]$ db2 "call LIST_USER()"
Return Status = 0
我还尝试通过Java例程中的SQL查询返回真实的数据,方法是遵循一些类似下面的db2示例Java例程,但是当我调用该过程时,它抛出下面的错误。
[01:07:51][test] $ db2 "call LIST_USERS()"
SQL4302N Procedure or user-defined function "LIST_USERS", specific name
"LIST_USERS" aborted with an exception "No suitable driver found for
jdbc:default:". SQLSTATE=08001
查看错误,我认为getConnection失败(尝试了jdbc:default:connection
和jdbc:db2:connection
),好像db2 jdbc驱动程序不存在。但这不是真的,因为我复制了db2 jdbc驱动程序,当我执行echo $CLASSPATH
时,我看到驱动程序**db2jcc4.jar
**在那里。
因此,如果有人知道为什么我的MockResultSet在第一种方法中没有返回,或者为什么存储过程在我的第二种方法中抛出“找不到合适的驱动程序”错误,请插话,我将非常感谢您在这里的输入!
1条答案
按热度按时间kt06eoxx1#
只是对我的线程进行了一些快速更新。在我重新启动db2引擎之后,
"No suitable driver found
错误现在消失了。所以看起来在重新安装java例程jar之后,我们将需要重新启动db2,以便CLASSPATH
、jar等可以正确地加载和更新。