在 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
)。
我正在尝试创建一个 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
)。