私は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
何が問題を引き起こしているのかわからない。私にとって、ここでうまく機能しているのは私のサンプルコードです
-参照サイト-- 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;
このようにファイルを開くコマンドへのパスを直接入力することはできません
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');
最初の手順ではファイルをPCからサーバーにロードしようとしますが、2番目の手順ではファイルはサーバーからサーバーへです。 UTL_FILE.FOPEN
サーバー側のPL/SQLで機能します。したがって、最初の手順は正しく実行されません... PCからサーバーにファイルをロードする場合は、D @KやVBなどのフロントエンドを使用する必要があります。
ここでの間違いはワークステーションパスの使用です。実際にはディレクトリパスを使用する必要があります。
これを解決する最も簡単な方法は、[〜#〜] winscp [〜#〜]コマンドを使用することです。
[〜#〜] winscp [〜#〜]を使用してディレクトリパスを指定し、この新しい情報をコード内の古いパスに置き換えるだけで、すべて正常に機能するはずです。