首页 > 解决方案 > 在 Pro*C 中使用带有动态查询的`execute immediate bulk collect into`

问题描述

我正在尝试在 Pro*C 下批量收集动态查询,但我无法在 Internet 上找到任何关于此的示例。例如,对于像这样的简单查询select level, level + 100 from dual connect by level <= 100,我想我应该这样做:

EXEC SQL BEGIN DECLARE SECTION;
    char proc_query[LARGE_ENOUGH_QUERY_BUFFER_SZ];

    TYPE sample_tbl_t IS TABLE OF number(10);
    sample_tbl_t level;
    sample_tbl_t level_100;
EXEC SQL END DECLARE SECTION;

char const example_query[] = "select level, level + 100 from dual connect by level <= 100";
memcpy(proc_query, example_query, sizeof(example_query));

EXEC SQL EXECUTE IMMEDIATE :proc_query BULK COLLECT INTO :level, :level_100;

...或类似的东西,但我不知道如何使用 and 的内容levellevel_100如何知道返回的行数等等。我试图搜索有关它的信息,但到目前为止还没有运气。

标签: oracleoracle11g

解决方案


我不知道 Pro*C,但是 - 在 PL/SQL 中 - 这类似于:

SQL> set serveroutput on
SQL>
SQL> declare
  2    TYPE sample_tbl_t IS TABLE OF number(10);
  3    lvl     sample_tbl_t;
  4    lvl_100 sample_tbl_t;
  5  begin
  6    execute immediate 'select level, level + 100
  7                       from dual
  8                       connect by level <= 100' bulk collect into lvl, lvl_100;
  9
 10    dbms_output.put_line('lvl    count = '|| lvl.count);
 11    dbms_output.put_line('lvl100 count = '|| lvl_100.count);
 12  end;
 13  /
lvl    count = 100
lvl100 count = 100

PL/SQL procedure successfully completed.

SQL>

此外,您的声明部分是错误的。将其与我的示例进行比较。

此外,您可能不应该命名 variables level,它会误导读者(看起来像分层查询中的伪列)。


推荐阅读