【问题标题】:PL/SQL open cursor for query string with varchar2 arrayPL/SQL 打开带有 varchar2 数组的查询字符串游标
【发布时间】:2023-02-25 05:46:34
【问题描述】:

我想在open c1 for sql-statement(在 plsql 中)中使用数组

数组是varchar2; 的表。

数组由另一个函数填充:

OPEN v_c1 FOR query_statement;
            LOOP
                v_hrc_list.extend; 
                FETCH v_c1 into v_hrc_list(v_hrc_list.count);
                EXIT WHEN (v_c1%NOTFOUND);
            END LOOP;
        CLOSE v_c1;

我试过:

query_statement = `...||'WHERE MEMBER OF (select * from table (:table_hrcs))'`

OPEN v_c1 FOR query_statement USING table_hrcs; 

我收到以下错误:

不一致的数据类型:预期的 UDT 得到 CHAR

我也试过

...||'WHERE MEMBER OF (select * from table ('||table_hrcs||'))'

【问题讨论】:

  • 请提供可重现的示例(最小化的 query_statement),最好是 db fiddle。乍一看似乎有语法错误where SOMETHING member of ...。还要指定 Oracle 版本。还有错误的 ora 代码 - 是 ORA-00932 吗?
  • 它不可执行但是:db-fiddle.com/f/X6AzcifZR5J2q9Jt2vzXV/0 是它的 ORA-00932 这个例子(没有 bind-var):ORA-06550:第 17 行,第 17 列:PLS-00306:调用“||”时参数的数量或类型错误
  • 现在我添加了工作和非工作示例(为...打开 v_c1)

标签: oracle plsql


【解决方案1】:

您混淆了两种引用集合成员的方式。

使用您似乎拥有的集合类型,您可以执行以下操作:

' ... WHERE your_column IN (select * from table (:table_hrcs))'

或者更简单地说:

' ... WHERE dummy MEMBER OF :table_hrcs'

fiddle

在处理大量数据时,您可能会看到两者之间的性能差异。

另请注意,结果数组最后一个元素为空。

您的示例不需要使用游标和 for 循环,您可以直接批量收集到目标集合中(然后不需要初始化,并且没有空元素):

EXECUTE IMMEDIATE query_statement
BULK COLLECT INTO v_hrc_list
USING table_hrcs;

fiddle

【讨论】:

  • AAAARRR 我真傻 :D,是时候完成包裹了……非常感谢
  • @EnricoStöbe - 另请参阅不使用循环的版本的更新。
  • 也许这有帮助,因为 apex 负担过重,谢谢,我想获得所有“HRCS”(如 ID),在收集它们之后,我想用它们来获取数据。
  • 嗯,我不知道...我使用你的“'...WHERE dummy MEMBER OF :table_hrcs'”但现在我得到 ORA-00932:不一致的数据类型:预期的 CHAR 得到了 AVATARS.HRC_LIST 我不明白 D:
  • 它在我的小提琴中起作用,所以也许它是查询语句的其余部分中您没有显示的其他内容? (在你的小提琴中,你似乎在周围添加引号 - chr(39) - 看起来没有必要;我想知道你是否试图将它们放入选择列表或其他东西的集合中?也许改编我的小提琴展示你正在做什么来得到那个错误......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-26
相关资源
最近更新 更多