选择临时 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
我的最终目标比这复杂得多,但这是导致我错误的简化版本。我想将一些行放入临时 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