目次
PL/SQLの概要
宣言部
実行部
例外処理部
カーソル
組み込みファンクション
システム・パッケージ
PL/SQLの概要
PL/SQL(Procedural Language Extention to SQL)は、非手続き型言語であるSQLに、手続き型言語拡張を施したものである。PL/SQLはOracle DatabaseやOracle TimesTen In-Memory Databaseで使用することができる。
PL/SQLブロック
PL/SQLブロックは、宣言部および実行部、例外処理部に分かれていて、この順序で記述する。このうち、宣言部と例外処理部は省略可能で、実行部は必ず存在しなければならない。
DECLARE
宣言部
BEGIN
実行部
EXCEPTION
例外処理部
END;
宣言部はDECLARE
文から始まり、変数やカーソル、ユーザー定義例外の宣言を行なう。
実行部はBEGIN
文から始まり、PL/SQLステートメントを記述する。
例外処理部はEXCEPTION
文から始まり、エラーが起こったときに実行する処理を記述する。
PL/SQLブロックはEND
文で終了する。
ステートメント
PL/SQLのステートメント(文)はセミコロンで終了する。
コメント
PL/SQLプログラム中にコメントを入れることができる。コメントとは、ユーザーのためにプログラムの使用方法や注意事項といった注釈を記述することであり、PL/SQLプログラムの実行には何の影響も及ぼさない。
コメントの記述スタイルとして、単一行コメントと複数行コメントの2種類がある。
単一行コメント
単一行コメントとは、2つ連続したハイフン(--
)から始まり、その行の末尾で終了するコメントである。行の中の任意の位置からコメントを開始することができる。
複数行コメント
複数行コメントとは、スラッシュとアスタリスク(/*
)から始まり、アスタリスクとスラッシュ(*/
)で終わるコメントである。行の中の任意の位置からコメントを開始することができる。単一行コメントと異なり、複数行に渡ってコメントを記述することができる。
演算子
代入演算子
変数に値を代入する演算子
比較演算子
演算子 | 演算式 | 意味 |
---|---|---|
= | 式1 = 式2 | 式1と式2が等しい |
<> | 式1 <> 式2 | 式1と式2が等しくない |
!= | 式1 != 式2 | |
~= | 式1 ~= 式2 | |
^= | 式1 ^= 式2 | |
< | 式1 < 式2 | 式1が式2より小さい |
> | 式1 > 式2 | 式1が式2より大きい |
<= | 式1 <= 式2 | 式1が式2より大きいか、等しい |
>= | 式1 >= 式2 | 式1が式2より小さいか、等しい |
IS NULL | 式 IS NULL | 式がNULLである |
LIKE | 式 LIKE パターン | 式(文字値)がパターンに一致する |
BETWEEN | 式 BETWEEN 下限値 AND 上限値 | 式が下限値から上限値の範囲に含まれる |
IN | 式 IN 集合 | 式が集合のいずれかのメンバーと等しい |
論理演算子
演算子 | 演算式 | 意味 |
---|---|---|
AND | 式1 AND 式2 | 式1および式2ともTRUEである |
OR | 式1 OR 式2 | 式1または式2いずれか、または両方TRUEである |
NOT | NOT 式 | 式がTRUEでない |
PL/SQLのブール値の場合、TRUEとFALSE以外にNULLがある。NULLを含めた論理演算子の真理値表を次に示す。
演算式 | 結果 |
---|---|
TRUE AND TRUE | TRUE |
TRUE AND FALSE | FALSE |
TRUE AND NULL | NULL |
FALSE AND TRUE | FALSE |
FALSE AND FALSE | FALSE |
FALSE AND NULL | FALSE |
NULL AND TRUE | NULL |
NULL AND FALSE | FALSE |
NULL AND NULL | NULL |
演算式 | 結果 |
---|---|
TRUE OR TRUE | TRUE |
TRUE OR FALSE | TRUE |
TRUE OR NULL | TRUE |
FALSE OR TRUE | TRUE |
FALSE OR FALSE | FALSE |
FALSE OR NULL | NULL |
NULL OR TRUE | TRUE |
NULL OR FALSE | NULL |
NULL OR NULL | NULL |
NULLを含めたNOT
の真理値表を次に示す。
演算式 | 結果 |
---|---|
NOT TRUE | FALSE |
NOT FALSE | TRUE |
NOT NULL | NULL |
連結演算子
連結演算子(||
)は、複数の文字列を連結する演算子である。たとえば、'pl' || 'sql'
という演算式は'plsql'
と評価される。
PL/SQLのデータ型
スカラー型
ファミリ | データ型 | Oracle | TimesTen |
---|---|---|---|
NUMERIC | NUMBER | ○ | ○ |
PLS_INTEGER | ○ | ○ | |
BINARY_FLOAT | ○ | ○ | |
BINARY_DOUBLE | ○ | ○ | |
CHARACTER | CHAR | ○ | ○ |
VARCHAR2 | ○ | ○ | |
NCHAR | ○ | ○ | |
NVARCHAR2 | ○ | ○ | |
BINARY | RAW | ○ | ○ |
BOOLEAN | BOOLEAN | ○ | ○ |
DATETIME | DATE | ○ | ○ |
TIMESTAMP | ○ | ○ | |
TIMESTAMP WITH TIME ZONE | ○ | × | |
TIMESTAMP WITH LOCAL TIME ZONE | ○ | × | |
INTERVAL | INTERVAL YEAR TO MONTH | ○ | ○ |
INTERVAL DAY TO SECONDS | ○ | ○ | |
ROWID | ROWID | ○ | ○ |
UROWID | ○ | × |
LOB型
データ型 | Oracle | TimesTen |
---|---|---|
BFILE | ○ | × |
BLOB | ○ | × |
CLOB | ○ | × |
NCLOB | ○ | × |
複合型
データ型 | Oracle | TimesTen |
---|---|---|
TABLE | ○ | ○ |
RECORD | ○ | ○ |
参照型
データ型 | Oracle | TimesTen |
---|---|---|
REF CURSOR | ○ | ○ |
属性
%TYPE属性
既存表の列と同じデータ型または既存変数と同じデータ型として変数を宣言する場合、%TYPE
属性を使用することができる。
表の列と同じデータ型として変数を宣言する構文を次に示す。
他の変数と同じデータ型として変数を宣言する構文を次に示す。
%TYPE属性の使用例を次に示す。
emp1 NUMBER;
emp2 emp1%TYPE;
emp3 employee.deptno%TYPE;
宣言部
宣言部はさまざまな定義や宣言を行う場所である。匿名PL/SQLブロックの場合、宣言部はDECLARE
文から始まる。プロシージャまたはファンクションの場合、宣言部はIS
(またはAS
)句から始まる。宣言部にて行うことを次に示す。
変数の宣言
変数の宣言はDECLAREブロック内で行う。
- CONSTANT
- CONSTANT句を指定すると、変数の値を変更できなくなる。つまり、定数となる。CONSTANT句を指定した場合、初期値を代入する必要がある。
- NOT NULL
- NOT NULL句を指定すると、変数にNULLを代入できなくなる。NOT NULL句を指定した場合、初期値を代入する必要がある。
- データ型
- PL/SQLのデータ型または
%TYPE
属性を指定する。
カーソルの宣言
- cursor_name
- カーソルの名前
- parameter
- カーソルのパラメータを次の構文で指定する。
parameter_name [ IN ] datatype [ { := | DEFAULT } expr ]
- parameter_name
- パラメータの名前
- datatype
- パラメータのデータ型
- expr
- パラメータの初期値
- return_type
- 戻り値のデータ型
- select_query
- SELECT文
CURSOR csr2 RETURN employee%ROWTYPE IS SELECT * FROM employee WHERE deptno = 4;
CURSOR csr3 (p_sal NUMBER DEFAULT 0) IS SELECT * FROM employee WHERE salary > p_sal;
ユーザー定義例外の宣言
ユーザー定義例外を使用する場合は、DECLARE
ブロックでユーザー定義例外の宣言を行う。ユーザー定義例外の宣言を行う構文を次に示す。
identifierには、ユーザー定義例外の識別子を指定する。
ユーザー定義例外の宣言を行う例を次に示す。
e_invalid EXCEPTION;
コレクションの定義
NESTED TABLEを定義する構文を次に示す。
- type_name
- 型指定子
- element_type
- PL/SQLのデータ型
varrayを定義する構文を次に示す。
- type_name
- 型指定子
- size_limit
- 最大サイズ
- element_type
- PL/SQLのデータ型
コレクションの宣言
- type_name
- 型指定子
- collection_name
- コレクション名
レコードの定義
レコードを宣言するには、あらかじめレコードを定義しておく必要がある。レコードの定義は次の構文で行う。
- type_name
- 型指定子
- field_declaration
- フィールドの宣言を次の構文で行う。
field_name field_type [[NOT NULL] {:= | DEFAULT} expr]
- field_name
- フィールドの名前
- field_type
- フィールドのデータ型
NOT NULL
- NULLになることができない制約を付ける。
NOT NULL
制約を付ける場合、初期値を指定しなければならない。 - expr
- 初期値を表す式
レコードの宣言
レコードを宣言するには、あらかじめレコードを定義しておく必要がある。レコードの宣言は次の構文で行う。
- record_name
- レコードの名前
- type_name
- 型指定子
- table_name
%ROWTYPE
- 指定した表と同じフィールド(列)を持つレコードを宣言する。
DECLARE rec1 employees%TYPE;
BEGIN
SELECT文
問い合せ結果を変数に割り当てるには、SELECT文のINTO句に変数名を指定する。
列名 [ , ... ]
INTO
変数名 [ , ... ]
FROM 表名 WHERE 条件
IF文
IF condition1 THEN statement_sequence1 [ELSIF condition2 THEN statement_sequence2] [ELSE statement_sequence3] END IF;
CASE文
CASE WHEN 条件式1 THEN -- 条件式1が真のとき実行するステートメント WHEN 条件式2 THEN -- 条件式2が真のとき実行するステートメント WHEN 条件式n THEN -- 条件式nが真のとき実行するステートメント ELSE -- 条件式1〜nがすべて偽のとき実行するステートメント END CASE;
LOOP文
LOOP
とEND LOOP
で囲まれた一連の文を無条件で繰り返す。
[<<label_name>>] LOOP statement_sequence END LOOP [label_name];
label_nameにはラベル(固有のループを識別するための名前)を指定する。
ループを終了するには、EXIT
文を使用する。
label_nameには、ループのラベルを指定する。label_nameを省略した場合は、1番内側のループを終了する。
conditionには、ループを終了する条件式を指定する。
LOOP IF count < 0 THEN EXIT; END IF; count := count + 1; EXIT WHEN count > 100; END LOOP;
WHILE文
WHILE 条件式 LOOP -- 条件式が真のとき実行するステートメント END LOOP;
FOR
FOR counter IN [ REVERSE ] low..high LOOP statements_sequence END LOOP;
- counter
- カウンタの識別子
- low
- カウンタの開始値(下限値)
- high
- カウンタの終了始値(上限値)
RETURN
文
RETURN
文は、サブプログラムの実行を終了させ、コールした側に制御を戻す。サブプログラムの中に複数のRETURN
文が存在してもよい。
プロシージャはRETURN
文が無くても実行部の最後でサブプログラムを終了して、コールした側に制御が戻る。ファンクションは実行部の最後に至るまでに必ずRETURN
文が必要である。
RETURN
文の構文を次に示す。
ファンクションでRETURN
文を使用する場合、ファンクションの戻り値を表す式expressionを必ず指定する。プロシージャでRETURN
文を使用する場合、expressionは指定できない。
カーソルFOR
ループ
FOR record_name IN cursor_name LOOP -- process END LOOP;
- record_name
- レコード名。暗黙的に宣言されているので、あらかじめ宣言部で明示的に宣言する必要はない。
- cursor_name
- カーソル名
カーソルFOR
ループ内でrecord_name.
column_nameで列の値を参照することができる。
EXCEPTION
例外とは、プログラム実行中に起こるPL/SQLエラーである。例外が発生すると、呼び出した環境によって例外が処理されるが、PL/SQLのEXCEPTIONブロックに独自の処理を記述することもできる。
EXCEPIONブロックには、発生した例外の種類によって異なる処理を記述できる。
事前定義済み例外
例外名 | エラー番号 | SQLCODE | Oracle | TimesTen |
---|---|---|---|---|
ACCESS_INTO_NULL | ORA-06530 | -6530 | ○ | ○ |
CASE_NOT_FOUND | ORA-06592 | -6592 | ○ | ○ |
COLLECTION_IS_NULL | ORA-06531 | -6531 | ○ | ○ |
CURSOR_ALREADY_OPEN | ORA-06511 | -6511 | ○ | ○ |
DUP_VAL_ON_INDEX | ORA-00001 | -1 | ○ | ○ |
INVALID_CURSOR | ORA-01001 | -1001 | ○ | ○ |
INVALID_NUMBER | ORA-01722 | -1722 | ○ | ○ |
LOGIN_DENIED | ORA-01017 | -1017 | ○ | not supported |
NO_DATA_FOUND | ORA-01403 | +100 | ○ | ○ |
NOT_LOGGED_ON | ORA-01012 | -1012 | ○ | not supported |
PROGRAM_ERROR | ORA-06501 | -6501 | ○ | ○ |
ROWTYPE_MISMATCH | ORA-06504 | -6504 | ○ | ○ |
SELF_IS_NULL | ORA-30625 | -30625 | ○ | not supported |
STORAGE_ERROR | ORA-06500 | -6500 | ○ | ○ |
SUBSCRIPT_BEYOND_COUNT | ORA-06533 | -6533 | ○ | ○ |
SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | -6532 | ○ | ○ |
SYS_INVALID_ROWID | ORA-01410 | -1410 | ○ | ○ |
TIMEOUT_ON_RESOURCE | ORA-00051 | -51 | ○ | not supported |
TOO_MANY_ROWS | ORA-01422 | -1422 | ○ | ○ |
VALUE_ERROR | ORA-06502 | -6502 | ○ | ○ |
ZERO_DIVIDE | ORA-01476 | -1476 | ○ | ○ |
ACCESS_INTO_NULL
プログラムが未初期化(アトミックNULL)オブジェクトの属性に値を代入しようとしたときに発生する例外
CASE_NOT_FOUND
CASE
文のWHEN
句が何も選択されておらず、ELSE
句もないときに発生する例外
COLLECTION_IS_NULL
プログラムがEXISTS 以外のコレクション・メソッドを未初期化(アトミックNULL)のNESTED TABLE またはvarray に適用しようとしたか、または未初期化のNESTED TABLE またはvarray の要素に値を代入しようとしたときに発生する例外。
CURSOR_ALREADY_OPEN
すでにオープンされているカーソルをオープンしようとしたときに発生する例外。カーソルをオープンするには、一度クローズする必要がある。カーソルFOR
ループは、参照するカーソルを自動的にオープンするため、ループの内側ではカーソルをオープンできない。
DUP_VAL_ON_INDEX
UNIQUE 索引によって制約されているデータベース列に、重複した値を格納しようとしたときに発生する例外
INVALID_CURSOR
オープンされていないカーソルをクローズするなど、不正なカーソル操作を実行しようとしたときに発生する例外
INVALID_NUMBER
SQL文の中で文字列が正しい数値を表していなかったために、文字列から数値への変換が失敗したときに発生する例外
LOGIN_DENIED
不正なユーザー名/ パスワードでOracle にログオンしようとしたときに発生する例外
NO_DATA_FOUND
SELECT INTO
文が行を戻さなかったときに発生する例外
COUNT
やMAX
などの集合関数を使用した場合、NO_DATA_FOUND
例外は発生しない。たとえば、次のようなSQL文である。
NOT_LOGGED_ON
Oracle に接続していないプログラムが、データベース・コールを発行したときに発生する例外
PROGRAM_ERROR
PL/SQL に内部的な問題が発生したときに発生する例外
ROWTYPE_MISMATCH
1 つの代入の中に含まれるホスト・カーソル変数とPL/SQL カーソル変数の戻り型に互換性がない場合に発生する例外
SELF_IS_NULL
NULL インスタンスでMEMBER メソッドをコールしようとしたときに発生する例外
STORAGE_ERROR
PL/SQL のメモリーが足りない場合、またはメモリーが破壊されている場合に発生する例外
SUBSCRIPT_BEYOND_COUNT
コレクション中の要素数より大きい索引番号を使用してNESTED TABLE またはvarray の要素を参照した場合に発生する例外
SUBSCRIPT_OUTSIDE_LIMIT
有効範囲外(たとえば-1)の索引番号を使用してNESTED TABLE またはvarray の要素を参照した場合に発生する例外
SYS_INVALID_ROWID
文字列が正しいROWID を表していなかったために、文字列から汎用ROWID への変換が失敗した場合に発生する例外
TIMEOUT_ON_RESOURCE
Oracle がリソースを求めて待機しているときにタイムアウトが発生した場合に発生する例外
TOO_MANY_ROWS
SELECT INTO
文が複数の行を戻したときに発生する例外
VALUE_ERROR
算術エラー、変換エラー、切捨てエラー、 またはサイズ制約エラーが発生したときに発生する例外
ZERO_DIVIDE
数値をゼロで割ろうとしたときに発生する例外
ユーザー定義例外
独自の例外を定義して、例外を明示的に発生させたり、その例外が発生したときに行う処理を記述することができる。
RAISE文でユーザー定義例外を発生させることができる。
identifierには、DECLARE
ブロックで宣言済みのユーザー定義例外識別子を指定する。
DECLARE v_code NUMBER := 9999; v_name VARCHAR2(32) := 'Test'; e_invalid EXCEPTION; BEGIN UPDATE tokyo1 SET name = v_name WHERE code = v_code; IF SQL%NOTFOUND THEN RAISE e_invalid -- ユーザー定義例外発生 END IF; EXCEPTION WHEN e_invalid THEN -- ユーザー定義例外の処理 DBMS_OUTPUT.PUT_LINE('No such code'); DBMS_OUTPUT.PUT_LINE(SQLERRM); DBMS_OUTPUT.PUT_LINE(SQLCODE); END; /
WHEN
WHEN { identifier | OTHERS } THEN statement; [ ... ]
identifierには事前定義済み例外の識別子かユーザー定義例外の識別子を指定する。
statementには、identifierで指定した例外が発生したときの処理を記述する。
DECLARE per NUMBER(3,1); BEGIN SELECT price / earnings INTO per FROM stocks WHERE code = 4716; INSERT INTO stats (code, ratio) VALUES (4716, per); COMMIT; EXCEPTION WHEN ZERO_DIVIDE THEN INSERT INTO stats (code, ratio) VALUES (4716, NULL); COMMIT; WHEN OTHERS THEN ROLLBACK; END;
WHEN
文には例外が発生したときの処理を指定するが、特定の例外が発生したときに何もしないようにするにはNULL
文を使用する。
EXCEPTION WHEN NO_DATA_FOUND THEN NULL; -- 何もしない
発生した例外をもう一度発生させて、コールした環境に例外を通知するには、RAISE
文を使用する。
EXCEPTION WHEN NO_DATA_FOUND THEN RAISE; -- 呼び出し元に同じ例外情報を伝播する
OR
演算子を用いて、複数の例外を対象とすることもできる。
EXCEPTION WHEN DUP_VAL_ON_INDEX OR NO_DATA_FOUND THEN RETURN -1;
カーソル
カーソルをオープンする
OPEN csr2(salary, 4);
カーソルを使用したフェッチ
カーソルを利用したフェッチを行なうにはFETCH
文を使用する。
LOOP FETCH csr1 INTO my_record; EXIT WHEN csr1%NOTFOUND; -- データレコード処理 END LOOP;
結果セットや問い合わせの中の変数の値を変更する場合は、カーソルをクローズし、入力変数を新しい値にして、もう一度オープンする必要がある。
カーソルをクローズする
カーソル属性
明示的なカーソルおよびカーソル変数にはカーソル属性がある。カーソル属性はデータ操作文の実行に関する情報を戻す。
%ISOPEN
属性
カーソルがオープンされているか否かを示すカーソル属性
値 | 説明 |
---|---|
TRUE | カーソルがオープンされている |
FALSE | カーソルがオープンされていない |
%FOUND
属性
直前のフェッチが行を戻したかどうかを示すカーソル属性
値 | 説明 |
---|---|
NULL | カーソルがオープンされてからまだフェッチされていない |
TRUE | 直前のフェッチが行を戻した |
FALSE | 直前のフェッチが行を戻さなかった |
%NOTFOUND
属性
直前のフェッチが行を戻さなかったかどうかを示すカーソル属性
値 | 説明 |
---|---|
NULL | カーソルがオープンされてからまだフェッチされていない |
TRUE | 直前のフェッチが行を戻さなかった |
FALSE | 直前のフェッチが行を戻した |
%ROWCOUNT
属性
これまでにフェッチした行数を示すカーソル属性
カーソルをオープンした状態では0であり、フェッチで行が戻されるたびに数値が増加する。
組み込みファンクション
PL/SQLには、データを操作するために役立つ様々なファンクションが用意されている。
SQLCODE
ファンクション
直前に呼び出された例外に対応付けられている番号コードを戻す。例外ハンドラの中でのみ有効で、例外ハンドラの外では常に0を戻す。
戻り値
番号コード
サンプル
DECLARE sql_code NUMBER; BEGIN ... EXCEPTION WHEN OTHERS THEN sql_code := SQLCODE; END;
SQLERRM
ファンクション
指定されたエラー番号に対応付けられているエラー・メッセージを戻す。エラー番号を省略した場合は、SQLCODE
の現在値に対応付けられているエラー・メッセージを戻す。
パラメータ
- err_number
- エラー番号
戻り値
エラー・メッセージ
サンプル
DECLARE sql_errm VARCHAR2(150); BEGIN ... EXCEPTION WHEN OTHERS THEN sql_errm := SQLERRM; END;
システム・パッケージ
Oracle DatabaseやTimesTen In-Memory Databaseでは、PL/SQLアプリケーションの構築を支援するために、製品固有のシステム・パッケージが用意されている。
DBMS_ALERT
パッケージ
データベース内の特定の値が変更されたときに、データベース・トリガーを使用してアプリケーションに警告するストアド・プロシージャ群を含むパッケージ
DBMS_LOCK
パッケージ
DBMS_LOCK
パッケージはOracleロックマネージメントサービスへのインタフェースを提供する。
DBMS_LOCK
パッケージはexecute_catalog_role
ロールに対して実行権限が付与されている。したがって、DBMS_LOCK
パッケージを実行するには、あらかじめ実行権限またはexecute_catalog_role
ロールをユーザに付与しておく必要がある。たとえば、SYSユーザで接続して次のSQL文を実行する。
または
DBMS_LOCK
パッケージのサブプログラム
サブプログラム | 説明 |
---|---|
SLEEP | 指定した秒数スリープする。 |
SLEEP
プロシージャ
指定した秒数スリープする。
DBMS_OUTPUT
パッケージ
PL/SQLブロックやサブプログラムからの出力を表示するストアド・プロシージャ群を含むパッケージ
DBMS_OUTPUT
パッケージはPUBLICに対して実行権限が付与されている。したがって、すべてのユーザが実行可能である。
DBMS_OUTPUT
からのメッセージの出力はバッファリングされ、PL/SQLプログラムの終了後に表示される。バッファリングされたメッセージを明示的にフラッシュする方法はない。
DBMS_OUTPUT
パッケージのサブプログラム
サブプログラム | 説明 |
---|---|
DISABLE | メッセージの出力を使用禁止にする。 |
ENABLE | メッセージの出力を使用可能にする。 |
NEW_LINE | 改行する。 |
PUT | メッセージを出力する(改行なし)。 |
PUT_LINE | メッセージを出力して改行する。 |
DISABLE
プロシージャ
メッセージの出力を使用禁止にする。
ENABLE
プロシージャ
メッセージの出力を使用可能にする。
NEW_LINE
プロシージャ
改行する。
PUT
プロシージャ
メッセージを出力する(改行なし)。
PUT_LINE
プロシージャ
メッセージを1行表示する。
SQL> SET SERVEROUTPUT ON SQL> BEGIN 2 DBMS_OUTPUT.PUT_LINE('Hello world'); 3 END; 4 / Hello world PL/SQLプロシージャが正常に完了しました。 SQL>
DBMS_PIPE
プロシージャ
名前付きパイプを通じて異なるセッション間で通信するストアド・プロシージャ群を含むパッケージ
UTL_FILE
パッケージ
PL/SQLプログラムでOSのテキスト・ファイルを読み書きするストアド・プロシージャ群を含むパッケージ
Oracle DatabaseでUTL_FILE
パッケージを使用してファイルの読み取りや書き込みを行うには、あらかじめディレクトリのアクセス権限を設定する必要がある。ディレクトリのアクセス権限を設定する手順は次の通り。
CREATE DIRECTORY
文でディレクトリ・データベース・オブジェクトを作成する。GRANT
文でディレクトリ・データベース・オブジェクトに関するオブジェクト権限をユーザーに付与する。
ディレクトリのアクセス権限を設定する例を次に示す。
GRANT READ ON DIRECTORY log_dir TO scott;
UTL_FILE
パッケージのデータ型
UTL_FILE
パッケージ固有のデータ型としてUTL_FILE.FILE_TYPE
がある。
UTL_FILE
パッケージの例外
例外名 | 説明 |
---|---|
INVALID_PATH | ファイルの場所が無効 |
INVALID_MODE | FOPENのopen_modeパラメータが無効 |
INVALID_FILEHANDLE | ファイル・ハンドルが無効 |
INVALID_OPERATION | 要求されたファイル操作ができない |
READ_ERROR | 読み込み操作中にOSのエラーが発生 |
WRITE_ERROR | 書き込み操作中にOSのエラーが発生 |
INTERNAL_ERROR | PL/SQLの内部エラー |
CHARSETMISMATCH | FOPEN_NCHAR を使用してオープンしてnoncharファンクションを使用した |
FILE_OPEN | ファイルがオープンされているため要求された操作が失敗 |
INVALID_MAXLINESIZE | FOPENのmax_linesize値が無効 |
INVALID_FILENAME | ファイル名パラメータが無効 |
ACCESS_DENIED | ファイルに対するアクセスが拒否された |
INVALID_OFFSET | オフセットが無効 |
DELETE_FAILED | ファイルの削除に失敗 |
RENAME_FAILED | ファイル名の変更に失敗 |
上記の例外の他に、事前定義済みのPL/SQL例外を発生させるときもある。
UTL_FILE
パッケージのサブプログラム
サブプログラム | 説明 |
---|---|
FCLOSE | ファイルをクローズする。 |
FCLOSE_ALL | オープンしているすべてのファイルをクローズする。 |
FOPEN | ファイルをオープンする。 |
GET_LINE | ファイルからテキストを1行読み取る。 |
PUT_LINE | ファイルへテキストを1行書き出す。 |
FCLOSE
プロシージャ
ファイルをクローズするプロシージャ
UTL_FILE.FCLOSE ( file IN OUT UTL_FILE.FILE_TYPE )
パラメータ
- file
- ファイル・ハンドル
FCLOSE_ALL
プロシージャ
オープンしているすべてのファイルをクローズするプロシージャ
FOPEN
ファンクション
ファイルをオープンしてファイル・ハンドルを戻すファンクション
UTL_FILE.FOPEN ( location IN VARCHAR2, filename IN VARCHAR2, open_mode IN VARCHAR2, max_linesize IN BINARY_INTEGER ) RETURN UTL_FILE.FILE_TYPE
パラメータ
- location
- ディレクトリのパス名
- filename
- ファイル名(ディレクトリのパス名を除く)
- open_mode
- ファイルのオープン方法
open_mode 説明 r テキストの読み出し w テキストの書き込み a テキストの追加 rb バイトの読み出し wb バイトの書き込み ab バイトの追加 - max_linesize
- ファイルの1行あたりの文字数(改行文字を含む)
戻り値
オープンしたファイルのファイル・ハンドル
GET_LINE
プロシージャ
ファイルからテキストを1行読み取るプロシージャ
UTL_FILE.GET_LINE ( file IN UTL_FILE.FILE_TYPE, buffer OUT VARCHAR2, len IN PLS_INTEGER DEFAULT NULL )
パラメータ
- file
- ファイル・ハンドル
- buffer
- ファイルから読み出した行を格納するバッファ
- len
- ファイルから読み出すバイト数
PUT_LINE
プロシージャ
ファイルへテキストを1行書き出すプロシージャ
UTL_FILE.PUT_LINE ( file IN UTL_FILE.FILE_TYPE, buffer IN VARCHAR2, autoflush IN BOOLEAN DEFAULT FALSE )
パラメータ
- file
- ファイル・ハンドル
- buffer
- ファイルに書き込む行
- autoflush
- 書きこんだ後でバッファをフラッシュするか