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つ連続したハイフン(--)から始まり、その行の末尾で終了するコメントである。行の中の任意の位置からコメントを開始することができる。

複数行コメント

複数行コメントとは、スラッシュとアスタリスク(/*)から始まり、アスタリスクとスラッシュ(*/)で終わるコメントである。行の中の任意の位置からコメントを開始することができる。単一行コメントと異なり、複数行に渡ってコメントを記述することができる。

演算子

代入演算子

変数に値を代入する演算子

変数名 := 式 ;

比較演算子

PL/SQLの比較演算子
演算子演算式意味
=式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 NULLIS NULL式がNULLである
LIKELIKE パターン式(文字値)がパターンに一致する
BETWEENBETWEEN 下限値 AND 上限値式が下限値から上限値の範囲に含まれる
ININ 集合式が集合のいずれかのメンバーと等しい

論理演算子

PL/SQLの論理演算子
演算子演算式意味
AND式1 AND 式2式1および式2ともTRUEである
OR式1 OR 式2式1または式2いずれか、または両方TRUEである
NOTNOT式がTRUEでない

PL/SQLのブール値の場合、TRUEとFALSE以外にNULLがある。NULLを含めた論理演算子の真理値表を次に示す。

ANDの真理値表
演算式結果
TRUE AND TRUETRUE
TRUE AND FALSEFALSE
TRUE AND NULLNULL
FALSE AND TRUEFALSE
FALSE AND FALSEFALSE
FALSE AND NULLFALSE
NULL AND TRUENULL
NULL AND FALSEFALSE
NULL AND NULLNULL
ORの真理値表
演算式結果
TRUE OR TRUETRUE
TRUE OR FALSETRUE
TRUE OR NULLTRUE
FALSE OR TRUETRUE
FALSE OR FALSEFALSE
FALSE OR NULLNULL
NULL OR TRUETRUE
NULL OR FALSENULL
NULL OR NULLNULL

NULLを含めたNOTの真理値表を次に示す。

NOTの真理値表
演算式結果
NOT TRUEFALSE
NOT FALSETRUE
NOT NULLNULL

連結演算子

連結演算子||)は、複数の文字列を連結する演算子である。たとえば、'pl' || 'sql'という演算式は'plsql'と評価される。

PL/SQLのデータ型

スカラー型

ファミリデータ型OracleTimesTen
NUMERICNUMBER
PLS_INTEGER
BINARY_FLOAT
BINARY_DOUBLE
CHARACTERCHAR
VARCHAR2
NCHAR
NVARCHAR2
BINARYRAW
BOOLEANBOOLEAN
DATETIMEDATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE×
TIMESTAMP WITH LOCAL TIME ZONE×
INTERVALINTERVAL YEAR TO MONTH
INTERVAL DAY TO SECONDS
ROWIDROWID
UROWID×

LOB型

データ型OracleTimesTen
BFILE×
BLOB×
CLOB×
NCLOB×

複合型

データ型OracleTimesTen
TABLE
RECORD

参照型

データ型OracleTimesTen
REF CURSOR

属性

%TYPE属性

既存表の列と同じデータ型または既存変数と同じデータ型として変数を宣言する場合、%TYPE属性を使用することができる。

表の列と同じデータ型として変数を宣言する構文を次に示す。

変数名 表名.列名%TYPE [ := 初期値 ] ;

他の変数と同じデータ型として変数を宣言する構文を次に示す。

変数名 変数名%TYPE [ := 初期値 ] ;

%TYPE属性の使用例を次に示す。

DECLARE
emp1 NUMBER;
emp2 emp1%TYPE;
emp3 employee.deptno%TYPE;

宣言部

宣言部はさまざまな定義や宣言を行う場所である。匿名PL/SQLブロックの場合、宣言部はDECLARE文から始まる。プロシージャまたはファンクションの場合、宣言部はIS(またはAS)句から始まる。宣言部にて行うことを次に示す。

変数の宣言

変数の宣言はDECLAREブロック内で行う。

変数名 [ CONSTANT ] データ型 [ NOT NULL ] [ := 初期値 ] ;
CONSTANT
CONSTANT句を指定すると、変数の値を変更できなくなる。つまり、定数となる。CONSTANT句を指定した場合、初期値を代入する必要がある。

NOT NULL
NOT NULL句を指定すると、変数にNULLを代入できなくなる。NOT NULL句を指定した場合、初期値を代入する必要がある。

データ型
PL/SQLのデータ型または%TYPE属性を指定する。

カーソルの宣言

CURSOR cursor_name [ ( parameter [ , parameter ] ... ) ] [ RETURN return_type ] IS select_query ;
cursor_name
カーソルの名前
parameter
カーソルのパラメータを次の構文で指定する。
parameter_name [ IN ] datatype [ { := | DEFAULT } expr ]
parameter_name
パラメータの名前
datatype
パラメータのデータ型
expr
パラメータの初期値
return_type
戻り値のデータ型
select_query
SELECT文
CURSOR csr1 IS SELECT empno, ename FROM employee WHERE salary > 3000;
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 EXCEPTION;

