c++ - 将 Informix Object Interface for C++ 用于不带参数的存储过程/函数

标签 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,我可以通过 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 )") 时,它绑定(bind)正常,所以没有问题。但是看到这个:

std::cout << "Result type: " << routine.ResultType()->Name() IsRow() ? "row, " : ", " )
        << (routine.ResultType()->IsCollection() ? "collection, " : ", " )
        << routine.ResultType()->Quality() << "\n\n";

打印 integer, , , null注意整数.. 例如,为什么是整数,而不是行。以及如何获取函数返回的 2 个值?另一个有趣的事实 - 返回值是 0(当我使用 ITConversions 类将它转换为 int 时),不是 123,也不是 321。 .

一定有办法的。这是一个特殊的库,由 Informix 开发人员为 Informix 服务器编写,如果这不可能,那就太奇怪了。

函数也一样,但我想它在那里也是一样的。


注意:对于 informix 过程/函数 ( Informix: procedure with output parameters? ),通常情况下没有 out 参数之类的东西

最佳答案

如您所见,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++ 接口(interface)建立在另一个库 DMI 之上,而 DMI 又建立在另一个访问 DBMS 的库之上——我忘记它是基于 ESQL/C 还是基于 ODBC,或者是建立在这些库之上的核心库之一.使用 unixODBC 作为驱动程序管理器和合适的 ODBC 驱动程序对我来说比使用 OIC++ 更有意义。


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

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

关于c++ - 将 Informix Object Interface for C++ 用于不带参数的存储过程/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5499464/

相关文章:

mysql - 将具有重复行的表连接为属性

sql - 如何找到类似的地址记录?

mysql - 如何在mysql存储过程中用 '/'分割字符串?

c++ - KD 树仍然是用于移动物体的最佳算法之一吗?

c++ - 我可以用静态的、constexpr、类内初始化的数据成员做什么?

sql - postgresql 中的错误

mysql - 如何将两个过程组合在一起来填充一个表,而不是两个过程中的每一个过程填充它自己的表?

c# - 插入后数据库中只插入了 "string"的一个字符

c++ - 将 C/C++ 源文件作为插件包含在 IL2CPP 中

c++ - 如何从 WinDbg 扩展中提取用户流?