在没有指定索引的SELECT语句中使用本地表类型

时间:2016-07-12 10:14:28

标签: oracle plsql

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

module Sequel
  module JDBC
    module Oracle
      module DatabaseMethods
        def schema_column_type(db_type)
        end
      end
    end
  end
end

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

2 个答案:

答案 0 :(得分:0)

不,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;
/

答案 1 :(得分:0)

只要在包规范中定义了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;