我想在oracle 10g上运行此代码,但它给了我一个错误

时间:2016-05-19 05:17:09

标签: oracle

当我运行它时,它会给我错误

  

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
  

无法将排序数据从插入算法

写入文件

1 个答案:

答案 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块,并按照上面的方式修改授权脚本。