【问题标题】:PL/SQL Oracle - Selecting from internal tablePL/SQL Oracle - 从内部表中选择
【发布时间】:2017-05-29 04:08:17
【问题描述】:

已编辑

我在执行一些 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;

但我得到了 eroor PLS-00642ORA-22905。 我能做些什么?为什么它不能那样工作? 我在Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production版本(根据SELECT * FROM V$VERSION;

【问题讨论】:

  • 如果您不需要 aActual 表来做其他事情,请不要使用它。只需从 Kocury 表中选择范围的总和即可。
  • @DanBracuk 我知道,但我确实需要这张桌子。这里我只展示了少量代码来解释我遇到了什么问题。

标签: sql oracle select plsql


【解决方案1】:

您不能这样做,因为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() 表达式中使用。

【讨论】:

  • 是的,你知道我的意思 :) 但是当我这样做时,我得到了 ORA-22905 错误而不是 PLS-00642。我该如何解决?
  • 顺便说一句,没有“内部表”之类的东西,PL/SQL 中的table of 实际上定义了一个集合。从 PL/SQL 的角度来看,Oracle 可以使用更不言自明的关键字,例如 array(如在 Ada 中)或 collection,但他们还需要在数据库表中引用 nested table columns 的语法。
  • 好吧,当我使用本地集合类型对其进行测试时,我实际上在错误堆栈中收到了两条消息。将其添加到您的问题中,我会看看。
  • 用我所说的“使用create type 创建”的示例更新了答案。
【解决方案2】:

正如 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);

【讨论】:

  • 您可以在 Oracle 12.1 以后的 SQL 查询中使用 PL/SQL 集合。
  • 是的,我想提一下。从错误来看,我认为 OP 不在 12c 上。
  • 它说我使用的是 Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 版本。我已经更新了我的问题
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 2015-06-14
  • 2017-01-01
  • 2012-02-26
  • 2020-10-19
  • 1970-01-01
  • 2014-08-20
  • 2011-07-08
相关资源
最近更新 更多