質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

受付中

Oracle PL/SQL の UTL_FILEによる操作がしたいです

ymrkm
ymrkm

総合スコア8

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

2回答

0評価

0クリップ

43693閲覧

投稿2016/06/29 07:40

編集2022/01/12 10:55

###前提・実現したいこと
Oracle database 12c と、SQL Developerを使用してPL/SQLの勉強中です。
UTL_FILEを使用して、ファイルの読み書きをしたいのですが、うまくいきませんでした。

作業&実行ユーザ:SCOTT(一般ユーザ)
OS:Windows7
作業:
SQL Developer(PL/SQL作成と実行)
コマンドプロンプトよりSQL*Plus(sysdba権限で権限付与)

エンジニア経験も浅い初心者ですが、
よろしくお願い致します。

###発生している問題・エラーメッセージ
データベースorcl.domainに接続中です。
ORA-29283: 無効なファイル操作です。
ORA-06512: "SYS.UTL_FILE", 行536
ORA-29283: 無効なファイル操作です。
ORA-06512: "SCOTT.FILE_UNLOAD_DEPT", 行9
ORA-06512: 行2
プロセスが終了しました。
データベースorcl.domainから切断中です。。

###UTL_FILE_DIR使用の場合

SQL

create or replace PROCEDURE UTL_FILE_DIR_WRITE_SAMPLE AS file_hand UTL_FILE.FILE_TYPE; dirname VARCHAR2(250); name VARCHAR2(250); BEGIN name := 'dept.txt'; dirname := 'C:\Users\ymrkm\Desktop\SCOTT'; file_hand := UTL_FILE.FOPEN(dirname ,name,'w', 32767); UTL_FILE.PUT_LINE(file_hand, 'hoge'); UTL_FILE.FCLOSE(file_hand); END;
**実行時のエラーメッセージ** データベースorcl.domainに接続中です。 ORA-29283: 無効なファイル操作です。 ORA-06512: "SYS.UTL_FILE", 行536 ORA-29283: 無効なファイル操作です。 ORA-06512: "SCOTT.FILE_UNLOAD_DEPT", 行9 ORA-06512: 行2 プロセスが終了しました。 データベースorcl.domainから切断中です。

###DIRECTORYオブジェクト使用の場合

SQL

CREATE OR REPLACE PROCEDURE file_unload_dept IS CURSOR dept_cur IS SELECT dname FROM dept; file_hand UTL_FILE.FILE_TYPE; name VARCHAR2(20); BEGIN SELECT sysdate INTO day FROM dual; name:='dept.txt'; file_hand:=UTL_FILE.FOPEN('UTL_DATA',name,'a'); FOR dept_rec IN dept_cur LOOP UTL_FILE.PUT_LINE(file_hand,dept_rec.dname); END LOOP; UTL_FILE.FCLOSE(file_hand); END;
**実行時のエラーメッセージ** データベースorcl.domainに接続中です。 ORA-29283: 無効なファイル操作です。 ORA-06512: "SYS.UTL_FILE", 行536 ORA-29283: 無効なファイル操作です。 ORA-06512: "SCOTT.FILE_UNLOAD_DEPT", 行9 ORA-06512: 行2 プロセスが終了しました。 データベースorcl.domainから切断中です。

###試したこと
・CREATE DIRECTORY -> SCOTTにディレクトリの権限付与
・SQLPlusでSCOTTに接続し、SQLPlusでfile_unload_deptを実行
・システム権限を再度付与(CREATE SESSION,ALTER SESSION,CREATE PROCEDURE,CREATE TRIGGER,CREATE SEQUENCE)
・'dept.txt'をあらかじめ用意してみた

###(追記)試したこと
UTL_FILE_DIRにディレクトリをセットし、
GRANT SELECT ON V_$PARAMETER2 TO SCOTT;もやってみたのですが、同様でした。
'dept.txt'が存在している状態で、FOPEN()の引数を'a'->'w'に変更したところ、
ORA-06512: "SYS.UTL_FILE", 行41 がなくなったのですが、他はそのままエラーとなっています。

###確認したこと(DIRECTORYオブジェクト)
(1)UTL_FILE.OPENの第一引数は「DIRECTORYオブジェクト」

"select * from all_directories;"より OWNER: SYS DIRECTORY_NAME: UTL_DATA DIRECTORY_PATH: C:\Users\ymrkm\Desktop\SCOTT ORIGIN_CON_ID: 0

(2)UTL_FILE.OPENの第ニ引数は「DIRECTORYオブジェクト」配下となるファイル名

C:\Users\ymrkm\Desktop\SCOTT\dept.txtのdept.txt

(3)上記DIRECTORYオブジェクトに対してスキーマが読み書きの権限があるか

GRANTEE: SCOTT OWNER: SYS TABLE_NAME: UTL_DATA GRANTOR: SYS PRIVILEGE: READ GRA: NO HIE: NO COM: NO TYPE: DIRECTORY
GRANTEE: SCOTT OWNER: SYS TABLE_NAME: UTL_DATA GRANTOR: SYS PRIVILEGE: WRITE GRA: NO HIE: NO COM: NO TYPE: DIRECTORY

以上です。
よろしくお願い致します。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。