programing

PL/SQL ORA-06550의 "로컬 수집 유형이 허용되지 않음" 오류

i4 2023. 6. 20. 21:22
반응형

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 intoPL/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

반응형