Bur*_*tar 14 sql oracle plsql 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;
Run Code Online (Sandbox Code Playgroud)
而错误是;
ORA-06550: line 7, column 12:
PLS-00642: local collection types not allowed in SQL statements
Run Code Online (Sandbox Code Playgroud)
关于解决这个问题的任何想法?
对于想要查看完整代码的人;
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;
Run Code Online (Sandbox Code Playgroud)
A.B*_*ade 14
尝试使用游标和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;
Run Code Online (Sandbox Code Playgroud)
没检查代码
use*_*735 10
这只是对ABCade答案的澄清.光标与问题无关.
根本原因
PLS-00642: local collection types not allowed in SQL statements
Run Code Online (Sandbox Code Playgroud)
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;
/
Run Code Online (Sandbox Code Playgroud)
以下匿名块编译正常:
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;
/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33278 次 |
| 最近记录: |