Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将Informix对象接口用于C++;对于带out参数的存储过程/函数_C++_Sql_Stored Procedures_Informix_Stored Functions - Fatal编程技术网

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,所以我希望它速度更快(它适用于负载非常高的实时系统)。但它似乎