2013-11-21 16 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