这很简单 - 有没有办法使用这个lib调用存储过程或函数,返回多个结果?我知道ITRoutingManager
,但它似乎只返回一个值..
详细说明,这就是我的意思:
CREATE FUNCTION test_out1( pin INT )
RETURNING INT;
DEFINE param INT;
LET param = 321;
RETURN param;
END FUNCTION;
返回321
,我可以使用ITValue
和ITConversions
获取值。所以这很好。但以下情况并非如此:
CREATE FUNCTION test_out2( pin INT )
RETURNING INT, INT;
DEFINE param INT;
LET param = 321;
DEFINE param2 INT;
LET param2 = 123;
RETURN param, param2;
END FUNCTION;
当我做routine.GetRoutine( "function test_out2( int )" )
时,它被绑定了,所以没问题。但请看这个:
std::cout << "Result type: " << routine.ResultType()->Name() IsRow() ? "row, " : ", " )
<< (routine.ResultType()->IsCollection() ? "collection, " : ", " )
<< routine.ResultType()->Quality() << "\n\n";
打印integer, , , null
,记下整数 ..例如,为什么是整数,而不是行。 如何获取函数返回的2个值?另一个有趣的事实 - 返回的值是 0 (当我使用int
类将其转换为ITConversions
时,而不是123,也不是321 ..
必须要有办法。这是一个由Informix开发人员为Informix服务器编写的特殊库,如果不可能的话会很奇怪。
功能相同,但我猜它也是一样。
注意:对于informix程序/函数(Informix: procedure with output parameters?)
,在常见情况下不存在out参数。答案 0 :(得分:1)
如您所知,Informix确实没有“OUT”参数;它返回值。
在常规ESQL / C中,您使用输入值列表对称地处理输出值列表;因此,我期望对此代码执行相同的操作。无论您使用哪种技术将2个参数传递给函数,都可能 - 但绝不保证 - 是获得多个返回值的方法。
如有疑问,请将其视为处理返回多行的SELECT语句。也就是说,做类似的:
PREPARE s FROM "EXECUTE PROCEDURE test_out2(?)";
DECLARE c CURSOR FOR s;
OPEN c USING :input_value;
while (sqlca.sqlcode == 0)
{
FETCH c INTO :out_value1, :out_value2;
if (sqlca.sqlcode != 0)
break;
...use values...
}
CLOSE c;
FREE c;
FREE s;
我建议使用ODBC而不是OIC ++。 OIC ++接口构建在另一个库DMI之上,而DMI又构建在访问DBMS的另一个库之上 - 我忘记它是基于ESQL / C还是基于ODBC,还是构建在其上的核心库之一。使用unixODBC作为驱动程序管理器和适当的ODBC驱动程序对我来说比使用OIC ++更有意义。
我不知道OIC ++中的外观如何;我从来没有使用它,但只是粗略地维护它。
总的来说,建议您不要将OIC ++用于新工作。 Informix继续分发它以实现向后兼容,而不是鼓励新用途。