Ошибка локальных типов коллекций в PL/SQL ORA-06550
Я пытаюсь получить запрос из таблицы oracle с именем "sys.all_objects"
в строковую переменную, поэтому я могу передать ее "dbms_obfuscation_toolkit.DESEncrypt" в качестве входных данных, после чего зашифрованная строка войдет в "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;
Ответы
Ответ 1
Попробуйте использовать курсоры и 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;
Не проверял код
Ответ 2
Это просто разъяснение для ответа A.B.Cade. Курсор не имеет ничего общего с проблемой.
Основная причина
PLS-00642: local collection types not allowed in SQL statements
is 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;
/