1

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

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

CREATE FUNCTION test_out1( pin INT )
    RETURNING INT;

    DEFINE param INT;
    LET param = 321;

    RETURN param;

END FUNCTION;

返回321,我可以用ITValueand 得到值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:带有输出参数的过程?

4

1 回答 1

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;

我建议在 OIC++ 上使用 ODBC。OIC++ 接口构建在另一个库 DMI 之上,而 DMI 又构建在另一个访问 DBMS 的库之上——我忘记了它是基于 ESQL/C 还是基于 ODBC,还是构建在其中的核心库之一. 使用 unixODBC 作为驱动程序管理器和适当的 ODBC 驱动程序对我来说比使用 OIC++ 更有意义。


我真的不知道它在 OIC++ 中的样子。我从来没有使用过它,只是对它进行了一些粗略的维护。

总的来说,最好不要将 OIC++ 用于新工作。Informix 继续分发它是为了向后兼容,而不是鼓励新的使用。

于 2011-03-31T15:27:41.417 回答