【问题标题】:Read text file to insert data into Oracle SQL table读取文本文件以将数据插入 Oracle SQL 表
【发布时间】:2013-01-27 05:14:16
【问题描述】:

我正在学习 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

【问题讨论】:

  • 你的第一行是NULL吗?您可以使用 dbms_output.put_line(s) 来查看它正在读取的内容。
  • 不是,是目录路径的问题。我检查并准确复制并粘贴了文件目录:(。但是,它仍然存在问题
  • 服务器上是否存在该文件/目录?没有发现代码有任何问题。
  • 是的!所以我创建了像“MYDIR”这样的路径名,然后像 f := UTL_FILE.FOPEN('MYDIR','testdatabinary.txt','R');
  • 然后我收到类似“01403.00000 - “未找到数据”的错误

标签: sql oracle11g oracle-sqldeveloper utl-file


【解决方案1】:

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


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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

          这是非常概念化和棘手的。您可以在下面找到更多概念和详细信息: 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; 
          
          / 
          

          【讨论】:

            【解决方案6】:

            第一次登录

            用户名:sys 作为 sysdba

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

            现在输入

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

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

            【讨论】:

            • 请说明对答案投反对票的原因
            • 我猜投反对票的原因是您的答案不符合问题? OP 收到的错误消息不是由于缺少 GRANT,而是由于调用不正确。
            猜你喜欢
            • 2019-01-09
            • 2021-12-30
            • 2016-01-15
            • 2012-12-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多