【问题标题】:Using table type in SELECT statement [duplicate]在 SELECT 语句中使用表类型 [重复]
【发布时间】:2014-04-07 12:08:40
【问题描述】:

我尝试在SELECT语句中使用表类型的变量,但出现错误:

DECLARE
    TYPE v2t IS TABLE OF table_a.id%TYPE INDEX BY BINARY_INTEGER;
    TYPE test_type IS TABLE OF table_a.id%TYPE INDEX BY BINARY_INTEGER;
    test_table1 test_type;
    test_table2 test_type;
    databaseArray v2t;
BEGIN
    SELECT id BULK COLLECT INTO test_table1 FROM 
        (SELECT id FROM test_a WHERE some_flag = 1);
    FOR i IN 1..test_table1.COUNT LOOP
        databaseArray(i) := test_table1(i);
    END LOOP;

    SELECT id BULK COLLECT INTO test_table2 FROM 
           (SELECT id FROM TABLE(databaseArray));  --error ORA-22905
END;

test_table1 作为表格不可见。 有什么方法可以在 SELECT 语句中使用 test_table1 吗? 我需要有两个结果子集。

【问题讨论】:

  • 我编辑了我的代码,但仍然出现错误
  • @DavidSilva - 必须在模式级别声明类型,如链接问题的答案所示,使用create type - 不仅仅是在declare 部分。它必须是数据库类型,而不是 PL/SQL 类型,您才能在 SQL 中引用它(甚至是 PL/SQL 中的 SQL)。目前v2tdatabase_array 没有添加任何内容。
  • @Alex Poole,有什么方法可以在不声明任何架构级别的情况下做类似的事情吗?

标签: sql oracle plsql


【解决方案1】:

如果您不想在架构级别声明自己的类型,则可以使用built-in table type,只要有一个与您的基础数据类型匹配并且您没有太多值可以输入它:

DECLARE
  TYPE test_type IS TABLE OF user_objects.object_id%TYPE
    INDEX BY BINARY_INTEGER;
  test_table1 test_type;
  test_table2 test_type;
  databaseArray sys.odcinumberlist;
BEGIN
  SELECT object_id
  BULK COLLECT INTO test_table1
  FROM user_objects;

  databaseArray := sys.odcinumberlist();
  FOR i IN 1..test_table1.COUNT LOOP
    databaseArray.extend;
    databaseArray(i) := test_table1(i);
  END LOOP;

  SELECT column_value
  BULK COLLECT INTO test_table2
  FROM TABLE(databaseArray);
END;
/

anonymous block completed

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2018-06-01
    • 2015-05-28
    相关资源
    最近更新 更多