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

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

ただいまの
回答率

90.11%

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

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 21K+

ymrkm

score 6

前提・実現したいこと

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使用の場合

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オブジェクト使用の場合

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にディレクトリの権限付与
・SQL*PlusでSCOTTに接続し、SQL*Plusで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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

UTL_FILE パッケージの使い方 (UTL_FILE_DIR 編) とぱっと見比べると、ALTER SYSTEM SET UTL_FILE_DIR ... が抜けています。
上記のサンプルを参考に1ステップずつきちんと実行してみては?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/30 10:57

    コードは必要最小限の内容をきちんと載せないで省かれてもわかりません。エラー・メッセージも表示されたものをそのまま載せてください。

    キャンセル

  • 2016/06/30 14:25

    コードをそのまま全部載せるようにさせていただきました。
    練習問題の内容そのままなので、短いですがこれで全文です。
    エラーコードも全文です。
    utl_file_dirとcreate directoryの2パターンです。

    キャンセル

  • 2016/07/01 09:32

    UTL_FILE の使い方 (DIRECTORY 編)
    http://www.shift-the-oracle.com/plsql/utl_file/create-directory.html

    tnsnames.oraの HOST = localhost となっていますか?
    tns1 =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = xxxxxxxx)
    )
    )

    テキストファイルに出力するだけなら、
    cd C:\Users\ymrkm\Desktop\SCOTT
    sqlplus / as sysdba
    set は省略
    spool dept.txt
    SELECT dname FROM dept;
    spool off

    キャンセル

0

未検証ですので外しているかもしれませんが、以下の条件が満たされているか確認して見てください。

  • UTL_FILE.OPENの第一引数は「DIRECTORYオブジェクト」
  • UTL_FILE.OPENの第ニ引数は「DIRECTORYオブジェクト」配下となるファイル名
  • 上記DIRECTORYオブジェクトに対してスキーマが読み書きの権限があるか
  • UTL_FILE.OPENで利用するファイルに対して、Oracle実行ユーザにOSレベルで読み書き権限があるか

また、Oracle12cではUTL_FILE_DIRの利用よりもDIRECTORYオブジェクトの利用が推奨されているようです。

http://docs.oracle.com/cd/E49329_01/appdev.121/b71281/u_file.htm
セキュリティ・モデル


※質問文のソースコードはコードタグでくくると読みやすくなりますよ。

CREATE OR REPLACE ....
  // hogehoge

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/30 14:22

    回答ありがとうございます。
    教えていただいた確認事項は本分にて追記させていただきました。
    ただし、1点だけ、
    >UTL_FILE.OPENで利用するファイルに対して、Oracle実行ユーザにOSレベルで読み書き権限があるか
    申し訳ありません、こちらについてはよくわからなかったのですが……、
    下記のものとは別でしょうか……?


    SQL> SELECT * FROM dba_sys_privs WHERE GRANTEE='SCOTT'

    GRANT PRIVILEGE ADM COM
    ----- ---------------------------------------- --- ---
    SCOTT CREATE TABLE NO NO
    SCOTT UNLIMITED TABLESPACE NO NO
    SCOTT ALTER SESSION NO NO
    SCOTT DEBUG CONNECT SESSION NO NO
    SCOTT CREATE TRIGGER NO NO
    SCOTT CREATE SESSION NO NO
    SCOTT DEBUG ANY PROCEDURE NO NO
    SCOTT CREATE PROCEDURE NO NO
    SCOTT CREATE SEQUENCE NO NO

    キャンセル

  • 2016/07/01 00:05

    >UTL_FILE.OPENで利用するファイルに対して、Oracle実行ユーザにOSレベルで読み書き権限があるか

    「OSレベルで」とはOracle上ではなく、通常のファイルへの権限を意味しました。
    Oracleサーバプロセスが該当ファイル(やディレクトリ)にアクセスできないと同様のエラーが発生するかと思います。

    確認ですが、Oracleデータベースはご自身のPCにインストールして実行していますか?それともWindows上に仮想環境を構築して実行していますか?それともWindowsとは異なる別のサーバに構築して実行していますか?
    ※Oracleデータベースサーバがどこにあるか、という意味合いです。
     tnsnames.oraに指定されている「HOST」はどこを指していますか?

    キャンセル

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

  • ただいまの回答率 90.11%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる