2013-11-21 15 views
0

我想要检索的Informix数据库的存储过程的结果,这里是我的代码:如何从jdbc获取informix storedprocedure的结果?

Connection connection = session.connection(); 
callableStatement = connection.prepareCall("{? = call my_stored_procedure()}"); 
***callableStatement.registerOutParameter(1, Types.VARCHAR);*** 
callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR); 
callableStatement.registerOutParameter(3, java.sql.Types.INTEGER); 

的问题是,第一registerOutParameter不工作,并抛出这个异常: java.sql.SQLException: [BEA][Informix JDBC Driver]Invalid parameter binding(s)

我该怎么办 ?

+0

这将只工作,如果你的程序有OUT参数......是这样的:'createProductDef(产品名称为varchar(64 ),productdesc varchar(64),out prod_id float);'。如果你想获得RETURN,我不能说出正确的方式,但是你可以做的就是像select一样获得数据的返回,就像这样:'select * from table(my_stored_procedure);' – ceinmart

+0

In ESQL/C,您可以在'EXECUTE PROCEDURE my_stored_procedure()'上创建一个游标,并像在SELECT语句中那样处理这些列。我不确定这是否适用于JDBC。 –

+0

从你的代码看来,应该有3个输出参数,但我认为应该只有一个。看到'my_stored_procedure()'主体会很好。看看有关Informix存储过程的其他查询:http://stackoverflow.com/questions/18536285/informix-odbc-stored-procedure-always-return-incorrect-same-value/18545274 –

回答

0

看来您不能使用registerOutParameter()来读取函数结果。取而代之的是,你可以使用的resultSet只是想:

#!/usr/bin/env jython 
# -*- coding: utf8 -*- 

import sys 
import traceback 

from java.sql import DriverManager, Types 
from java.lang import Class 

Class.forName("com.informix.jdbc.IfxDriver") 


FUN_BODY = """CREATE FUNCTION get_ver() RETURNING VARCHAR(200); 
    RETURN 'ver 1.12'; 
END FUNCTION;""" 


def test_init(db): 
    c = db.createStatement() 
    try: 
     c.execute('DROP FUNCTION get_ver;') 
    except: 
     pass 
    c.execute(FUN_BODY) 


def test_call(db): 
    try: 
     print("\n\n--------------\ncall...") 
     proc = db.prepareCall("{ ? = call get_ver() }") 
     rs = proc.executeQuery() 
     while (rs.next()): 
      r = rs.getString(1) 
      print('result: %s' % (r)) 
    except: 
     print("there were errors!") 
     s = traceback.format_exc() 
     sys.stderr.write("%s\n" % (s)) 


def test_exec(db): 
    try: 
     print("\n\n--------------\nEXECUTE PROCEDURE...") 
     c = db.createStatement() 
     rs = c.executeQuery("EXECUTE PROCEDURE get_ver()") 
     while (rs.next()): 
      r = rs.getString(1) 
      print('result: %s' % (r)) 
    except: 
     print("there were errors!") 
     s = traceback.format_exc() 
     sys.stderr.write("%s\n" % (s)) 


def test(db_url, usr, passwd): 
    print("\n\n%s\n" % (db_url)) 
    db = DriverManager.getConnection(db_url, usr, passwd) 
    test_init(db) 
    test_call(db) 
    test_exec(db) 
    db.close() 


test('jdbc:informix-sqli://test-informix:9088/testifx:informixserver=ol_testifx;DB_LOCALE=pl_PL.CP1250;CLIENT_LOCALE=pl_PL.CP1250;charSet=CP1250', 'user', 'passwd') 
test('jdbc:odbc:[system_dsn]', 'user', 'passwd') 

我的结果:

jdbc:informix-sqli://test-informix.... 
-------------- 
call... 
result: ver 1.12 


-------------- 
EXECUTE PROCEDURE... 
result: ver 1.12