4

我正在学习 Oracle SQL 开发人员。

我正在做的是从文件夹中逐行读取文本文件。然后将数据插入到 SQL 表中。

我能够编译我的 PROCEDURE,但是,它似乎没有将数据插入到文件中。

Create or Replace PROCEDURE Rfile is
f UTL_FILE.FILE_TYPE;
s VARCHAR2(200); 
BEGIN
f := UTL_FILE.FOPEN('C:\Projects\','testdatabinary.txt','R');
  IF UTL_FILE.IS_OPEN(f) THEN
    LOOP
      BEGIN
        UTL_FILE.GET_LINE(f,s);
        IF s IS NULL THEN
          EXIT;
        END IF;
      INSERT INTO DATAINSERT
      (COLUMN1, COLUMN2)
      VALUES
      (s, 'testdatabinary');
      END;
  END LOOP;
  COMMIT;
  END IF;
 END;

我有一个带有两个 varchar(200) 类型 cols 的表 DATAINSERT

我不太确定 PROCEDURE 未将数据插入表的原因

我刚刚检查了错误消息

Error starting at line 1 in command:
EXEC Rfile
ORA-29280: invalid directory path
ORA-06512: at "SYS.UTL_FILE", line 41
ORA-06512: at "SYS.UTL_FILE", line 478
ORA-06512: at "SYSTEM.RFILE", line 5
4

6 回答 6

9

不确定是什么导致了问题。对我来说,它的工作正常是我的示例代码


--参考网站--https ://community.oracle.com/thread/3633577?start=0&tstart = 0

     set serveroutput on;
     CREATE or replace DIRECTORY USER_DIR AS '/home/oracle'; 
     GRANT READ ON DIRECTORY USER_DIR TO PUBLIC;

     DECLARE 
        V1 VARCHAR2(200); --32767
        F1 UTL_FILE.FILE_TYPE; 
     BEGIN 
        F1 := UTL_FILE.FOPEN('USER_DIR','temp.txt','R'); 
        Loop
        BEGIN
    UTL_FILE.GET_LINE(F1,V1); 
    dbms_output.put_line(V1);
    EXCEPTION WHEN No_Data_Found THEN EXIT; END;
        end loop;

        IF UTL_FILE.IS_OPEN(F1) THEN
     dbms_output.put_line('File is Open');
        end if;

        UTL_FILE.FCLOSE(F1); 
     END; 
     /
    set serveroutput off;

于 2013-06-16T12:28:44.410 回答
8

您不能像这样直接输入文件打开命令的路径

f := UTL_FILE.FOPEN('C:\Projects\','testdatabinary.txt','R');

您必须使用以下 sql 查询创建目录,而不是直接输入路径

创建或替换 DIRECTORY USER_DIR AS 'C:\PROJECTS\';

然后在文件打开命令中输入目录名。会是这样

f := UTL_FILE.FOPEN('USER_DIR ','testdatabinary.txt','R');
于 2015-05-28T06:28:59.520 回答
1

第一个过程试图将文件从 PC 加载到服务器中,而在第二个过程中,文件是从服务器到服务器。UTL_FILE.FOPEN适用于服务器端 PL/SQL。所以第一个程序不会正确执行......如果你想将文件从 PC 加载到服务器,那么你需要使用任何前端,如 D@K 或 VB。

于 2014-06-04T05:39:57.493 回答
0

您在这里犯的错误是使用工作站路径,您实际上需要使用目录路径。

解决此问题的最快方法就是使用WINSCP命令。

使用WINSCP告诉您目录路径是什么,然后简单地用这个新信息替换代码中的旧路径,一切都应该正常。

于 2014-12-12T08:51:24.350 回答
-1

这是非常概念化和棘手的。您可以在下面找到更多概念和详细信息: https ://ora-data.blogspot.in/2016/11/read-and-writ-text-file-using-UTLFILE.html

当然会有所帮助:

create or replace procedure read_file is 
f_line varchar2(2000); 
f utl_file.file_type; 
f_dir varchar2(250); 
fname varchar2(50); 
Comma1 varchar(10); 
Comma2 varchar(10); 
Comma3 varchar(10); 
Comma4 varchar(10); 
Comma5 varchar(10); 
f_empno emp.empno%type; 
f_ename emp.ename%type; 
f_job emp.job%type; 
f_mgr emp.mgr%type; 
f_hiredate emp.hiredate%type; 
f_sal emp.sal%type; 
begin 
f_dir := ‘E:\PLSQL’; 
fname := ‘input.txt’; 
f := utl_file.fopen(‘UTL_FILE_DIR’,fname,’r’); –opening the file using fopen function 
loop 
begin 
utl_file.get_line(f,f_line); 
–using a loop continuously get the file’s content using get_line function exception when no_data_found then 
exit; 
end; 

Comma1 := INSTR(f_line, ‘,’ ,1 , 1); 
Comma2 := INSTR(f_line, ‘,’ ,1 , 2); 
Comma3 := INSTR(f_line, ‘,’ ,1 , 3); 
Comma4 := INSTR(f_line, ‘,’ ,1 , 4); 
Comma5 := INSTR(f_line, ‘,’ ,1 , 5);
–Each field in the input record is delimited by commas. 
–We need to find the location of two commas in the line. 
–and use the locations to get the field from the line. 
f_empno := to_number(SUBSTR(f_line, 1, Comma1-1)); 
f_ename := SUBSTR(f_line, Comma1+1, Comma2-Comma1-1); 
f_job := SUBSTR(f_line, comma2+1, Comma3-Comma2-1); 
f_mgr := to_number(SUBSTR(f_line, comma3+1, Comma4-Comma3-1)); 
f_hiredate := to_date(SUBSTR(f_line, comma4+1, Comma5-Comma4-1),’dd-mon-yyyy’); 
f_sal := to_number(SUBSTR(f_line, comma5+1),’99999′); dbms_output.put_line(f_empno ||’ ‘|| f_ename || ‘ ‘ || f_job || ‘ ‘ || f_mgr ||’ ‘ || f_hiredate||’ ‘|| f_sal); 
insert into emp12 VALUES (f_empno,f_ename,f_job,f_mgr,f_hiredate,f_sal); 
end loop; 
utl_file.fclose(f); 

commit; 

end; 

/ 
于 2017-04-20T13:59:30.370 回答
-2

首次登录

用户名:sys 作为 sysdba

密码应与用于用户“系统”的密码相同

现在输入

SQL> 将 UTL_FILE 上的执行权限授予 PUBLIC;

现在使用您要创建过程的任何用户登录

于 2015-10-08T07:47:44.970 回答