首页 > 解决方案 > 带有文件夹的 SQL 开发人员中的错误

问题描述

我已经使用 sql developer 创建了一个文件夹,例如命令“创建或替换文件夹......” MY_DIR 是我的文件夹的名称。我的错误在第 21 行:“l_fichier_log := utl_file.fopen(w_repertoire, w_fichier, 'w');”

create or replace PROCEDURE JSP

AS

   CURSOR C_donnees IS
      select distinct CODPRO, MOTCLE,CODZN6,CODZN8
      From PRO WHERE CODZN6 = 'C' AND CODSOC = '1';

   w_sysdate varchar2(20);
   w_repertoire varchar2(64);
   w_fichier varchar2(80);
   l_fichier_log      utl_file.file_type;

BEGIN

   SELECT To_Char(SysDate, 'YYYYMMDD_HH24MISS') DATEJOUR INTO w_sysdate FROM Dual;

   w_repertoire := 'MY_DIR';
   w_fichier := 'extraction_'||w_sysdate||'.csv';
   dbms_output.put_line('D‚but de la boucle');
   l_fichier_log  := utl_file.fopen( w_repertoire, w_fichier, 'w');
   
   FOR r_donnees IN c_donnees
   LOOP
      utl_file.put_line(l_fichier_log, r_donnees.CODPRO || ';' || r_donnees.MOTCLE    || ';' || r_donnees.CODZN6 || ';' || r_donnees.CODZN8 );
   END LOOP;

   UTL_FILE.fclose_all;
   dbms_output.put_line('FIN du script');
   
END;

错误是:

ORA-29283: opération non valide sur le fichier
ORA-06512: à "SYS.UTL_FILE", ligne 536
ORA-29283: opération non valide sur le fichier
ORA-06512: à "SYS.UTL_FILE", ligne 41
ORA-06512: à "SYS.UTL_FILE", ligne 478
ORA-06512: à "C##JLECAT.JSP", ligne 21
ORA-06512: à ligne 2

你能帮我吗 ?

谢谢 !

标签: sqloracle

解决方案


除了创建一个目录(不是“文件夹”;它是directory,一个 Oracle 对象)之外,您还应该向将要使用它的用户授予权限。

因此,以 SYS 身份连接(就像您创建该目录时一样),运行例如

grant read, write on directory my_dir to julien;

(或任何用户名)。


我测试了你的代码;它在我的数据库上正常工作,并授予我的 SCOTT 用户权限。我在游标中使用了 DUAL 表,因为我没有你的表。

SQL> CREATE OR REPLACE PROCEDURE jsp
  2  AS
  3     CURSOR c_donnees IS SELECT dummy FROM DUAL;
  4
  5     w_sysdate      VARCHAR2 (20);
  6     w_repertoire   VARCHAR2 (64);
  7     w_fichier      VARCHAR2 (80);
  8     l_fichier_log  UTL_FILE.file_type;
  9  BEGIN
 10     SELECT TO_CHAR (SYSDATE, 'YYYYMMDD_HH24MISS') datejour
 11       INTO w_sysdate
 12       FROM DUAL;
 13
 14     w_repertoire := 'MY_DIR';
 15     w_fichier := 'extraction_' || w_sysdate || '.csv';
 16     DBMS_OUTPUT.put_line ('D but de la boucle');
 17     l_fichier_log := UTL_FILE.fopen (w_repertoire, w_fichier, 'w');
 18
 19     FOR r_donnees IN c_donnees
 20     LOOP
 21        UTL_FILE.put_line (l_fichier_log, r_donnees.dummy);
 22     END LOOP;
 23
 24     UTL_FILE.fclose_all;
 25     DBMS_OUTPUT.put_line ('FIN du script');
 26  END;
 27  /

Procedure created.

测试:

SQL> EXEC jsp;
D but de la boucle
FIN du script

PL/SQL procedure successfully completed.

SQL>

因此,您一定做错了什么。


推荐阅读