ヘッダーをスキップ

Oracle Database PL/SQLユーザーズ・ガイドおよびリファレンス
10g リリース2(10.2)

B19257-01
目次
目次
索引
索引

戻る 次へ

13 PL/SQLの言語要素

この章は、PL/SQL構文および方法のクイック・リファレンス・ガイドです。コマンド、パラメータおよびその他の言語要素を組み合せてPL/SQL文を作成する方法を示します。また、使用上の注意および例へのリンクも示します。

PL/SQL文の構文は、構文図を左から右、上から下の順に読んでください。この図は、バッカス正規形(BNF)の結果を表しています。この図では、四角形の中はキーボード、円の中はデリミタ、楕円の中は識別子です。各図は、構文の要素を定義しています。図を通るパスは、それぞれがその要素のフォームとして考えられるものを表しています。矢印の向きに進んでください。線がループ状になっている場合は、そのループ内の要素を繰り返すことができます。

この章の項目は、次のとおりです。


代入文

代入文は、変数、フィールド、パラメータまたは要素の現在の値を設定します。代入文は、代入のターゲットと、それに続く代入演算子および式で構成されています。代入文を実行すると、式が評価され、結果の値がターゲットに格納されます。詳細は、「変数への値の代入」を参照してください。

構文

assignment statement ::=

画像の説明

キーワードとパラメータの説明

attribute_name

オブジェクト型の属性を指定します。名前はそのオブジェクト型の中で一意である必要があります(他のオブジェクト型内では使用できます)。属性の宣言内では、代入演算子またはDEFAULT句を使用しての属性の初期化はできません。また、属性にNOT NULL制約を課すことはできません。

collection_name

現行の有効範囲のうち、これより前の部分で宣言されているネストした表、索引付き表またはVARRAYを指定します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。カーソル変数に代入できるのは、別のカーソル変数の値のみです。

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。最も単純な式は、1個の変数で構成されています。expressionの構文は、「式定義」を参照してください。代入文を実行すると、式が評価され、結果の値が代入のターゲットに格納されます。値とターゲットのデータ型には互換性が必要です。

field_name

ユーザー定義のレコードまたは%ROWTYPEレコード内のフィールドを指定します。

host_cursor_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されるカーソル変数を識別します。ホスト・カーソル変数のデータ型は、PL/SQLカーソル変数の戻り型と互換性があります。ホスト変数には、接頭辞としてコロンを付けてください。

host_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡される変数を識別します。ホスト変数には、接頭辞としてコロンを付けてください。

index

戻される値がPLS_INTEGER型の値、BINARY_INTEGER型の値、またはそのデータ型に暗黙的に変換可能な値になる数値式です。

indicator_name

PL/SQLホスト環境で宣言され、PL/SQLに渡される標識変数を識別します。標識変数には、接頭辞としてコロンを付ける必要があります。標識変数は、関連付けられたホスト変数の値または条件を示します。たとえば、Oracleプリコンパイラ環境では、標識変数を使用して出力ホスト変数内のNULLや切り捨てられた値を検出できます。

object_name

現行の有効範囲のうち、これより前の部分で宣言されているオブジェクト型のインスタンスを識別します。

parameter_name

代入文が使用されているサブプログラムの仮パラメータOUTまたはIN OUTを識別します。

record_name

現行の有効範囲のうち、これより前に宣言されているユーザー定義のレコードまたは%ROWTYPEレコードを識別します。

variable_name

現行の有効範囲の中で事前に宣言されているPL/SQL変数を識別します。

使用上の注意

デフォルトでは、宣言で初期化されていない変数は、ブロックまたはサブプログラムに入るたびにNULLに初期化されます。変数を式の中で使用する前に、その変数に値を代入する必要があります。

NOT NULLと定義されている変数にはNULLを代入できません。NULLを代入しようとすると、PL/SQLは事前定義の例外VALUE_ERRORを呼び出します。ブール変数に代入できるのは、値TRUEFALSEおよびNULLのみです。比較またはその他のテスト結果をブール変数に代入できます。

式の値をレコード内の特定のフィールドに代入できます。レコード内のすべてのフィールドに一度に値を代入できます。PL/SQLでは、レコードの宣言で同じカーソルまたは表が参照されている場合は、レコード全体の間での集計代入ができます。例1-2「代入演算子を使用した変数への値の代入」に、レコード内のすべてのフィールドの値を別のレコードにコピーする方法を示します。

コレクション名に添字を付けると、式の値をコレクションの特定の要素に代入できます。

例13-1に、値を宣言し、値を変数に代入する様々な方法を示します。

例13-1    宣言および変数への値の代入

DECLARE
  wages         NUMBER;
  hours_worked  NUMBER := 40; 
  hourly_salary CONSTANT NUMBER := 17.50; -- constant value does not change
  country       VARCHAR2(64) := 'UNKNOWN';
  unknown       BOOLEAN;
  TYPE comm_tab IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
  commissions   comm_tab;
  TYPE jobs_var IS VARRAY(10) OF employees.job_id%TYPE;
  jobids        jobs_var;
  CURSOR c1 IS SELECT department_id FROM departments; -- cursor declaration
  deptid        departments.department_id%TYPE;
  emp_rec       employees%ROWTYPE; -- do not need TYPE declaration in this case
BEGIN
/* the following are examples of assignment statements */
  wages := hours_worked * hourly_salary; -- compute wages
  country := UPPER('italy');
  unknown := (country = 'UNKNOWN');
  commissions(5) := 20000 * 0.15; commissions(8) := 20000 * 0.18;
  jobids := jobs_var('ST_CLERK'); jobids.EXTEND(1); jobids(2) := 'SH_CLERK';
  OPEN c1; FETCH c1 INTO deptid; CLOSE c1;
  emp_rec.department_id := deptid; emp_rec.job_id := jobids(2);
END;
/

次の例を参照してください。

例1-2「代入演算子を使用した変数への値の代入」
例1-3「SELECT INTOを使用した変数への値の代入」
例1-4「サブプログラムのパラメータとしての変数への値の代入」
例2-10「%ROWTYPE宣言を使用したレコードへの値の代入」

関連項目

「変数への値の代入」
「定数と変数の宣言」
「式定義」
「SELECT INTO文」

AUTONOMOUS_TRANSACTIONプラグマ

AUTONOMOUS_TRANSACTIONプラグマは、トランザクション内のサブプログラムの動作方法を変更します。このプラグマでマークされたサブプログラムは、メイン・トランザクションでデータをコミットまたはロールバックすることなく、実行したSQL操作をコミットまたはロールバックできます。詳細は、「自律型トランザクションによる独立した作業単位の実行」を参照してください。

構文

pragma autonomous_transaction ::=

画像の説明

キーワードとパラメータの説明

PRAGMA

文がプラグマ(コンパイラ・ディレクティブ)であることを表します。プラグマは、実行時ではなくコンパイル時に処理されます。プラグマは、コンパイラに情報を渡します。

使用上の注意

このプラグマは次のものに適用できます。

このプラグマは、パッケージ全体またはオブジェクト型全体には適用できません。かわりに、各パッケージ・サブプログラムまたはオブジェクト・メソッドに適用できます。

プラグマは、宣言部の任意の場所でコーディングできます。見やすくするために、セクションの先頭にプラグマをコーディングしてください。

自律型トランザクションは、開始すると完全に独立します。ロック、リソースまたはコミット依存関係をメイン・トランザクションと共有することはありません。メイン・トランザクションがロールバックする場合でも、イベントや増分再試行カウンタなどのログを取ることができます。

通常のトリガーとは異なり、自律型トリガーには、COMMITROLLBACKなどのトランザクション制御文を含めることができます。また、EXECUTE IMMEDIATE文を使用してDDL文(CREATEDROPなど)を発行できます。

自律型トランザクションによって行われた変更は、自律型トランザクションがコミットすると、他のトランザクションから参照できるようになります。変更は、メイン・トランザクションが再開するとメイン・トランザクションからも参照できるようになりますが、これは分離レベルがREAD COMMITTED(デフォルト)に設定されている場合のみです。メイン・トランザクションの分離レベルをSERIALIZABLEに設定すると、その自律型トランザクションによって行われた変更は、メイン・トランザクションが再開してもメイン・トランザクションからは参照できません。

メイン・トランザクション内で、自律型サブプログラムをコールする前にマークされたセーブポイントまでロールバックしても、自律型トランザクションはロールバックされません。自律型トランザクションは、メイン・トランザクションからは完全に独立していることに注意してください。

メイン・トランザクション(自律型ルーチンの終了まで再開できない)が保持するリソースに、自律型トランザクションがアクセスしようとすると、デッドロックが発生します。この場合、Oracleは自律型トランザクションで例外を呼び出します。例外が未処理になった場合、自律型トランザクションはロールバックされます。

コミットまたはロールバックせずにアクティブな自律型トランザクションを終了しようとすると、Oracleは例外を呼び出します。例外が未処理になった場合、またはその他の未処理例外が発生してトランザクションが終了した場合、トランザクションはロールバックされます。

次の例を参照してください。

例6-43「パッケージでの自律型ファンクションの宣言」
例6-44「自立型スタンドアロン・プロシージャの宣言」
例6-45「自律型PL/SQLブロックの宣言」
例6-46「自律型トリガーの宣言」

関連項目

「EXCEPTION_INITプラグマ」
「RESTRICT_REFERENCESプラグマ」
「SERIALLY_REUSABLEプラグマ」

ブロック宣言

PL/SQLにおけるプログラムの基本単位はブロックです。PL/SQLブロックは、キーワードDECLAREBEGINEXCEPTIONおよびENDで定義します。これらのキーワードは、ブロックを宣言部、実行部、例外処理部に分けます。このうち必ず存在する必要があるのは実行部のみです。ブロックの中では、実行可能文を置ける場所ならば別のブロックをネストできます。詳細は、「PL/SQLブロック構造」および「PL/SQLの識別子の有効範囲と可視性」を参照してください。

構文

plsql block ::=

画像の説明

type definition ::=

画像の説明

subtype definition ::=

画像の説明

item definition ::=

画像の説明

sql_statement ::=

画像の説明

statement ::=

画像の説明

キーワードとパラメータの説明

base_type

任意のスカラーまたはCHARDATERECORDなどのユーザー定義のPL/SQLデータ型指定子です。

BEGIN

PL/SQLブロックの実行部の開始を示すキーワードです。実行部には実行可能文が置かれます。PL/SQLブロックには1つ以上の実行可能文(NULL文でも可)が含まれている必要があります。「PL/SQLブロック構造」を参照してください。

collection_declaration

コレクションを宣言します(索引付き表、ネストした表またはVARRAY)。collection_declarationの構文は、「コレクション定義」を参照してください。

constant_declaration

定数を宣言します。constant_declarationの構文は、「定数と変数の宣言」を参照してください。

constraint

CHARNUMBERなどの制約できるデータ型にのみ適用されます。文字データ型の場合は、最大サイズのバイト数を指定します。数値データ型の場合は、精度と位取りの最大値を指定します。

cursor_declaration

明示カーソルを宣言します。cursor_declarationの構文は、「カーソル宣言」を参照してください。

cursor_variable_declaration

カーソル変数を宣言します。cursor_variable_declarationの構文は、「カーソル変数」を参照してください。

DECLARE

PL/SQLブロックの宣言部の開始を示すキーワードです。宣言部にはローカル宣言が置かれます。ローカルに宣言された項目は現行のブロックとそのすべてのサブブロックにのみ存在し、外側のブロックからは見えません。PL/SQLブロックの宣言部はオプションです。宣言部は、ブロックの実行部の開始を示すキーワードBEGINによって暗黙的に終了します。詳細は、「宣言」を参照してください。

PL/SQLでは前方参照ができません。他の文で項目を参照するときは、事前に宣言しておく必要があります。ただし、サブプログラムは、その他すべてのプログラム項目の後の宣言部の末尾で宣言してください。

END

PL/SQLブロックの終わりを示すキーワードです。これはブロック中の最後のキーワードにする必要があります。ENDはトランザクションの終わりを通知しないことに注意してください。ブロックが複数のトランザクションにまたがることができるように、トランザクションも複数のブロックにまたがることができます。「PL/SQLブロック構造」を参照してください。

EXCEPTION

PL/SQLブロックの例外処理部の開始を示すキーワードです。例外が呼び出されると、ブロックの通常の実行が停止され、制御が適切な例外ハンドラに移ります。例外ハンドラが終了すると、ブロック直後の文から実行が再開されます。「PL/SQLブロック構造」を参照してください。

呼び出された例外の例外ハンドラが現行のブロックに存在しないと、制御は外側のブロックに渡されます。この過程が、例外ハンドラが見つかるまで、または外側にブロックがなくなるまで繰り返されます。PL/SQLが、例外を処理するための例外ハンドラを見つけられない場合、実行は停止され、「未処理例外」エラーがホスト環境に戻されます。例外の詳細は、第10章を参照してください。

exception_declaration

例外を宣言します。exception_declarationの構文は、「例外定義」を参照してください。

exception_handler

例外ハンドラです。例外が呼び出されると、その例外に関連付けられた一連の文を実行します。exception_handlerの構文は、「例外定義」を参照してください。

function_declaration

ファンクションを宣言します。function_declarationの構文は、「ファンクション宣言」を参照してください。

label_name

PL/SQLブロックまたは文に任意のラベルを付ける未宣言の識別子です。使用する場合は、label_nameを二重の山カッコで囲み、ラベルを付けるブロックまたは文の先頭に置く必要があります。必要に応じて、ブロックのラベル付けに使用する場合は、label_nameを山カッコで囲まずにブロックの末尾に置くこともできます。1つのブロックまたは文に複数のラベルを使用できますが、ラベルは、各ブロックまたは文に対して一意である必要があります。

外側のブロックで宣言されたグローバル識別子を、サブブロックで再宣言できます。この場合、ローカルでの宣言が優先され、ブロック・ラベルを使用して参照を修飾しなければ、サブブロックではグローバル識別子を参照できなくなります。例2-19「複数の重複したラベルを使用するPL/SQLブロック」を参照してください。

object_declaration

オブジェクト型のインスタンスを宣言します。object_declarationの構文は、「オブジェクト型宣言」を参照してください。

procedure_declaration

プロシージャを宣言します。procedure_declarationの構文は、「プロシージャ宣言」を参照してください。

record_declaration

ユーザー定義のレコードを宣言します。record_declarationの構文は、「レコード定義」を参照してください。

statement

実行可能文です(宣言文ではない)。一連の文の中には、RAISEなどのプロシージャ文、UPDATEなどのSQL文およびPL/SQLブロックを含めることができます。PL/SQL文は自由形式です。つまり、PL/SQL文は、キーワード、デリミタ、リテラルが複数の行にまたがらないかぎり、何行でも続けることができます。文の終わりは、セミコロン(;)です。

subtype_name

任意のスカラーまたはCHARDATERECORDなどのユーザー定義のPL/SQLデータ型指定子を使用して定義したユーザー定義のサブタイプを識別します。

variable_declaration

変数を宣言します。variable_declarationの構文は、「定数と変数の宣言」を参照してください。

PL/SQLは、データ操作、カーソル制御およびトランザクション制御文を含むSQL文のサブセットをサポートしています。ただし、ALTERCREATEGRANTREVOKEなどのデータ定義およびデータ制御文はサポートしていません。

次の例を参照してください。

例1-4「サブプログラムのパラメータとしての変数への値の代入」
例2-19「複数の重複したラベルを使用するPL/SQLブロック」
例13-1「宣言および変数への値の代入」

関連項目

「定数と変数の宣言」
「例外定義」
「ファンクション宣言」
「プロシージャ宣言」

CASE文

CASE文を使用すると、一連の条件を基に、対応する文を選択して実行できます。CASE文は、単一の式を評価していくつかの可能性のある値と比較するか、または複数のブール式を評価して最初にTRUEとなった式を選択します。

構文

searched case statement ::=

画像の説明

simple case statement ::=

画像の説明

キーワードとパラメータの説明

単純なCASE文の場合、CASEオペランドとWHENオペランドの値は、BLOBBFILE、オブジェクト型、PL/SQLレコード、索引付き表、VARRAYまたはネストした表以外であれば、任意のPL/SQLデータ型にできます。

ELSE句を省略すると、デフォルトのアクションが代用されます。CASE文の場合、条件が一致しなければ、デフォルトでCASE_NOT_FOUND例外が呼び出されます。CASE式の場合は、デフォルトでNULLが戻されます。

使用上の注意

WHEN句は順番に実行されます。各WHEN句はそれぞれ1度のみ実行されます。一致するWHEN句が1つでも見つかると、後続のWHEN句は実行されません。WHEN句の後に複数の文を使用できます。また、WHEN句の式にはリテラル、変数、ファンクション・コールまたはその他の任意の式を使用できます。WHEN句では、すべての条件に同じ変数をテストしたり同じ演算子を使用するのではなく、それぞれ異なる条件を使用できます。

WHEN句の文でデータベースを変更し、非決定的なファンクションをコールできます。C言語のswitch文のようなfall-throughのメカニズムはありません。WHEN句が一致し、その文が実行されると、CASE文は終了します。

CASE文は、オプションごとにアクションが異なる場合に適しています。複数の値から値を選択して変数に代入するのみの場合、かわりにCASE式を使用して代入文を記述できます。

たとえば、DECODEファンクション、またはある値を別の値に変換する他のファンクションをコールするかわりに、SQL問合せ内にCASE式を含めることができます。

例13-2に、単純なCASE文の使用を示します。

例13-2    CASE文の使用

DECLARE
   jobid      employees.job_id%TYPE;
   empid      employees.employee_id%TYPE := 115;
   sal_raise  NUMBER(3,2);
BEGIN
  SELECT job_id INTO jobid from employees WHERE employee_id = empid;
  CASE
    WHEN jobid = 'PU_CLERK' THEN sal_raise := .09;
    WHEN jobid = 'SH_CLERK' THEN sal_raise := .08;
    WHEN jobid = 'ST_CLERK' THEN sal_raise := .07;
    ELSE sal_raise := 0;
  END CASE;
END;
/

次の例を参照してください。

例1-7「IF-THEN_ELSE文およびCASE文を使用した条件制御」
例4-6「CASE-WHEN文の使用」
例4-7「検索CASE文の使用」

関連項目

「条件テスト: IF文およびCASE文」
「CASE式」
「CASE文の使用」
『Oracle Database SQLリファレンス』の「NULLIFファンクション」および「COALESCEファンクション」

CLOSE文

CLOSE文は、カーソルまたはカーソル変数からのフェッチが終了し、カーソルが占有していたリソースを再利用できるようになったことを示します。

構文

close ::=

画像の説明

キーワードとパラメータの説明

cursor_name、cursor_variable_name、host_cursor_variable_name

カーソルをクローズする際、現行の有効範囲の中で事前に宣言され、現在オープンされている明示カーソルまたはPL/SQLカーソル変数を指定できます。

また、PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されるカーソル変数も指定できます。ホスト・カーソル変数のデータ型は、PL/SQLカーソル変数の戻り型と互換性があります。ホスト変数には、接頭辞としてコロンを付けてください。

使用上の注意

一度クローズしたカーソルまたはカーソル変数を再オープンする場合は、それぞれOPEN文またはOPEN-FOR文を使用します。カーソルは再オープンする前に、一度クローズする必要があります。そうしないと、PL/SQLによって事前定義の例外CURSOR_ALREADY_OPENが呼び出されます。カーソル変数を再オープンする場合は、その前にクローズする必要はありません。

すでにクローズされているか一度もオープンされたことのないカーソルまたはカーソル変数をクローズしようとすると、PL/SQLによって事前定義の例外INVALID_CURSORが呼び出されます。

次の例を参照してください。

例4-17「LOOPでのEXITの使用」
例6-10「カーソルを使用したフェッチ」
例6-13「カーソルを使用したバルク・データのフェッチ」
例13-1「宣言および変数への値の代入」

関連項目

「カーソルのクローズ」
「FETCH文」
「OPEN文」
「OPEN-FOR文」
「PL/SQLを使用したデータの問合せ」

コレクション定義

コレクションは、すべて同じ型の要素の順序付きグループです。たとえば、あるクラスの生徒の成績です。各要素には一意の添字が付いています。その番号によって、集合の中での要素の位置が決まります。PL/SQLには、結合配列、ネストした表およびVARRAY(可変サイズの配列)の、3種類のコレクションがあります。ネストした表は、結合配列(以前の「PL/SQL表」または「索引付き表」)の機能を拡張します。

コレクションは、ほとんどの第3世代のプログラミング言語で見られる配列と同様の働きをします。コレクションにあるのは、1次元のみです。ほとんどのコレクションは整数で索引付けされますが、結合配列では文字列も使用できます。マルチディメンション配列のモデルを作成する場合には、項目として他のコレクションを持つコレクションを宣言できます。

ネストした表やVARRAYにオブジェクト型のインスタンスを格納したり、また、逆にネストした表やVARRAYがオブジェクト型の属性であったりします。コレクションは、パラメータとして渡すこともできます。それらを使用して、データの列をデータベースの表に出し入れしたり、クライアント側アプリケーションとストアド・サブプログラムとの間でデータの列を移動できます。

詳細は、「コレクション型の定義とコレクション変数の宣言」を参照してください。


注意:

CREATE TYPE文を使用して作成されたスキーマ・レベルのコレクション型の構文は、PL/SQLコレクション型の構文とは異なります。SQLのCREATE TYPE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。SQLのCREATE TYPE BODY文の詳細は、『Oracle Database SQLリファレンス』を参照してください。 


構文

table type definition ::=

画像の説明

varray type definition ::=

画像の説明

collection type definition ::=

画像の説明

element type definition ::=

画像の説明

キーワードとパラメータの説明

element_type

PL/SQLコレクション要素の型を指定します。REF CURSORを除く任意のPL/SQLデータ型を使用できます。

INDEX BY type_name

オプションです。結合配列を定義します。システムで添字値を順に定義するのではなく、ユーザーが使用する添字値を指定します。

type_nameは、BINARY_INTEGERPLS_INTEGERまたはVARCHAR2あるいはVARCHAR2サブタイプVARCHARSTRINGまたはLONGにすることができます。v_sizeは、VARCHAR2キーの長さを指定します。

size_limit

正の整数のリテラルであり、VARRAYの最大サイズ、つまりVARRAYに格納できる要素数の最大値を指定します。最大値には制限があります。「コレクション要素の参照」を参照してください。

type_name

データ型指定子TABLEまたはVARRAYを使用して定義されたユーザー定義のコレクション型を識別します。

使用上の注意

ネストした表は、結合配列(以前の索引付き表)の機能を拡張したものであるため、いくつかの点で異なります。「ネストした表と結合配列の選択」を参照してください。

すべての要素参照には、コレクション名およびカッコで囲まれた1つ以上の添字が含まれており、この添字によって、処理される要素が決まります。負の添字を持つことができる結合配列を除き、コレクションの添字の下限は1(固定)です。マルチレベル・コレクションの添字は、任意の順序で評価されます。添字に、別の添字の値を変更する式が含まれている場合の結果は、未定義になります。「コレクション要素の参照」を参照してください。

3つのすべてのコレクション型は、任意のPL/SQLブロック、サブプログラムまたはパッケージの宣言部で定義できます。ただし、ネストした表とVARRAY型のみをOracleデータベース内に作成して格納できます。

結合配列とネストした表は疎である(添字が連続していない)場合があります。ただし、VARRAYは常に密です(添字が連続しています)。ネストした表とは異なり、VARRAYはデータベースに格納されるときにその順序と添字が保たれます。最初、結合配列は疎です。そのため、たとえば、主キー(口座番号や従業員番号など)を索引として使用して、参照データを一時変数に格納できます。

コレクションは、通常の有効範囲とインスタンス化の規則に従います。パッケージの中では、そのパッケージが初めて参照された時点でコレクションのインスタンスが生成され、データベース・セッションが終わった時点で消滅します。ブロックまたはサブプログラムの中で、ローカル・コレクションは、ブロックまたはサブプログラムに入ったときにインスタンス化され、ブロックまたはサブプログラムが終了した時点で消滅します。

ネストした表またはVARRAYは、初期化するまでは基本構造的にNULL(つまりコレクションの要素ではなく、コレクション自体がNULL)です。ネストした表またはVARRAYを初期化するには、コンストラクタ(コレクション型と同じ名前のシステム定義ファンクション)を使用します。このファンクションは、コレクションに渡される要素から、コレクションを構成(作成)します。

