Oracle PL/SQL—条件和内部视图中WHERE和FROM子句的批量收集用法

Oracle PL/SQL—条件和内部视图中WHERE和FROM子句的批量收集用法,oracle,view,pivot,bulk-collect,Oracle,View,Pivot,Bulk Collect,我在使用批量集合作为FROM子句的元素时遇到了一个奇怪的问题。 当我执行这个代码示例时,就在运行时出现了错误“表名无效” 如果我用一张桌子来代替这个集合,一切都会很好 我缺少的批量收集有什么限制吗? 也许我不能在FROM子句中使用匿名阻止? 在sql调试器中,我看到l_vol(I)有值,但l_vol(I).FIELD不存在 谢谢 TYPE t_bulk_vol is table of vol%ROWTYPE; l_vol t_bulk_vol; ... cursor cur is SEL

我在使用批量集合作为FROM子句的元素时遇到了一个奇怪的问题。 当我执行这个代码示例时,就在运行时出现了错误“表名无效”

如果我用一张桌子来代替这个集合,一切都会很好

我缺少的批量收集有什么限制吗? 也许我不能在FROM子句中使用匿名阻止? 在sql调试器中,我看到l_vol(I)有值,但l_vol(I).FIELD不存在

谢谢

 TYPE t_bulk_vol is table of vol%ROWTYPE;
 l_vol t_bulk_vol;
 ...
 cursor cur is SELECT * FROM vol where ... ;

 OPEN CUR;
 LOOP 
     FETCH CUR BULK COLLECT INTO l_vol;
     ....
     insert into dest
     select col1, col2, ... from 
     (inner view with some pivot, unpivot and l_vol(i).FIELD ...) src where l_vol(i).FIELD = src.FIELD;

PS:我无法粘贴原始代码。

类型t\u bulk\u vol
是PL/SQL类型。这意味着您只能在PL/SQL构造中使用它。您不能在SQL中使用它,即使它是PL/SQL程序中的SQL

如果要在SELECT的FROM子句中使用嵌套表,则需要定义SQL类型。这是一种痛苦,因为这意味着您不能使用%ROWTYPE定义(这是一个仅限PL/SQL的关键字)。因此,您必须创建一个签名与表的投影匹配的对象,然后创建该类型的嵌套表


您的光标定义错误。它应该只是一个SELECT语句

cursor cur is SELECT * FROM vol where ... ;
将批量采集保存到l_vol中,以便实际提取


虽然这可能只是因为“无法粘贴原始代码”而伪造一些PL/SQL的伪制品。

我已经按照您所说的创建了类型,但在同一点上我得到了相同的错误(ORA-00903-无效的表名)

这是我所做工作的一个例子:

  CREATE TYPE REC_VOL AS OBJECT (
       FIELD1    VARCHAR2(25),
       ...
  );
  create TYPE T_BULK IS TABLE OF REC_VOL;
  ....
  l_vol t_bulk;
  ...
这是我收集记录的方式(我不再使用光标):


insert select语句仍会引发异常。

唯一比调试某人的劣质代码更有趣的事情是蒙着眼睛调试某人的劣质代码。
    SELECT REC_VOL(FIELD1, ...) BULK COLLECT INTO l_vol
    FROM vol where ...;