sql - 带有文件夹的 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
你能帮我吗 ?
谢谢 !
解决方案
除了创建一个目录(不是“文件夹”;它是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>
因此,您一定做错了什么。
推荐阅读
- python - 使用 GEKKO 求解约束 x(0) + x(2) =0 的最优控制问题
- c# - 实例化为 GameObject 和实例化为 Transform 之间的区别
- mongodb - MongoDB:按日期和其他值分组
- spring-boot - 在微服务中存储数据库用户名和密码的最佳方法是什么
- r - 如何创建与全名单词的前 9 个字符匹配的条件?
- powerbi - 根据 Power bi 中经过身份验证的用户有条件地显示仪表板
- laravel - 使用地图后 Laravel 集合为空
- html5-canvas - Phaser 3. 导入 phaser/src/core/Game 在运行时产生错误
- python - 从另一个数据框的行值设置数据框索引
- android - 如何在 Jetpack Compose 中将图像 URL 设置为线圈上的错误占位符