PL/SQL 错误 - 需要说明

Posted

技术标签:

【中文标题】PL/SQL 错误 - 需要说明【英文标题】:PL/SQL error - need instructions 【发布时间】:2014-10-29 10:05:40 【问题描述】:

我需要一些 pl/sql 错误的帮助。我需要编写函数 whitch 从文本文件中提取前三个数字并稍后使用。为此,我编写了以下代码:

CREATE OR REPLACE FUNCTION extract_dep
   (v_filename IN VARCHAR2)
   RETURN NUMBER
IS
   v_filehandle   UTL_FILE.FILE_TYPE;
   v_deptno       NUMBER;
   v_fileline     VARCHAR2(100);
BEGIN
   v_filehandle:=UTL_FILE.FOPEN('/home/oracle/vezba', v_filename, 'r');
   UTL_FILE.GET_LINE(v_filehandle, v_fileline);
   v_deptno:=TO_NUMBER(SUBSTR(v_fileline,1,3));
   UTL_FILE.FCLOSE(v_filehandle);
   RETURN v_deptno;
END extract_dep;
/

VARIABLE g_deptno NUMBER
EXECUTE :g_deptno:=extract_dep('POVECANJE.txt');

执行此操作后出现此错误

Function created
begin :g_deptno:=extract_dep('POVECANJE.txt'); end;
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at "HR.EXTRACT_DEP", line 9
ORA-06512: at line 1

“POVECANJE.txt”的内容是数字 100200。我应该做什么?我检查了文件路径,它是正确的。不知道该怎么办,所以如果有人知道解决方案,请告诉。 谢谢。

【问题讨论】:

【参考方案1】:

根据Oracle 11.2 "Supplied packages and types" documentation,utl_file.fopen() 函数中使用的目录规范必须是目录对象。换句话说,您不能在 .fopen() 调用中使用绝对路径,但需要由...定义一个目录(通常由您的 DBA,因为这些是“全局”数据库对象)...

create directory dir_vezba as '/home/oracle/vezba';

...并授予您用于文件导入的数据库用户...

grant read on directory dir_vezba to your_db_schema_name_here;

...并将目录对象用作.fopen() 调用的参数...

v_filehandle := UTL_FILE.FOPEN('DIR_VEZBA', v_filename, 'r');

如果您的 your_db_schema_here 用户具有 DBA 权限或 read any directory 权限,您可以省略 grant read on directory ... 部分。

【讨论】:

以上是关于PL/SQL 错误 - 需要说明的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL程序设计基础语法详解

调用 PL/SQL 函数

PL/SQL Developer结合oracle精简客户端配置说明

PL/SQL 错误问题

PL/SQL:语法错误

整理课堂笔记 pl/sql orcale异常