我将调用一个函数,并按名称设置一些参数,例如:
Connection c = null;
ResultSet rs = null;
String query;
PreparedStatement ps;
CallableStatement cs = null;
try {
c = DbUtils.getConnection();
cs = c.prepareCall("{? = call get_proc_name(?, ?) }");
cs.registerOutParameter(1, OracleTypes.VARCHAR);
cs.setInt("in_proc_type", ProcTypes.SELECT);
cs.setLong("in_table_id", tableId);
// here I should use something like cs.registerOutParameter("result", OracleTypes.VARCHAR);
cs.execute();PL/SQL函数参数包括:
CREATE OR REPLACE FUNCTION get_proc_name
(
in_proc_type IN NUMBER, /*1 - insert, 2 - update, 3 - delete, 4 - select*/
in_table_name IN VARCHAR2 := NULL,
in_table_id IN NUMBER := NULL,
in_table_type_id IN NUMBER := NULL,
is_new IN NUMBER := 0
) RETURN VARCHAR2问题是如何将结果注册为out参数,然后将其从oracle获取到java?我可以通过名称注册in/out参数,因为我从function中知道它们的名称,但我不知道go如何获得函数结果,它使用什么变量名。
手册只描述了使用过程的in/out参数,而不是函数。
Oracle版本: 11.1.0.6.0 Java版本: 1.6.0_14
发布于 2010-09-13 19:44:28
注册函数结果就像它是第一个参数一样。显然,这改变了实际参数的编号。
您已经存在的行
cs.registerOutParameter(1, OracleTypes.VARCHAR);这就是它所需要的。在调用之后,您将获得如下结果:
String result = cs.getString(1);发布于 2010-09-13 20:25:16
解决方案是仅对设置参数使用索引。这样的代码可以正常工作(混合索引和命名参数不起作用;因此,无法解决结果变量使用命名参数的问题,imho):
c = DbUtils.getConnection();
cs = c.prepareCall("{? = call get_proc_name(in_proc_type => ?, in_table_id => ?) }");
cs.registerOutParameter(1, java.sql.Types.VARCHAR);
cs.setInt(2, ProcTypes.SELECT);
cs.setLong(3, tableId);
cs.execute();
String procName = cs.getString(1);
cs.close();发布于 2010-09-13 19:31:46
CallableStatement有一堆获取索引的registerXXX方法。
这就是注册结果的方式。它是参数编号1。
在你的情况下,
cs.registerOutParameter( 1, java.sql.Types.VARCHAR);顺便说一句,因为您正在为result使用索引,所以您可能需要使用面向索引的setXXX方法并提供完整的参数列表。
https://stackoverflow.com/questions/3699891
复制相似问题