我需要一些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.我该怎么办?我检查了文件路径,这是正确的。不知道该怎么做,所以如果有人知道解决方案请告诉。 感谢。
答案 0 :(得分:2)
根据Oracle 11.2 "Supplied packages and types" documentation,utl_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 ...
部分。