identifierには、ユーザー定義例外の識別子を指定する。

ユーザー定義例外の宣言を行う例を次に示す。

DECLARE
e_invalid EXCEPTION;

コレクションの定義

NESTED TABLEを定義する構文を次に示す。

TYPE type_name IS TABLE OF element_type [NOT NULL];
type_name
型指定子
element_type
PL/SQLのデータ型

varrayを定義する構文を次に示す。

TYPE type_name IS {VARRAY | VARYING ARRAY} (size_limit) OF element_type [NOT NULL];
type_name
型指定子
size_limit
最大サイズ
element_type
PL/SQLのデータ型

コレクションの宣言

type_name collection_name;
type_name
型指定子
collection_name
コレクション名

レコードの定義

レコードを宣言するには、あらかじめレコードを定義しておく必要がある。レコードの定義は次の構文で行う。

TYPE type_name IS RECORD (field_declaration[, field_declaration]...);
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 };
record_name
レコードの名前
type_name
型指定子
table_name%ROWTYPE
指定した表と同じフィールド(列)を持つレコードを宣言する。
DECLARE
  rec1 employees%TYPE;

BEGIN

SELECT文

問い合せ結果を変数に割り当てるには、SELECT文のINTO句に変数名を指定する。

SELECT
列名 [ , ... ]
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文

LOOPEND LOOPで囲まれた一連の文を無条件で繰り返す。

[<<label_name>>]
LOOP
  statement_sequence
END LOOP [label_name];

label_nameにはラベル(固有のループを識別するための名前)を指定する。

ループを終了するには、EXIT文を使用する。

EXIT [ label_name ] [ WHEN condition ] ;

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を必ず指定する。プロシージャで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ブロックには、発生した例外の種類によって異なる処理を記述できる。

事前定義済み例外

例外名エラー番号SQLCODEOracleTimesTen
ACCESS_INTO_NULLORA-06530-6530
CASE_NOT_FOUNDORA-06592-6592
COLLECTION_IS_NULLORA-06531-6531
CURSOR_ALREADY_OPENORA-06511 -6511
DUP_VAL_ON_INDEXORA-00001 -1
INVALID_CURSORORA-01001 -1001
INVALID_NUMBERORA-01722 -1722
LOGIN_DENIEDORA-01017 -1017not supported
NO_DATA_FOUNDORA-01403 +100
NOT_LOGGED_ONORA-01012 -1012not supported
PROGRAM_ERRORORA-06501 -6501
ROWTYPE_MISMATCHORA-06504 -6504
SELF_IS_NULLORA-30625 -30625not supported
STORAGE_ERRORORA-06500 -6500
SUBSCRIPT_BEYOND_COUNTORA-06533 -6533
SUBSCRIPT_OUTSIDE_LIMITORA-06532 -6532
SYS_INVALID_ROWIDORA-01410 -1410
TIMEOUT_ON_RESOURCEORA-00051 -51not supported
TOO_MANY_ROWSORA-01422 -1422
VALUE_ERROR ORA-06502 -6502
ZERO_DIVIDEORA-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文が行を戻さなかったときに発生する例外

COUNTMAXなどの集合関数を使用した場合、NO_DATA_FOUND例外は発生しない。たとえば、次のようなSQL文である。

SELECT MAX(salary) INTO max_salary FROM employee WHERE deptno = 2;

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文でユーザー定義例外を発生させることができる。

RAISE identifier;

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 カーソル名[(引数 [, ...])];
OPEN csr1;
OPEN csr2(salary, 4);

カーソルを使用したフェッチ

カーソルを利用したフェッチを行なうにはFETCH文を使用する。

FETCH カーソル名 INTO 変数名;
LOOP
  FETCH csr1 INTO my_record;
  EXIT WHEN csr1%NOTFOUND;
  -- データレコード処理
END LOOP;

結果セットや問い合わせの中の変数の値を変更する場合は、カーソルをクローズし、入力変数を新しい値にして、もう一度オープンする必要がある。

カーソルをクローズする

CLOSE カーソル名;

カーソル属性

明示的なカーソルおよびカーソル変数にはカーソル属性がある。カーソル属性はデータ操作文の実行に関する情報を戻す。

cursor.attribute
cursor_variable.attribute

%ISOPEN属性

カーソルがオープンされているか否かを示すカーソル属性

%ISOPEN属性
説明
TRUEカーソルがオープンされている
FALSEカーソルがオープンされていない

%FOUND属性

直前のフェッチが行を戻したかどうかを示すカーソル属性

%FOUND属性
説明
NULLカーソルがオープンされてからまだフェッチされていない
TRUE直前のフェッチが行を戻した
FALSE直前のフェッチが行を戻さなかった

%NOTFOUND属性

直前のフェッチが行を戻さなかったかどうかを示すカーソル属性

%NOTFOUND属性
説明
NULLカーソルがオープンされてからまだフェッチされていない
TRUE直前のフェッチが行を戻さなかった
FALSE直前のフェッチが行を戻した

%ROWCOUNT属性

これまでにフェッチした行数を示すカーソル属性

