对于带有out参数的存储过程/函数,请使用C ++的Informix Object Interface

时间:2011-03-31 11:59:28

标签: c++ sql stored-procedures informix stored-functions

这很简单 - 有没有办法使用这个lib调用存储过程或函数,返回多个结果?我知道ITRoutingManager,但它似乎只返回一个值..

详细说明,这就是我的意思:

CREATE FUNCTION test_out1( pin INT )
    RETURNING INT;

    DEFINE param INT;
    LET param = 321;

    RETURN param;

END FUNCTION;

返回321,我可以使用ITValueITConversions获取值。所以这很好。但以下情况并非如此:

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参数。

1 个答案:

答案 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继续分发它以实现向后兼容,而不是鼓励新用途。