この項では、後に続く章の内容の基本概念について説明します。この項の内容は次のとおりです。
埋込みSQLとは、アプリケーション・プログラムに記述されているSQL文のことです。SQL文を含むアプリケーション・プログラムはホスト・プログラムと呼ばれ、その記述言語はホスト言語と呼ばれます。たとえば、Pro*C/C++では、特定のSQL文をCまたはC++ホスト・プログラムに埋め込むことができます。
Oracleデータの操作および問合せには、INSERT文、UPDATE文、DELETE文およびSELECT文を使用します。INSERTではデータの行をデータベース表に追加し、UPDATEでは行を変更し、DELETEでは不要な行を削除し、SELECTでは検索条件と一致する行を取り出します。
強力なSET ROLE文を使用すると、データベース権限を動的に管理できます。ロールとは、関連するシステム権限やオブジェクト権限の名前付きグループ、あるいはユーザーまたは他のロールに付与された関連するシステム権限やオブジェクト権限の名前付きグループです。ロールの定義は、Oracleデータ・ディクショナリに格納されます。アプリケーションでは、必要に応じてSET ROLE文を使用し、ロールを有効または無効にできます。
アプリケーション・プログラムではSQL文のみ有効であり、SQL*Plus文は無効です。(SQL*Plusにはレポートの書式化、SQL文の編集、環境パラメータの設定のための文が追加されています。)
埋込みSQL文には、すべての対話型SQL文に加えて、Oracleとホスト・プログラムの間でデータを転送できるその他の文があります。埋込みSQL文には、実行文およびディレクティブという2つのタイプがあります。実行文では、SQLLIBランタイム・ライブラリへのコールが発生します。実行文は、Oracleへの接続、Oracleデータの定義、問合せ、操作、Oracleデータへのアクセス制御およびトランザクション処理に使用します。CまたはC++言語の実行文を配置できる位置であれば、任意の位置に記述できます。
一方、ディレクティブではSQLLIBへのコールは発生せず、Oracleデータの操作も行われません。宣言文は、Oracleオブジェクト、通信領域およびSQL変数を宣言するために使用します。CまたはC++の変数宣言を配置できる位置であれば、任意の位置に記述できます。
表2-1は、各種の埋込みSQL文の一部をグループ化したものです。
表2-1 埋込みSQL文
ディレクティブ | 用途 |
---|---|
ARRAYLEN* |
PL/SQLでのホスト配列の使用 |
BEGIN DECLARE SECTION* END DECLARE SECTION* |
ホスト変数の宣言(オプション) |
DECLARE* |
Oracleスキーマ・オブジェクトの命名 |
INCLUDE* |
ファイルへのコピー |
TYPE* |
データ型の同値化 |
VAR* |
変数の同値化 |
WHENEVER* |
ランタイム・エラーの処理 |
表2-2 埋込みSQL文
実行文 | 用途 |
---|---|
ALLOCATE* |
Oracleデータの定義および制御 |
ALTER |
- |
ANALYZE |
- |
DELETE |
DML |
INSERT |
- |
SELECT |
- |
UPDATE |
- |
COMMIT |
トランザクションの処理 |
ROLLBACK |
- |
SAVEPOINT |
- |
SET TRANSACTION |
- |
DESCRIBE* |
動的SQLの使用 |
EXECUTE* |
- |
PREPARE* |
- |
ALTER SESSION |
セッションの制御 |
SET ROLE |
- |
*対話形式はありません。 |
作成したアプリケーション・プログラムでは、完全なSQL文と完全なCプログラムを自由に混在させ、SQL文にC言語の変数や構造体を使用できます。SQL文をホスト・プログラム内に作成する場合の唯一の特殊要件は、SQL文をEXEC SQLキーワードで開始し、セミコロンで終了することです。Pro*C/C++では、すべてのEXEC SQL文がSQLLIBランタイム・ライブラリへのコールに変換されます。
多くの埋込みSQL文は、新しい句が追加される点、またはプログラム変数が使用される点のみが同等の対話型SQLと異なります。次の例は、対話型ROLLBACK文と埋込みROLLBACK文の対比を示しています。
ROLLBACK WORK: -- interactive EXEC SQL ROLLBACK WORK; -- embedded
この2つの文の効果は同じですが、対話型SQL環境(SQL*Plusの実行時など)では前者を、Pro*C/C++プログラムでは後者を使用します。
ほとんどのアプリケーション・プログラムは、静的SQL文と固定的なトランザクションを処理するように設計されています。この場合、実行前にそれぞれのSQL文およびトランザクションの構成が認識できます。つまり、どのSQLコマンドが発行され、どのデータベースの表が変更され、どの列が更新されるかなどが事前にわかっています。
ただし、アプリケーションによっては、任意の有効なSQL文を実行時に受け入れて処理することを要求される場合もあります。したがって、関係するSQLコマンド、データベース表および列が実行時までわからないことがあります。
動的SQLは、実行時のプログラムでSQL文を受け入れるか作成し、データ型の変換を明示的に制御する高度なプログラミング技術です。
Pro*C/C++では、PL/SQLブロックが1つの埋込みSQL文と同様に扱われます。PL/SQLブロックは、アプリケーション・プログラム内でSQL文を記述できる位置であれば、任意の位置に記述できます。PL/SQLをホスト・プログラムに埋め込むには、単にPL/SQLと共有する変数を宣言し、PL/SQLブロックをEXEC SQL EXECUTEおよびEND-EXECキーワードで囲みます。
PL/SQLはすべてのSQLデータ操作コマンドおよびトランザクション処理コマンドをサポートしているため、埋込みPL/SQLブロックからOracleデータを柔軟かつ安全に操作できます。
関連項目:
ホスト変数は、Oracleとプログラムとの間で通信を行うための鍵です。ホスト変数とは、C言語で宣言され、Oracleで共有される(つまり、プログラムとOracleの両方がその値を参照できる)スカラー変数または集合体変数です。
プログラムでは、入力ホスト変数を使用してOracleにデータを渡します。Oracleでは、出力ホスト変数を使用してプログラムにデータおよびステータス情報を渡します。プログラムは入力ホスト変数に値を割り当て、Oracleは出力ホスト変数に値を割り当てます。
ホスト変数は、SQL式を使用できる位置であれば任意の位置に使用できます。SQL文では、SQLキーワードと区別するために、ホスト変数に接頭辞としてコロン(:)を付ける必要があります。
C構造体を使用して、複数のホスト変数を含めることもできます。接頭辞コロンを付けて埋込みSQL文の構造体を命名すると、Oracleでは構造体の各コンポーネントがホスト変数として使用されます。
任意のホスト変数に任意指定の標識変数を関連付けることができます。標識変数は、関連付けられたホスト変数の値または条件を示すshort int型変数です。標識変数は、入力ホスト変数へのNULLの割当てと、出力ホスト変数に含まれるNULLまたは切捨て値の検出に使用されます。NULL値は、欠落している値、不明な値または適用不能な値です。
SQL文の場合、標識変数には接頭辞コロンを付けて、対応するホスト変数の直後に記述する必要があります。さらにわかりやすくするには、ホスト変数とその標識変数の間にINDICATORキーワードを記述します。
ホスト変数が構造体にパッケージされていて、標識変数を使用する場合は、ホスト構造体の各ホスト変数に対する標識変数を含む構造体を作成し、SQL文でインジケータ構造体を命名します。インジケータ構造体の名前の前にはコロンを付け、ホスト変数の構造体の直後に指定します。また、INDICATORキーワードを使用して、ホスト構造体とそれに対応するインジケータ構造体を分離することもできます。
通常、ホスト・プログラムからOracleにデータが入力され、Oracleからプログラムにデータが出力されます。Oracleではデータベース表に入力データが格納され、出力データはプログラム・ホスト変数に格納されます。データ項目を格納するために、Oracleではそのデータ型を認識する必要があり、データ型により値の記憶形式と有効範囲が指定されます。
Oracleでは、内部データ型と外部データ型という2種類のデータ型が認識されます。内部データ型は、Oracleでデータベース列にデータを格納する方法を指定します。また、Oracleでは、データベース疑似列を表す内部データ型も使用されます。データベース疑似列は特定のデータ項目を戻すものの、表には実際の列はありません。
外部データ型は、データがホスト変数にどのように格納されるかを指定します。ホスト・プログラムがOracleにデータを入力すると、Oracleは必要に応じて、入力ホスト変数の外部データ型とターゲット・データベース列の内部データ型の間で変換を行います。Oracleがホスト・プログラムにデータを出力すると、Oracleは必要に応じて、ソース・データベース列の内部データ型と出力ホスト変数の外部データ型の間で変換を行います。
Oracleでは、SQL文を処理するためにプライベートSQL領域と呼ばれる作業領域がオープンされます。このプライベートSQL領域にはSQL文の実行に必要な情報が格納されます。カーソルと呼ばれる識別子を使用すると、SQL文に名前を付け、そのプライベート領域内の情報にアクセスし、その処理をある程度制御できます。
静的SQL文には、明示的および暗黙的という2種類のカーソルがあります。Oracleでは、1行のみを戻すSELECT文(問合せ)などのすべてのデータ定義文とDML文に対しては、1つのカーソルが暗黙的に宣言されます。ただし、複数行を戻す問合せで2行目以降を処理する場合は、カーソルを明示的に宣言(またはホスト配列を使用)する必要があります。
戻された一連の行はアクティブ・セットと呼ばれ、そのサイズは問合せの検索条件と何行一致するかによって異なります。現在処理している行(カレント行と呼ばれる)を識別するには、明示カーソルを使用します。
たとえば、端末の画面に一連の行が戻されたとします。画面上のカーソルは、最初に処理される行、次に処理される行というように移動していきます。同様に、明示カーソルはアクティブ・セット内の現在行を指します。これを利用して、プログラムは行を1行ずつ処理できます。
トランザクションとは、論理的に関連のある一連のSQL文です(ある銀行勘定の貸方に記帳し、別の銀行勘定の借方に記帳する2つのUPDATEなど)。Oracleでは、トランザクションは1単位として扱われるため、それぞれの文による変更はすべてが同時に確定されるか、取り消されるかします。
最後のデータ定義、COMMITまたはROLLBACK文が実行された後に実行するDML文すべてが、現行のトランザクションを構成します。
データベースの整合性を維持するために、Pro*C/C++ではCOMMIT文、ROLLBACK文およびSAVEPOINT文を使用してトランザクションを定義できます。
COMMITでは、現行のトランザクション中にデータベースに加えられた変更が確定されます。ROLLBACKでは、現行のトランザクションを終了し、トランザクションの開始以降に加えられた変更がすべて取り消されます。SAVEPOINTでは、トランザクション処理の現在の位置にマークが付けられ、ROLLBACKと併用することで、トランザクションを部分的に取り消すことができます。
埋込みSQL文を実行すると、エラーまたは警告が発生する場合があります。これらの結果を処理する方法が必要です。Pro*C/C++には、SQL通信領域(SQLCA)とWHENEVER文という2つのエラー処理方法が用意されています。
SQLCAは、ホスト・プログラムに組み込む(ハードコードする)データ構造体です。Oracleにより使用されるプログラム変数を定義して、ランタイム・ステータス情報をプログラムに渡します。SQLCAを使用すると、直前に試みた処理に関するOracleからのフィードバックに基づいて、異なる処理を実行できます。たとえば、DELETE文が成功したかチェックし、成功した場合は削除された行数をチェックできます。
WHENEVER文を使用すると、Oracleがエラーまたは警告状態を検出した際に自動的に行われるアクションを指定できます。これらの処理は、次の文の継続実行、関数のコール、ラベル付き文への分岐、停止です。