17

我试图从名为“sys.all_objects”的oracle表中获取一个查询到一个字符串变量中,所以我可以将它作为输入提供给“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;
4

4 回答 4

17

这只是对 ABCade 答案的澄清。光标与问题无关。

的根本原因

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

issql 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;
/
于 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 回答
-1

试试这个:

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;
于 2021-08-30T19:10:39.757 回答