可能なコレクションの比較の詳細は、「コレクションの比較」を参照してください。

コレクションにオブジェクト型のインスタンスを格納したり、また、逆にコレクションがオブジェクト型の属性であったりします。コレクションは、パラメータとして渡すこともできます。それらを使用して、データの列をデータベースの表に出し入れしたり、クライアント側アプリケーションとストアド・サブプログラムとの間でデータの列を移動できます。

コレクションを戻すファンクションをコールする場合、次の構文を使用してコレクション内の要素を参照します。

function_name(parameter_list)(subscript)

例5-16「結合配列の要素の参照」および例B-2「ドット表記法を使用した名前の修飾」を参照してください。

Oracle Call Interface(OCI)またはOracleプリコンパイラを使用すると、サブプログラムの仮パラメータとして宣言された結合配列(索引付き表)にホスト配列をバインドできます。これによって、ホスト配列をストアド・ファンクションやプロシージャに渡すことができます。

次の例を参照してください。

例5-1「コレクション型の宣言」
例5-3「ネストした表、VARRAYおよび結合配列の宣言」
例5-4「%TYPEを使用したコレクションの宣言」
例5-5「ネストした表としてのプロシージャのパラメータの宣言」
例5-42「レコード型の宣言および初期化」
例13-1「宣言および変数への値の代入」

関連項目

「コレクション・メソッド」
「オブジェクト型宣言」
「レコード定義」

コレクション・メソッド

コレクション・メソッドとは、コレクションに対する操作を実行するための、ドット表記法を使用してコールされる組込みファンクションまたはプロシージャです。メソッドEXISTSCOUNTLIMITFIRSTLASTPRIORNEXTEXTENDTRIMおよびDELETEを使用して、サイズが不明または多様なコレクションを管理できます。

EXISTSCOUNTLIMITFIRSTLASTPRIORおよびNEXTは、コレクションのプロパティまたは個のコレクション要素をチェックするファンクションです。EXTENDTRIMおよびDELETEは、コレクションを変更するプロシージャです。

EXISTSPRIORNEXTTRIMEXTENDおよびDELETEは整数パラメータを取ります。文字列キーを持つ結合配列の場合、EXISTSPRIORNEXTおよびDELETEは、VARCHAR2パラメータも取ります。EXTENDTRIMは、索引付き表では使用できません。

詳細は、「コレクション・メソッドの使用」を参照してください。

構文

collection call method ::=

画像の説明

キーワードとパラメータの説明

collection_name

現行の有効範囲のうち、これより前の部分で宣言されている結合配列、ネストした表またはVARRAYを指定します。

COUNT

コレクションに現在含まれている要素の数を戻します。コレクションの現行のサイズが不明な場合があるため、そのようなときに役立ちます。COUNTは、整数式が使用できる位置ならどこでも使用できます。VARRAYの場合、COUNTは常にLASTと同じです。ネストした表の場合、COUNTは通常、LASTと同じです。ただし、ネストした表の途中から要素を削除すると、COUNTLASTより小さくなります。

DELETE

このプロシージャには3つの形式があります。DELETEは、コレクションからすべての要素を削除します。DELETE(n)は、n番目の要素を結合配列またはネストした表から削除します。nがNULLである場合、DELETE(n)は何も実行しません。DELETE(m,n)は、結合配列またはネストした表からm〜nの範囲のすべての要素を削除します。mnより大きい場合、またはmnがNULLである場合、DELETE(m,n)は何も実行しません。

EXISTS

EXISTS(n)は、コレクションにn番目の要素が存在する場合にTRUEを戻します。それ以外の場合、EXISTS(n)FALSEを戻します。主にEXISTSは、DELETEとともに、疎であるネストした表のメンテナンスのために使用します。また、EXISTSを使用すると、存在しない要素を参照した場合に呼び出される例外を回避できます。範囲外の添字を渡した場合、EXISTSSUBSCRIPT_OUTSIDE_LIMITを呼び出さずに、FALSEを戻します。

EXTEND

このプロシージャには3つの形式があります。EXTENDは、コレクションに1つのNULL要素を追加します。EXTEND(n)は、コレクションにn個のNULL要素を追加します。EXTEND(n,i)は、コレクションにi番目の要素のコピーをn個追加します。EXTENDは、コレクションの内部サイズに対して操作します。EXTENDは削除された要素を見つけると、それらの要素を数に含めます。結合配列でEXTENDを使用することはできません。

FIRST、LAST

FIRSTLASTは、それぞれコレクションの最初と最後(最小と最大)の添字値を戻します。通常、添字値は整数ですが、結合配列では文字列の場合もあります。コレクションが空の場合、FIRSTLASTNULLを戻します。コレクションに含まれる要素の数が1つのみの場合、FIRSTLASTは同じ添字値を戻します。VARRAYの場合、FIRSTは常に1を戻し、LASTは常にCOUNTと同じです。ネストした表の場合、LASTは通常、COUNTと同じです。ただし、ネストした表の途中から要素を削除すると、LASTCOUNTより大きくなります。

index

ほとんどの場合は整数が戻される(または暗黙的に整数に変換される)式、文字列キーを使用して宣言した結合配列の場合は文字列です。

LIMIT

最大サイズがないネストした表の場合、LIMITNULLを戻します。VARRAYの場合、LIMITはVARRAYに入れることのできる(型定義で指定する必要がある)要素の最大数を戻します。

NEXT、PRIOR

PRIOR(n)は、コレクションの索引nの前の添字を戻します。NEXT(n)は、索引nの後の添字を戻します。nの前の番号がない場合、PRIOR(n)NULLを戻します。同様に、nの後の番号がない場合、NEXT(n)NULLを戻します。

TRIM

このプロシージャには2つの形式があります。TRIMは、コレクションの末尾から1つの要素を削除します。TRIM(n)は、コレクションの末尾からn個の要素を削除します。nCOUNTより大きいと、TRIM(n)SUBSCRIPT_BEYOND_COUNTを呼び出します。索引付き表でTRIMを使用することはできません。TRIMは、コレクションの内部サイズ上での処理です。TRIMは削除された要素を見つけると、それらの要素を数に含めます。

使用上の注意

コレクション・メソッドはSQL文では使用できません。使用すると、コンパイル・エラーになります。

基本構造的にNULLであるコレクションに適用されるのはEXISTSのみです。それ以外のメソッドをそのようなコレクションに適用すると、PL/SQLはCOLLECTION_IS_NULLを呼び出します。

コレクション要素の添字が連続している場合、FORループでcollection.FIRST .. collection.LASTを使用して、すべての要素に対して反復処理を実行できます。PRIORまたはNEXTを使用すると、任意の添字列を索引とするコレクション内を移動できます。たとえば、PRIORまたはNEXTを使用すると、要素をいくつか削除したネストした表内、または添字が文字列の値である結合配列内を移動できます。

EXTENDは、削除された要素を含むコレクションの内部サイズに対して操作します。EXTENDを使用して、基本構造的にNULLであるコレクションの初期化はできません。また、NOT NULL制約をTABLEまたはVARRAY型に指定した場合、EXTENDの最初の2つの形式はその型のコレクションに適用できません。

削除対象の要素が存在しない場合でも、DELETEは単にその要素をスキップするため、例外は呼び出されません。VARRAYは密であるため、個の要素は削除できません。PL/SQLは削除された要素のプレースホルダを保持するため、削除された要素に新しい値を代入して、その要素を置き換えることができます。ただし、PL/SQLは切り捨てられた(TRIM)要素のプレースホルダは保持しません。

ネストした表に割り当てられるメモリーの量は、動的に増減します。要素を削除すると、メモリーはページ単位で解放されます。表全体を削除した場合は、すべてのメモリーが解放されます。

一般に、TRIMDELETEの間の相互作用には依存しないでください。ネストした表は、固定サイズの配列のように扱ってDELETEのみを使用するか、またはスタックのように扱ってTRIMEXTENDのみを使用することをお薦めします。

サブプログラム内で、コレクション・パラメータは引数のプロパティがバインドされていることを前提にしています。メソッドFIRSTLASTCOUNTなどをそのようなパラメータに適用できます。VARRAYパラメータの場合、パラメータ・モードに関係なく、LIMITの値は常にパラメータの型定義から導出されます。

次の例を参照してください。

例5-28「コレクション要素のEXISTSのチェック」
例5-29「COUNTを使用したコレクションの要素のカウント」
例5-30「LIMITを使用したコレクションの最大サイズのチェック」
例5-31「コレクションでのFIRSTおよびLASTの使用」
例5-32「PRIORおよびNEXTを使用したコレクションの要素へのアクセス」
例5-34「EXTENDを使用したコレクションのサイズの拡大」
例5-35「TRIMを使用したコレクションのサイズの縮小」
例5-37「コレクションに対するDELETEメソッドの使用」
例13-1「宣言および変数への値の代入」

関連項目

「コレクション定義」

コメント

コメントを使用すると、コードの内容を説明する任意のテキストをコード内に含めることができます。また、廃止されたコード部分や作成途中のコード部分をコメントに入れて無効化することもできます。

PL/SQLでは、単一行コメントと複数行コメントの2種類のコメント・スタイルがサポートされています。行の中の任意の位置(文字リテラルの中は除く)に二重ハイフン(- -)を挿入すると、その行の残りの部分がコメントになります。複数行コメントは、スラッシュ-アスタリスク(/*)で始まってアスタリスク-スラッシュ(*/)で終わります。詳細は、「コメント」を参照してください。

構文

comment ::=

画像の説明

使用上の注意

プログラムのテストやデバッグのときに、コード中の複数の行を無効にする場合があります。単一行コメントは、行の末尾ならば、文の途中に置くこともできます。単一行コメントは複数行コメント内に含めることができますが、複数行コメントはネストできません。

また、Oracleプリコンパイラ・プログラムが動的に処理するPL/SQLブロックの中では、単一行コメントは使用できません。これは、行の終わりを示す文字が無視され、単一行コメントがブロックの終わりまで続いてしまうためです。この場合、複数行コメントを使用してください。複数行コメントのデリミタを使用すると、コードの一部分をすべてコメントにできます。

次の例を参照してください。

例2-4「単一行コメントの使用」
例2-5「複数行コメントの使用」
例13-1「宣言および変数への値の代入」

COMMIT文

COMMIT文は、カレント・トランザクションでデータベースに加えられた変更を確定します。また、コミットは変更内容が他のユーザーからも見えるようにします。PL/SQLトランザクション処理の詳細は、「PL/SQLにおけるトランザクション処理の概要」を参照してください。

SQLのCOMMIT文は、静的SQLとしてPL/SQLに埋め込むことができます。SQLのCOMMIT文の構文の詳細は、『Oracle Database SQLリファレンス』を参照してください。『Oracle Databaseアプリケーション開発者ガイド-基礎編』のトランザクションのコミットに関する項、および『Oracle Databaseリファレンス』のCOMMIT_WRITE初期化パラメータに関する項を参照してください。

使用上の注意

COMMIT文は、すべての行と表のロックを解除します。また、最後のコミットまたはロールバック以降にマークされたすべてのセーブポイントを消去します。変更がコミットされるまでは、次のような状況になっています。

FOR UPDATEカーソルがオープンしているときにコミットした場合、そのカーソルでそれ以降フェッチすると例外が呼び出されます。カーソルはオープンしたままのため、クローズしてください。詳細は、「FOR UPDATEの使用」を参照してください。

次の例を参照してください。

例6-1「PL/SQLを使用したデータ操作」
例6-3「PL/SQL変数の置換」
例6-36「WRITE句とCOMMITの併用」
例6-40「SET TRANSACTIONを使用した読取り専用トランザクションの開始」
例6-43「パッケージでの自律型ファンクションの宣言」

関連項目

「ROLLBACK文」
「SAVEPOINT文」
「トランザクション制御」
「コミットにまたがるフェッチ」

定数と変数の宣言

定数と変数は、任意のPL/SQLブロック、サブプログラムまたはパッケージの宣言部で宣言できます。宣言によって、値の記憶域を割り当て、データ型を指定し、参照できるように名前を指定します。また、初期値を代入したり、NOT NULL制約を付けることもできます。詳細は、「宣言」を参照してください。

構文

variable declaration ::=

画像の説明

datatype ::=

画像の説明

constant ::=

画像の説明

キーワードとパラメータの説明

collection_name

現行の有効範囲のうち、これより前の部分で宣言されているコレクション(結合配列、ネストした表またはVARRAY)を識別します。

collection_type_name

データ型指定子TABLEまたはVARRAYを使用して定義されたユーザー定義のコレクション型を識別します。

CONSTANT

定数の宣言であることを示します。定数は宣言部で初期化してください。初期化された定数の値は変更できません。

constant_name

プログラム定数を識別します。ネーミング規則は、「識別子」を参照してください。

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。

db_table_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表(またはビュー)を識別します。

db_table_name.column_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表および列を識別します。

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。最も単純な式は、1個の変数で構成されています。宣言がPL/SQLコンパイラによって処理されるとき、expressionの値が定数または変数に代入されます。その値と定数または変数のデータ型には互換性が必要です。

NOT NULL

プログラムでNULL値を変数または定数に代入できないようにするための制約です。NOT NULLとして定義された変数にNULLを代入しようとすると、事前定義の例外VALUE_ERRORが呼び出されます。NOT NULL制約の後には初期化句が続く必要があります。

object_name

現行の有効範囲のうち、これより前の部分で宣言されているオブジェクト型のインスタンスを識別します。

record_name

現行の有効範囲のうち、これより前に宣言されているユーザー定義のレコードまたは%ROWTYPEレコードを識別します。

record_name.field_name

現行の有効範囲のうち、これより前に宣言されているユーザー定義のレコードまたは%ROWTYPEレコードのフィールドを識別します。

record_type_name

データ型指定子RECORDを使用して定義するユーザー定義のレコード型を識別します。

ref_cursor_type_name

データ型指定子REF CURSORを使用して定義されたユーザー定義のカーソル変数型を識別します。

%ROWTYPE

データベース表の中の行、またはカーソルを保持できるレコードを表します。レコードの中のフィールドと行の中の列は、同じ名前とデータ型を持ちます。

scalar_datatype_name

事前定義済のスカラー・データ型(BOOLEANNUMBERVARCHAR2など)を識別します。サイズ、精度、または文字とバイトのセマンティクスの修飾子が含まれます。

%TYPE

これより前に宣言されたコレクション、カーソル変数、フィールド、オブジェクト、レコード、データベース列または変数のデータ型を表します。

variable_name

プログラム変数を識別します。

使用上の注意

定数と変数は、ブロックまたはサブプログラムに入るたびに初期化されます。デフォルトでは、変数はNULLに初期化されます。パッケージの仕様部で宣言された定数と変数は、パブリックであるかプライベートであるかにかかわらず、セッションごとに1回のみ初期化されます。

NOT NULL変数を宣言する場合、および定数を宣言する場合には、必ず初期化の句が必要です。%ROWTYPEを使用して変数を宣言する場合は、初期化できません。

代入値を戻すファンクションをコールして、リテラル値または事前定義済コンストラクタを持たない複合型の定数を定義できます。たとえば、この方法で定数の結合配列を作成できます。

次の例を参照してください。

例1-1「PL/SQL変数の宣言」
例1-2「代入演算子を使用した変数への値の代入」
例1-3「SELECT INTOを使用した変数への値の代入」
例2-9「%ROWTYPE属性の使用」
例13-1「宣言および変数への値の代入」

関連項目

「変数の宣言」
「宣言」
「事前定義されたPL/SQLデータ型の概要」
「代入文」
「式定義」
「%ROWTYPE属性」
「%TYPE属性」

カーソル属性

どの明示カーソルおよびカーソル変数にも%FOUND%ISOPEN%NOTFOUNDおよび%ROWCOUNTの4つの属性があります。これらの属性をカーソルまたはカーソル変数に付加すると、DML文の実行について役立つ情報が戻されます。詳細は、「カーソル式の使用」を参照してください。

暗黙カーソルSQLにはさらに属性%BULK_ROWCOUNTおよび%BULK_EXCEPTIONSがあります。詳細は、「SQLカーソル」を参照してください。

構文

cursor attribute ::=

画像の説明

キーワードとパラメータの説明

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で、事前に宣言されているPL/SQLカーソル変数(またはパラメータ)を識別します。

%FOUND属性

カーソル属性で、カーソルまたはカーソル変数の名前に追加できます。カーソルがオープンされてから最初のフェッチまでのcursor_name%FOUNDは、NULLを戻します。その後、直前のフェッチが行を戻した場合はTRUEを戻し、直前のフェッチが行を戻さなかった場合はFALSEを戻します。

host_cursor_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されるカーソル変数を識別します。ホスト・カーソル変数のデータ型は、PL/SQLカーソル変数の戻り型と互換性があります。ホスト変数には、接頭辞としてコロンを付けてください。

%ISOPEN属性

カーソル属性で、カーソルまたはカーソル変数の名前に追加できます。カーソルがオープンされていると、cursor_name%ISOPENTRUEを戻し、それ以外の場合はFALSEを戻します。

%NOTFOUND属性

カーソル属性で、カーソルまたはカーソル変数の名前に追加できます。カーソルがオープンされてから最初のフェッチまでのcursor_name%NOTFOUNDは、NULLを戻します。その後、直前のフェッチが行を戻した場合はFALSEを戻し、直前のフェッチが行を戻さなかった場合はTRUEを戻します。

%ROWCOUNT属性

カーソル属性で、カーソルまたはカーソル変数の名前に追加できます。カーソルがオープンされると%ROWCOUNTは0(ゼロ)になります。最初のフェッチまでは、cursor_name%ROWCOUNTは0(ゼロ)を戻します。その後は、これまでにフェッチした行数を戻します。フェッチで行が戻されるたびに、数値は増加します。

使用上の注意

カーソルの属性は、すべてのカーソルおよびカーソル変数に適用されます。たとえば、複数のカーソルをオープンし、%FOUNDまたは%NOTFOUNDを使用して、まだフェッチしていない行が残っているカーソルがどれかを判別できます。同様に、%ROWCOUNTを使用して、これまでにフェッチした行の数を知ることができます。

カーソルまたはカーソル変数をオープンしていない場合、%FOUND%NOTFOUNDあるいは%ROWCOUNTでカーソルやカーソル変数を参照すると、事前定義の例外INVALID_CURSORが呼び出されます。

カーソルまたはカーソル変数をオープンすると、対応する問合せを満たす行が識別され、結果セットが形成されます。行は、結果セットから一度に1行ずつフェッチされます。

SELECT INTO文が複数の行を戻した場合、PL/SQLによって事前定義の例外TOO_MANY_ROWSが呼び出され、%ROWCOUNTは、問合せを満たす行の実数ではなく、1に設定されます。

最初のフェッチの前は、%NOTFOUNDの評価結果はNULLです。FETCHが正常に実行されない場合は、EXIT WHEN条件がTRUEとならず、ループは終了しません。安全のために、次のEXIT文をかわりに使用できます。

EXIT WHEN c1%NOTFOUND OR c1%NOTFOUND IS NULL;

カーソル属性は、プロシージャ文では使用できますが、SQL文では使用できません。

次の例を参照してください。

例6-7「SQL%FOUNDの使用」
例6-8「SQL%ROWCOUNTの使用」
例6-10「カーソルを使用したフェッチ」
例6-15「%ISOPENの使用」

関連項目

「カーソル宣言」
「カーソル変数」
「PL/SQLでのカーソルの管理」

カーソル変数

複数行の問合せを実行するために、Oracleは処理情報を格納する名前の付けられていない作業領域をオープンします。この領域にアクセスするには、作業領域の名前を示す明示カーソル、または作業領域を指すカーソル変数を使用します。カーソル変数を作成するには、REF CURSOR型を定義してから、その型のカーソル変数を宣言します。

カーソル変数は、CやPascalのポインタに類似しており、項目のかわりに項目のアドレスを保持します。カーソル変数を宣言すると、項目ではなくポインタが作成されます。

詳細は、「カーソル変数(REF CURSOR)の使用」を参照してください。

構文

ref cursor type definition ::=

画像の説明

ref cursor variable declaration ::=

画像の説明

キーワードとパラメータの説明

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。

db_table_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表またはビューを識別します。

record_name

現行の有効範囲の中で事前に宣言されているユーザー定義のレコードを識別します。

record_type_name

データ型指定子RECORDを使用して定義されたユーザー定義のレコード型を識別します。

REF CURSOR

すべてのカーソル変数がデータ型REF CURSORに属します。

RETURN

カーソル変数の戻り値のデータ型を指定します。RETURN句で%ROWTYPE属性を使用すると、データベース表の行や、カーソルまたは強い型指定のカーソル変数によって戻される行を表すレコード型を与えることができます。また、%TYPE属性を使用して、事前に宣言されたレコードのデータ型を与えることもできます。

%ROWTYPE

データベース表の中の行、またはカーソルや強い型指定のカーソル変数からフェッチされる行を表すレコード型を指定します。レコードの中のフィールドと、それに対応する行の中の列は、同じ名前とデータ型を持ちます。

%TYPE

事前に宣言されているユーザー定義のレコードのデータ型を指定します。

type_name

REF CURSORとして定義されたユーザー定義のカーソル変数型を識別します。

使用上の注意

カーソル変数は、すべてのPL/SQLクライアントで使用します。たとえば、OCIやPro*CプログラムなどのPL/SQLホスト環境の中でカーソル変数を宣言し、それをバインド変数としてPL/SQLに渡すことができます。PL/SQLエンジンを備えたアプリケーション開発ツールでは、クライアント側でカーソル変数を完全に使用できます。

データベース・リンクによるリモート・プロシージャ・コールを通じて、アプリケーションとデータベース・サーバーの間でカーソル変数をやり取りできます。クライアント側にPL/SQLエンジンがあれば、どちらの側でもカーソル変数を使用できます。たとえば、クライアント側でカーソル変数を宣言し、それをサーバー側でオープンしてフェッチした後で、クライアント側で引き続きフェッチすることができます。

カーソル変数は、PL/SQLのストアド・サブプログラムとクライアント・プログラムとの間で問合せの結果セットを渡すために使用します。PL/SQLとクライアント・プログラムはどちらも結果セットを所有せず、結果セットが格納されている作業領域を指すポインタを共有しています。たとえば、OCIプログラム、Oracle Formsアプリケーションおよびデータベースがすべて同じ作業領域を参照する場合があります。

REF CURSOR型には、強いものと弱いものがあります。 強いREF CURSOR型定義では戻り型を指定しますが、弱い型定義では戻り型を指定しません。強いREF CURSOR型の方が、エラー発生の可能性は少なくなります。これは、PL/SQLの場合、強い型指定のカーソル変数は型互換性のある問合せにしか関連付けることができないためです。弱いREF CURSOR型は、より柔軟です。弱い型指定のカーソル変数は、どの問合せにも関連付けることができます。

REF CURSOR型を一度定義すれば、その型のカーソル変数を宣言できます。%TYPEを使用すると、レコード変数のデータ型を与えることができます。また、REF CURSOR型定義のRETURN句では、%ROWTYPEを使用して、強い型指定(弱い型指定ではなく)のカーソル変数によって戻される行を表すレコード型を指定できます。

現在のところ、カーソル変数にはいくつかの制限があります。「カーソル変数の制限」を参照してください。

カーソル変数の制御には、OPEN-FORFETCHおよびCLOSEの3つの文を使用します。まず、OPEN-FOR文でカーソル変数を複数行問合せ用にオープンします。次に、FETCH文で結果セットから行を取り出します。すべての行が処理された後に、CLOSE文でカーソル変数をクローズします。

その他のOPEN-FOR文は、異なる複数の問合せ用に同じカーソル変数をオープンできます。カーソル変数を再オープンする場合、その前にクローズする必要はありません。別の問合せ用にカーソル変数を再オープンすると、前の問合せは失われます。

PL/SQLでは、カーソル変数の戻り型が、必ずFETCH文のINTO句と互換性を持ちます。カーソル変数に関連付けられた問合せが戻す列の値に対して、INTO句の中に、対応する、型互換性のあるフィールドまたは変数が存在している必要があります。また、フィールドまたは変数の数は、列の値の数と一致する必要があります。それ以外の場合はエラーになります。

代入に関係する両方のカーソル変数が強い型指定である場合は、両方が同じデータ型であることが必要です。ただし、一方または両方のカーソル変数が弱い型指定である場合は、同じデータ型でなくてもかまいません。

