PL / SQL Oracle - 从内部表中选择

时间:2017-01-13 17:45:08

标签: sql oracle select plsql

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-00642ORA-22905。 我能做什么?为什么它没有那样工作? 我在Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production版本(根据SELECT * FROM V$VERSION;

2 个答案:

答案 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);