아래 코드에 따라 (oracle 11g 사용) 이전 select 문에서 선택한 필드를 선택하는 select 문을 만들려고합니다.
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;
주로 내가하려는 것은 모든 지역의 콘텐츠를 선택하고이 결과를 반복하여 해당 지역의 모든 지역 콘텐츠를 가져온 다음 각 지역의 모든 RecipientMediumID를 가져와 v_medium_final이라는 변수에 결과를 추가하는 것입니다. 이 부분은 완벽하게 작동합니다. 문제는이 선택의 결과를 사용하여 모든 값이 v_medium_final 변수에있는 RecipientMedium 테이블의 값을 선택하려고 할 때입니다.
나는 사용을 시도한다 :
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 블록의 범위 만 가지고있는 것이 아니라 볼 수있는 권한이있는 모든 사람이 유형 정의를 볼 수 있습니다.
개인적으로 나는 단순히 이름이 혼란 스러울 수 있기 때문에 Array
컬렉션 유형의 이름을 사용 하지 않을 것 VARRAY
입니다. 유형 이 표시되면 중첩 테이블 유형 NumberArray
이 VARRAY(n) OF NUMBER
아닌 것으로 정의 된 것 같습니다 . ntt
중첩 테이블 유형에 접미사를 사용하는 것이 더 합리적으로 보입니다 ( create type number_ntt as table of number
).
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다