カーソル変数を、そのカーソル変数からフェッチするか、またはそのカーソル変数をクローズするサブプログラムの仮パラメータとして宣言する場合は、INまたはIN OUTモードを指定する必要があります。サブプログラムがカーソル変数をオープンする場合は、IN OUTモードを指定する必要があります。

カーソル変数をパラメータとして渡す場合は注意が必要です。実パラメータと仮パラメータの戻り型に互換性がないと、実行時にPL/SQLによってROWTYPE_MISMATCHが呼び出されます。

カーソル属性%FOUND%NOTFOUND%ISOPEN%ROWCOUNTをカーソル変数に適用できます。

問合せ作業領域を指していないカーソル変数に対してフェッチまたはクローズを実行するか、カーソルの属性を適用しようとすると、PL/SQLによって事前定義の例外INVALID_CURSORが呼び出されます。カーソル変数(またはパラメータ)が問合せ作業領域を指すようにするには、次の2通りの方法があります。

問合せ作業領域は、それを指すカーソル変数が存在するかぎりアクセスできます。したがって、カーソル変数の値は、1つの有効範囲から別の有効範囲へ自由に渡すことができます。たとえば、Pro*Cプログラムに組み込まれたPL/SQLブロックにホスト・カーソル変数を渡す場合、カーソル変数が指す作業領域は、そのブロックの終了後もアクセス可能な状態のままです。

次の例を参照してください。

例6-9「カーソルの宣言」
例6-10「カーソルを使用したフェッチ」
例6-13「カーソルを使用したバルク・データのフェッチ」
例6-27「REF CURSORのパラメータとしての引渡し」
例6-29「REF CURSORをオープンするストアド・プロシージャ」
例6-30「別の問合せでREF CURSORをオープンするストアド・プロシージャ」
例6-31「異なる戻り型を持つカーソル変数」

関連項目

「CLOSE文」
「カーソル属性」
「カーソル宣言」
「FETCH文」
「OPEN-FOR文」

カーソル宣言

複数行の問合せを実行するために、Oracleは処理情報を格納する名前の付けられていない作業領域をオープンします。カーソルを使用すると、作業領域の名前付け、情報へのアクセス、行の個別処理が可能です。詳細は、「PL/SQLを使用したデータの問合せ」を参照してください。

構文

cursor declaration ::=

画像の説明

cursor spec ::=

画像の説明

cursor body ::=

画像の説明

cursor parameter declaration ::=

画像の説明

rowtype ::=

画像の説明

キーワードとパラメータの説明

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

datatype

型指定子です。datatypeの構文は、「定数と変数の宣言」を参照してください。

db_table_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表(またはビュー)を識別します。

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。最も単純な式は、1個の変数で構成されています。宣言がPL/SQLコンパイラによって処理されるときに、expressionの値がパラメータに代入されます。その値とパラメータのデータ型には互換性が必要です。

parameter_name

カーソルの仮パラメータとして宣言された変数を識別します。カーソルのパラメータは、問合せの中で定数が使用できる場所であれば、どこででも使用できます。カーソルの仮パラメータはINパラメータにしてください。問合せは、有効範囲の他のPL/SQL変数を参照することもできます。

record_name

現行の有効範囲の中で事前に宣言されているユーザー定義のレコードを識別します。

record_type_name

データ型指定子RECORDを使用して定義されたユーザー定義のレコード型を識別します。

RETURN

カーソルの戻り値のデータ型を指定します。RETURN句で%ROWTYPE属性を使用すると、データベースの表の行や、事前に宣言されたカーソルによって戻される行を表すレコード型を与えることができます。また、%TYPE属性を使用して、事前に宣言されたレコードのデータ型を与えることもできます。

カーソル本体には、SELECT文と、対応するカーソル仕様部と同じRETURN句が必要です。さらに、SELECT句の中の選択項目の数、順序およびデータ型は、RETURN句と一致している必要があります。

%ROWTYPE

データベース表の中の行、または事前に宣言されたカーソルやカーソル変数からフェッチされる行を表すレコード型を指定します。レコードの中のフィールドと、それに対応する行の中の列は、同じ名前とデータ型を持ちます。

select_statement

行の結果セットを戻す問合せです。構文はselect_into_statementの構文と似ていますが、INTO句は使用できません。「SELECT INTO文」を参照してください。カーソル宣言でパラメータを宣言した場合は、すべてのパラメータを問合せで使用する必要があります。

%TYPE

事前に宣言されているユーザー定義のレコードのデータ型を指定します。

使用上の注意

OPEN文、FETCH文またはCLOSE文でカーソルを参照する前に、そのカーソルを宣言します。カーソル宣言で変数を参照する前に、その変数を宣言します。SQLという語は、暗黙カーソルのデフォルト名としてPL/SQLによって予約されており、カーソル宣言の中では使用できません。

カーソル名に値を代入したり、カーソル名を式の中で使用することはできません。ただし、カーソルの有効範囲規則は変数の有効範囲規則と同じです。詳細は、「PL/SQLの識別子の有効範囲と可視性」を参照してください。

カーソルからデータを取り出す場合は、まずカーソルをオープンし、そこからフェッチします。FETCH文ではターゲットとなる変数を指定するため、cursor_declarationSELECT文でINTO句を使用するのは冗長かつ誤りです。

カーソルのパラメータの有効範囲は、カーソルに対してローカルです。つまり、カーソル宣言の中で使用されている問合せの内側からしか参照できません。カーソルのパラメータ値は、カーソルがオープンされているときに、カーソルに関連付けられた問合せから使用できます。問合せは、有効範囲の他のPL/SQL変数を参照することもできます。

カーソルのパラメータのデータ型は、無制約で指定する必要があります(数値の精度と位取り、および文字列の長さは指定しません)。

次の例を参照してください。

例6-9「カーソルの宣言」
例6-10「カーソルを使用したフェッチ」
例6-13「カーソルを使用したバルク・データのフェッチ」
例6-27「REF CURSORのパラメータとしての引渡し」
例6-29「REF CURSORをオープンするストアド・プロシージャ」
例6-30「別の問合せでREF CURSORをオープンするストアド・プロシージャ」
例13-1「宣言および変数への値の代入」

関連項目

「CLOSE文」
「FETCH文」
「OPEN文」
「SELECT INTO文」
「カーソルの宣言」

DELETE文

DELETE文は、指定された表またはビューから、行のデータを削除します。DELETE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

delete ::=

画像の説明

table_reference ::=

画像の説明

キーワードとパラメータの説明

alias

参照される表またはビューの別名(通常は短縮名)です。通常、WHERE句の中で参照されます。

BULK COLLECT

RETURNING INTOリストで指定した場合と同様に、削除された行からPL/SQLコレクションに列を戻します。対応する列には、(複合値ではなく)スカラー値が格納されている必要があります。詳細は、「バルクSQLによる、DML文および問合せのループ・オーバーヘッドの削減」を参照してください。

returning_clause

削除された行から値を戻します。そのため、最初に行をSELECTで選択しておく必要はありません。取り出した列値は、個の変数またはコレクションに代入できます。RETURNING句はリモートまたはパラレルでの削除には使用できません。文を実行しても行に影響がない場合、RETURNING句で指定した変数の値は未定義になります。「RETURNING INTO句」を参照してください。

subquery

処理する行セットを提供するSELECT文です。構文はselect_into_statementの構文と似ていますが、INTO句は使用できません。「SELECT INTO文」を参照してください。

table_reference

表またはビューを指定します。指定された表またはビューは、DELETE文の実行時にアクセスできる必要があり、ユーザーはDELETE権限を持つ必要があります。

TABLE (subquery2)

TABLEのオペランドは、1つの列値を戻すSELECT文です。これはネストした表である必要があります。演算子TABLEは、値がスカラー値ではなくコレクションであることをOracleに通知します。

WHERE CURRENT OF cursor_name

cursor_nameで識別されるカーソルに関連付けられているFETCH文によって処理された最後の行を参照します。カーソルは、FOR UPDATEであること、さらにオープンされていて行に置かれていることが必要です。カーソルがオープンされていないと、CURRENT OF句でエラーが発生します。

カーソルがオープンされていても、フェッチされた行がないか、最後のフェッチで行が戻されなかった場合は、PL/SQLによって事前定義の例外NO_DATA_FOUNDが呼び出されます。

WHERE search_condition

参照された表またはビューから削除する行を条件に従って選択します。検索条件を満たす行のみが削除されます。WHERE句を省略すると、表またはビューのすべての行が削除されます。

使用上の注意

DELETE WHERE CURRENT OF文は、オープンされているカーソルからのフェッチ(カーソルFORループで実行される暗黙的なフェッチを含む)の後で使用できます。ただし、そのためには、関連付けられた問合せがFOR UPDATEであることが必要です。この文は現在行、つまり直前にフェッチされた行を削除します。

暗黙カーソルSQLと、カーソル属性%NOTFOUND%FOUNDおよび%ROWCOUNTを使用すると、DELETE文の実行に関する有用な情報にアクセスできます。

次の例を参照してください。

例6-1「PL/SQLを使用したデータ操作」
例6-5「CURRVALとNEXTVALの使用」
例6-7「SQL%FOUNDの使用」
例6-8「SQL%ROWCOUNTの使用」
例6-29「REF CURSORをオープンするストアド・プロシージャ」
例6-30「別の問合せでREF CURSORをオープンするストアド・プロシージャ」
例11-2「ループでのDELETE文の発行」
例11-16「BULK COLLECTでのFORALLの使用」

関連項目

「FETCH文」
「INSERT文」
「SELECT INTO文」
「UPDATE文」

EXCEPTION_INITプラグマ

EXCEPTION_INITプラグマは、例外名をOracleエラー番号に関連付けます。OTHERSハンドラを使用するかわりに、ORA-エラーを回避し、専用のハンドラを作成できます。詳細は、「PL/SQL例外と番号の関連付け: EXCEPTION_INITプラグマ」を参照してください。

構文

exception_init pragma ::=

画像の説明

キーワードとパラメータの説明

error_number

任意の有効なOracleエラー番号です。これはSQLCODEファンクションが戻すエラー番号(常に負の値)と同じです。

exception_name

現行の有効範囲の中で宣言されているユーザー定義の例外を識別します。

PRAGMA

文がコンパイラ・ディレクティブであることを表します。

使用上の注意

EXCEPTION_INITは、任意のPL/SQLブロック、サブプログラムまたはパッケージの宣言部で使用できます。このプラグマは、関連付けられた例外と同じ宣言部の中で、例外宣言の後のどこかに指定する必要があります。

1つのエラー番号に割り当てる例外名は1つのみです。

次の例を参照してください。

例10-4「PRAGMA EXCEPTION_INITの使用」
例11-9「例外が発生しても継続するバルク操作」

関連項目

「AUTONOMOUS_TRANSACTIONプラグマ」
「例外定義」
「SQLCODEファンクション」

例外定義

例外は、事前定義またはユーザー定義可能な、ランタイム・エラーまたは警告状態です。事前定義の例外は実行時システムによって暗黙的(自動的)に呼び出されます。ユーザー定義の例外はRAISE文によって明示的に呼び出す必要があります。呼び出された例外を処理するには、例外ハンドラと呼ばれる独立したルーチンを作成します。詳細は、第10章「PL/SQLエラーの処理」を参照してください。

構文

exception ::=

画像の説明

exception handler ::=

画像の説明

キーワードとパラメータの説明

exception_name

ZERO_DIVIDEのような事前定義の例外、または現行の有効範囲の中で事前に宣言されているユーザー定義の例外を識別します。

OTHERS

ブロックの例外処理部で明示的に名前を指定していないすべての例外を表します。OTHERSの使用はオプションで、ブロックの最後の例外ハンドラとしてのみ使用できます。キーワードWHENに続く例外のリストの中では、OTHERSを使用できません。

statement

実行可能文です。statementの構文は、「ブロック宣言」を参照してください。

WHEN

例外ハンドラの開始を知らせるキーワードです。キーワードWHENに続けて、キーワードORで区切った例外のリストを指定すると、複数の例外で一連の同一文を実行できます。リスト中のいずれかの例外が呼び出されると、それに関連付けられた文が実行されます。

使用上の注意

例外宣言はブロック、サブプログラム、またはパッケージの宣言部でのみ使用できます。例外の有効範囲の規則は変数と同じです。ただし、変数とは異なり、例外をパラメータとしてサブプログラムに渡すことができません。

例外のいくつかはPL/SQLによって事前に定義されています。これらの例外のリストは、「事前定義のPL/SQL例外のまとめ」を参照してください。PL/SQLは、事前定義済の例外をパッケージSTANDARDでグローバルに宣言しているため、ユーザーが宣言する必要はありません。

事前定義の例外を再宣言すると、ローカルな宣言がグローバルな宣言をオーバーライドするため、エラーが発生しやすくなります。この場合は、ドット表記法を使用して、次のように事前定義の例外を指定する必要があります。

EXCEPTION
    WHEN invalid_number OR STANDARD.INVALID_NUMBER THEN ...

PL/SQLブロックの例外処理部はオプションです。例外ハンドラはブロックの末尾に置く必要があります。例外処理部はキーワードEXCEPTIONで始まります。ブロックの例外処理部の終わりは、ブロックの終わりも示すキーワードENDです。例外ハンドラから参照できる変数は、カレント・ブロックから参照できる変数のみです。

例外を呼び出すのは、処理の続行が不可能、あるいは望ましくないようなエラーが発生した場合のみにしてください。呼び出された例外に対応する例外ハンドラがカレント・ブロックに存在しない場合、例外は次の規則に従って伝播します。

ブロックの例外処理部でアクティブになれる例外は一度に1つのみです。このため、ハンドラの内側で例外が呼び出されると、カレント・ブロックの外側のブロックが、新しく呼び出された例外に対するハンドラを検索するための最初のブロックになります。それ以降の例外の伝播は通常どおりに行われます。

次の例を参照してください。

例1-9「WHILE-LOOPを使用した制御」
例1-12「ストアド・サブプログラムの作成」
例2-19「複数の重複したラベルを使用するPL/SQLブロック」
例5-35「TRIMを使用したコレクションのサイズの縮小」
例5-38「コレクションに関する例外」
例6-37「ROLLBACKの使用」
例7-1「動的SQLの例」
例8-1「単純なPL/SQLプロシージャ」
例9-3「emp_adminパッケージの作成」
例10-1「ランタイム・エラー処理」
例10-3「PL/SQL例外の有効範囲」
例10-9「PL/SQL例外の再呼出し」
例11-6「FORALLでのロールバックの使用」
例11-9「例外が発生しても継続するバルク操作」
例12-3「PL/SQLブロックでのNULLのオブジェクト」

関連項目

「ブロック宣言」
「EXCEPTION_INITプラグマ」
「RAISE文」

EXECUTE IMMEDIATE文

EXECUTE IMMEDIATE文は、動的SQL文または無名PL/SQLブロックを実行します。この文を使用すると、PL/SQLで直接表せないSQL文を発行したり、一部の表名、WHERE句などが事前に不明な場合でも文を作成できます。詳細は、「PL/SQLでのEXECUTE IMMEDIATE文の使用」を参照してください。

構文


画像の説明

キーワードとパラメータの説明

bind_argument

動的SQL文に渡される値を持つ式か、または動的SQL文から戻された値を格納する変数です。

BULK COLLECT

1つ以上のコレクションに結果の値を格納します。FETCH文を使用したループよりも高速な問合せが可能です。詳細は、「バルクSQLによる、DML文および問合せのループ・オーバーヘッドの削減」を参照してください。

collection_name

フェッチしたselect_item値を格納するための、宣言されたコレクションを識別します。select_itemごとに、リストの中に、対応する型互換のコレクションが存在している必要があります。

host_array_name

フェッチしたselect_item値を格納するための配列を識別します。この配列は、PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されます。select_itemごとに、リストの中に、対応する型互換の配列が存在している必要があります。ホスト配列には、接頭辞としてコロンが必要です。

define_variable

選択された列の値を格納する変数を識別します。

dynamic_string

1つのSQL文またはPL/SQLブロックを表す文字列リテラル、変数または式です。NCHAR型またはNVARCHAR2型ではなく、CHAR型またはVARCHAR2型である必要があります。

INTO ...

単一行の問合せの場合に使用され、取り出された列値を入れる変数またはレコードを指定します。問合せによって取り出された値それぞれに対して、INTO句の中に、対応する型互換性変数が存在している必要があります。

record_name

選択された行を格納するユーザー定義のレコードまたは%ROWTYPEレコードを識別します。

returning_clause

挿入された行から値を戻します。そのため、後で行をSELECTで選択する必要がありません。取り出した列値は、変数またはコレクションに代入できます。RETURNING句はリモートまたはパラレルでの挿入には使用できません。文を実行しても行に影響がない場合、RETURNING句で指定した変数の値は未定義になります。returning_clauseの構文は、「RETURNING INTO句」を参照してください。

USING ...

入力または出力バインド引数(あるいはその両方)のリストを指定します。デフォルトのパラメータ・モードはINです。

使用上の注意

複数行の問合せの場合を除いて、動的文字列には任意のSQL文(最後のセミコロンなし)または任意のPL/SQLブロック(最後のセミコロン付き)を含めることができます。また、バインド引数のプレースホルダも含めることができます。バインド引数を使用してスキーマ・オブジェクトの名前を動的SQL文に渡すことはできません。

バインド引数は、すべてUSING句に入れることができます。デフォルトのパラメータ・モードはINです。RETURNING句を持つDML文の場合は、パラメータ・モードOUTを定義して指定しなくても、OUT引数をRETURNING INTO句に入れることができます。USING句とRETURNING INTO句の両方を使用する場合、USING句にはIN引数のみを含めることができます。

実行時に、バインド引数は動的文字列内の対応するプレースホルダを置き換えます。すべてのプレースホルダをUSING句内またはRETURNING INTO句内(あるいはその両方)のバインド引数に関連付ける必要があります。数値リテラル、文字リテラルおよび文字列リテラルはバインド引数として使用できますが、ブール・リテラル(TRUEFALSEおよびNULL)は使用できません。動的文字列にNULLを渡すには、回避策を使用する必要があります。「動的SQLへのNULLの引渡し」を参照してください。

動的SQLはすべてのSQLデータ型をサポートしています。たとえば、定義変数やバインド引数をコレクション、LOB、オブジェクト型のインスタンスおよびrefとすることができます。動的SQLはPL/SQL固有の型をサポートしていません。たとえば、定義変数やバインド引数をブールまたは索引付き表にすることはできません。例外として、PL/SQLレコードをINTO句に入れることができます。

動的SQL文は、バインド引数の新しい値を使用して繰り返し実行できます。ただし、EXECUTE IMMEDIATEは実行のたびに動的文字列を準備するため、オーバーヘッドが発生します。

EXECUTE IMMEDIATEコマンドの文字列引数に、NCHARNVARCHAR2などの各国語キャラクタ・タイプを使用することはできません。


注意:

PL/SQLで動的SQLを使用する場合は、SQLインジェクションのリスクを認識しておく必要があります。SQLインジェクションによって、セキュリティの問題が発生する可能性があります。SQLインジェクションおよび発生する可能性がある問題の詳細は、『Oracle Databaseアプリケーション開発者ガイド-基礎編』を参照してください。SQLインジェクションについては、Oracle Technology Networkのhttp://www.oracle.com/technologyで検索することもできます。 


次の例を参照してください。

例7-1「動的SQLの例」
例7-2「表名およびWHERE句を受け入れる動的SQLプロシージャ」
例7-4「BULK COLLECT INTO句を使用した動的SQL」
例7-5「RETURNING BULK COLLECT INTO句を使用した動的SQL」
例7-6「FORALL文中の動的SQL」

関連項目

「OPEN-FOR文」

EXIT文

EXIT文は、ループを終了します。EXIT文には、無条件EXITと、条件付きEXIT WHENという2つの形式があります。どちらの形式でも、終了するループの名前を指定できます。詳細は、「ループの反復の制御: LOOP文とEXIT文」を参照してください。

構文

exit ::=

画像の説明

キーワードとパラメータの説明

boolean_expression

TRUEFALSEまたはNULLのいずれかのブール値を戻す式です。この式は、ループが繰り返されるたびに評価されます。式がTRUEを戻す場合、カレント・ループ(またはlabel_nameのラベルの付いたループ)はただちに終了します。boolean_expressionの構文は、「式定義」を参照してください。

EXIT

無条件の(つまりWHEN句のない)EXIT文は、カレント・ループをただちに終了します。実行はループの直後の文から再開されます。

label_name

終了するループを識別します。カレント・ループ、またはラベルが付けられている外側のループのいずれかになります。

使用上の注意

EXIT文は、ループの内側でのみ使用できます。ブロックからは直接終了できません。PL/SQLでは無限ループをコーディングできます。たとえば、次のループは通常の方法では永久に終了しないため、EXIT文を使用して終了させます。

WHILE TRUE LOOP ...END LOOP;

EXIT文を使用してカーソルFORループを途中で終了させると、カーソルは自動的にクローズされます。ループの内側で例外が呼び出された場合も、カーソルは自動的にクローズされます。

次の例を参照してください。

例4-8「EXIT文の使用」
例4-17「LOOPでのEXITの使用」
例4-18「LOOPでのラベル付きEXITの使用」

関連項目

「式定義」
「LOOP文」

式定義

式は、変数、定数、リテラル、演算子、ファンクション・コールの任意の組合せです。最も単純な式は、1個の変数で構成されています。

PL/SQLコンパイラは、式を構成する変数、定数、リテラルおよび演算子の型から、式のデータ型を決定します。式が評価されたときは、その型の1つの値が結果として得られます。詳細は、「PL/SQLの式および比較」を参照してください。

構文

expression ::=

画像の説明

boolean_expression ::=

画像の説明

other boolean form ::=

画像の説明

character expression ::=

画像の説明

numeric subexpression ::=

画像の説明

date expression ::=

画像の説明

numeric expression ::=

画像の説明

キーワードとパラメータの説明

BETWEEN

この比較演算子は、ある値が指定範囲の中にあるかどうかをテストします。つまり、下限以上、上限以下にあるかどうかがテストされます。

boolean_constant_name

BOOLEAN型の定数を指定します。このような定数は、TRUEFALSE、またはNULLに初期化される必要があります。ブール定数に対する算術演算は許可されていません。

boolean_expression

TRUEFALSEまたはNULLのいずれかのブール値を戻す式です。

boolean_function_call

ブール値を戻すファンクション・コールです。

boolean_literal

事前定義の値TRUEFALSE、またはNULL(存在しない値、不明な値または適用できない値を表す)です。データベース列に値TRUEFALSEを挿入できません。

boolean_variable_name

BOOLEAN型の変数を識別します。BOOLEAN変数に代入できるのは、値TRUEFALSEおよびNULLのみです。列の値を選択またはフェッチしてBOOLEAN変数に入れることはできません。BOOLEAN変数に対する算術演算も許可されていません。

%BULK_ROWCOUNT

FORALL文で使用するように設計された、暗黙カーソルSQLの複合属性です。詳細は「SQLカーソル」を参照してください。

character_constant_name

文字値を格納する、事前に宣言された定数を識別します。この定数は、文字値または暗黙的に文字値に変換可能な値に初期化される必要があります。

character_expression

文字または文字列を戻す式です。

character_function_call

文字値または暗黙的に文字値に変換可能な値を戻すファンクション・コールです。

character_literal

文字値または暗黙的に文字値に変換可能な値を表すリテラルです。

character_variable_name

文字値を格納する、事前に宣言された変数を識別します。

collection_name

現行の有効範囲のうち、これより前の部分で宣言されているコレクション(ネストした表、索引付き表またはVARRAY)を指定します。

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。

date_constant_name

日付値を格納する、事前に宣言された定数を識別します。この定数は、日付値、または暗黙的に日付値に変換可能な値に初期化される必要があります。

date_expression

日付/時刻値を戻す式です。

date_function_call

日付値、または暗黙的に日付値に変換可能な値を戻すファンクション・コールです。

date_literal

日付値、または暗黙的に日付値に変換可能な値を表すリテラルです。

date_variable_name

日付値を格納する、事前に宣言された変数を識別します。

EXISTS、COUNT、FIRST、LAST、LIMIT、NEXT、PRIOR

コレクション・メソッドです。コレクションの名前にこれらを付加すると、有用な情報が戻されます。たとえば、EXISTS(n)は、コレクションにn番目の要素が存在する場合にTRUEを戻します。それ以外の場合、EXISTS(n)FALSEを戻します。詳細は、「コレクション・メソッド」を参照してください。

