C++ 将Informix对象接口用于C++;对于带out参数的存储过程/函数
这很简单-有没有一种方法可以使用这个库来调用存储过程或函数,从而返回多个结果?我知道C++ 将Informix对象接口用于C++;对于带out参数的存储过程/函数,c++,sql,stored-procedures,informix,stored-functions,C++,Sql,Stored Procedures,Informix,Stored Functions,这很简单-有没有一种方法可以使用这个库来调用存储过程或函数,从而返回多个结果?我知道ITRoutingManager,但它似乎只返回一个值 具体来说,我的意思是: CREATE FUNCTION test_out1( pin INT ) RETURNING INT; DEFINE param INT; LET param = 321; RETURN param; END FUNCTION; 返回321,我可以使用ITValue和ITConversions获取
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(“函数测试输出2(int)”)
时,它绑定良好,因此没有问题。但请看这个:
std::cout << "Result type: " << routine.ResultType()->Name() IsRow() ? "row, " : ", " )
<< (routine.ResultType()->IsCollection() ? "collection, " : ", " )
<< routine.ResultType()->Quality() << "\n\n";
打印整数,null
,注意整数。。例如,为什么是整数而不是行。以及如何获取函数返回的2个值?另一个有趣的事实-返回值是0(当我使用ITConversions
类将其转换为int
时),不是123,也不是321
一定有办法的。这是一个特殊的库,由Informix开发人员为Informix服务器编写,如果这不可能的话,那将很奇怪
函数也是一样,但我想在那里也是一样的
注意:在常见情况下没有out参数,对于informix过程/函数(),正如您所注意到的,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继续分发它是为了向后兼容,而不是鼓励新的使用。正如您所注意到的,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继续分发它是为了向后兼容,而不是鼓励新的使用。您高估了OIC++包的实用性。它是用古旧的标准C++编写的,使用宏代替模板。自1996年编写以来,它一直没有被认真修改过——几年前它进行了一些清理,这样编译时编译器的抱怨就更少了。注意“投诉较少”,而不是“无投诉”。我不推荐它用于新代码。@Jonathan Leffler-我的另一个选择是使用ODBC驱动程序,它与Informix服务器完美配合。我想使用OIC++包,因为它只用于Informix,所以我希望它更快(它适用于负载非常高的实时系统)。但它似乎更慢,除了在使用ITRoutineManager时——然后,通过这个类,性能提高了两倍。但只有到那时。。那么,你能给我一些建议吗?我想ODBC是更好的选择?提前多谢!我说的是unixODBC,忘了提了。我在您的个人资料中看到了描述(“长期使用Informix的用户和开发人员,在C和Unix方面经验丰富”),我非常感谢您的意见。我建议您使用ODBC而不是OIC++。OIC++接口构建在另一个库DMI之上,而DMI又构建在另一个访问DBMS的库之上——我忘了它是基于ESQL/C还是ODBC的,还是构建在其之上的核心库之一。使用unixODBC作为驱动程序管理器和适当的ODBC驱动程序对我来说比使用OIC++更有意义。非常感谢!请在你的回答中加上这些作为建议,我将欣然接受(你对OC+++包的效用估计过高了。它是用标准的C++编写的,使用宏而不是模板。自从1996年前就没有对它进行过严重的修改。几年前,它得到了一些清理,这样编译就少了编译器的抱怨。”我不推荐它用于新代码。@Jonathan Leffler-我的另一个选择是使用ODBC驱动程序,它与Informix服务器完美配合。我想使用OIC++包,因为它只用于Informix,所以我希望它速度更快(它适用于负载非常高的实时系统)。但它似乎