【问题标题】:Using local table type in SELECT statement without specified index在没有指定索引的 SELECT 语句中使用本地表类型
【发布时间】:2016-07-12 10:14:27
【问题描述】:

有没有办法在SELECT语句的IN子句中使用本地表类型而不指定表类型的索引?

DECLARE
    TYPE temp_rec_TYPE IS RECORD (
        n_temp_id NUMBER
    );

    TYPE temp_tab_TYPE IS TABLE OF temp_rec_TYPE INDEX BY PLS_INTEGER;
    temp_tab temp_tab_TYPE;

    n_temp_id2 NUMBER;
BEGIN
    temp_tab(1).n_temp_id := 1;

    FOR temp_rec IN (SELECT * FROM example_table WHERE id IN temp_tab)
    LOOP
        NULL;
    END LOOP;
END;

执行返回 'PLS-00382: 表达式类型错误'

【问题讨论】:

标签: oracle plsql


【解决方案1】:

不,SQL 表达式只能引用在 SQL 范围(不是 PL/SQL 范围 - 即不在包或 PL/SQL 块中)生成的类型。

你想要的是这样的:

CREATE TYPE number_list IS TABLE OF NUMBER;
/

DECLARE
  temp_tab number_list;
BEGIN
  temp_tab := number_list( 1 );

  FOR temp_rec IN (SELECT * FROM example_table WHERE id MEMBER OF temp_tab)
  LOOP
    NULL;
  END LOOP;
END;
/

【讨论】:

    【解决方案2】:

    只要在包规范中定义了 PL/SQL 类型,您就可以在 Oracle 12c 中执行此操作。这是一个例子:

    CREATE OR REPLACE PACKAGE matt_p1 AS
      TYPE temp_rec_type IS RECORD (n_temp_id NUMBER);
      TYPE temp_tab_type IS TABLE OF temp_rec_type
        INDEX BY PLS_INTEGER;
    
    END matt_p1;
    /
    
    DECLARE
    
      temp_tab     matt_p1.temp_tab_type;
    
      n_temp_id2   NUMBER;
    BEGIN
      SELECT object_id
      BULK COLLECT INTO temp_tab
      FROM  dba_objects 
      WHERE OBJECT_NAME LIKE 'DBA_TAB%';
    
      FOR temp_rec IN (SELECT object_name
                       FROM   dba_objects
                       WHERE  object_id IN ( SELECT n_temp_id FROM TABLE(temp_tab))) LOOP
        dbms_output.put_line(temp_rec.object_name);
      END LOOP;
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-19
      • 1970-01-01
      • 2011-09-29
      • 2015-10-20
      • 2011-07-07
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多