exponent

数値を戻す式です。

%FOUND、%ISOPEN、%NOTFOUND、%ROWCOUNT

カーソルの属性です。カーソル名またはカーソル変数名にこれらの属性を追加すると、複数行の問合せの実行に関する有用な情報が戻されます。これらの属性は暗黙カーソルSQLにも追加できます。

host_cursor_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されるカーソル変数を識別します。ホスト・カーソル変数には、接頭辞としてコロンを付ける必要があります。

host_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡される変数を識別します。ホスト変数のデータ型は、適切なPL/SQLのデータ型に暗黙的に変換できる必要があります。また、ホスト変数には、接頭辞としてコロンを付ける必要があります。

IN

セット・メンバーシップをテストする比較演算子です。集合のいずれかのメンバーと等しいかどうかがテストされます。集合にはNULLが含まれていてもかまいませんが、NULLは無視されます。さらに、次の形式の式の場合、

value NOT IN set

集合にNULLが含まれている場合は、FALSEが戻されます。

index

戻される値がBINARY_INTEGER型の値、PLS_INTEGER型の値、またはその型に暗黙的に変換可能な値になる数値式です。

indicator_name

PL/SQLホスト環境で宣言され、PL/SQLに渡される標識変数を識別します。標識変数には、接頭辞としてコロンを付ける必要があります。標識変数は、関連付けられたホスト変数の値または条件を示します。たとえば、Oracleプリコンパイラ環境では、標識変数を使用して出力ホスト変数内のNULLや切り捨てられた値を検出できます。

IS NULL

オペランドがNULLの場合はブール値TRUEを戻し、オペランドがNULLでない場合はFALSEを戻す比較演算子です。

LIKE

文字値とパターンを比較する比較演算子です。大/小文字が区別されます。LIKEは、文字のパターンが一致した場合はブール値TRUE、一致しない場合はFALSEを戻します。

NOT、AND、OR

表2-3の3値論理に従う論理演算子です。ANDは、オペランドの両方がTRUEの場合にのみTRUEを戻します。ORは、オペランドの片方がTRUEならばTRUEを戻します。NOTはオペランドの反対の値(論理否定)を戻します。詳細は、「論理演算子」を参照してください。

NULL

NULLを表すキーワードです。存在しない値、不明な値または適用できない値を示します。数値式または日付式の中でNULLを使用すると、結果はNULLになります。

numeric_constant_name

数値を格納する、事前に宣言された定数を識別します。この定数は、数値または暗黙的に数値に変換可能な値に初期化される必要があります。

numeric_expression

整数または実数を戻す式です。

numeric_function_call

数値または暗黙的に数値に変換可能な値を戻すファンクション・コールです。

numeric_literal

数値または暗黙的に数値に変換可能な値を表すリテラルです。

numeric_variable_name

数値を格納する、事前に宣言された変数を識別します。

pattern

LIKE演算子によって、指定された文字列値と比較される文字列です。patternには、ワイルドカードと呼ばれる特殊目的の文字を2種類使用できます。アンダースコア(_)は1つの文字を表し、パーセント記号(%)は0(ゼロ)個以上の文字を表します。パターンの後にESCAPE 'character_literal'を使用することもできます。文字列の中で、パーセント記号またはアンダースコアの前にエスケープ文字があると、それらはワイルドカードとして認識されません。

relational_operator

式を比較する演算子です。各演算子の意味は、「比較演算子」を参照してください。

SQL

SQLのDML文を処理するために、Oracleによって暗黙的にオープンされるカーソルを識別します。暗黙カーソルSQLは常に、直前に実行されたSQL文を参照します。

+, -, /, *, **

加算、減算、除算、乗算、指数の演算子を示す記号です。

||

連結演算子です。次の例に示すように、string1string2を連結した結果は、string1の後にstring2が続く文字列になります。

'Good' || ' morning!'= 'Good morning!'

次の例では、NULLは連結の結果に影響しないことを示します。

'suit' || NULL || 'case' = 'suitcase'

長さが0(ゼロ)の文字列('')はNULL文字列と呼ばれ、NULLと同じように扱われます。

使用上の注意

ブール式では、互換性のあるデータ型を持つ値のみを比較できます。詳細は、「PL/SQLデータ型の変換」を参照してください。

条件制御文においてブール式がTRUEを戻すと、関連する一連の文が実行されます。ただし、式がFALSEまたはNULLを戻すと、関連する一連の文は実行されません。

関係演算子は、BOOLEAN型のオペランドに適用できます。定義によれば、TRUEFALSEよりも大きい値を持ちます。NULLの関係する比較は、常にNULLを戻します。ブール式の値はブール変数にしか代入できず、ホスト変数やデータベースの列には代入できません。また、BOOLEAN型からの、またはBOOLEAN型へのデータ型変換はできません。

次の例に示すように、加算演算子または減算演算子を使用すると、日付値を増減できます。

hire_date := '10-MAY-95';
hire_date := hire_date + 1; -- makes hire_date '11-MAY-95'
hire_date := hire_date - 5; -- makes hire_date '06-MAY-95'

PL/SQLがブール式を評価する場合は、優先順位が最も高いのがNOT演算子で、次がAND演算子、最後がOR演算子です。ただし、カッコを使用すると、演算子のデフォルトの優先順位を変更できます。

式の中では、事前定義の優先順位に従って演算が実行されます。デフォルトの演算順序を、優先順位の高いものから順に示すと、次のようになります。

カッコ
指数
単項演算子
乗算および除算
加算、減算および連結

PL/SQLでは、優先順位の等しい演算子を評価する順序は特に決まっていません。ある式の一部にカッコで囲まれた別の式が含まれている場合、PL/SQLでは、カッコで囲まれた式を先に評価し、その結果の値を外側の式で使用します。カッコで囲まれた式がネストされている場合、PL/SQLでは、最も内側にある式を1番目に評価し、最も外側にある式を最後に評価します。

式の例を次に示します。

(a + b) > c -- Boolean expression
NOT finished -- Boolean expression
TO_CHAR(acct_no) -- character expression
'Fat ' || 'cats' -- character expression
'15-NOV-05' -- date expression
MONTHS_BETWEEN(d1, d2) -- date expression
pi * r**2 -- numeric expression
emp_cv%ROWCOUNT -- numeric expression
例1-2「代入演算子を使用した変数への値の代入」を参照してください。

関連項目

「代入文」
「定数と変数の宣言」
「EXIT文」
「IF文」
「LOOP文」

FETCH文

FETCH文は、複数行の問合せの結果セットから、行データを取り出します。一度に1行、複数の行、またはすべての行をフェッチできます。データは問合せが選択した列に対応する変数またはフィールドに格納されます。詳細は、「PL/SQLを使用したデータの問合せ」を参照してください。

構文

fetch statement ::=

画像の説明

キーワードとパラメータの説明

BULK COLLECT

コレクションをPL/SQLエンジンに戻す前にバルク・バインド出力するように、SQLエンジンに指示します。SQLエンジンは、INTOリスト内で参照されるすべてのコレクションをバルク・バインドします。

collection_name

バルク・フェッチした列値を格納するための、宣言されたコレクションを識別します。問合せselect_itemごとに、リストの中に、対応する型互換のコレクションが存在している必要があります。

cursor_name

現行の有効範囲の中で宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で宣言されているPL/SQLカーソル変数(またはパラメータ)を識別します。

host_array_name

バルク・フェッチした列値を格納するための配列を識別します。この配列は、PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されます。問合せselect_itemごとに、リストの中に、対応する型互換の配列が存在している必要があります。ホスト配列には、接頭辞としてコロンが必要です。

host_cursor_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されるカーソル変数を識別します。ホスト・カーソル変数のデータ型は、PL/SQLカーソル変数の戻り型と互換性があります。ホスト変数には、接頭辞としてコロンを付けてください。

LIMIT

バルク(スカラーではない)FETCH文の中でのみ許されるオプションの句です。結果セット全体ではなく、一度にいくつかの行をバルク・フェッチします。

record_name

フェッチした行の値を格納する、ユーザー定義のレコードまたは%ROWTYPEレコードを識別します。カーソルまたはカーソル変数に関連付けられた問合せが戻す列の値に対して、レコードの中に、対応する型互換のフィールドが存在している必要があります。

variable_name

フェッチした列値を格納するための変数を識別します。カーソルまたはカーソル変数に関連付けられた問合せが戻す列の値に対して、リストの中に、対応する型互換の変数が存在している必要があります。

使用上の注意

複数行の問合せを処理するには、カーソルFORループかFETCH文を使用します。

問合せのWHERE句に含まれる変数は、カーソルまたはカーソル変数がオープンされたときにのみ評価されます。結果セットや問合せの中の変数の値を変更するには、カーソルまたはカーソル変数を、新しい値に設定して再オープンする必要があります。

カーソルを再オープンするには、まずクローズしてください。ただし、カーソル変数を再オープンする場合には、その前にクローズする必要はありません。

同じカーソルまたはカーソル変数を使用した別のフェッチで、異なるINTOリストを使用できます。個のFETCH文で別の行を取り出し、ターゲット変数に値を代入します。

結果セットの中に行が残っていない状態でFETCH文を実行すると、ターゲット・フィールドの値またはターゲット変数の値は予測不能となり、%NOTFOUND属性はTRUEを戻します。

PL/SQLでは、カーソル変数の戻り型が、必ずFETCH文のINTO句と互換性を持ちます。カーソル変数に関連付けられた問合せが戻す列の値に対して、INTO句の中に、対応する、型互換性のあるフィールドまたは変数が存在している必要があります。また、フィールドまたは変数の数は、列の値の数と一致する必要があります。

カーソル変数を、そのカーソル変数からフェッチするサブプログラムの仮パラメータとして宣言する場合は、INまたはIN OUTモードを指定する必要があります。ただし、サブプログラムがカーソル変数もオープンする場合は、IN OUTモードを指定する必要があります。

一連のFETCH文では取り出すデータが常に不足するため、FETCHがデータを戻さない場合でも例外は呼び出されません。この状態を検出するには、カーソル属性%FOUNDまたは%NOTFOUNDを使用する必要があります。

クローズしている、または一度もオープンされていないカーソルまたはカーソル変数からフェッチを実行すると、PL/SQLによって事前定義の例外INVALID_CURSORが呼び出されます。

BULK COLLECTの制限

BULK COLLECT句には、次の制限が適用されます。

次の例を参照してください。

例6-10「カーソルを使用したフェッチ」
例6-13「カーソルを使用したバルク・データのフェッチ」
例6-23「明示カーソルへのパラメータの引渡し」
例6-27「REF CURSORのパラメータとしての引渡し」
例6-32「カーソル変数からレコードへのフェッチ」
例6-33「カーソル変数からコレクションへのフェッチ」
例6-35「カーソル式の使用」
例6-41「CURRENT OFを使用した、カーソルからフェッチされた最新行の更新」
例7-4「BULK COLLECT INTO句を使用した動的SQL」
例13-1「宣言および変数への値の代入」

関連項目

「CLOSE文」
「カーソル宣言」
「カーソル変数」
「LOOP文」
「OPEN文」
「OPEN-FOR文」
「RETURNING INTO句」

FORALL文

FORALL文は、一連の静的DML文または動的DML文を発行します。通常、FORループを使用する場合より高速に処理を実行できます。この文には、いくつかの設定コードが必要です。これは、ループが繰り返されるたびに、VALUES句またはWHERE句内の1つ以上のコレクションの値が使用されるためです。詳細は、「バルクSQLによる、DML文および問合せのループ・オーバーヘッドの削減」を参照してください。

構文

for all statement ::=

画像の説明

bounds_clause ::=

画像の説明

キーワードとパラメータの説明

INDICES OF collection_name

索引変数の値が指定したコレクション要素の添字に対応するように指定する句です。この句を使用すると、いくつかの要素が削除されたネストした表、または数値の添字を持つ結合配列で、FORALLを使用できます。

BETWEEN lower_bound AND upper_bound

INDICES OF句の添字の範囲を制限します。範囲内の添字がコレクションに存在しない場合、その添字はスキップされます。

VALUES OF index_collection_name

FORALL索引変数の添字に、index_collection_nameで指定した別のコレクションの要素の値が使用されるように指定する句です。ここで使用する別のコレクションは、ポインタのセットとして機能します。index_collection_nameで指定する要素に応じて、FORALLは任意の順序で添字に対する反復処理を実行できます(同じ添字を複数回使用することもできます)。

索引コレクションは、ネストした表であるか、またはPLS_INTEGERBINARY_INTEGERによって索引付けされ、要素もPLS_INTEGERBINARY_INTEGERである結合配列である必要があります。索引コレクションが空の場合、例外が呼び出され、FORALL文は実行されません。

index_name

コレクションの添字として、FORALL文の中でのみ参照できる、未宣言の識別子です。

index_nameの暗黙的な宣言は、ループの外側での宣言をオーバーライドします。文の中では同じ名前の別の変数を参照できません。FORALL文の中では、index_nameは式に使用したり値を代入できません。

lower_bound .. upper_bound

連続した索引番号の有効範囲を指定する数式です。必要に応じて、PL/SQLはこれらの番号を最も近い整数に四捨五入します。SQLエンジンは、範囲内の各索引番号に対して一度ずつSQL文を実行します。この式は、FORALL文を入力すると、一度評価されます。

SAVE EXCEPTIONS

一部のDML操作が失敗してもFORALLループを継続させるオプションのキーワードです。プログラムでは、例外をただちに呼び出すのではなく、FORALL文の終了後に例外を1つ呼び出します。エラーの詳細は、SQL%BULK_EXCEPTIONSでループの後に取得できます。プログラムでは、発生するたびに例外を個別に処理するのではなく、FORALLループの後ですべてのエラーをレポートまたはクリーンアップできます。「%BULK_EXCEPTIONS属性を持つFORALL例外の処理」を参照してください。

sql_statement

VALUES句またはWHERE句内のコレクション要素を参照するUPDATEまたはDELETEなどの静的DML文、あるいは動的(EXECUTE IMMEDIATE)DML文です。

使用上の注意

SQL文は複数のコレクションを参照できますが、パフォーマンス上のメリットは、添字付きコレクションにのみ適用されます。

FORALL文が失敗すると、データベースの変更は、各SQL文の実行の前にマークされた暗黙的なセーブポイントまでロールバックされます。前回のFORALLループの反復中に行われた変更はロールバックされません。

制限

FORALL文には、次の制限が適用されます。

次の例を参照してください。

例11-2「ループでのDELETE文の発行」
例11-3「ループでのINSERT文の発行」
例11-4「コレクションの一部でのFORALLの使用」
例11-5「連続していない索引値でのFORALLの使用」
例11-9「例外が発生しても継続するバルク操作」
例11-16「BULK COLLECTでのFORALLの使用」

関連項目

「BULK COLLECT句を使用した、問合せ結果のコレクションへの取出し」

ファンクション宣言

ファンクションとは、パラメータを指定して単一の値を戻すことができるサブプログラムのことです。ファンクションには、仕様部と本体の2つの部分があります。ファンクションの仕様部はキーワードFUNCTIONで始め、戻り値のデータ型を指定するRETURN句で終わります。パラメータ宣言はオプションです。パラメータを取らないファンクションではカッコを書きません。ファンクション本体は、キーワードIS(またはAS)で始め、キーワードENDで終わります。ENDの後には、オプションとしてファンクション名を続けることができます。

ファンクション本体には、宣言部(オプション)、実行部、例外処理部(オプション)の3つの部分があります。宣言部には、型、カーソル、定数、変数、例外およびサブプログラムが含まれます。これらの項目はローカルで、ファンクションを終了すると消去されます。実行部には、値の代入、実行の制御およびデータの操作を実行する文があります。例外処理部には、実行の途中で呼び出された例外を処理する例外ハンドラがあります。詳細は、「PL/SQLファンクション」を参照してください。ファンクション宣言の例は、例9-3を参照してください。

PL/SQLブロックまたはパッケージでのファンクション宣言は、SQLでのファンクションの作成とは異なります。SQLのCREATE FUNCTION文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

function specification ::=

画像の説明

function declaration ::=

画像の説明

function body ::=

画像の説明

parameter declaration ::=

画像の説明

キーワードとパラメータの説明

datatype

型指定子です。datatypeの構文は、「定数と変数の宣言」を参照してください。

DETERMINISTIC

オプティマイザが冗長なファンクション・コールを回避するために役立つヒントです。ストアド・ファンクションが同じ引数で事前にコールされた場合は、オプティマイザは前の結果を使用できます。ファンクションの結果をセッション変数の状態またはスキーマ・オブジェクトに依存させないでください。さもないと、コールごとに結果が異なる可能性があります。DETERMINISTICファンクションのみが、ファンクションベースの索引またはクエリー・リライトを使用可能にしたマテリアライズド・ビューからコールできます。DETERMINISTICオプションの詳細および可能性がある制限は、『Oracle Database SQLリファレンス』の「CREATE FUNCTION文」を参照してください。『Oracle Database SQLリファレンス』の「CREATE INDEX文」も参照してください。

exception_handler

例外ハンドラです。例外が呼び出されると、その例外に関連付けられた一連の文を実行します。exception_handlerの構文は、「例外定義」を参照してください。

expression

変数、定数、リテラル、演算子、ファンクション・コールの任意の組合せです。最も単純な式は、1個の変数で構成されています。宣言がPL/SQLコンパイラによって処理されるときに、expressionの値がパラメータに代入されます。その値とパラメータのデータ型には互換性が必要です。

function_name

ファンクションに選択する名前を指定します。

IN、OUT、IN OUT

仮パラメータの動作を定義するパラメータ・モードです。INパラメータは、コールされるサブプログラムに値を渡します。OUTパラメータは、サブプログラムのコール元に値を戻します。IN OUTパラメータは、コール先のサブプログラムに初期値を渡し、更新された値をコール元に戻します。

item_declaration

プログラム・オブジェクトを宣言します。構文は、「ブロック宣言」を参照してください。

NOCOPY

コンパイラ・ヒント(ディレクティブではなく)です。これによって、PL/SQLコンパイラはOUTおよびIN OUTパラメータを、デフォルトの値方式ではなく、参照方式で渡すことができます。このファンクションは、これらのパラメータの一時コピーを作成する必要がないため、高速で実行できます。ただし、ファンクションが未処理例外を戻して終了すると、結果が異なる場合があります。詳細は、「サブプログラムのパラメータのデフォルト値の使用」を参照してください。

PARALLEL_ENABLE

ストアド・ファンクションがパラレルDML評価のスレーブ・セッションで安全に使用されることを宣言します。メイン(ログオン)・セッションの状態が、スレーブ・セッションと共有されることはありません。スレーブ・セッションごとに固有の状態があり、セッション開始時に初期化されます。ファンクションの結果がセッション(static)変数の状態に依存しないようにしてください。さもないと、セッションごとに結果が異なる可能性があります。PARALLEL_ENABLEオプションの詳細は、『Oracle Database SQLリファレンス』の「CREATE FUNCTION文」を参照してください。

parameter_name

仮パラメータを識別します。仮パラメータとは、ファンクションの仕様部で宣言され、ファンクション本体の中で参照される変数のことです。

PIPELINED

PIPELINEDは、テーブル・ファンクションの結果を反復的に戻すことを指定します。テーブル・ファンクションは、SQLデータ型の要素を含むコレクション型(ネストした表またはVARRAY)を戻します。SQL問合せのFROM句のファンクション名の前にTABLEキーワードを使用して、テーブル・ファンクションを問い合せることができます。詳細は、「パイプライン・ファンクションによる変換の設定」を参照してください。

AUTONOMOUS_TRANSACTIONプラグマ

ファンクションを自律型としてマークします。自律型トランザクションは、メイン・トランザクションによって開始される独立したトランザクションです。自律型トランザクションを使用すると、メイン・トランザクションを停止し、SQL操作を実行してその操作をコミットまたはロールバックしてから、メイン・トランザクションを再開できます。詳細は、「自律型トランザクションによる独立した作業単位の実行」を参照してください。

procedure_declaration

プロシージャを宣言します。procedure_declarationの構文は、「プロシージャ宣言」を参照してください。

RETURN

RETURN句の開始を知らせるキーワードです。この句では、戻り値のデータ型を定義します。

type_definition

ユーザー定義のデータ型を指定します。構文は、「ブロック宣言」を参照してください。

:= | DEFAULT

INパラメータをデフォルト値に初期化します。

使用上の注意

ファンクションは、式の一部としてコールされます。

promotable := sal_ok(new_sal, new_title) AND (rating > 3);

ストアド・ファンクションは、副作用を制御する特定の規則に従っている場合にのみ、SQL文からコールできます。「PL/SQLサブプログラムの副作用の制御」を参照してください。

ファンクションには、RETURN文へ導く少なくとも1つの実行パスが必要です。実行パスがない場合は、実行時に「ファンクションが値なしで戻されました」というエラーが発生します。RETURN文には、RETURN文の実行時に評価される式が含まれている必要があります。結果として得られる値がファンクション識別子に代入されます。ファンクション識別子は変数のように取り扱われます。

ファンクションの仕様部と本体を合わせて1つの単位として作成できます。また、ファンクションの仕様部と本体を別にすることもできます。このように、ファンクションをパッケージに入れると、実装上の細部を隠ぺいできます。パッケージ仕様部でファンクション仕様部を宣言せずに、パッケージ本体でファンクションを定義できます。ただし、このようなファンクションは、パッケージの中からのみコールできます。

ファンクションの中では、INパラメータは定数のように取り扱われるため、値は代入できません。OUTパラメータはローカル変数のように取り扱われるため、値を変更して参照できます。IN OUTパラメータは初期化された変数のように取り扱われるため、値を代入したり、その値を他の変数に代入できます。パラメータ・モードの詳細は、表8-1を参照してください。

ファンクションでは、OUTモードとIN OUTモードを使用しないでください。ファンクションの目的は、0(ゼロ)個以上のパラメータを取り、単一の値を戻すことです。サブプログラム専用ではない変数の値を変更するという副作用も避ける必要があります。

次の例を参照してください。

例1-13「パッケージおよびパッケージ本体の作成」
例2-15「名前解決でのサブプログラムの使用」
例2-27「CASE文での検索条件の使用」
例5-44「ファンクションからレコードを戻す」
例6-43「パッケージでの自律型ファンクションの宣言」
例6-48「自律型ファンクションのコール」
例9-3「emp_adminパッケージの作成」

関連項目

「パッケージ宣言」
「プロシージャ宣言」

GOTO文

GOTO文は、文ラベルまたはブロック・ラベルに無条件に分岐します。ラベルは有効範囲の中で他と重複しないもので、実行可能文かPL/SQLブロックの前に置かれている必要があります。GOTO文によって、制御はラベルの付いた文またはブロックに移ります。詳細は、「GOTO文の使用」を参照してください。

構文

label declaration ::=

画像の説明

goto statement ::=

画像の説明

キーワードとパラメータの説明

label_name

実行可能文またはPL/SQLブロックに付けるラベル名です。GOTO文を使用すると、<<label_name>>の後に指定した文またはブロックに制御を移すことができます。

使用上の注意

GOTO文のラベルは、実行可能文かPL/SQLブロックの前に付けてください。GOTO文はIF文、LOOP文またはサブブロックには分岐できません。実行可能文のない場所へ分岐するには、NULL文を追加します。

GOTO文では、カレント・ブロックから同じブロックの別の場所、または囲みブロックには分岐できますが、例外ハンドラには分岐できません。例外ハンドラのGOTO文は、囲みブロックには分岐できますが、カレント・ブロックには分岐できません。

GOTO文を使用してカーソルFORループを途中で終了させると、カーソルは自動的にクローズされます。ループの内側で例外が呼び出された場合も、カーソルは自動的にクローズされます。

ある1つのブロックの中では、1つのラベルは一度のみ使用できます。ただし、囲みブロックやサブブロックなどの他のブロックでそのラベルを使用できます。ターゲット・ラベルがカレント・ブロックにない場合、GOTO文は囲みブロックのうちそのラベルが存在する最初のものに分岐します。

次の例を参照してください。

例4-19「簡単なGOTO文の使用」
例4-21「GOTO文を使用した外側のブロックへの分岐」

IF文

IF文を使用すると、ブール式の値に応じて、一連の文を実行するか、またはスキップできます。詳細は、「条件テスト: IF文およびCASE文」を参照してください。

