17

「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;
4

4 に答える 4

17

これは、ABCAD の回答を明確にするだけです。カーソルは問題とは関係ありません。

の根本原因

PLS-00642: local collection types not allowed in SQL statements

これは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;
/
于 2015-03-30T15:06:54.520 に答える
15

代わりにカーソルと 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;

コードをチェックしなかった

于 2011-12-10T18:33:26.130 に答える
0

実行を成功させるには、以下のブロックを使用するだけです。

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;
于 2021-05-09T03:18:16.420 に答える