【问题标题】:Getting Data into Host Arrays from Oracle PL/SQL从 Oracle PL/SQL 将数据导入主机阵列
【发布时间】:2016-09-06 21:18:18
【问题描述】:

我想将表中的一列数据提取到主机数组中。在我的表中,DOB 是整数类型。我的 C++ 代码如下所示:

EXEC SQL BEGIN DECLARE SECTION;
int birthdays[10];
EXEC SQL END DECLARE SECTION;

...//Code to connect with the database

EXEC SQL EXECUTE
DECLARE
    ...
BEGIN
   SELECT DOB INTO :birthdays FROM DRIVER_LICENSE WHERE DL_NUMBER < 10;
END

DOB 列是整数类型,并且 DRIVER_LICENSE 表中的 DL_NUMBERS 从 0 开始编号。当我尝试编译它时,我得到错误“PLS-S-00597,INTO 列表中的表达式“BIRTHDAYS”是类型错误”

如果它不在执行中,我可以运行选择。 C++ 代码:

EXEC SQL BEGIN DECLARE SECTION;
int birthdays[10];
EXEC SQL END DECLARE SECTION;

SQL EXEC SELECT DOB INTO :birthdays FROM DRIVER_LICENSE WHERE DL_NUMBER < 10;

给我 DRIVER_LICENSE 表的 DOB 列中的数字。

我正在尝试使用 PL/SQL 来整合大量 SQL 调用,以尽量减少与服务器的通信。我可以通过循环游标将信息放入 C++ 生日数组中,并一次将值分配给生日数组元素,但这似乎效率很低。

【问题讨论】:

    标签: c++ arrays oracle plsql


    【解决方案1】:

    我对您的 C++ 库/框架/任何调用上下文一无所知,但在 PL/SQL 中 select into 需要 a single row result set 并且绑定变量必须是标量变量。 int birthdays[10] 看起来像一个数组,因此第一个示例中的 PL/SQL 编译器错误消息非常合理。

    我认为您的第二个示例不会起作用,除非魔术圣歌SQL EXEC 以某种方式隐式运行在 PL/SQL 上下文中(并引发与第一个示例相同的 PL/SQL 编译器错误)。 select into 是 PL/SQL-only,应该在 SQL 上下文中引发 SQL 解析器错误。

    看起来您希望获得a multi row result set,因此在PL/SQL 中您应该使用select into bulk collect

    您应该更多地研究您的 C++ 调用上下文 SQL 合作文档,以了解它期望如何绑定到数组中。

    【讨论】:

    • 谢谢。第二个 SQL 调用确实不完整。批量收集正是我所需要的。
    【解决方案2】:

    你的目标不明确;你真正想要完成什么?

    如果您只是想从数据库表中获取值,一个简单的选择就可以了。无需临时程序。这实际上可能会导致更多开销,因为需要将过程发送到数据库进行编译,然后才能使用它。

    我不知道 C++ 语法,但您在第二个代码集中缺少 FROM 表说明符。

    SQL EXECUTE SELECT dob INTO :birthdays FROM driver_license WHERE dl_number < 10;
    

    【讨论】:

    • 谢谢。我知道对于这个例子,一个简单的选择就可以工作,不需要 PL/SQL。但是,我们有很多地方可以将东西放入数组中,并根据此决定要提取的其他内容。最终,我们希望将逻辑移至 Oracle 服务器并减少对其的调用次数。
    • @HeywoodFloyd 我建议创建数据库包并将您的业务逻辑移动到数据库层。你现在所做的并没有减少任何东西,它实际上增加了不必要的复杂性和编译时间。看起来您正在尝试将 C++ 数据类型绑定到 PLSQL 方法。 Oracle 只返回表。如果要将表格结果转换为数组,则必须使用 ODP ToArray 函数。不确定这在 C++ 中是什么,但 Google 搜索应该会提供。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-08
    • 1970-01-01
    • 2018-06-30
    • 2013-01-05
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    相关资源
    最近更新 更多