2014-10-29 52 views
0

我需要一些pl/sql错误的帮助。我需要编写函数从文本文件中提取第三个数字并在以后使用它。要做到这一点,我写了这个代码:PL/SQL错误 - 需要说明

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'); 

执行此之后,我得到这个错误“POVECANJE.txt”的是什么,我应该做的数字100200.

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 

内容?我检查了文件路径,它是正确的。不知道该怎么做,所以如果有人知道解决方案,请告诉。 谢谢。

回答

2

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

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 ...部分。