カーソルをオープンした状態では0であり、フェッチで行が戻されるたびに数値が増加する。

組み込みファンクション

PL/SQLには、データを操作するために役立つ様々なファンクションが用意されている。

SQLCODEファンクション

直前に呼び出された例外に対応付けられている番号コードを戻す。例外ハンドラの中でのみ有効で、例外ハンドラの外では常に0を戻す。

SQLCODE

戻り値

番号コード

サンプル

DECLARE
    sql_code NUMBER;
BEGIN
    ...
EXCEPTION
    WHEN OTHERS THEN
        sql_code := SQLCODE;
END;

SQLERRMファンクション

指定されたエラー番号に対応付けられているエラー・メッセージを戻す。エラー番号を省略した場合は、SQLCODEの現在値に対応付けられているエラー・メッセージを戻す。

SQLERRM[(err_number)]

パラメータ

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文を実行する。

GRANT EXECUTE ON SYS.DBMS_LOCK TO maimi;

または

GRANT execute_catalog_role TO maimi;

DBMS_LOCKパッケージのサブプログラム

DBMS_OUTPUTパッケージのサブプログラム
サブプログラム説明
SLEEP指定した秒数スリープする。
SLEEPプロシージャ

指定した秒数スリープする。

DBMS_LOCK.SLEEP(seconds IN NUMBER);

DBMS_OUTPUTパッケージ

PL/SQLブロックやサブプログラムからの出力を表示するストアド・プロシージャ群を含むパッケージ

DBMS_OUTPUTパッケージはPUBLICに対して実行権限が付与されている。したがって、すべてのユーザが実行可能である。

DBMS_OUTPUTからのメッセージの出力はバッファリングされ、PL/SQLプログラムの終了後に表示される。バッファリングされたメッセージを明示的にフラッシュする方法はない。

DBMS_OUTPUTパッケージのサブプログラム

DBMS_OUTPUTパッケージのサブプログラム
サブプログラム説明
DISABLEメッセージの出力を使用禁止にする。
ENABLEメッセージの出力を使用可能にする。
NEW_LINE改行する。
PUTメッセージを出力する(改行なし)。
PUT_LINEメッセージを出力して改行する。
DISABLEプロシージャ

メッセージの出力を使用禁止にする。

DBMS_OUTPUT.DISABLE;
ENABLEプロシージャ

メッセージの出力を使用可能にする。

DBMS_OUTPUT.ENABLE(buffer_size IN INTEGER DEFAULT 20000);
NEW_LINEプロシージャ

改行する。

DBMS_OUTPUT.NEW_LINE;
PUTプロシージャ

メッセージを出力する(改行なし)。

DBMS_OUTPUT.PUT(item IN VARCHAR2);
PUT_LINEプロシージャ

メッセージを1行表示する。

DBMS_OUTPUT.PUT_LINE(item IN VARCHAR2);
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パッケージを使用してファイルの読み取りや書き込みを行うには、あらかじめディレクトリのアクセス権限を設定する必要がある。ディレクトリのアクセス権限を設定する手順は次の通り。

  1. CREATE DIRECTORY文でディレクトリ・データベース・オブジェクトを作成する。
  2. GRANT文でディレクトリ・データベース・オブジェクトに関するオブジェクト権限をユーザーに付与する。

ディレクトリのアクセス権限を設定する例を次に示す。

CREATE DIRECTORY log_dir AS '/appl/log/';
GRANT READ ON DIRECTORY log_dir TO scott;

UTL_FILEパッケージのデータ型

UTL_FILEパッケージ固有のデータ型としてUTL_FILE.FILE_TYPEがある。

UTL_FILEパッケージの例外

UTL_FILEパッケージの例外
例外名説明
INVALID_PATHファイルの場所が無効
INVALID_MODEFOPENのopen_modeパラメータが無効
INVALID_FILEHANDLEファイル・ハンドルが無効
INVALID_OPERATION要求されたファイル操作ができない
READ_ERROR読み込み操作中にOSのエラーが発生
WRITE_ERROR書き込み操作中にOSのエラーが発生
INTERNAL_ERRORPL/SQLの内部エラー
CHARSETMISMATCHFOPEN_NCHARを使用してオープンしてnoncharファンクションを使用した
FILE_OPENファイルがオープンされているため要求された操作が失敗
INVALID_MAXLINESIZEFOPENのmax_linesize値が無効
INVALID_FILENAMEファイル名パラメータが無効
ACCESS_DENIEDファイルに対するアクセスが拒否された
INVALID_OFFSETオフセットが無効
DELETE_FAILEDファイルの削除に失敗
RENAME_FAILEDファイル名の変更に失敗

上記の例外の他に、事前定義済みのPL/SQL例外を発生させるときもある。

UTL_FILEパッケージのサブプログラム

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プロシージャ

オープンしているすべてのファイルをクローズするプロシージャ

UTL_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
書きこんだ後でバッファをフラッシュするか
SEO [PR] おまとめローン Windows7 冷え性対策 動画 掲示板 レンタルサーバー ライブチャット SEO