在 select 语句中使用类型 "is table of"

Using type "is table of" in a select statement

我正在尝试创建一个 select 语句来 select 在之前的 select 语句中 select 的字段,按照下面的代码(使用 oracle 11g ):

    Declare 
    type NumberArray IS TABLE OF Number;
    v_medium NumberArray;
    v_medium_final NumberArray := NumberArray(); 
    v_count number;
    type VarcharArray IS TABLE OF VARCHAR2(60);
    v_Type VarcharArray
    --Select all Regions and Locality affected by the fault
    cursor Locality_cur is
      Select LocalityCode from AvaFaultLocality where FAULTID=36841 and SITEID=1;
      Locality_rec Locality_cur%ROWTYPE;
    cursor Region_cur is
      Select RegionCode  from avafaultregion where FAULTID=36841 and SITEID=1;
      Region_rec Region_cur%ROWTYPE;
Begin
      v_count := 1; 
      FOR Region_rec IN Region_cur
      LOOP
        dbms_output.put_line(Region_rec.RegionCode);
        Select RECIPIENTMEDIUMID BULK COLLECT into v_medium from  AvaRecipientAreaRegion where RegionCode = Region_rec.RegionCode;

       FOR idx IN 1..v_medium.COUNT LOOP
         v_medium_final.extend(); 
         v_medium_final(v_count) := v_medium(idx); 
         dbms_output.put_line(TO_CHAR(v_medium(idx)));
         v_count:= v_count + 1;
       END LOOP;  
       dbms_output.put_line('End Loop for Region '||Region_rec.RegionCode);     
      END LOOP;
      dbms_output.put_line(TO_CHAR(v_medium_final.count));
      Select MEDIUMTYPECODE BULK COLLECT into v_Type from AvaRecipientMedium where RECIPIENTMEDIUMID in (SELECT * FROM TABLE(v_medium_final)); <--- Line with problem
End;

我主要想做的是select所有地区的内容,循环这个结果,得到这些地区所有地方的内容,然后得到每个地方的所有RecipientMediumID并添加结果在一个名为 v_medium_final 的变量中。这部分工作完美。 问题是当我尝试将此 selection 的结果用于 select RecipientMedium table 中的值时,其中所有值都在变量 v_medium_final.

我尝试使用:

Select MEDIUMTYPECODE BULK COLLECT into v_Type from AvaRecipientMedium where RECIPIENTMEDIUMID in (SELECT * FROM TABLE(v_medium_final));

Select MEDIUMTYPECODE BULK COLLECT into v_Type from AvaRecipientMedium where RECIPIENTMEDIUMID in v_medium_final;

但我总是遇到错误:

 [Error] Execution (32: 126): ORA-06550: line 32, column 126:
PLS-00642: local collection types not allowed in SQL statements
ORA-06550: line 32, column 120:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 32, column 7:
PL/SQL: SQL Statement ignored

对于第二种情况: [错误] 执行 (32:106):ORA-06550:第 32 行,第 106 列:

PLS-00642: local collection types not allowed in SQL statements

如错误所示,您不能使用本地集合类型。您需要使用在 SQL 级别定义的集合类型。

CREATE TYPE NumberArray
    AS TABLE OF NUMBER;

DECLARE
  v_medium NumberArray;
  ...

这将要求您拥有 CREATE TYPE 权限,这意味着您的类型定义将对任何有权限查看它的人可见,而不是仅在您的 PL/SQL 块范围内.

就个人而言,我会避免在不是 VARRAY 的集合类型的名称中使用 Array,因为名称可能会造成混淆。如果我看到类型 NumberArray,我会猜测它被定义为 VARRAY(n) OF NUMBER 而不是嵌套的 table 类型。对嵌套的 table 类型使用 ntt 后缀似乎更明智 (create type number_ntt as table of number)。