0

我有一个奇怪的问题,使用批量收集作为 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:我无法粘贴原始代码。

4

2 回答 2

0

TYPE t_bulk_vol是一种 PL/SQL 类型。这意味着您只能在 PL/SQL 结构中使用它。你不能在 SQL 中使用它,即使它是 PL/SQL 程序中的 SQL。

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


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

cursor cur is SELECT * FROM vol where ... ;

保存以BULK COLLECT INTO l_vol进行实际提取。

尽管这可能只是您伪造某些 PL/SQL 的人工制品,因为您“无法粘贴原始代码”。

于 2013-07-11T17:34:24.367 回答
0

我已经按照你说的创建了类型,但是我在同一点得到了同样的错误(ORA-00903 - 无效的表名)。

这是我所做的一个例子:

  CREATE TYPE REC_VOL AS OBJECT (
       FIELD1    VARCHAR2(25),
       ...
  );
  create TYPE T_BULK IS TABLE OF REC_VOL;
  ....
  l_vol t_bulk;
  ...

这是我收集记录的方式(我不再使用游标了):

    SELECT REC_VOL(FIELD1, ...) BULK COLLECT INTO l_vol
    FROM vol where ...;

在插入选择语句中仍然会引发异常。

于 2013-07-12T07:58:29.143 回答