構文

if statement ::=

画像の説明

キーワードとパラメータの説明

boolean_expression

TRUEFALSEまたはNULLのいずれかのブール値を戻す式です。たとえば、等価、以上、未満などの比較があります。THENキーワードに続く一連の文は、式がTRUEを戻した場合にのみ実行されます。

ELSE

制御がこのキーワードに達すると、その直後の一連の文が実行されます。以前の条件テストがいずれもTRUEを戻さなかった場合に発生します。

ELSIF

以前の条件がいずれもTRUEを戻さなかった場合に評価されるブール式の開始を知らせます。

THEN

式がTRUEを戻した場合、THENキーワードの後の文が実行されます。

使用上の注意

IF文には、IF-THENIF-THEN-ELSEおよびIF-THEN-ELSIFの3つの形式があります。IF文の最も単純な形式では、ブール式を、キーワードTHENEND IFで囲まれた一連の文に関連付けます。一連の文は、式がTRUEを戻す場合にのみ実行されます。式がFALSEまたはNULLを戻す場合、IF文は何も実行しません。いずれの場合も、制御は次の文に渡されます。

IF文の2つ目の形式では、キーワードELSEが追加され、その後に一連の代替文を続けます。ブール式がFALSEまたはNULLを戻す場合にのみ、ELSE句内の一連の文が実行されます。このように、ELSE句では必ず一連の文が実行されます。

IF文の3つ目の形式では、キーワードELSIFを使用して別のブール式を追加します。最初の式がFALSEまたはNULLを戻す場合、ELSIF句は別の式を評価します。IF文は任意の数のELSIF句を持つことができます。最後のELSE句はオプションです。ブール式は上から下に1つずつ評価されます。いずれかの式がTRUEを戻す場合は、それに関連する一連の文が実行され、制御は次の文に移ります。すべての式がFALSEまたはNULLを戻す場合は、ELSE句内の一連の文が実行されます。

一連の文が1つでも実行されると、IF文の処理は終了します。このため、一連の文が複数回実行されることはありません。ただし、THEN句とELSE句には、さらにIF文を入れることができます。つまり、IF文はネストできます。

例13-3に、IF-THEN-ELSIF-ELSE文の例を示します。

例13-3    IF文の使用

DECLARE
   jobid      employees.job_id%TYPE;
   empid      employees.employee_id%TYPE := 115;
   sal_raise  NUMBER(3,2);
BEGIN
  SELECT job_id INTO jobid from employees WHERE employee_id = empid;
  IF jobid = 'PU_CLERK' THEN sal_raise := .09;
  ELSIF jobid = 'SH_CLERK' THEN sal_raise := .08;
  ELSIF jobid = 'ST_CLERK' THEN sal_raise := .07;
  ELSE sal_raise := 0;
  END IF;
END;
/

次の例を参照してください。

例1-7「IF-THEN_ELSE文およびCASE文を使用した条件制御」
例4-1「単純なIF-THEN文の使用」
例4-2「単純なIF-THEN-ELSE文の使用」
例4-3「IF文のネスト」
例4-4「IF-THEN-ELSEIF文の使用」

関連項目

「条件テスト: IF文およびCASE文」
「CASE文」
「式定義」

INSERT文

INSERT文は、データベース表に1つ以上の新しい行データを追加します。INSERT文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

insert statement ::=

画像の説明

キーワードとパラメータの説明

alias

参照される表またはビューの別名(通常は短縮名)です。

column_name[, column_name]...

データベースの表またはビューの列のリストを識別します。VALUES句の式が同じ順序でリストに示されているかぎり、列はどのような順序で指定してもかまいません。各列の名前はリストの中で一度のみ指定できます。表の列のうち、リストに含まれていないものがある場合、それらの列はそれぞれNULL、またはCREATE TABLE文で指定されたデフォルト値に設定されます。

returning_clause

挿入された行から値を戻します。そのため、後で行をSELECTで選択する必要がありません。取り出した列値は、変数またはコレクションに代入できます。RETURNING句はリモートまたはパラレルでの挿入には使用できません。文を実行しても行に影響がない場合、RETURNING句で指定した変数の値は未定義になります。returning_clauseの構文は、「RETURNING INTO句」を参照してください。

sql_expression

任意の有効なSQLの式です。たとえば、リテラル、PL/SQL変数、単一の値を戻すSQL問合せなどがあります。詳細は、『Oracle Database SQLリファレンス』を参照してください。PL/SQLでは、ここでレコード変数も使用できます。

subquery

処理する行セットを提供するSELECT文です。構文はselect_into_statementの構文と似ていますが、INTO句は使用できません。「SELECT INTO文」を参照してください。

subquery3

行セットを戻すSELECT文です。このSELECT文によって戻された各行が、表に挿入されます。この副問合せは、列リストのすべての列について値を戻す必要があります。また、列リストが存在しない場合は、表の中のすべての列について値を戻す必要があります。

table_reference

表またはビューを指定します。指定された表またはビューは、INSERT文の実行時にアクセスできる必要があり、ユーザーはINSERT権限を持つ必要があります。table_referenceの構文は、「DELETE文」を参照してください。

TABLE (subquery2)

TABLEのオペランドは、1つの列値を戻すSELECT文です。これはネストした表を表します。この演算子は、値がスカラー値ではなくコレクションになるように指定します。

VALUES (...)

式の値を、列リストの中の対応する列に代入します。列リストが指定されていない場合、最初の値はCREATE TABLE文で定義された最初の列に、2番目の値は2番目の列に、というように挿入されます。列リストの中では、各列につき指定できる値は1つです。挿入される値のデータ型は、列リストの対応する列のデータ型との互換性が必要です。

使用上の注意

