读取文本文件以将数据插入Oracle SQL表

时间:2013-02-12 00:15:02

标签: sql oracle11g oracle-sqldeveloper utl-file

我正在研究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;

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

我不确定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

6 个答案:

答案 0 :(得分:8)

不确定导致问题的原因。对我来说,这里的工作正常是我的示例代码


- 参考站点 - 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;

答案 1 :(得分:7)

您无法直接输入文件打开命令的路径,如此

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

使用 WINSCP 告诉您目录路径是什么,然后只需将此新信息替换为您的代码中的旧路径,一切都应该正常。

答案 4 :(得分:-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; 

/ 

答案 5 :(得分:-2)

首次登录

用户名:sys as sysdba

密码应与用户' system'

相同

现在输入

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

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