PL/SQL ORA-06550의 "로컬 수집 유형이 허용되지 않음" 오류
오라클 테이블에서 "message"라는 쿼리를 가져오려고 합니다.all_message"를 문자열 변수로 변환하여 "dbms_message_message"에 전달할 수 있습니다.DES Encrypt"를 입력하면 암호화된 문자열이 "utl_file"에 들어가 txt 파일에 쓸 수 있습니다.
제가 이 코드로 쿼리를 시도할 때 문제가 있습니다.
DECLARE
TYPE name_array is array(50) OF varchar2(100);
var_input name_array;
BEGIN
SELECT owner
INTO var_input
FROM sys.all_objects;
FOR i IN var_input.FIRST .. var_input.LAST
LOOP
dbms_output.put_line(var_input(i));
END LOOP;
END;
오류는 다음과 같습니다.
ORA-06550: line 7, column 12:
PLS-00642: local collection types not allowed in SQL statements
이 문제를 극복하는 것에 대해 생각해 본 적이 있습니까?
전체 코드를 보고 싶은 사람들을 위해;
CREATE OR REPLACE DIRECTORY data AS 'd:\folder';
GRANT read, write ON DIRECTORY data TO PUBLIC;
DECLARE
var_input varchar2(64) := 'Rndminpt';
var_key varchar2(16) := 'Anahtar1';
var_enc varchar2(1024);
var_dec varchar2(1024);
var_file utl_file.file_type;
BEGIN
-- (query part)
dbms_obfuscation_toolkit.DESEncrypt(
input_string => var_input,
key_string => var_key,
encrypted_string => var_enc);
dbms_output.put_line('Encrypted...');
var_file := utl_file.fopen('DATA','textfile.txt','W');
utl_file.put_line(var_file,var_enc);
utl_file.fclose(var_file);
dbms_output.put_line('Writen in to text... ');
END;
이것은 A.B.에 대한 해명일 뿐입니다.케이드의 대답.커서는 문제와 관련이 없습니다.
의 근본 원인
PLS-00642: local collection types not allowed in SQL statements
이라sql into
PL/SQL 변수 또는 레코드에만 사용할 수 있으며 PL/SQL 컬렉션에는 사용할 수 없습니다.
PL/SQL 컬렉션을 사용할 경우select bulk collect into
대신.
(예 - 오류 메시지가 더 설명적일 수 있다는 데 동의합니다.)
참고 항목:
예
다음 익명 블록은 다음과 같은 이유로 PLS-00642와 컴파일됩니다.select into
컬렉션과 함께 사용할 수 없습니다.
declare
type dual_list_t is table of dual%rowtype;
v_duals dual_list_t;
begin
select *
into v_duals
from dual
connect by level <= 2
;
end;
/
다음 익명 블록은 정상적으로 컴파일됩니다.
declare
type dual_list_t is table of dual%rowtype;
v_duals dual_list_t;
begin
select *
bulk collect into v_duals
from dual
connect by level <= 2
;
end;
/
대신 커서와 BULK COLLECT를 사용해 보십시오. http://www.dba-oracle.com/t_oracle_bulk_collect.htm
다음과 같이 보여야 합니다.
DECLARE
TYPE name_array is array(50) OF varchar2(100);
var_input name_array;
cursor c1 is
SELECT owner
FROM sys.all_objects;
BEGIN
open c1;
fetch c1 bulk collect into var_input;
close c1;
FOR i IN var_input.FIRST .. var_input.LAST
LOOP
dbms_output.put_line(var_input(i));
END LOOP;
END;
코드를 확인하지 않았습니다.
아래 지정된 블록을 사용하여 성공적으로 실행하십시오.
DECLARE
TYPE name_array is array(50) OF varchar2(100);
var_input name_array;
BEGIN
SELECT owner Bulk Collect
INTO var_input
FROM sys.all_objects;
FOR i IN var_input.FIRST .. var_input.LAST
LOOP
dbms_output.put_line(var_input(i));
END LOOP;
END;
사용해 보십시오.
DECLARE
TYPE name_array IS ARRAY(50) OF VARCHAR2(100);
var_input name_array := name_array();
idx NUMBER := 1;
BEGIN
var_input.extend;
SELECT owner INTO var_input (idx) FROM sys.all_objects WHERE object_id = 540;
FOR i IN var_input.first..var_input.last LOOP
dbms_output.put_line(var_input(i));
END LOOP;
END;
또는 다음과 같습니다.
DECLARE
TYPE name_array IS TABLE OF VARCHAR2(100) INDEX BY VARCHAR2(50);
var_input name_array;
BEGIN
FOR x IN 535..546 LOOP
SELECT owner INTO var_input (x) FROM sys.all_objects WHERE object_id = x;
END LOOP;
FOR i IN var_input.first..var_input.last LOOP
dbms_output.put_line(var_input(i));
END LOOP;
END;
언급URL : https://stackoverflow.com/questions/8458806/local-collection-types-not-allowed-error-in-pl-sql-ora-06550
'programing' 카테고리의 다른 글
TFS 빌드에서 뷰 빌드가 실패한 후 ASP.NET MVC 1.0 (0) | 2023.06.25 |
---|---|
Firebase(Phone Auth) iOS 오류 가져오기: 사용자 지정 URL 체계 등록 (0) | 2023.06.25 |
가장 긴 연속 우승 기록 찾기 (0) | 2023.06.20 |
Erno 32 파이프가 부러지는 것을 어떻게 예방합니까? (0) | 2023.06.20 |
텐서 흐름을 가져올 때 다음 오류가 발생합니다. 'numpy.core._multiarray_umath'라는 모듈이 없습니다. (0) | 2023.06.20 |