前提・実現したいこと
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
UTL_FILE パッケージの使い方 (UTL_FILE_DIR 編) とぱっと見比べると、ALTER SYSTEM SET UTL_FILE_DIR ... が抜けています。
上記のサンプルを参考に1ステップずつきちんと実行してみては?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
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
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/06/29 18:15
UTL_FILE_DIRにディレクトリをセットし、
GRANT SELECT ON V_$PARAMETER2 TO SCOTT;もやってみたのですが、同様でした。
'dept.txt'が存在している状態で、FOPEN()の引数を'a'->'w'に変更したところ、
ORA-06512: "SYS.UTL_FILE", 行41 がなくなったのですが、他はそのままエラーとなっています。
2016/06/30 06:25
って書いたのですが。
UTL_FILE.FOPENの部分で
ymrkmさんのコードは
>file_hand:=UTL_FILE.FOPEN('UTL_DATA',name,'a');
ですが、
わたしが提示したコードは
> vHandle := UTL_FILE.FOPEN(vDirname ,vFilename,'r', 32767);
とvDirnameでディレクトリのパスを指定しています。
UTL_FILE.FOPEN をマニュアルで確認されましたか?
http://docs.oracle.com/cd/E57425_01/121/ARPLS/u_file.htm#i1003526
2016/06/30 08:22
失礼いたしました。
create directoryしたUTL_DATAを使用するのをやめて、
設定したUTL_FILE_DIRと同じpathを'vDirname'と同様に変数に入れて、FOPENの変数としています。
2016/06/30 10:57
2016/06/30 14:25
練習問題の内容そのままなので、短いですがこれで全文です。
エラーコードも全文です。
utl_file_dirとcreate directoryの2パターンです。
2016/07/01 09:32
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