VALUESリストの中の文字リテラルと日付リテラルは、引用符(')で囲む必要があります。数値リテラルは引用符で囲みません。

暗黙的なSQLカーソルとカーソル属性%NOTFOUND%FOUND%ROWCOUNTおよび%ISOPENを使用すると、INSERT文の実行に関する有用な情報にアクセスできます。

次の例を参照してください。

例6-1「PL/SQLを使用したデータ操作」
例6-5「CURRVALとNEXTVALの使用」
例6-7「SQL%FOUNDの使用」
例6-37「ROLLBACKの使用」
例6-38「ROLLBACKとSAVEPOINTの併用」
例6-46「自律型トリガーの宣言」
例6-48「自律型ファンクションのコール」
例7-1「動的SQLの例」
例9-3「emp_adminパッケージの作成」

関連項目

「DELETE文」
「SELECT INTO文」
「UPDATE文」

リテラル宣言

リテラルは、識別子によって表現する必要がない明示的な数値、文字、文字列またはブール値です。たとえば、数値リテラル135や文字列リテラル'hello world'などです。詳細は、「リテラル」を参照してください。

構文

numeric literal ::=

画像の説明

integer literal ::=

画像の説明

real number literal ::=

画像の説明

character literal ::=

画像の説明

string literal ::=

画像の説明

boolean literal ::=

画像の説明

キーワードとパラメータの説明

character

PL/SQLキャラクタ・セットのメンバーです。詳細は、「キャラクタ・セットおよび字句単位」を参照してください。

digit

数字0〜9のうちのいずれかです。

TRUE、FALSE、NULL

事前定義のブール値です。

使用上の注意

算術式では、整数と実数の数値リテラルを使用できます。数値リテラルは、句読点文字で区切る必要があります。句読点以外に空白も使用できます。詳細は、「数値リテラル」を参照してください。

文字リテラルは引用符(アポストロフィ)で囲まれた1文字のことです。文字リテラルには、PL/SQLキャラクタ・セットのすべての印刷可能文字(英字、数字、空白および特殊記号)を使用できます。文字リテラルの中で、PL/SQLは大/小文字を区別します。たとえば、PL/SQLはリテラル'Q''q'を異なるものとみなします。詳細は、「文字リテラル」を参照してください。

文字列リテラルは、引用符(')で囲まれた0(ゼロ)個以上の文字の並びです。NULL文字列('')は0(ゼロ)個の文字です。文字列リテラルは最大32,767個の文字を保持できます。文字列リテラルの中で、PL/SQLは大/小文字を区別します。たとえば、PL/SQLはリテラル'white''White'を異なるものとみなします。

文字列の中でアポストロフィを表現する場合は、引用符(')を1つではなく、2つ入力します。引用符を2つ入力すると不都合があるか、またはわかりにくくなるリテラルでは、q'esc_char ... esc_char'という表記法を使用して、エスケープ文字を指定できます。このエスケープ文字は、その文字列の他の箇所では使用されていない必要があります。

文字列リテラルの中では、値に後続する空白が意味を持ちます。つまり、'abc''abc 'は異なります。文字列リテラルの中の後続する空白は、PL/SQLの処理中には切り捨てられませんが、表のCHAR型の列にその値を挿入すると切り捨てられます。NCHAR文字列リテラルを含む詳細は、「文字列リテラル」を参照してください。

ブール値TRUEおよびFALSEはデータベース列に挿入できません。詳細は、「ブール・リテラル」を参照してください。

次に数値リテラルの例を示します。

25 6.34 7E2 25e-03 .1 1. +17 -4.4 -4.5D -4.6F

次に文字リテラルの例を示します。

'H' '&' ' ' '9' ']' 'g'

次に文字列リテラルの例を示します。

'$5,000'
'02-AUG-87'
'Don''t leave until you''re ready and I''m ready.'
q'#Don't leave until you're ready and I'm ready.#'

次の例を参照してください。

例2-3「日時リテラルの使用」
例2-34「データベースのバージョンでの条件付きコンパイルの使用」

関連項目

「定数と変数の宣言」
「式定義」
「リテラル」

LOCK TABLE文

LOCK TABLE文は、データベース表全体を指定のロック・モードでロックします。これによって、表の整合性を維持したまま、表アクセスの共有や拒否ができます。詳細は、「LOCK TABLEの使用」を参照してください。

Oracleには、複数のプログラムで、一貫性のあるデータのビューを個別に参照してデータの読取りと書込みを同時に実行できる様々な自動機能が備わっています。そのため、ほとんどの場合、ユーザーが表をロックする必要はありません。SQLのLOCK TABLE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

lock table statement ::=

画像の説明

キーワードとパラメータの説明

table_reference

ロックする対象の表またはビューです。LOCK TABLE文を実行する場合は、この表またはビューがアクセス可能である必要があります。table_referenceの構文は、「DELETE文」を参照してください。

lock_mode

ロックのタイプを指定します。これは、ROW SHAREROW EXCLUSIVESHARE UPDATESHARESHARE ROW EXCLUSIVEEXCLUSIVEのいずれかです。

NOWAIT

これはオプションのキーワードであり、これを指定するとOracleは他のユーザーが表をロックしていると待機しません。制御はただちにプログラムに戻されるため、他の処理を実行してから、改めてロックを試みてください。

使用上の注意

キーワードNOWAITを省略すると、Oracleは表が利用できるようになるまで待ちます。待機時間に制限はありません。表ロックは、トランザクションがコミットまたはロールバックを発行したときに解除されます。表がロックされていても、他のユーザーは表に対して問合せできますが、問合せを実行しても表のロックを取得できません。プログラムにSQLロッキング文が含まれている場合は、ロックを要求しているOracleユーザーが、ロックのために必要な権限を持っていることを確認してください。DBAは、任意の表をロックできます。他のユーザーは、自分が所有する表か、SELECTINSERTUPDATEDELETEなどの権限が付与されている表をロックできます。

次の文は、NOWAITオプションを使用して、employees表を行共有モードでロックします。

LOCK TABLE employees IN ROW SHARE MODE NOWAIT;

関連項目

「COMMIT文」
「ROLLBACK文」

LOOP文

LOOP文は一連の文を複数回実行します。LOOPキーワードとEND LOOPキーワードで文を囲みます。PL/SQLでは、基本ループ、WHILEループ、FORループ、カーソルFORループの4種類がサポートされています。使用方法は、「ループの反復の制御: LOOP文とEXIT文」を参照してください。

構文

loop statement ::=

画像の説明

while loop statement ::=

画像の説明

for loop statement ::=

画像の説明

cursor for loop statement ::=

画像の説明

キーワードとパラメータの説明

basic_loop_statement

回数の制限なしに実行するループです。LOOPキーワードとEND LOOPキーワードで一連の文を囲みます。ループが繰り返されるたびに一連の文が実行され、制御がループの先頭に戻ります。EXITGOTOまたはRAISE文は、ループの外に分岐します。例外が呼び出された場合もループは終了します。

boolean_expression

TRUEFALSEまたはNULLのいずれかのブール値を戻す式です。式がTRUEを戻す場合にのみ実行される一連の文が関連付けられています。boolean_expressionの構文は、「式定義」を参照してください。

cursor_for_loop_statement

SQL問合せを発行し、結果セットの行をループします。この手法を使用すると、問合せの処理が、他のプログラミング言語でテキスト行を読み取る場合と同様に簡単になります。

カーソルFORループは、ループ索引を%ROWTYPE属性のレコードとして暗黙的に宣言し、カーソルをオープンして、結果セットから行の値をフェッチしてレコード内のフィールドに入れる一連の作業を繰り返し、すべての行を処理した後にカーソルをクローズします。

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。カーソルFORループに入ると、cursor_nameは、OPEN文または外側のカーソルFORループによって、すでにオープンされたカーソルを参照できません。

cursor_parameter_name

カーソルの仮パラメータとして宣言された変数を識別します。cursor_parameter_declarationの構文は、「カーソル宣言」を参照してください。カーソルのパラメータは、問合せの中で定数が使用できる場所であれば、どこででも使用できます。カーソルの仮パラメータはINパラメータにしてください。

for_loop_statement

数値のFOR_LOOPループは、指定された整数の範囲内でループを繰り返し実行します。繰返しの範囲は、キーワードFORLOOPに囲まれた反復スキームの一部です。

繰返しの範囲はFORループに入った段階で評価され、それ以降は評価されません。ループ本体は、lower_bound..upper_boundによって定義された範囲の整数1つにつき1回実行されます。1回の繰返しが終わると、ループ索引に増分が加えられます。

index_name

ループ索引に名前を付ける未宣言の識別子です(ループ・カウンタと呼ばれる場合もあります)。有効範囲はループ自体になるため、ループの外側では索引を参照できません。

index_nameの暗黙的な宣言は、ループの外側での宣言をオーバーライドします。同じ名前の別の変数を参照するには、次のようにラベルを使用します。例4-15「ループの外で変数を参照する場合のラベルの使用」を参照してください。

ループの内側では、索引は定数のように扱われるため、式の中で使用できます。ただし、値は代入できません。

label_name

オプションとしてループに付けるラベル名で、未宣言の識別子です。label_nameを使用する場合は、二重の山カッコで囲み、ループの先頭に置く必要があります。必要に応じて、label_nameを山カッコで囲まずにループの最後に置くこともできます。

label_nameEXIT文の中で使用すると、label_nameによってラベル付けされているループを終了できます。カレント・ループのみでなく、外側のループも終了できます。

外側のFORループと、その内側のネストされたFORループの索引が同じ名前である場合、ネストされたループから外側のループの索引を参照できません。ただし、外側のループがlabel_nameでラベル付けされている場合は、次のようにドット表記法を使用すれば参照できます。例4-16「ループのラベルを使用した参照」を参照してください。

lower_bound .. upper_bound

数値を戻す式です。それ以外の場合、PL/SQLは事前定義の例外VALUE_ERRORを呼び出します。式は、最初にループに入ったときにのみ評価されます。下限は1である必要はありません。FOR i IN -5..10のように負の整数にすることができます。ループ・カウンタの増分値(または減分値)は1である必要があります。

内部的に、PL/SQLはPLS_INTEGER一時変数に境界の値を代入します。さらに、必要に応じてその値を最も近い整数に四捨五入します。PLS_INTEGERの大きさの範囲は、32ビットで表すと、-2147483648〜2147483647です。範囲外の数値を評価した場合、PL/SQLが代入をすると、数値オーバーフローのエラーが発生します。「PLS_INTEGERデータ型」を参照してください。

デフォルトでは、ループ索引にはlower_boundの値が代入されます。この値がupper_boundの値を超えていない場合、ループの中の一連の文が実行され、索引が増分されます。索引の値がupper_boundの値を超えていない場合、一連の文がもう一度実行されます。この処理は、索引の値がupper_boundの値を超えるまで繰り返されます。下回った時点で、ループが終了します。

record_name

暗黙的に宣言されたレコードを識別します。このレコードはcursor_nameまたはselect_statementによって取り出された行と同じ構造を持ちます。

レコードはループの内側のみで定義されています。ループの外側からこのレコードのフィールドを参照できません。record_nameの暗黙的な宣言は、ループの外側での宣言をオーバーライドします。同じ名前のレコードは、ブロック・ラベルを使用して参照を修飾しないかぎり、ループの内側から参照できません。

レコード中のフィールドには、暗黙のうちにフェッチされた行の列値が格納されます。フィールドの名前とデータ型は、対応する列の名前とデータ型と同じです。フィールドの値にアクセスするには、次のようにドット表記法を使用します。

record_name.field_name

FORループのカーソルによってフェッチされた選択項目の名前は、単純名にしてください。また、それらが式である場合は、別名を持つ必要があります。次の例では、選択項目salary+NVL(commission_pct,0)*1000の別名としてwagesを指定しています。

CURSOR c1 IS SELECT employee_id,
salary + NVL(commission_pct,0) * 1000 wages FROM employees ...

REVERSE

デフォルトでは、反復は、範囲の下限から上限に上向きに進みます。キーワードREVERSEを使用すると、反復は上限から下限に下向きに進みます。次に例を示します。

BEGIN
  FOR i IN REVERSE 1..10 LOOP  -- i starts at 10, ends at 1
   DBMS_OUTPUT.PUT_LINE(i); -- statements here execute 10 times
  END LOOP;
END;
/

ループ索引にはupper_boundの値が割り当てられます。この値がlower_boundの値を下回っていない場合、ループの中の一連の文が実行され、索引が減分されます。索引の値がまだlower_boundの値を下回っていない場合、一連の文がもう一度実行されます。この処理は、索引の値がlower_boundの値を下回るまで繰り返されます。下回った時点で、ループが終了します。

select_statement

使用不可能な内部カーソルに関連付けられた問合せです。構文はselect_into_statementの構文と似ていますが、INTO句は使用できません。「SELECT INTO文」を参照してください。PL/SQLは内部カーソルを自動的に宣言し、オープンし、データをフェッチしてクローズします。select_statementは独立した文ではないため、暗黙カーソルSQLは適用されません。

while_loop_statement

WHILE-LOOP文は、ブール式を、キーワードLOOPEND LOOPで囲まれた一連の文に関連付けます。ループを反復する前に条件が評価されます。式がTRUEを戻す場合、一連の文が実行されてから、ループの先頭で制御が再開します。式がFALSEまたはNULLを戻す場合、ループは実行されず、制御は次の文に渡されます。

使用上の注意

EXIT WHEN文を使用すると、任意のループを途中で終了できます。WHEN句の中のブール式がTRUEを戻す場合、ループはただちに終了します。

カーソルFORループを終了すると、EXIT文またはGOTO文を使用してループを途中で終了した場合でも、カーソルは自動的にクローズされます。ループの内側で例外が呼び出された場合も、カーソルは自動的にクローズされます。

次の例を参照してください。

例4-18「LOOPでのラベル付きEXITの使用」
例6-10「カーソルを使用したフェッチ」
例6-13「カーソルを使用したバルク・データのフェッチ」

関連項目

「ループの反復の制御: LOOP文とEXIT文」
「カーソル宣言」
「EXIT文」
「FETCH文」
「OPEN文」

MERGE文

MERGE文は、一部の行の挿入と他の行の更新を1回の操作で行います。ターゲット表に対して更新と挿入のどちらを行うかは、結合条件に基づいて決定されます。つまり、ターゲット表のうち結合条件と一致する既存の行は更新され、それ以外の場合は別個の副問合せからの値を使用して1行が挿入されます。

MERGE文の詳細と例は、『Oracle Database SQLリファレンス』を参照してください。

使用上の注意

この文は、主として大量のデータが頻繁に挿入および更新されるデータ・ウェアハウスの場合に有効です。単一の行のみを挿入または更新する必要がある場合は、通常のPL/SQLで処理を実行する方が効率的です。行の更新を試みて、更新される行がない場合はかわりに挿入を行い、行の挿入を試みて、表がすでにその主キーを含んでいるために例外が呼び出された場合はかわりに更新を行います。


NULL文

NULL文は、制御を次の文に渡す以外は何もしません。IF-THEN句、ループまたはプロシージャの本体で、NULL文はプレースホルダの役割を果たします。詳細は、「NULL文の使用」を参照してください。

構文

null statement ::=

画像の説明

使用上の注意

NULL文には、条件文の意味とアクションを明確にすることによって、コードをわかりやすくする効果があります。読み手に対して、代替アクションを誤って見逃したのではなく、アクションが不要であると判断したことを伝えることができます。

IF文、例外ハンドラなどのPL/SQLの特定の句には、1つ以上の実行可能文が必要です。NULL文を使用すると、アクションを実行することなく、これらの構造体をコンパイルできます。

次の文が実行可能文ではなく、ENDEND IFなどであるため、GOTO文で特定の場所に分岐できない場合があります。この場合、分岐する場所にNULL文を置くことができます。

NULL文とブール値NULLは無関係です。

次の例を参照してください。

例1-12「ストアド・サブプログラムの作成」
例1-16「レコード型の宣言」
例4-20「GOTOをラベルに使用するためにNULLを使用」
例4-22「アクションを起こさないことを明示するNULL文の使用」
例4-23「サブプログラム作成時のプレースホルダとしてのNULLの使用」

関連項目

「順次制御: GOTO文とNULL文」

オブジェクト型宣言

オブジェクト型は、データの操作に必要なファンクションおよびプロシージャとともにデータ構造をカプセル化するユーザー定義の複合データ型です。データ構造を形成する変数は、属性と呼ばれます。オブジェクト型の動作を特徴付けるファンクションとプロシージャはメソッドと呼ばれます。コンストラクタと呼ばれる特殊な種類のメソッドは、オブジェクト型の新規インスタンスを作成し、その属性を記入します。

オブジェクト型は、SQLで作成し、Oracleデータベースに格納して、多くのプログラムで共有できるようにする必要があります。CREATE TYPE文を使用してオブジェクト型を定義する場合は、実世界のオブジェクトに対応する抽象テンプレートを作成します。テンプレートでは、アプリケーション環境でオブジェクトに必要な属性と動作を指定します。SQLのCREATE TYPE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。SQLのCREATE TYPE BODY文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

属性の集合によって形成されるデータ構造はパブリック(クライアント・プログラムから参照可能)です。ただし、優れたプログラムは、データ構造を直接操作しません。かわりに、提供される一連のメソッドを使用します。その結果、データは常に適切な状態に保たれます。

オブジェクト型の詳細は、『Oracle Databaseアプリケーション開発者ガイド-オブジェクト・リレーショナル機能』を参照してください。オブジェクト型でのPL/SQLの使用方法の詳細は、第12章「PL/SQLのオブジェクト型の使用」を参照してください。

使用上の注意

オブジェクト型をスキーマに作成すると、任意のPL/SQLブロック、サブプログラムまたはパッケージの中で、それを使用してオブジェクトを宣言できます。たとえば、そのオブジェクト型を使用すると、オブジェクト属性、表の列、PL/SQL変数、バインド変数、レコード・フィールド、コレクション要素、プロシージャの仮パラメータまたはファンクション結果のデータ型を指定できます。

パッケージと同様に、オブジェクト型は仕様部と本体の2つの部分から構成されます。仕様部はアプリケーションへのインタフェースです。ここでは、データ構造(属性の集合)とデータ操作に必要な演算(メソッド)を宣言します。本体ではメソッドを完全に定義し、それによって仕様部を実装します。

メソッドを使用するためにクライアント・プログラムが必要とするすべての情報は、仕様部にあります。仕様部は操作インタフェース、そして本体はブラック・ボックスと考えてください。仕様部を変更しなくても、本体をデバッグ、拡張または置換できます。

オブジェクト型はデータと操作をカプセル化します。属性とメソッドはオブジェクト型仕様部で宣言できますが、定数、例外、カーソル、型は宣言できません。少なくとも1つの属性が必要です(最大で1000)。メソッドはオプションです。

オブジェクト型の仕様部では、メソッドより前にすべての属性を宣言する必要があります。サブプログラムのみが実装を必要とします。オブジェクト型の仕様部に属性およびコール仕様の宣言のみがある場合、またはそのいずれかの宣言のみがある場合、オブジェクト型本体は不要です。本体では属性を宣言できません。オブジェクト型の仕様部のすべての宣言は、パブリック(オブジェクト型の外側から参照可能)です。

属性は、オブジェクト型内の位置によってではなく、名前によってのみ参照できます。属性にアクセスしたり、その値を変更するには、ドット表記法を使用します。属性名を連鎖させて、ネストされたオブジェクト型の属性にアクセスできます。

オブジェクト型の中でメソッドは、修飾子なしで属性および他のメソッドを参照できます。SQL文からパラメータのないメソッドをコールするには、空のパラメータ・リストが必要です。プロシージャ文では、コールを連鎖しないかぎり空のパラメータ・リストはなくてもかまいません。連鎖する場合は、最後のコール以外のすべてのコールで空のパラメータ・リストが必要です。

SQL文からは、NULLインスタンス(SELFがNULLである状態)でMEMBERメソッドをコールすると、メソッドは起動されずNULLが戻されます。プロシージャ文からは、NULLインスタンスでMEMBERメソッドをコールすると、メソッドが起動される前に事前定義の例外SELF_IS_NULLが呼び出されます。

マップ・メソッドかオーダー・メソッドを宣言できますが、その両方は宣言できません。どちらかのメソッドを宣言すれば、オブジェクトをSQL文およびプロシージャ文によって比較できます。ただし、どちらのメソッドも宣言しなければ、オブジェクトはSQL文でのみ比較し、しかも比較できるのは等しいか等しくないかについてのみです。同じ型の2つのオブジェクトが等しいとされるのは、それらの対応する属性の値が等しい場合のみです。

パッケージ化されたサブプログラムと同じく、同じ種類(ファンクションまたはプロシージャ)のメソッドはオーバーロードできます。つまり、仮パラメータの数、順序、またはデータ型の種類が違っていれば、同じ名前を複数の異なるメソッドで使用できます。

どのオブジェクト型にもデフォルト・コンストラクタ・メソッド(略してコンストラクタ)があります。このコンストラクタは、そのオブジェクト型と同じ名前のシステム定義のファンクションです。コンストラクタは、そのオブジェクト型のインスタンスを初期化したり、そのインスタンスを戻すために使用します。異なるパラメータのセットを受け入れる独自のコンストラクタ・メソッドを定義することもできます。PL/SQLは、暗黙的にコンストラクタをコールすることはないため、明示的にコールする必要があります。コンストラクタは、ファンクション・コールが許可されているところでコールできます。

関連項目

「ファンクション宣言」
「パッケージ宣言」
「プロシージャ宣言」

OPEN文

OPEN文は、カーソルに関連付けられた問合せを実行します。また、問合せの処理に使用するデータベース・リソースを割り当て、結果セット(問合せの条件に一致する行)を識別します。カーソルは、結果セットの最初の行の前に置かれます。詳細は、「PL/SQLを使用したデータの問合せ」を参照してください。

構文

open statement ::=

画像の説明

キーワードとパラメータの説明

cursor_name

現行の有効範囲のうちそれより前に宣言されていて、現在オープンされていない明示カーソルです。

cursor_parameter_name

カーソルの仮パラメータとして宣言された変数を識別します。(cursor_parameter_declarationの構文は、「カーソル宣言」を参照してください。)カーソルのパラメータは、問合せの中で定数が使用できる場所であれば、どこででも使用できます。

使用上の注意

一般に、PL/SQLによる明示カーソルは、それを最初にオープンするときにのみ解析されます。また、SQL文の解析(およびそれによる暗黙カーソルの作成)は、その文が初めて実行されるときにのみ行われます。解析されたSQL文は、すべてキャッシュに入れられます。SQL文は、新しいSQL文によってキャッシュからエージ・アウトされた場合にのみ再解析されます。したがって、カーソルを再オープンするには、まずクローズする必要がありますが、PL/SQLはカーソルに関連付けられたSELECT文を再解析する必要はありません。カーソルをクローズしてからただちに再オープンした場合、再解析は不要です。

結果セットの中の行は、OPEN文の実行時には取り出されません。行の取出しにはFETCH文を使用します。FOR UPDATEカーソルでは、カーソルがオープンされるときに、行はロックされます。

仮パラメータが宣言されている場合は、カーソルに実パラメータを渡す必要があります。カーソルの仮パラメータはINパラメータにする必要があるため、実パラメータに値を戻すことはできません。実パラメータの値はカーソルをオープンする場合に使用されます。仮パラメータと実パラメータのデータ型には、互換性が必要です。問合せでは、有効範囲の中で宣言されている他のPL/SQL変数を参照することもできます。

デフォルト値を受け入れるのでなければ、カーソル宣言の中の仮パラメータは、すべてOPEN文の中で対応する実パラメータを持つ必要があります。デフォルト値で宣言された仮パラメータの詳細は、対応する実パラメータがなくてもかまいません。このような仮パラメータは、OPEN文の実行時にデフォルト値を取ります。

位置表記法または名前表記法を使用して、OPEN文の実パラメータを、カーソル宣言の仮パラメータに関連付けることができます。

カーソルがオープンされている場合は、そのカーソルの名前をカーソルFORループで使用できません。

次の例を参照してください。

例6-10「カーソルを使用したフェッチ」
例6-13「カーソルを使用したバルク・データのフェッチ」
例13-1「宣言および変数への値の代入」

関連項目

「CLOSE文」
「カーソル宣言」
「FETCH文」
「LOOP文」

OPEN-FOR文

OPEN-FOR文は、カーソル変数に関連付けられている問合せを実行します。また、問合せの処理に使用するデータベース・リソースを割り当て、結果セット(問合せの条件を満たす行)を識別します。カーソル変数は、結果セットの中の最初の行の前に配置します。詳細は、「カーソル変数(REF CURSOR)の使用」を参照してください。

オプションのUSING句を使用して、カーソル変数を問合せに関連付けて、問合せを実行し、結果セットを識別してカーソルを結果セットの最初の行の前に配置してから、%ROWCOUNTによって保持される処理行カウントを0(ゼロ)に設定します。詳細は、「動的SQLを使用した動的問合せの構築」を参照してください。OPEN-FOR-USING文は、バインド変数を使用してSQLの処理効率を向上させることができるため、WHERE句が事前に判明している問合せを構築する場合は、この文を使用します。WHERE句の数が不明な動的問合せを処理するために柔軟性が必要な場合は、OPEN-FOR文を使用します。

構文

open for statement ::=

画像の説明

using clause ::=

画像の説明

キーワードとパラメータの説明

bind_argument

動的SELECT文に渡される値を持つ式です。

cursor_variable_name

現行の有効範囲のうちそれより前に宣言されているカーソル変数またはパラメータ(戻り型を持たない)です。

host_cursor_variable_name

PL/SQLホスト環境で事前に宣言され、バインド変数としてPL/SQLに渡されるカーソル変数を識別します。ホスト・カーソル変数のデータ型は、PL/SQLカーソル変数の戻り型と互換性があります。ホスト変数には、接頭辞としてコロンを付けてください。

select_statement

cursor_variableに関連付けられた問合せです。一連の値を戻します。問合せでは、バインド変数、PL/SQL変数、パラメータ、ファンクションを参照できます。select_statementの構文は、「SELECT INTO文」で定義されているselect_into_statementの構文に似ていますが、select_statementカーソルでは、INTO句は使用できません。動的文字列の長さは32767K以下にしてください。

USING句

バインド引数のリストを指定するオプションの句です。実行時に、USING句のバインド引数は動的SELECT文内の対応するプレースホルダを置き換えます。

使用上の注意

OCIやPro*CプログラムなどのPL/SQLホスト環境で、カーソル変数を宣言できます。ホスト・カーソル変数をオープンするには、バインド変数として無名PL/SQLブロックに渡します。OPEN-FOR文をグループにまとめることで、ネットワークの通信量を削減できます。たとえば、次のPL/SQLブロックは、1回の往復で5つのカーソル変数をオープンしています。

/* anonymous PL/SQL block in host environment */
BEGIN
  OPEN :emp_cv FOR SELECT * FROM employees;
  OPEN :dept_cv FOR SELECT * FROM departments;
  OPEN :grade_cv FOR SELECT * FROM salgrade;
  OPEN :pay_cv FOR SELECT * FROM payroll;
  OPEN :ins_cv FOR SELECT * FROM insurance;
END;

その他のOPEN-FOR文は、異なる複数の問合せ用に同じカーソル変数をオープンできます。カーソル変数を再オープンする場合、その前にクローズする必要はありません。別の問合せ用にカーソル変数を再オープンすると、前の問合せは失われます。

カーソルとは異なり、カーソル変数はパラメータを取りません。かわりに、カーソル変数にはパラメータのみでなく問合せ全体を渡すことができます。カーソル変数は、PL/SQLストアド・プロシージャまたはファンクションによってオープンして、コール元のサブプログラムに戻すことができますが、コール元とコール先のサブプログラムは同じインスタンス上に存在する必要があります。データベース・リンクを介してコールされたプロシージャおよびファンクションに、カーソル変数を渡したり、戻すことはできません。カーソル変数を、そのカーソル変数をオープンするサブプログラムの仮パラメータとして宣言する場合は、IN OUTモードを指定する必要があります。この指定によって、サブプログラムはコール元にオープン・カーソルを渡すことができます。

動的な複数行の問合せを処理するには、OPEN-FOR-USING文、FETCH文およびCLOSE文の3つの文を使用します。まず、OPEN-FOR文でカーソル変数を複数行問合せ用にオープンします。次に、FETCH文で結果セットから行を取り出します。すべての行が処理された後に、CLOSE文でカーソル変数をクローズします。

動的文字列には、任意の複数行SELECT文(終了記号を持たない)を含むことができます。また、バインド引数のプレースホルダも含めることができます。ただし、バインド引数を使用してスキーマ・オブジェクトの名前を動的SQL文に渡すことはできません。

動的文字列内のすべてのプレースホルダは、USING句内のバインド引数に関連付ける必要があります。USING句内では数値リテラル、文字リテラル、および文字列リテラルは使用できますが、ブール・リテラル(TRUEFALSENULL)は使用できません。動的文字列にNULLを渡すには、回避策を使用する必要があります。「動的SQLへのNULLの引渡し」を参照してください。

カーソル変数がオープンしている場合にのみ、問合せの中のバインド引数が評価されます。異なるバインド値を使用してカーソルからフェッチするには、新しい値に設定されたバインド引数でカーソル変数を再オープンする必要があります。

動的SQLはすべてのSQLデータ型をサポートしています。たとえば、バインド引数をコレクション、LOB、オブジェクト型のインスタンスおよびrefとすることができます。通常、動的SQLはPL/SQL固有の型をサポートしていません。たとえばバインド引数をブールまたは索引付き表にできません。

次の例を参照してください。

例6-27「REF CURSORのパラメータとしての引渡し」
例6-29「REF CURSORをオープンするストアド・プロシージャ」
例6-30「別の問合せでREF CURSORをオープンするストアド・プロシージャ」
例6-31「異なる戻り型を持つカーソル変数」
例6-32「カーソル変数からレコードへのフェッチ」
例6-33「カーソル変数からコレクションへのフェッチ」
例7-9「レコードへの動的SQLフェッチ」

関連項目

「CLOSE文」
「カーソル変数」
「EXECUTE IMMEDIATE文」
「FETCH文」
「LOOP文」

パッケージ宣言

パッケージとは、論理的に関連するPL/SQLの型、項目およびサブプログラムをグループにまとめたスキーマ・オブジェクトのことです。再利用の可能性があるApplication Program Interface(API)を構成する一連の関連サブプログラムを作成する場合にパッケージを使用します。パッケージには、仕様部と本体の2つの部分があります。詳細は、第9章「PL/SQLパッケージの使用」を参照してください。パッケージ宣言の例は、例9-3を参照してください。

この項では、PL/SQLのパッケージ仕様部とパッケージ本体のオプションについて説明します。SQLのCREATE PACKAGE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。SQLのCREATE PACKAGE BODY文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

package specification ::=

画像の説明

package body ::=

画像の説明

キーワードとパラメータの説明

call_spec

Oracleデータ・ディクショナリ内の外部CファンクションまたはJavaメソッドを発行します。これは、対応するSQLに名前、パラメータ型および戻り型をマップすることによって、ルーチンを発行します。詳細は、『Oracle Database Java開発者ガイド』および『Oracle Databaseアプリケーション開発者ガイド-基礎編』を参照してください。

collection_declaration

コレクション(ネストした表、索引付き表またはVARRAY)を宣言します。collection_declarationの構文は、「コレクション定義」を参照してください。

collection_type_definition

データ型指定子TABLEまたはVARRAYを使用してコレクション型を定義します。

constant_declaration

定数を宣言します。constant_declarationの構文は、「定数と変数の宣言」を参照してください。

cursor_body

明示カーソルの基盤となる実装を定義します。cursor_bodyの構文は、「カーソル宣言」を参照してください。

cursor_spec

明示カーソルへのインタフェースを宣言します。cursor_specの構文は、「カーソル宣言」を参照してください。

exception_declaration

例外を宣言します。exception_declarationの構文は、「例外定義」を参照してください。

function_body

ファンクションを実装します。function_bodyの構文は、「ファンクション宣言」を参照してください。

function_spec

ファンクションへのインタフェースを宣言します。function_specの構文は、「ファンクション宣言」を参照してください。

object_declaration

オブジェクト(オブジェクト型のインスタンス)を宣言します。object_declarationの構文は、「オブジェクト型宣言」を参照してください。

package_name

データベースに格納されたパッケージを識別します。ネーミング規則は、「識別子」を参照してください。

pragma_restrict_refs

純正規則に違反していないか確認できるプラグマです。ファンクションは、副作用を制御する規則に従っている場合にのみ、SQL文からコールできます。ファンクション本体内のSQL文が規則に違反すると、実行時(文が解析されるとき)にエラーが発生します。プラグマの構文は、「RESTRICT_REFERENCESプラグマ」を参照してください。

プラグマは、ファンクションがデータベース表またはパッケージ変数(あるいはその両方)に対する読込みや書込み、またはそのいずれも行っていないことを示します。純正規則とRESTRICT_REFERENCESプラグマの詳細は、『Oracle Databaseアプリケーション開発者ガイド-基礎編』を参照してください。

PRAGMA SERIALLY_REUSABLE

サーバーへの1コール(サーバーへのOCIコール、サーバー間のリモート・プロシージャ・コールなど)の間のみパッケージを逐次再使用可能な状態にする必要がある場合は、パッケージに逐次再使用可能とマークします。詳細は、『Oracle Databaseアプリケーション開発者ガイド-基礎編』を参照してください。

procedure_body

プロシージャを実装します。procedure_bodyの構文は、「プロシージャ宣言」を参照してください。

procedure_spec

プロシージャへのインタフェースを宣言します。procedure_specの構文は、「プロシージャ宣言」を参照してください。

record_declaration

ユーザー定義のレコードを宣言します。record_declarationの構文は、「レコード定義」を参照してください。

record_type_definition

データ型指定子RECORDまたは属性%ROWTYPEを使用してレコード型を定義します。

schema_name

パッケージが含まれているスキーマを識別します。schema_nameを省略すると、パッケージはユーザーのスキーマ内に存在するとみなされます。

variable_declaration

変数を宣言します。variable_declarationの構文は、「定数と変数の宣言」を参照してください。

使用上の注意

PL/SQLをサポートするOracleのツール製品を使用すると、パッケージを作成し、それをOracleデータベース内に格納できます。CREATE PACKAGEおよびCREATE PACKAGE BODY文は、OracleプリコンパイラかOCIホスト・プログラムから、またはSQL*Plusから対話形式で発行できます。ただし、パッケージは、PL/SQLブロックまたはサブプログラムの中では定義できません。

通常、パッケージには仕様部と本体があります。仕様部はアプリケーションへのインタフェースです。ここでは、使用できる型、変数、定数、例外、カーソル、サブプログラムなどを宣言します。本体ではカーソルとサブプログラムを完全に定義し、仕様を実装します。

下位の実装を持つのは、サブプログラムとカーソルのみです。仕様部で宣言されているのが型、定数、変数、例外およびコール仕様のみであれば、パッケージ本体は不要です。ただしその場合でも、次のようにパッケージ本体を使用して、仕様部で宣言した項目を初期化できます。

CREATE OR REPLACE PACKAGE emp_actions AS
--   additional code here ...
   number_hired INTEGER;
END emp_actions;
/
CREATE OR REPLACE PACKAGE BODY emp_actions AS
BEGIN
   number_hired := 0;
END emp_actions;
/

仕様部は本体がなくてもコーディングし、コンパイルできます。仕様部のコンパイルが終了すると、そのパッケージを参照するストアド・サブプログラムもコンパイルできます。アプリケーション作成の最終段階になるまで、パッケージ本体を完全に定義する必要はありません。パッケージ本体は、パッケージ仕様部を変更せずに、デバッグ、拡張または置換できます。そのため、パッケージをコールするサブプログラムを再コンパイルする必要はありません。

パッケージ仕様部で宣言したカーソルとサブプログラムは、パッケージ本体で定義する必要があります。パッケージ仕様部で宣言したその他のプログラム項目は、パッケージ本体で再宣言できません。

サブプログラムの仕様部と本体を一致させるために、PL/SQLは、それらのヘッダーをトークンごとに比較します。このため、空白を除いて、ヘッダーは一語一語が一致している必要があります。一致していない場合は、PL/SQLによって例外が呼び出されます。

パッケージで宣言された変数は、セッションを通じてその値が保持されます。そのため、1つのプロシージャでパッケージ変数の値を設定して、その値を別のプロシージャで取り出すことができます。

次の例を参照してください。

例1-13「パッケージおよびパッケージ本体の作成」
例6-43「パッケージでの自律型ファンクションの宣言」
例9-3「emp_adminパッケージの作成」
例9-4「DBMS_OUTPUTパッケージでのPUT_LINEの使用」
例12-18「オブジェクト型とコレクションの動的SQLを使用したTEAMSパッケージ」

関連項目

「コレクション定義」
「カーソル宣言」
「例外定義」
「ファンクション宣言」
「プロシージャ宣言」
「レコード定義」

プロシージャ宣言

プロシージャとは、パラメータを指定してコールできるサブプログラムのことです。一般に、プロシージャはアクションを実行するために使用します。プロシージャには、仕様部と本体の2つの部分があります。仕様部は、キーワードPROCEDUREで始め、プロシージャ名またはパラメータ・リストで終わります。パラメータ宣言はオプションです。パラメータを取らないプロシージャではカッコを書きません。プロシージャの本体は、キーワードIS(またはAS)で始め、キーワードENDで終わります。ENDの後には、オプションとしてプロシージャ名を続けることができます。

プロシージャ本体には、宣言部(オプション)、実行部、例外処理部(オプション)の3つの部分があります。宣言部には、型、カーソル、定数、変数、例外およびサブプログラムが含まれます。これらの項目はローカルで、プロシージャを終了すると消去されます。実行部には、値の代入、実行の制御およびOracleデータの操作を実行する文があります。例外処理部には、実行の途中で呼び出された例外を処理する例外ハンドラがあります。詳細は、「PL/SQLプロシージャ」を参照してください。プロシージャ宣言の例は、例9-3を参照してください。

PL/SQLブロックまたはパッケージでのプロシージャ宣言は、SQLでのプロシージャの作成とは異なります。SQLのCREATE PROCEDURE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

procedure specification ::=

画像の説明

procedure declaration ::=

画像の説明

procedure body ::=

画像の説明

parameter declaration ::=

画像の説明

キーワードとパラメータの説明

datatype

型指定子です。datatypeの構文は、「定数と変数の宣言」を参照してください。

exception_handler

例外ハンドラです。例外が呼び出されると、その例外に関連付けられた一連の文を実行します。exception_handlerの構文は、「例外定義」を参照してください。

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。最も単純な式は、1個の変数で構成されています。宣言がPL/SQLコンパイラによって処理されるときに、expressionの値がパラメータに代入されます。その値とパラメータのデータ型には互換性が必要です。

function_declaration

ファンクションを宣言します。function_declarationの構文は、「ファンクション宣言」を参照してください。

IN、OUT、IN OUT

仮パラメータの動作を定義するパラメータ・モードです。INパラメータは、コールされるサブプログラムに値を渡します。OUTパラメータは、サブプログラムのコール元に値を戻します。IN OUTパラメータは、コール先のサブプログラムに初期値を渡して、更新された値をコール元に戻します。

item_declaration

プログラム・オブジェクトを宣言します。item_declarationの構文は、「ブロック宣言」を参照してください。

NOCOPY

コンパイラ・ヒント(ディレクティブではなく)です。これによって、PL/SQLコンパイラはOUTおよびIN OUTパラメータを、デフォルトの値方式ではなく、参照方式で渡すことができます。詳細は、「サブプログラムのパラメータのモードの指定」を参照してください。

parameter_name

仮パラメータを識別します。仮パラメータとは、プロシージャの仕様部で宣言され、プロシージャ本体の中で参照される変数のことです。

AUTONOMOUS_TRANSACTIONプラグマ

ファンクションを自律型としてマークします。自律型トランザクションは、メイン・トランザクションによって開始される独立したトランザクションです。自律型トランザクションを使用すると、メイン・トランザクションを停止し、SQL操作を実行してその操作をコミットまたはロールバックしてから、メイン・トランザクションを再開できます。詳細は、「自律型トランザクションによる独立した作業単位の実行」を参照してください。

procedure_name

ユーザー定義のプロシージャです。

type_definition

ユーザー定義のデータ型を指定します。type_definitionの構文は、「ブロック宣言」を参照してください。

:= | DEFAULT

プロシージャがコールされたときにINパラメータに値が指定されていない場合、INパラメータをデフォルト値に初期化します。

使用上の注意

プロシージャはPL/SQL文としてコールされます。たとえば、次のようにプロシージャraise_salaryをコールできます。

raise_salary(emp_num, amount);

プロシージャの中では、INパラメータは定数のように取り扱われるため、値は代入できません。OUTパラメータはローカル変数のように取り扱われるため、値を変更して参照できます。IN OUTパラメータは初期化された変数のように取り扱われるため、値を代入したり、その値を他の変数に代入できます。パラメータ・モードの概要は、表8-1を参照してください。

OUTパラメータおよびIN OUTパラメータとは異なり、INパラメータはデフォルト値に初期化できます。詳細は、「サブプログラムのパラメータのデフォルト値の使用」を参照してください。

プロシージャを終了する前に、すべてのOUT仮パラメータに明示的に値を代入してください。OUT実パラメータには、サブプログラムがコールされる前にも値を入れることができます。ただし、サブプログラムをコールした時点で、値は失われます(コンパイラ・ヒントNOCOPYを指定しない場合、またはサブプログラムを未処理例外で終了しない場合)。

プロシージャの仕様部と本体を合わせて1つの単位として作成できます。また、プロシージャの仕様部と本体を別にすることもできます。このように、プロシージャをパッケージに入れると、実装上の細部を隠ぺいできます。パッケージ仕様部でプロシージャ仕様部を宣言せずに、パッケージ本体でプロシージャを定義できます。ただし、このようなプロシージャはパッケージの内側からのみコールできます。プロシージャの実行部には、少なくとも1つの文が存在している必要があります。NULL文はこの条件を満たします。

次の例を参照してください。

例1-12「ストアド・サブプログラムの作成」
例1-13「パッケージおよびパッケージ本体の作成」
例1-14「パッケージのプロシージャのコール」
例9-3「emp_adminパッケージの作成」

関連項目

「コレクション・メソッド」
「ファンクション宣言」
「パッケージ宣言」

RAISE文

RAISE文は、PL/SQLブロックまたはサブプログラムの通常の実行を停止させ、例外ハンドラに制御を移します。

ZERO_DIVIDENO_DATA_FOUNDなどの事前定義済の例外、またはユーザーが名前を付けたユーザー定義の例外をRAISE文で呼び出すことができます。詳細は、「独自のPL/SQL例外の定義」を参照してください。

構文

raise statement ::=

画像の説明

キーワードとパラメータの説明

exception_name

事前定義済の例外またはユーザー定義の例外を識別します。事前定義済の例外のリストは、「事前定義のPL/SQL例外のまとめ」を参照してください。

使用上の注意

PL/SQLブロックとサブプログラムからRAISE文で例外を呼び出すのは、エラーのために処理を続行できなくなった場合のみにしてください。指定した例外に対するRAISE文は、その例外の有効範囲内であれば任意の場所にコーディングできます。

例外が呼び出されたときに、PL/SQLがその例外のハンドラをカレント・ブロックで発見できない場合は、ハンドラが見つかるまで、または検索するブロックがなくなるまで、例外が1つずつ外側のブロックに伝播していきます。ハンドラが見つからなかった場合、PL/SQLはホスト環境に「未処理例外」エラーを戻します。

例外ハンドラの中のRAISE文で例外名を省略すると、現行の例外を再度呼び出すことができます。これによって、初期の対処措置(問題のログを記録するなど)を行ってから、より広範囲な対処を行う別のハンドラに制御を渡すことができます。例外が再度呼び出された場合、最初に検索されるブロックは、カレント・ブロックではなく外側のブロックです。

次の例を参照してください。

例1-12「ストアド・サブプログラムの作成」
例9-3「emp_adminパッケージの作成」
例10-3「PL/SQL例外の有効範囲」
例10-9「PL/SQL例外の再呼出し」

関連項目

「例外定義」

レコード定義

レコードは、様々な型のデータ値を格納できるコンポジット変数で、C、C++またはJavaのstruct型に似ています。詳細は、「PL/SQLレコード」を参照してください。

PL/SQLのレコードは、表の行から取り出したデータや特定の列を保持する場合に便利です。新しいレコード型を作成するかわりに、変数をtable%ROWTYPEまたはcursor%ROWTYPEとして宣言して、メンテナンスを容易にできます。

構文

record type definition ::=

画像の説明

record field declaration ::=

画像の説明

record type declaration ::=

画像の説明

キーワードとパラメータの説明

datatype

データ型指定子です。datatypeの構文は、「定数と変数の宣言」を参照してください。

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。最も単純な式は、1個の変数で構成されています。expressionの構文は、「式定義」を参照してください。宣言がPL/SQLコンパイラによって処理されるとき、expressionの値がフィールドに代入されます。その値とフィールドのデータ型には互換性が必要です。

field_name

ユーザー定義のレコード内のフィールドを識別します。

NOT NULL

実行時に、NOT NULLとして定義されたフィールドにNULLを代入しようとすると、事前定義の例外VALUE_ERRORが呼び出されます。NOT NULL制約の後には初期化句が続く必要があります。

record_name

ユーザー定義のレコードを識別します。

type_name

データ型指定子RECORDを使用して定義されたユーザー定義のレコード型を識別します。

:= | DEFAULT

フィールドをデフォルト値に初期化します。

使用上の注意

RECORD型定義とユーザー定義レコードの宣言は、任意のブロック、サブプログラムまたはパッケージの宣言部でできます。

次に示すように、レコードを宣言の中で初期化できます。%TYPE属性を使用して、フィールドのデータ型を指定できます。また、フィールド宣言にNOT NULL制約を加えて、フィールドにNULLを代入できないようにすることもできます。NOT NULLと宣言されたフィールドは、初期化されている必要があります。レコード中の個のフィールドを参照する場合は、ドット表記法を使用します。たとえば、dept_recレコードのdnameフィールドを参照するには、dept_rec.dnameを使用します。

レコード中の個のフィールドに別に値を代入するかわりに、すべてのフィールドに値を一度に代入できます。

ユーザー定義のレコードは、通常の有効範囲規則とインスタンス化の規則に従います。パッケージの中では、そのパッケージが初めて参照された時点でインスタンスが生成され、データベース・セッションが終わった時点で消滅します。ブロックまたはサブプログラムでは、ブロックまたはサブプログラムに入るときにインスタンス化され、ブロックまたはサブプログラムを終了すると消去されます。

スカラー変数と同様に、ユーザー定義のレコードもプロシージャやファンクションの仮パラメータとして宣言できます。スカラー・パラメータに適用されるのと同じ制限が、ユーザー定義のレコードにも適用されます。

ファンクション仕様部のRETURN句の中にRECORD型を指定できます。こうすると、ファンクションは同じ型のユーザー定義のレコードを戻します。ユーザー定義のレコードを戻すファンクションをコールする場合、次の構文を使用してレコード内のフィールドを参照します。

function_name(parameter_list).field_name

ネストしたフィールドを参照するには、次の構文を使用します。

function_name(parameter_list).field_name.nested_field_name

ファンクションがパラメータを取らない場合は、空のパラメータ・リストをコーディングします。次に構文を示します。

function_name().field_name

次の例を参照してください。

例1-16「レコード型の宣言」
例5-8「レコードとしてのVARRAY」
例5-20「複雑なデータ型を使用したVARRAYへの値の代入」
例5-21「複雑なデータ型を使用した表への値の代入」
例5-41「単純なレコード型の宣言および初期化」
例5-42「レコード型の宣言および初期化」
例5-44「ファンクションからレコードを戻す」
例5-45「プロシージャへのパラメータとしてのレコードの使用」
例5-46「ネストされたレコードの宣言」
例5-47「レコードへのデフォルト値の代入」
例5-50「%ROWTYPEを使用したPL/SQLレコードの挿入」
例5-51「レコードを使用した行の更新」
例5-52「レコードを使用したRETURNING句の使用」
例5-53「SELECT INTO文でのBULK COLLECTの使用」
例6-26「レコード型を戻すカーソル変数」
例9-3「emp_adminパッケージの作成」

関連項目

「コレクション定義」
「ファンクション宣言」
「パッケージ宣言」
「プロシージャ宣言」

RESTRICT_REFERENCESプラグマ

ストアド・ファンクションは、副作用を制御する特定の純正規則に従っている場合にのみ、SQL文からコールできます。「PL/SQLサブプログラムの副作用の制御」を参照してください。副作用が少なければ、特にPARALLEL_ENABLEヒントまたはDETERMINISTICヒントを使用している場合に、問合せ内でファンクションをより効率化できます。ファンクション自体に適用される規則が、そのファンクションがコールするファンクションまたはプロシージャにも適用されます。

ファンクション本体内のSQL文が規則に違反すると、実行時(文が解析されるとき)にエラーが発生します。コンパイル時にこの規則に違反していないかどうかを確認するには、コンパイラ・ディレクティブであるRESTRICT_REFERENCESプラグマを使用します。このプラグマは、ファンクションがデータベース表またはパッケージ変数(あるいはその両方)に対する読込みや書込み、またはそのいずれも行っていないことを示します。このような読込みや書込み操作を行っているファンクションは、コールによって結果が異なったり、エラーが発生する場合があるため、最適化は困難です。

詳細は、『Oracle Databaseアプリケーション開発者ガイド-基礎編』を参照してください。

構文

restrict_references pragma ::=

画像の説明

キーワードとパラメータの説明

DEFAULT

プラグマがパッケージ仕様部またはオブジェクト型の仕様部の中のすべてのサブプログラムに適用されるように指定します。その場合でも、サブプログラムごとにプラグマを宣言できます。これらのプラグマは、デフォルトのプラグマをオーバーライドします。

function_name

ユーザー定義のファンクションまたはプロシージャを識別します。

PRAGMA

文がコンパイラ・ディレクティブであることを表します。プラグマは、実行時ではなくコンパイル時に処理されます。プログラムの機能に影響を与えず、コンパイラに情報を提供します。

RNDS

サブプログラムがデータベースに読込み禁止状態である(データベース表を問合せできない)ことを示します。

RNPS

サブプログラムがパッケージに読込み禁止状態である(パッケージ変数の値を参照できない)ことを示します。

TRUST

サブプログラムが1つ以上の規則に違反しないと信頼されていることを示します。CまたはJavaで記述されたファンクションをPL/SQLでコールする場合は、実行時にこれらのファンクションを検証できないため、この値が必要です。

WNDS

サブプログラムがデータベースへの書込み禁止状態である(表を変更できない)ことを示します。

WNPS

サブプログラムがパッケージへの書込み禁止状態である(パッケージ変数の値を変更できない)ことを示します。

使用上の注意

RESTRICT_REFERENCESプラグマは、パッケージ仕様部またはオブジェクト型仕様部でのみ宣言できます。制約は4つまで(RNDSRNPSWNDSWNPS)任意の順序で指定できます。パラレル問合せからファンクションをコールするには、4つの制約をすべて指定します。他の制約を暗黙的に指定する制約はありません。通常、このプラグマはファンクションに対して指定します。ファンクションがプロシージャをコールする場合は、それらのプロシージャにも同様にプラグマを指定します。

TRUSTを指定すると、ファンクション本体はプラグマにリストされた制約に違反しているかどうかチェックされません。ファンクションは制約に違反していないことを承認されます。これらのチェックをスキップすると、パフォーマンスが向上します。

サブプログラム名ではなくDEFAULTを指定した場合、このプラグマはパッケージ仕様部またはオブジェクト型の仕様部(オブジェクト型のシステム定義のコンストラクタも含む)の中のすべてのサブプログラムに適用されます。その場合でも、サブプログラムごとにプラグマを宣言し、デフォルトのプラグマをオーバーライドできます。

RESTRICT_REFERENCESプラグマは、1つのサブプログラム宣言にのみ適用できます。オーバーロードされたサブプログラムの名前を参照するプラグマは、直前のサブプログラム宣言に必ず適用されます。

次の例を参照してください。

例6-48「自律型ファンクションのコール」

関連項目

「AUTONOMOUS_TRANSACTIONプラグマ」
「EXCEPTION_INITプラグマ」
「SERIALLY_REUSABLEプラグマ」

RETURN文

RETURN文は、サブプログラムの実行を即座に完了させ、コール元に制御を戻します。その後は、サブプログラム・コールの直後の文から、実行が再開されます。ファンクションの中のRETURN文は、ファンクション識別子を戻り値に代入します。「RETURN文の使用」を参照してください。

構文

return statement ::=

画像の説明

キーワードとパラメータの説明

expression

変数、定数、リテラル、演算子、ファンクション・コールの組合せです。最も単純な式は、1個の変数で構成されています。RETURN文を実行すると、expressionの値がファンクション識別子に代入されます。

使用上の注意

RETURN文は、ファンクションの仕様部の中で戻り値のデータ型を指定するRETURN句とは異なります。

サブプログラムでは、複数のRETURN文を使用できます。どのRETURN文を実行しても、サブプログラムは即座に終了します。RETURN文をサブプログラムの最後の文として配置する必要はありません。RETURN文を無名ブロックで使用して、そのブロックおよびすべての外側のブロックを終了させることができますが、RETURN文は式を含むことはできません。

プロシージャでは、RETURN文に式を含めることはできません。RETURN文には、プロシージャ本来の終了地点に達する前に、コール元に制御を戻す役割のみがあります。ファンクションでは、RETURN文に、RETURN文の実行時に評価される式が含まれている必要があります。結果として得られる値がファンクション識別子に代入されます。ファンクションには、RETURN文へ導く少なくとも1つの実行パスが必要です。そうではない場合、PL/SQLによって実行時に例外が呼び出されます。

次の例を参照してください。

例1-13「パッケージおよびパッケージ本体の作成」
例2-15「名前解決でのサブプログラムの使用」
例5-44「ファンクションからレコードを戻す」
例6-43「パッケージでの自律型ファンクションの宣言」
例6-48「自律型ファンクションのコール」
例9-3「emp_adminパッケージの作成」

関連項目

「ファンクション宣言」

RETURNING INTO句

RETURNING句では、DELETEEXECUTE IMMEDIATEINSERTおよびUPDATEの各文の戻り値を指定します。取り出した列値は、個の変数またはコレクションに代入できます。RETURNING句はリモートまたはパラレルでの削除には使用できません。文を実行しても行に影響がない場合、RETURNING句で指定した変数の値は未定義になります。

構文

returning clause ::=

画像の説明

キーワードとパラメータの説明

BULK COLLECT

1つ以上のコレクションに結果の値を格納します。FETCH文を使用したループよりも高速な問合せが可能です。詳細は、「バルクSQLによる、DML文および問合せのループ・オーバーヘッドの削減」を参照してください。

collection_name

フェッチしたselect_item値を格納するための、宣言されたコレクションを識別します。select_itemごとに、リストの中に、対応する型互換のコレクションが存在している必要があります。

host_array_name

フェッチしたselect_item値を格納するための配列を識別します。この配列は、PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されます。select_itemごとに、リストの中に、対応する型互換の配列が存在している必要があります。ホスト配列には、接頭辞としてコロンが必要です。

host_variable_name

PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されるカーソル変数を識別します。ホスト・カーソル変数のデータ型は、PL/SQLカーソル変数の戻り型と互換性があります。ホスト変数には、接頭辞としてコロンを付けてください。

INTO ...

単一行の問合せの場合に使用され、取り出された列値を入れる変数またはレコードを指定します。問合せによって取り出された値それぞれに対して、INTO句の中に、対応する型互換性変数が存在している必要があります。

multiple_row_expression

表の複数行を戻す式です。

RETURNING | RETURN

RETURNING句のある(BULK COLLECT句のない)DML文の場合に使用され、列の値が戻されるバインド変数を指定します。DML文によって戻された値それぞれに対して、RETURNING INTO句の中に、対応する型互換性変数が存在している必要があります。

single_row_expression

表の単一行を戻す式です。

variable_name

選択された列の値を格納する変数を識別します。

使用

RETURNING句を持つDML文の場合は、パラメータ・モードOUTを定義して指定しなくても、OUT引数をRETURNING INTO句に入れることができます。USING句とRETURNING INTO句の両方を使用する場合、USING句にはIN引数のみを含めることができます。

実行時に、バインド引数は動的文字列内の対応するプレースホルダを置き換えます。すべてのプレースホルダをUSING句内またはRETURNING INTO句内(あるいはその両方)のバインド引数に関連付ける必要があります。数値リテラル、文字リテラルおよび文字列リテラルはバインド引数として使用できますが、ブール・リテラル(TRUEFALSEおよびNULL)は使用できません。動的文字列にNULLを渡すには、回避策を使用する必要があります。「動的SQLへのNULLの引渡し」を参照してください。

動的SQLはすべてのSQLデータ型をサポートしています。たとえば、定義変数やバインド引数をコレクション、LOB、オブジェクト型のインスタンスおよびrefとすることができます。動的SQLはPL/SQL固有の型をサポートしていません。たとえば、定義変数やバインド引数をブールまたは索引付き表にすることはできません。例外として、PL/SQLレコードをINTO句に入れることができます。

次の例を参照してください。

例5-52「レコードを使用したRETURNING句の使用」
例6-1「PL/SQLを使用したデータ操作」
例7-5「RETURNING BULK COLLECT INTO句を使用した動的SQL」
例7-6「FORALL文中の動的SQL」
例11-15「RETURNING INTO句でのBULK COLLECTの使用」
例11-16「BULK COLLECTでのFORALLの使用」

関連項目

「DELETE文」
「SELECT INTO文」
「UPDATE文」

ROLLBACK文

ROLLBACK文はCOMMIT文の逆です。これは、カレント・トランザクションでデータベースに加えられたすべての変更または一部の変更を取り消します。詳細は、「PL/SQLにおけるトランザクション処理の概要」を参照してください。

SQLのROLLBACK文は、静的SQLとしてPL/SQLに埋め込むことができます。SQLのROLLBACK文の構文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

使用上の注意

ロールバック先のセーブポイント以降にマークされているセーブポイントはすべて消去されます。ロールバック先のセーブポイントは消去されません。たとえば、セーブポイントをA、B、C、Dの順でマークしている場合、セーブポイントBまでロールバックすると、セーブポイントCとDのみが消去されます。

INSERT文、UPDATE文またはDELETE文を実行する前に、暗黙的なセーブポイントがマークされます。文の実行が失敗すると、その暗黙的なセーブポイントまでロールバックされます。通常は、トランザクション全体ではなく、失敗したSQL文のみがロールバックされます。その文が原因で未処理例外が呼び出された場合は、ホスト環境によってロールバックの対象が決まります。

次の例を参照してください。

例2-14「名前解決でのブロック・ラベルの使用」
例6-37「ROLLBACKの使用」
例6-38「ROLLBACKとSAVEPOINTの併用」
例6-39「ROLLBACKによるSAVEPOINTの再使用」

関連項目

「COMMIT文」
「SAVEPOINT文」

%ROWTYPE属性

%ROWTYPE属性は、データベース表の中の行を表すレコード型を提供します。レコードには、表から選択された行全体、あるいはカーソルまたはカーソル変数でフェッチされた行全体のデータを格納できます。%ROWTYPE属性を使用して宣言された変数は、データ型名を使用して宣言された変数と同じように扱われます。%ROWTYPE属性は、変数宣言の中でデータ型指定子として使用できます。

レコード中のフィールドと、それに対応する行の中の列は、同じ名前とデータ型を持ちます。ただし、%ROWTYPEレコードのフィールドは、NOT NULL列、チェック制約、デフォルト値などの制約を継承しません。詳細は、「%ROWTYPE属性の使用」を参照してください。

構文

%rowtype attribute ::=

画像の説明

キーワードとパラメータの説明

cursor_name

現行の有効範囲の中で、事前に宣言されている明示カーソルを識別します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されている、強い型指定を持つPL/SQLカーソル変数を識別します。

table_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要があるデータベースの表(またはビュー)を識別します。

使用上の注意

変数をtable_name%ROWTYPE型として宣言すると、データベース表とPL/SQL間でデータを送信する場合に便利です。列ごとに個別の変数を作成するのではなく、単一の変数を作成します。ユーザーはすべての列の名前を知る必要がありません。作成した変数名ではなく、列の実名を使用して、列を参照します。後で列が表に追加されたり、表から削除された場合も、変更なしでコードは正常に機能します。

レコード中のフィールドを参照するには、ドット表記法(record_name.field_name)を使用します。この方法では、一度に1つのフィールドに対して読取りまたは書込みを行うことができます。

レコードのすべてのフィールドに一度に値を代入するには、次の2つの方法があります。

次の例を参照してください。

例1-6「明示カーソルでの%ROWTYPEの使用」
例2-8「表の行での%ROWTYPEの使用」
例2-9「%ROWTYPE属性の使用」
例2-10「%ROWTYPE宣言を使用したレコードへの値の代入」
例3-11「%TYPEおよび%ROWTYPEでのSUBTYPEの使用」
例5-7「%TYPEおよび%ROWTYPEを使用したコレクション要素型の指定」
例5-20「複雑なデータ型を使用したVARRAYへの値の代入」
例5-42「レコード型の宣言および初期化」
例6-24「%ROWTYPE変数を戻すカーソル変数」
例6-25「%ROWTYPE属性を使用したデータ型の指定」
例13-1「宣言および変数への値の代入」

関連項目

「定数と変数の宣言」
「カーソル宣言」
「カーソル変数」
「FETCH文」

SAVEPOINT文

SAVEPOINT文は、トランザクション処理の過程で、現行の位置に名前を付けてマークします。セーブポイントをROLLBACK TO文と組み合せると、トランザクション全体ではなく、トランザクションの一部を取り消すことができます。詳細は、「PL/SQLにおけるトランザクション処理の概要」を参照してください。

SQLのSAVEPOINT文は、静的SQLとしてPL/SQLに埋め込むことができます。SQLのSAVEPOINT文の構文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

使用上の注意

単純なロールバックまたはコミットではすべてのセーブポイントが消去されます。あるセーブポイントまでロールバックすると、そのセーブポイント以降にマークされたセーブポイントはすべて消去されます。ロールバック先のセーブポイントは消去されません。

セーブポイント名は、トランザクション内で再利用できます。再利用すると、セーブポイントはトランザクションの中の古い位置から現在の位置に移動します。

再帰的サブプログラムの中でセーブポイントをマークすると、再帰しながら進む過程で、各レベルでSAVEPOINT文の新しいインスタンスが実行されます。ロールバックできるのは直前にマークされたセーブポイントまでのみです。

INSERT文、UPDATE文またはDELETE文を実行する前に、暗黙的なセーブポイントがマークされます。文の実行が失敗すると、その暗黙的なセーブポイントまでロールバックされます。通常は、トランザクション全体ではなく、失敗したSQL文のみがロールバックされます。その文が原因で未処理例外が呼び出された場合は、ホスト環境(SQL*Plusなど)によってロールバックの対象が決まります。

次の例を参照してください。

例6-38「ROLLBACKとSAVEPOINTの併用」
例6-39「ROLLBACKによるSAVEPOINTの再使用」

関連項目

「COMMIT文」
「ROLLBACK文」

SELECT INTO文

SELECT INTO文は、データベースの1つ以上の表からデータを取り出して、選択した値を変数またはコレクションに代入します。SELECT SQL文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

デフォルトの使用方法(SELECT ... INTO)では、この文は単一の行から1つ以上の列を取り出します。バルクでの使用方法(SELECT ... BULK COLLECT INTO)では、この文は結果セット全体を一度に取り出します。

構文

select into statement ::=

画像の説明

select item ::=

画像の説明

キーワードとパラメータの説明

alias

参照される列、表またはビューの別名(通常は短縮名)です。

BULK COLLECT

1つ以上のコレクションに結果の値を格納します。FETCH文を使用したループよりも高速な問合せが可能です。詳細は、「バルクSQLによる、DML文および問合せのループ・オーバーヘッドの削減」を参照してください。

collection_name

フェッチしたselect_item値を格納するための、宣言されたコレクションを識別します。select_itemごとに、リストの中に、対応する型互換のコレクションが存在している必要があります。

function_name

ユーザー定義のファンクションを識別します。

host_array_name

フェッチしたselect_item値を格納するための配列を識別します。この配列は、PL/SQLホスト環境で宣言され、バインド変数としてPL/SQLに渡されます。select_itemごとに、リストの中に、対応する型互換の配列が存在している必要があります。ホスト配列には、接頭辞としてコロンが必要です。

numeric_literal

数値または暗黙的に数値に変換可能な値を表すリテラルです。

parameter_name

ユーザー定義ファンクションの仮パラメータを識別します。

record_name

フェッチした行の値を格納する、ユーザー定義のレコードまたは%ROWTYPEレコードを識別します。問合せが戻すselect_item値に対して、レコードの中に、対応する型互換のフィールドが存在している必要があります。

rest_of_statement

SAMPLE句を除く、SQLのSELECT文のFROM句に続けることができる任意の構造体です。

schema_name

表またはビューが含まれているスキーマを識別します。schema_nameを省略すると、表またはビューはユーザーのスキーマ内に存在するとみなされます。

subquery

処理する行セットを提供するSELECT文です。構文はselect_into_statementの構文と似ていますが、INTO句は使用できません。

table_reference

表またはビューを指定します。指定された表またはビューは、SELECT文の実行時にアクセスできる必要があり、ユーザーはSELECT権限を持っている必要があります。table_referenceの構文は、「DELETE文」を参照してください。

TABLE (subquery2)

TABLEのオペランドは、1つの列値を戻すSELECT文です。これはネストした表またはVARRAYである必要があります。演算子TABLEは、値がスカラー値ではなくコレクションであることをOracleに通知します。

variable_name

フェッチしたselect_item値を格納するための、事前に宣言された変数を識別します。問合せが戻すselect_item値に対して、リストの中に、対応する型互換の変数が存在している必要があります。

使用上の注意

デフォルトでは、SELECT INTO文は1行のみを戻す必要があります。それ以外の場合、PL/SQLは事前定義の例外TOO_MANY_ROWSを呼び出して、INTO句内の変数の値は未定義になります。WHERE句が1行とのみ一致するように指定してください。

行が戻されなかった場合は、PL/SQLによってNO_DATA_FOUNDが呼び出されます。可能な場合、COUNT(*)AVG()などの集計関数の結果を選択すると、この例外を回避できます。これらの集計関数は、条件に一致する行がない場合でも、必ず単一の値を戻します。

SELECT ... BULK COLLECT INTO文を使用すると、複数行を戻すことができます。結果を保持するようにコレクション変数を設定する必要があります。必要に応じて、拡張される結合配列またはネストした表を宣言して、結果セット全体を保持することもできます。

暗黙カーソルSQLとカーソル属性%NOTFOUND%FOUND%ROWCOUNTおよび%ISOPENを使用すると、SELECT INTO文の実行についての情報が得られます。

例13-4に、SELECT INTO文を使用する様々な方法を示します。

例13-4    SELECT INTO文の使用

DECLARE
  deptid        employees.department_id%TYPE;
  jobid         employees.job_id%TYPE;
  emp_rec       employees%ROWTYPE;
  TYPE emp_tab IS TABLE OF employees%ROWTYPE INDEX BY PLS_INTEGER;
  all_emps      emp_tab;
BEGIN
  SELECT department_id, job_id INTO deptid, jobid 
     FROM employees WHERE employee_id = 140;
  IF SQL%FOUND THEN 
    DBMS_OUTPUT.PUT_LINE('Dept Id: ' || deptid || ', Job Id: ' || jobid);
  END IF;
  SELECT * INTO emp_rec FROM employees WHERE employee_id = 105;
  SELECT * BULK COLLECT INTO all_emps FROM employees;
  DBMS_OUTPUT.PUT_LINE('Number of rows: ' || SQL%ROWCOUNT);
END;
/

次の例を参照してください。

例1-3「SELECT INTOを使用した変数への値の代入」
例1-4「サブプログラムのパラメータとしての変数への値の代入」
例1-9「WHILE-LOOPを使用した制御」
例5-51「レコードを使用した行の更新」
例5-52「レコードを使用したRETURNING句の使用」
例6-5「CURRVALとNEXTVALの使用」
例6-37「ROLLBACKの使用」
例6-38「ROLLBACKとSAVEPOINTの併用」
例6-43「パッケージでの自律型ファンクションの宣言」
例7-1「動的SQLの例」
例7-2「表名およびWHERE句を受け入れる動的SQLプロシージャ」

関連項目

「代入文」
「FETCH文」
「%ROWTYPE属性」

SERIALLY_REUSABLEプラグマ

SERIALLY_REUSABLEプラグマは、サーバーへの1コールの間のみ、そのパッケージ状態が必要であることを示します。例としては、データベースへのOCIコール、データベース・リンクを介したストアド・プロシージャ・コールなどがあります。このコールの後、パッケージ変数の記憶域の再利用が可能になり、長時間実行セッションのメモリー・オーバーヘッドが削減されます。詳細は、『Oracle Databaseアプリケーション開発者ガイド-基礎編』を参照してください。

構文

pragma serially_resuable ::=

画像の説明

キーワードとパラメータの説明

PRAGMA

文がプラグマ(コンパイラ・ディレクティブ)であることを表します。プラグマは、実行時ではなくコンパイル時に処理されます。プログラムの機能に影響を与えず、コンパイラに情報を提供する役割のみです。

使用上の注意

このプラグマは、同じセッションのそれ以降のデータベース・コール中には必要ない、1回のみ使用される大規模な一時作業領域を宣言するパッケージに適しています。

本体部のないパッケージを逐次再使用可能としてマークできます。パッケージに仕様部と本体がある場合は、両方ともマークする必要があります。本体のみをマークすることはできません。

逐次再使用可能なパッケージのグローバル・メモリーは、ユーザー・グローバル領域(UGA)で個のユーザーに割り当てられるのではなく、システム・グローバル領域(SGA)にプールされます。それによって、パッケージ作業領域の再使用が可能になります。サーバーへのコールが終わると、メモリーはプールに戻されます。パッケージが再使用されるたびに、そのパッケージのパブリック変数はデフォルト値かNULLに初期設定されます。

逐次再使用可能パッケージには、データベース・トリガー、またはSQL文からコールされる他のPL/SQLサブプログラムからアクセスすることはできません。これを試行すると、Oracleはエラーを生成します。

例13-5では、逐次再使用可能パッケージを作成します。

例13-5    逐次再使用パッケージの使用

CREATE PACKAGE pkg1 IS
   PRAGMA SERIALLY_REUSABLE;
   num NUMBER := 0;
   PROCEDURE init_pkg_state(n NUMBER);
   PROCEDURE print_pkg_state;
END pkg1;
/
CREATE PACKAGE BODY pkg1 IS
   PRAGMA SERIALLY_REUSABLE;
   PROCEDURE init_pkg_state (n NUMBER) IS
   BEGIN
      pkg1.num := n;
   END;
   PROCEDURE print_pkg_state IS
   BEGIN
      DBMS_OUTPUT.PUT_LINE('Num: ' || pkg1.num);
   END;
END pkg1;
/

関連項目

「AUTONOMOUS_TRANSACTIONプラグマ」
「EXCEPTION_INITプラグマ」
「RESTRICT_REFERENCESプラグマ」

SET TRANSACTION文

SET TRANSACTION文は、読取り専用または読取り/書込みのトランザクションを開始するか、分離レベルを設定するか、指定したロールバック・セグメントにカレント・トランザクションを代入します。読取り専用トランザクションは、他のユーザーが更新中である1つ以上の表に対して、複数の問合せを実行する場合に便利です。詳細は、「SET TRANSACTIONを使用したトランザクション・プロパティの設定」を参照してください。

SQLのSET TRANSACTION文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

set transaction ::=

画像の説明

キーワードとパラメータの説明

READ ONLY

カレント・トランザクションを読取り専用に設定する句です。これによって、それ以降の問合せからはトランザクションの開始前にコミットされた変更内容のみが参照されます。READ ONLYを使用しても、他のユーザーや他のトランザクションには影響がありません。

READ WRITE

カレント・トランザクションを読取り/書込みに設定する句です。READ WRITEを使用しても、他のユーザーや他のトランザクションには影響がありません。トランザクションでDML文が実行されると、Oracleはトランザクションをロールバック・セグメントに代入します。

ISOLATION LEVEL

データベースを変更するトランザクションがどのように処理されるかを指定します。

SERIALIZABLE: 直列可能トランザクションが、コミットされていない別のトランザクションですでに変更された表を変更するSQL DML文を実行しようとした場合、その文は失敗します。

SERIALIZABLEモードを使用可能にするには、DBAが、Oracle初期化パラメータCOMPATIBLEを7.3.0以上に設定します。

READ COMMITTED: トランザクションに含まれるSQL DML文が、別のトランザクションによって保持されている行ロックを必要とする場合に、その文は行ロックが解放されるまで待機します。

USE ROLLBACK SEGMENT

カレント・トランザクションを指定したロールバック・セグメントに代入し、トランザクションを読取り/書込みに設定する句です。このパラメータは、同じトランザクションの中でREAD ONLYパラメータとともには使用できません。読取り専用トランザクションは、ロールバック情報を生成しないためです。

NAME

トランザクションの名前またはコメント・テキストを指定します。この指定した名前やコメント・テキストはトランザクションの実行中に使用可能で、長時間実行のインダウト・トランザクションをモニターしやすくなるため、COMMIT COMMENT機能を使用するより適切です。

使用上の注意

SET TRANSACTION文は、トランザクションの最初のSQL文にする必要があり、そのトランザクションで1回しか使用できません。

次の例を参照してください。

例6-40「SET TRANSACTIONを使用した読取り専用トランザクションの開始」

関連項目

「COMMIT文」
「ROLLBACK文」
「SAVEPOINT文」

SQLカーソル

明示カーソルに関連付けられていないSQL文を処理するために、Oracleは暗黙的にカーソルをオープンします。PL/SQLでは直前の暗黙カーソルをSQLカーソルとして参照できます。SQLカーソルには、%FOUND%ISOPEN%NOTFOUNDおよび%ROWCOUNTの4つの属性があります。これらの属性を使用すると、DML文の実行についての情報が得られます。SQLカーソルには、FORALL文で使用できるように設計された追加の属性%BULK_ROWCOUNTおよび%BULK_EXCEPTIONSもあります。詳細は、「PL/SQLを使用したデータの問合せ」を参照してください。

構文

sql cursor ::=

画像の説明

キーワードとパラメータの説明

%BULK_ROWCOUNT

FORALL文で使用するために設計された複合属性です。この属性は索引付き表のように取り扱われます。i 番目の要素には、UPDATE文またはDELETE文のi 番目の実行によって処理された行の数が格納されます。i 番目の実行によって影響を受ける行がない場合、%BULK_ROWCOUNT(i)は0(ゼロ)を戻します。

%BULK_EXCEPTIONS

SAVE EXCEPTIONS句を使用するFORALL文によって発生した例外についての情報を格納する結合配列です。この要素をループして、例外の発生した箇所と内容を判断する必要があります。SQL%BULK_EXCEPTIONS(i).ERROR_INDEXは、1からSQL%BULK_EXCEPTIONS.COUNTまでの各索引値iにおいて、例外の原因となったFORALLループの反復を指定します。SQL%BULK_EXCEPTIONS(i).ERROR_CODEは、例外に対応するOracleエラー・コードを指定します。

%FOUND

INSERT文、UPDATE文またはDELETE文が1つ以上の行に影響を与える場合またはSELECT INTO文が1つ以上の行を戻す場合、この属性はTRUEを戻します。それ以外の場合は、FALSEを戻します。

%ISOPEN

Oracleは、SQLカーソルに関連付けられたSQL文の実行を終了すると、このカーソルを自動的にクローズするため、この属性は常にFALSEを戻します。

%NOTFOUND

%FOUNDとは論理的に反対の意味を持ちます。INSERT文、UPDATE文またはDELETE文がどの行にも影響を与えない場合またはSELECT INTO文がどの行も戻さない場合、この属性はTRUEを戻します。それ以外の場合は、FALSEを戻します。

%ROWCOUNT

INSERT文、UPDATE文またはDELETE文に影響を受けた行、またはSELECT INTO文に戻された行の数を戻します。

SQL

Oracle暗黙カーソルの名前です。

使用上の注意

カーソル属性は、プロシージャ文では使用できますが、SQL文では使用できません。OracleがSQLカーソルを自動的にオープンするまでは、暗黙カーソルの属性はNULLを戻します。カーソル属性の値は、常に直前に実行されたSQL文を参照します(その文の場所とは無関係です)。文が別の有効範囲に存在する場合もあります。したがって、属性の値を保存して後で使用する場合は、値を変数に直接代入してください。

SELECT INTO文が行を戻せなかった場合は、次の行でSQL%NOTFOUNDをチェックしているかどうかにかかわらず、PL/SQLによって事前定義済の例外NO_DATA_FOUNDが呼び出されます。SQL集計関数をコールするSELECT INTO文が、NO_DATA_FOUNDを呼び出すことはありません。SQL集計関数は、必ず値またはNULLを戻します。このような場合、SQL%NOTFOUNDFALSEを戻します。典型的な挿入は1行にのみ影響するため、%BULK_ROWCOUNTは、冗長になるのを防ぐためバルク挿入用に保持されません。「%BULK_ROWCOUNT属性を持つFORALLによる影響を受ける行カウント」を参照してください。

バルク・バインドには、スカラー属性の%FOUND%NOTFOUNDおよび%ROWCOUNTを使用できます。たとえば、%ROWCOUNTは、SQL文のすべての実行によって処理された行の総数を戻します。%FOUND%NOTFOUNDは、SQL文の最後の実行のみを参照しますが、%BULK_ROWCOUNTを使用すると、個の実行に対する値を推論できます。たとえば、%BULK_ROWCOUNT(i)がゼロの場合、%FOUND%NOTFOUNDはそれぞれ、FALSEおよびTRUEになります。

次の例を参照してください。

例6-7「SQL%FOUNDの使用」
例6-8「SQL%ROWCOUNTの使用」
例6-10「カーソルを使用したフェッチ」
例6-14「%FOUNDの使用」
例6-15「%ISOPENの使用」
例6-16「%NOTFOUNDの使用」
例6-17「%ROWCOUNTの使用」
例11-7「FORALL文での%BULK_ROWCOUNTの使用」
例13-4「SELECT INTO文の使用」

関連項目

「カーソル宣言」
「カーソル属性」
「FORALL文」

SQLCODEファンクション

SQLCODEファンクションは、直前の例外の番号コードを戻します。

内部例外の場合、SQLCODEは関連付けられているOracleエラーの番号を戻します。SQLCODEが戻す番号は負の値ですが、Oracleエラー「データが見つかりません。」の場合は例外です。この場合、SQLCODE+100を戻します。ユーザー定義の例外の場合、SQLCODE+1を戻します。ただし、EXCEPTION_INITプラグマを使用して例外をOracleエラー番号に関連付けている場合は、代入した値を戻します。

構文

sqlcode function ::=

画像の説明

使用上の注意

SQLCODEは例外ハンドラの中でのみ有効です。ハンドラの外側では、SQLCODEは常に0を戻します。SQLCODEは呼び出された内部例外の識別に使用できるため、OTHERS例外ハンドラの中で使用すると特に便利です。SQLCODEは、SQL文の中で直接使用することができません。まず、SQLCODEの値をローカル変数に代入します。

RESTRICT_REFERENCESプラグマを使用してストアド・ファンクションの純正度を示すときにファンクションがSQLCODEをコールする場合は、WNPSおよびRNPS制約は指定できません。

例13-6に、SQLCODEおよびSQLERRMの使用を示します。

例13-6    SQLCODEおよびSQLERRMの使用

DECLARE
   name employees.last_name%TYPE;
   v_code NUMBER;
   v_errm VARCHAR2(64);
BEGIN
   SELECT last_name INTO name FROM employees WHERE employee_id = 1000;
   EXCEPTION
      WHEN OTHERS THEN
         v_code := SQLCODE;
         v_errm := SUBSTR(SQLERRM, 1 , 64);
         DBMS_OUTPUT.PUT_LINE('The error code is ' || v_code || '- ' || v_errm);
END;
/

次の例を参照してください。

例10-11「SQLCODEおよびSQLERRMの表示」

関連項目

「例外定義」
「SQLERRMファンクション」
「エラー・コードとエラー・メッセージの取得: SQLCODEおよびSQLERRM」

SQLERRMファンクション

SQLERRMファンクションは、エラー番号の引数に関連付けられているエラー・メッセージを戻します。引数が省略されている場合は、SQLCODEのカレント値に関連付けられているエラー・メッセージを戻します。引数なしのSQLERRMは、例外ハンドラの中でのみ有効です。ハンドラの外側では、引数なしのSQLERRMは常にメッセージ「正常に完了しました。」を戻します。内部例外の場合、SQLERRMは、発生したOracleエラーに関連付けられているメッセージを戻します。メッセージの先頭にはOracleエラー・コードが示されています。

ユーザー定義の例外の場合、SQLERRMはメッセージ「ユーザー定義の例外」を戻します。ただし、EXCEPTION_INITプラグマを使用して例外をOracleエラー番号に関連付けている場合は例外です。この場合、SQLERRMは対応するエラー・メッセージを戻します。詳細は、「エラー・コードとエラー・メッセージの取得: SQLCODEおよびSQLERRM」を参照してください。

構文

sqlerrm function ::=

画像の説明

キーワードとパラメータの説明

error_number

有効なOracleエラー番号です。Oracleエラー(接頭辞としてORA-が付くエラー)のリストは、『Oracle Databaseエラー・メッセージ』を参照してください。

使用上の注意

SQLERRMは呼び出された内部例外の識別に使用できるため、OTHERS例外ハンドラの中で使用すると特に便利です。SQLERRMに渡されるエラー番号は、負の値です。SQLERRMに0(ゼロ)を渡すと、常にメッセージ「ORA-0000: 正常に完了しました。」を戻します。SQLERRMに正数を渡すと、必ず「ユーザー定義の例外」というメッセージが戻されます。ただし、+100を渡すと、SQLERRMによって「ORA-01403: データが見つかりません。」というメッセージが戻されます。

SQLERRMは、SQL文の中で直接使用することができません。例13-6に示すように、まず、SQLERRMの値をローカル変数に代入します。

RESTRICT_REFERENCESプラグマを使用してストアド・ファンクションの純正度を示すときに、ファンクションがSQLERRMをコールする場合はWNPSおよびRNPS制約を指定できません。

次の例を参照してください。

例10-11「SQLCODEおよびSQLERRMの表示」
例13-6「SQLCODEおよびSQLERRMの使用」

関連項目

「例外定義」
「SQLCODEファンクション」

%TYPE属性

%TYPE属性を使用すると、型名をハードコードするかわりに、宣言内のフィールド、レコード、ネストした表、データベース列または変数のデータ型を使用できます。%TYPE属性は、定数、変数、フィールドまたはパラメータを宣言するときにデータ型指定子として使用できます。参照する型が変更されると、宣言は自動的に更新されます。これによって、たとえば、VARCHAR2列を長くする場合にコードを変更する必要がなくなります。%TYPEを使用して宣言した項目には、NOT NULL、チェック制約、デフォルト値などの列制約は継承されません。詳細は、「%TYPE属性の使用」を参照してください。

構文

%type attribute ::=

画像の説明

キーワードとパラメータの説明

collection_name

現行の有効範囲のうち、これより前の部分で宣言されているネストした表、索引付き表またはVARRAYを指定します。

cursor_variable_name

現行の有効範囲の中で事前に宣言されているPL/SQLカーソル変数を識別します。カーソル変数に代入できるのは、別のカーソル変数の値のみです。

db_table_name.column_name

宣言がPL/SQLコンパイラによって処理されるときにアクセスできる必要がある表および列を識別します。

object_name

現行の有効範囲のうち、これより前の部分で宣言されているオブジェクト型のインスタンスを識別します。

record_name

現行の有効範囲のうち、これより前の部分で宣言されているユーザー定義のレコードまたは%ROWTYPEレコードです。

record_name.field_name

現行の有効範囲のうち、これより前の部分で宣言されているユーザー定義のレコードまたは%ROWTYPEレコードのフィールドを識別します。

variable_name

同じ有効範囲の中で事前に宣言されている変数を識別します。

使用上の注意

%TYPE属性は、データベース列を参照する変数、フィールドおよびパラメータを宣言する場合に特に便利です。列の長さや型が変更されても、コードは正常に機能します。

次の例を参照してください。

例1-15「PL/SQLのコレクション型の使用」
例2-6「変数のデータ型を持つ%TYPEの使用」
例2-7「表の列での%TYPEの使用」
例2-15「名前解決でのサブプログラムの使用」
例2-10「%ROWTYPE宣言を使用したレコードへの値の代入」
例3-11「%TYPEおよび%ROWTYPEでのSUBTYPEの使用」
例5-5「ネストした表としてのプロシージャのパラメータの宣言」
例5-7「%TYPEおよび%ROWTYPEを使用したコレクション要素型の指定」
例5-42「レコード型の宣言および初期化」
例6-1「PL/SQLを使用したデータ操作」
例6-13「カーソルを使用したバルク・データのフェッチ」
例13-1「宣言および変数への値の代入」

関連項目

「定数と変数の宣言」
「%ROWTYPE属性」

UPDATE文

UPDATE文は、表またはビューの中の1行以上の行にある指定された列の値を変更します。UPDATE文の詳細は、『Oracle Database SQLリファレンス』を参照してください。

構文

update statement ::=

画像の説明

キーワードとパラメータの説明

alias

参照される表またはビューの別名(通常は短縮名)で、WHERE句の中で頻繁に使用されます。

column_name

更新する列(または更新する複数の列の中の1つ)です。これは参照される表またはビューの列の名前にしてください。column_nameリストでは同じ列名を繰り返して使用できません。UPDATE文の列名は、表またはビューの中と同じ順序で指定する必要はありません。

returning_clause

更新された行から値を戻します。そのため、後で行をSELECTで選択する必要がありません。取り出した列値は、変数かホスト変数、またはコレクションかホスト配列に代入できます。RETURNING句はリモートまたはパラレルでの更新には使用できません。文を実行しても行に影響がない場合、RETURNING句で指定した変数の値は未定義になります。returning_clauseの構文は、「RETURNING INTO句」を参照してください。

SET column_name = sql_expression

この句はsql_expressionの値を、column_nameによって識別される列に代入します。sql_expressionの中で、更新される表の列が参照されている場合、参照は現在行の列が対象になります。古い列の値は、等号の右辺で使用されます。

SET column_name = (subquery3)

subquery3でデータベースから取り出した値を、column_nameによって識別される列に代入します。この副問合せは、正確に1つの行と1つの列を戻す必要があります。

SET (column_name, column_name, ...)= (subquery4)

subquery4でデータベースから取り出した値を、column_nameリストにある列に代入します。副問合せは、リストされている列すべてを含む1つの行のみを戻す必要があります。副問合せによって戻された列値は、列リストの列に順番に代入されます。1番目の値はリストの1番目の列に、2番目の値はリストの2番目の列に、というように代入されます。

sql_expression

任意の有効なSQLの式です。詳細は、『Oracle Database SQLリファレンス』を参照してください。

subquery

処理する行セットを提供するSELECT文です。構文はselect_into_statementの構文と似ていますが、INTO句は使用できません。「SELECT INTO文」を参照してください。

table_reference

表またはビューを指定します。指定された表またはビューは、UPDATE文の実行時にアクセスできる必要があり、ユーザーがUPDATE権限を持つ必要があります。table_referenceの構文は、「DELETE文」を参照してください。

TABLE (subquery2)

TABLEのオペランドは、1つの列値を戻すSELECT文です。これはネストした表またはVARRAYである必要があります。演算子TABLEは、値がスカラー値ではなくコレクションであることをOracleに通知します。

WHERE CURRENT OF cursor_name

指定したカーソルに関連付けられているFETCH文によって処理された最後の行を参照します。カーソルは、FOR UPDATEであること、さらにオープンされていて行に置かれていることが必要です。カーソルがオープンされていないと、CURRENT OF句でエラーが発生します。カーソルがオープンされていても、フェッチされた行がないか、最後のフェッチで行が戻されなかった場合は、PL/SQLによって事前定義の例外NO_DATA_FOUNDが呼び出されます。

WHERE search_condition

データベース表の中の更新対象行を選択します。検索条件を満たす行のみが更新されます。この句を省略すると、表の中のすべての行が更新されます。

使用上の注意

UPDATE WHERE CURRENT OF文は、オープンされているカーソルからのフェッチ(カーソルFORループで実行されるフェッチを含む)の後で使用できます。ただしそのためには、関連付けられた問合せがFOR UPDATEである必要があります。この文は直前にフェッチされた行を更新します。

暗黙的なSQLカーソルとカーソル属性%NOTFOUND%FOUND%ROWCOUNTおよび%ISOPENを使用すると、UPDATE文の実行に関する有用な情報にアクセスできます。

例13-7では、従業員IDは正しく、名前は間違っている表を作成します。次に、相関問合せを含むUPDATE文を実行して、EMPLOYEES表から正しい名前を取り出し、新しい表で名前を修正します。

例13-7    副問合せでのUPDATEの使用

-- Create a table with all the right IDs, but messed-up names
CREATE TABLE employee_temp AS 
  SELECT employee_id, UPPER(first_name) first_name,
    TRANSLATE(last_name,'aeiou','12345') last_name
    FROM employees;
BEGIN
-- Display the first 5 names to show they're messed up
   FOR person IN (SELECT * FROM employee_temp WHERE ROWNUM < 6)
   LOOP
      DBMS_OUTPUT.PUT_LINE(person.first_name || ' ' || person.last_name);
   END LOOP;
   UPDATE employee_temp SET (first_name, last_name) =
      (SELECT first_name, last_name FROM employees
         WHERE employee_id = employee_temp.employee_id);
   DBMS_OUTPUT.PUT_LINE('*** Updated ' || SQL%ROWCOUNT || ' rows. ***');
-- Display the first 5 names to show they've been fixed up
   FOR person IN (SELECT * FROM employee_temp WHERE ROWNUM < 6)
   LOOP
      DBMS_OUTPUT.PUT_LINE(person.first_name || ' ' || person.last_name);
   END LOOP;
END;
/

次の例を参照してください。

例1-12「ストアド・サブプログラムの作成」
例4-1「単純なIF-THEN文の使用」
例5-51「レコードを使用した行の更新」
例5-52「レコードを使用したRETURNING句の使用」
例6-1「PL/SQLを使用したデータ操作」
例6-5「CURRVALとNEXTVALの使用」
例6-6「ROWNUMの使用」
例6-38「ROLLBACKとSAVEPOINTの併用」
例6-41「CURRENT OFを使用した、カーソルからフェッチされた最新行の更新」
例7-1「動的SQLの例」
例7-5「RETURNING BULK COLLECT INTO句を使用した動的SQL」
例7-6「FORALL文中の動的SQL」
例11-6「FORALLでのロールバックの使用」
例11-9「例外が発生しても継続するバルク操作」

関連項目

「データ操作」
「DELETE文」
「FETCH文」
「INSERT文」

戻る 次へ
Oracle
Copyright © 2005 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引