「sys.all_objects」というOracleテーブルから文字列変数にクエリを取得しようとしているので、暗号化された文字列が「utl_file」に入力された後、入力として「dbms_obfuscation_toolkit.DESEncrypt」に渡すことができます。 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;
代わりにカーソルとBULKCOLLECTを使用してみてください: 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;
コードをチェックしませんでした
これは、A.B。ケイドの答えを明確にしたものにすぎません。カーソルは問題とは何の関係もありません。
の根本原因
PLS-00642: local collection types not allowed in SQL statements
is sql into
は、PL/SQL変数またはレコードでのみ使用できますが、PL/SQLコレクションでは使用できません。
PL/SQLコレクションでは、代わりにselect bulk collect into
を使用する必要があります。
(はい-エラーメッセージがより説明的である可能性があることに同意します。)
参照:
例
次の匿名ブロックは、select into
をコレクションで使用できないため、PLS-00642でコンパイルされます。
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;
/