看来您不能使用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
这将只工作,如果你的程序有OUT参数......是这样的:'createProductDef(产品名称为varchar(64 ),productdesc varchar(64),out prod_id float);'。如果你想获得RETURN,我不能说出正确的方式,但是你可以做的就是像select一样获得数据的返回,就像这样:'select * from table(my_stored_procedure);' – ceinmart
In ESQL/C,您可以在'EXECUTE PROCEDURE my_stored_procedure()'上创建一个游标,并像在SELECT语句中那样处理这些列。我不确定这是否适用于JDBC。 –
从你的代码看来,应该有3个输出参数,但我认为应该只有一个。看到'my_stored_procedure()'主体会很好。看看有关Informix存储过程的其他查询:http://stackoverflow.com/questions/18536285/informix-odbc-stored-procedure-always-return-incorrect-same-value/18545274 –