当我运行它时,它会给我错误
ORA-00911:无效字符
CREATE OR REPLACE DIRECTORY CDATA AS 'D:\';
GRANT READ ON DIRECTORY CDATA TO PUBLIC;
DECLARE
MYFILE UTL_FILE.FILE_TYPE;
type array IS VARRAY(10) OF INTEGER;
arr array;
temp number;
curr number;
prev number;
n number;
BEGIN
MYFILE := UTL_FILE.FOPEN('CDATA','FILING.txt','W');
arr := array(98, 97, 78, 87, 92, 33, 12, 45, 45, 66);
n:= arr.count;
UTL_FILE.PUT(MYFILE, 'ORGANIZED DATA: ');
for i in 2..arr.count loop
curr:=i;
prev:=i-1;
while arr(prev) > arr(curr) loop
temp:= arr(curr);
arr(curr):= arr(prev);
arr(prev):= temp;
curr:= curr-1;
prev:= prev-1;
IF curr=1 THEN
EXIT;
END IF;
end loop;
end loop;
for i in 1.. arr.count loop
UTL_FILE.PUT_LINE(MYFILE, arr(i));
dbms_output.put_line(arr(i));
end loop;
UTL_FILE.FCLOSE(MYFILE);
END; //ORA-00911: invalid character
// File is not writting
无法将排序数据从插入算法
写入文件
答案 0 :(得分:0)
我将您的查询作为普通(公共)用户运行。 ORA-00911没有错误:无效字符。还有另一个错误,根据您运行的代码预期。当我以dba用户身份运行脚本时,根本没有错误。
第一种方法: 作为公共用户,您会收到第一个错误
"特权不足"
创建目录行时执行。然后你会得到
"目录不存在"
执行plsql脚本时。
这是因为,目录创建和授予脚本必须使用dba权限运行(这是一种特权,用户帐户就像' sys'拥有)。脚本的其余部分,即plsql块可以从公共用户运行。由于普通用户没有目录创建和授予权限,因此错误。
现在,如果您移动目录创建以授予与dba用户一起运行的行,它们将正常运行,上述2个错误将消失。然后,当您使用公共用户运行plsql块时,将出现第三个错误
"目录访问被拒绝"
。这是因为,在您的授权脚本中,您已将目录对象的读取访问权限授予public,而在您的plsql块中,您实际上是在写入它。要处理此问题,请将授权脚本修改为 -
GRANT READ,WRITE ON DIRECTORY CDATA TO PUBLIC;
第二种方法 您可以使用dba用户运行整个脚本,包括plsql块,您的脚本根本不会遇到任何错误。
我建议最好的方法是从dba用户运行目录创建和授予脚本,然后从普通的nondba用户运行plsql块,并按照上面的方式修改授权脚本。