选择临时 table 时出现 Oracle 错误

Oracle error when selecting into temp table

我的最终目标比这复杂得多,但这是导致我错误的简化版本。我想将一些行放入临时 table(实际上是几个临时 table,但我无法通过第一个障碍)。这是我的 PL/SQL;

DECLARE
    type L1_store is table of MyTable%rowtype;
    L1 L1_store;
BEGIN
    select
        * bulk collect
    into L1
    from MyTable
    WHERE 1=1
    and length(MyColumn1) = 2;

    select 
        L1.MyColumn1 
        ,L1.MyColumn2
    from L1;
END;

这是我得到的错误;

ORA-06550: line 19, column 6:
PL/SQL: ORA-00942: table or view does not exist
ORA-06550: line 16, column 1:
PL/SQL: SQL Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action:

行号可能不正确,因为为了清楚起见,我已经编辑了实际的 PL/SQL

****编辑****

好的,所以我最初接受了下面提供的答案,因为它看起来回答了我的问题,而且我可以看看如何使用它。但是,为了清楚起见,这是我的最终目标,以防有比我脑海中的答案更好的答案。

如果我只是在 SQL 中这样做,我会做类似的事情;

with L1 as
(select * from table),
L2 as 
(select * from anothertable)

select L1.Column
from L1
left join L2 on L1.somecolumn = L2.somecolumn

我不知道这是否有帮助或阻碍,但感谢大家期待您的持续耐心。

这里的问题似乎是块中的第二个 select。如果您尝试 select 记录中的数据,我倾向于将其放入 FOR 循环中。即,像这样:

for i in 1 .. L1.count() LOOP
   dbms_output.put_line (L1(i).MyColumn1);
end loop;

您可以将 MYColumn1 的值赋给一个变量或以其他方式使用它。

type L1_store is table of MyTable%rowtype; 不是 temporary table;它是在 PL/SQL 范围内声明的集合数据类型,不能在 SQL 范围内使用。同样,%ROWTYPE 是一个 PL/SQL 结构。

如果你想在 SQL 中使用一个集合,那么在 SQL 范围内声明它:

CREATE TYPE mytable_data is OBJECT (
  mycolumn1 VARCHAR2(50),
  mycolumn2 NUMBER,
  mycolumn3 DATE
);

CREATE TYPE mytable_data_table IS TABLE OF mytable_data;

所以对于一些测试数据:

CREATE TABLE MyTable(
  mycolumn1 VARCHAR2(50),
  mycolumn2 NUMBER,
  mycolumn3 DATE
);

INSERT INTO MyTable VALUES ( 'AA', 42, SYSDATE );

那么你可以这样做:

DECLARE
    L1 mytable_data_table;
BEGIN
    select mytable_data( mycolumn1, mycolumn2, mycolumn3 )
    bulk collect into L1
    from  MyTable
    WHERE length(MyColumn1) = 2;

    FOR i IN 1 .. L1.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE( L1(i).mycolumn1 || ' ' || l1(i).mycolumn2 );
    END LOOP;
END;
/

输出:

AA 42

db<>fiddle here