EDITED
我在执行一些PL / SQL代码时遇到问题。
我有真正的表a
。我想只使用range<=100
的元素。我根据该表在PL / SQL中创建了一个集合。然后我想对该集合执行SELECT
操作。但我遇到了问题。
准备好的表格(例如,这不是一个真正的问题。我只想知道如何从PL / SQL代码块中的集合中进行选择。)
CREATE TABLE a (amount NUMBER);
INSERT INTO a VALUES (50);
INSERT INTO a VALUES (100);
INSERT INTO a VALUES (200);
然后我得到了这个块:
DECLARE
TYPE aTable IS TABLE OF a%ROWTYPE;
aActual aTable;
temp NUMBER;
BEGIN
SELECT * BULK COLLECT INTO aActual
FROM a WHERE amount<=100;
SELECT SUM(amount) INTO temp FROM TABLE(aActual);
DBMS_OUTPUT.PUT_LINE(temp);
END;
但我得到了e {PLS-00642
和ORA-22905
。
我能做什么?为什么它没有那样工作?
我在Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
版本(根据SELECT * FROM V$VERSION;
)
答案 0 :(得分:4)
您无法执行此操作,因为aTable
不是数据库表。 (是的,我知道它是用table of
定义的,但是没有定义一个表。其中一个。)
要求SQL 将集合视为数据库表,您将使用table()
构造:
select sum(amount) into temp from table(aActual);
虽然由于范围问题导致您的示例失败,但您会得到不言自明的
PLS-00642: local collection types not allowed in SQL statements
要使其正常工作,您需要一种架构级类型,即使用create type
创建的类型:
create or replace type xyz as object (a integer, b varchar2(3), c date);
create or replace type xyz_tt as table of xyz;
现在,类型xyz_tt
实际上已发布到SQL,并且可以在SQL table()
表达式中使用。
答案 1 :(得分:0)
正如WilliamRobertson所示,您无法在SQL查询中使用PL / SQL集合。您可以遍历集合并将每个金额添加到临时变量,首先将其初始化为零:
temp := 0;
for i in 1..aActual.count loop
temp := temp + aActual(i).amount;
end loop;
DBMS_OUTPUT.PUT_LINE(temp);