web-dev-qa-db-ja.com

テキストファイルを読み取って、OracleSQLテーブルにデータを挿入します

私はOracleSQLDeveloperを勉強しています。

私がしているのは、フォルダからテキストファイルを1行ずつ読み取ることです。次に、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;

そして、2つのvarchar(200)型の列を持つテーブル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
Dc Redwing

何が問題を引き起こしているのかわからない。私にとって、ここでうまく機能しているのは私のサンプルコードです


-参照サイト-- https://community.Oracle.com/thread/3633577?start=0&tstart=

     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;

8
laks

このようにファイルを開くコマンドへのパスを直接入力することはできません

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

パスを直接入力する代わりに、以下のSQLクエリを使用してディレクトリを作成する必要があります

DIRECTORY USER_DIR AS'C:\ PROJECTS\'を作成または置換します。

次に、fileopenコマンドにディレクトリ名を入力します。こんな感じになります

f := UTL_FILE.FOPEN('USER_DIR ','testdatabinary.txt','R');
7
Nizar

最初の手順ではファイルをPCからサーバーにロードしようとしますが、2番目の手順ではファイルはサーバーからサーバーへです。 UTL_FILE.FOPENサーバー側のPL/SQLで機能します。したがって、最初の手順は正しく実行されません... PCからサーバーにファイルをロードする場合は、D @KやVBなどのフロントエンドを使用する必要があります。

1
Mahesh

ここでの間違いはワークステーションパスの使用です。実際にはディレクトリパスを使用する必要があります。

これを解決する最も簡単な方法は、[〜#〜] winscp [〜#〜]コマンドを使用することです。

[〜#〜] winscp [〜#〜]を使用してディレクトリパスを指定し、この新しい情報をコード内の古いパスに置き換えるだけで、すべて正常に機能するはずです。

0
Prince Sharma