指定しない場合、デフォルトはNO RESTRICTED ACCESSです。
ユーザー名に対する文字列リテラルを指定することも、DEFAULTキーワードを指定することもできます。DEFAULTキーワードによって、プログラムのソース・コードへのユーザー名の配置を回避できます。DEFAULTキーワードを指定する場合、SQLモジュールまたはプリコンパイルされたプログラムのコンパイル時に、コマンドライン修飾子を使用してプログラムにユーザー名を渡します。USERNAME修飾子を使用します。
PASSWORDに文字列リテラルを指定することも、DEFAULTキーワードを指定することもできます。DEFAULTキーワードによって、プログラムのソース・コードへのユーザー名の配置を回避できます。DEFAULTキーワードを指定する場合、SQLモジュールまたはプリコンパイルされたプログラムのコンパイル時に、コマンドライン修飾子を使用してプログラムにパスワードを渡します。PASSWORD修飾子を使用します。
- DECLARE ALIASは、コンパイル時にプログラムにデータベースを宣言する非実行可能文です。SQLでは、プログラムまたはSQLモジュールの最初の実行SQL文を実行するまでは、データベースにアタッチしません。
- SQLがモジュールの最初のプロシージャを実行すると、デフォルトでアクティブなモジュールの各別名にアタッチします。
- 対話型SQLまたは動的SQLでは、ATTACH文を使用して暗黙的環境にデータベースを追加する必要があります。詳細は、「ATTACH文」を参照してください。
- プログラムまたはSQLモジュールのDECLAREセクションに埋め込まれたDECLARE ALIAS文は、DECLARE TRANSACTION文または実行SQL文の前にある必要があります。DECLARE ALIAS文は、コンパイル可能なデータベースをアプリケーションに通知します。
- マルチスキーマ・データベースで別名を使用するには、第2.2.11項に示すように、ANSI/ISO引用を有効にして、デリミタ付き識別子を作成する必要があります。
- DEFAULT CHARACTER SET句およびNATIONAL CHARACTER SET句によって指定されたキャラクタ・セットが、実行時にアクセスするデータベースの実際のキャラクタ・セットと同一であることを確認する必要があります。これらのキャラクタ・セットが一致しない場合、実行時に予期しない結果が発生します。
- デフォルト・キャラクタ・セットでは、CHARデータ型およびVARCHARデータ型で列のキャラクタ・セットを指定します。デフォルト・キャラクタ・セットの詳細は、第2.1.3項を参照してください。
- 各国語キャラクタ・セットでは、NCHARデータ型およびNCHAR VARYINGデータ型で列のキャラクタ・セットを指定します。各国語キャラクタ・セットの詳細は、第2.1.7項を参照してください。
- DECLARE ALIAS文でデフォルト・キャラクタ・セットが指定されていない場合、コンパイル時に起動されるデータベース・ファイルのデフォルト・キャラクタ・セットが想定されます。
- DECLARE ALIAS文で各国語キャラクタ・セットが指定されていない場合、コンパイル時に起動されるデータベース・ファイルの各国語キャラクタ・セットが想定されます。
- データベースのデフォルト・キャラクタ・セットがDEC_MCSではない場合、PATHNAME指定子は使用できません。これは、現在リポジトリではオブジェクト名にDEC_MCSのみを含める制限があるためです。SQLにより、エラー・フラグが付けられます。
例1: 埋込みSQLでのデータベースおよび別名の指定この文は、ファイル仕様担当者によって定義されたデータベースを宣言します。プリコンパイラは、プログラムのコンパイル時にこの定義を使用し、SQLではプログラムの実行時にファイル担当者を使用します。この名前には、論理名もファイルpersonnel.rdbの名前部分も使用できます。
EXEC SQL DECLARE PERS_ALIAS ALIAS FOR FILENAME personnel END-EXEC
例2: アクセス制限付きデータベースの指定
この文は例1と同じですが、データベースのアクセス制限を指定します。
EXEC SQL DECLARE PERS_ALIAS ALIAS FOR FILENAME personnel RESTRICTED ACCESS END-EXEC
例3: DECLARE ALIAS文の指定
アプリケーション・プログラムのこの部分で、データベースMIA1およびMIA_CHAR_SETを宣言します。プリコンパイラは、プログラムのコンパイル時にMIA1データベースを使用し、SQLではプログラムの実行時にMIA_CHAR_SETデータベースを使用します。
EXEC SQL DECLARE ALIAS COMPILETIME FILENAME MIA1 RUNTIME FILENAME MIA_CHAR_SET DEFAULT CHARACTER SET DEC_KANJI NATIONAL CHARACTER SET KANJI;
例4: DEFAULTユーザー認証の指定
次の例は、SQLモジュールでユーザー名およびパスワードにDEFAULT句を使用する方法を示しています。
MODULE TEST_DECLARE DIALECT SQL99 LANGUAGE C PARAMETER COLONS ALIAS RDB$DBHANDLE ------------------------------------------------------- -----------------------declarations-------------------- DECLARE ALIAS COMPILETIME FILENAME mf_personnel USER DEFAULT USING DEFAULT RUNTIME :run_time_spec . . .
コマンドライン修飾子を使用して、コンパイル時のユーザー名およびパスワードをプログラムに渡します。たとえば、プログラムをコンパイルするには、次のコマンドラインを使用します。
$ SQLMOD TESTDEC /USER=heleng /PASS= helenspasswd
実行時に、ホスト言語プログラムは、ファイル仕様のみまたは実行時のファイル仕様とユーザー名およびパスワードを指定するように、実行時ユーザーに要求できます。ホスト言語プログラムは、実行時の文字列を作成できます。
たとえば、ホスト言語プログラムがファイル仕様のみを使用する場合、プログラムに渡される変数の値は、次のようになります。
FILENAME "mf_personnel"
ホスト言語プログラムがファイル仕様、ユーザー名およびパスワードを使用する場合、プログラムに渡される変数の値は、次のようになります。
FILENAME "mf_personnel 'USER heleng' USING 'mypassword' "
文字列は引用符で囲む必要があります。一重引用符(')と二重引用符(")のどちらを使用するかは、プログラミング言語によって異なります。
次のDECLARE ALIAS文を使用する場合、ホスト言語プログラムは実行時ユーザーにのみファイル名を指定するよう要求できます。
DECLARE ALIAS COMPILETIME FILENAME mf_personnel USER DEFAULT USING DEFAULT RUNTIME FILENAME :foo
カーソルを宣言します。カーソルを使用すると、結果表を定義する条件は、DECLARE CURSOR文の選択式によって指定されます。SQLでOPEN文が実行されると、結果表が作成されます。カーソルの結果表が存在するのは、CLOSE文、COMMIT文またはROLLBACK文の実行、プログラムの停止または対話型SQLの終了までです。ただし、保持可能カーソルを定義すると、トランザクション全体で存在できます。保持可能カーソルは、新規のSQLトランザクションが開始されるとオープンしたままその位置を保持できます。
プログラムでは一度に1つずつの行または要素の操作を実行する必要があるため、ホスト言語プログラムにはカーソルが必要です。したがって、文を複数回実行して結果表またはリストの全体を処理する場合があります。
カーソルのスコープは、カーソルが有効なモジュールまたはプログラムの一部を記述します。カーソルのエクステントは、有効である期間を指示します。SQLのすべてのカーソルには、モジュール全体のスコープがあります。
使用するDECLARE CURSOR文に応じて、次のように3つのクラスのカーソルを作成できます。
- DECLARE CURSOR文はすぐに実行されます。この文で作成するカーソルは、静的カーソルと呼ばれることがあり、そのモジュールのスコープおよびエクステント内にのみ存在します。カーソル名とSELECT文は、ともにコンパイル時にはアプリケーションに認識されています。
- 動的DECLARE CURSOR文はすぐに実行されます。カーソル名はコンパイル時に認識され、SELECT文は実行時に確認されます。実行時に生成されるSELECT文の名前を指定する必要があります。動的カーソルはそのモジュールのスコープ内に存在しますが、そのエクステントはプログラムまたはイメージのすべてを実行します。動的DECLARE CURSOR文の詳細は、「DECLARE CURSOR文、動的」を参照してください。
- 拡張動的DECLARE CURSOR文は、SQLモジュールのプロシージャの一部としてプリコンパイルまたは使用する必要があります。カーソル名、および実行時に生成される準備されたSELECT文の識別子のパラメータを指定する必要があります。拡張動的カーソルは、モジュール全体のスコープおよびエクステント内に存在します。拡張動的DECLARE CURSOR文の詳細は、「DECLARE CURSOR文、拡張動的」を参照してください。
- 表カーソル: SQLで結果表の各行にアクセスするために使用する方法。(結果表とは、1つ以上の表またはビューの列および行の一時的なコレクションのことです。)
- リスト・カーソル: SQLでリスト内の各要素にアクセスするために使用する方法。
リストは、データ型LIST OF BYTE VARYINGの要素またはセグメントの順序付き集合です。LIST OF BYTE VARYINGデータ型の詳細は、第2.3.7項を参照してください。
リスト・カーソルによって、ユーザーはそのようなサイズのオブジェクトがサポートされない言語内から非常に大規模なデータ構造体をスキャンできます。表の行内に要素セットとしてリストが存在するため、リスト・カーソルは表カーソルを参照する必要があります。これは、表カーソルが行のコンテキストを提供するためです。
実行できる操作モードに応じて、カーソルはさらに分類されます。表カーソルには次の4つのモードがあります。
- 更新カーソルが表カーソルのデフォルトです。最初に行が読み取られ、SHARED READまたはPROTECTED READのためにロックされます。その後、UPDATEが実行されると、行はEXCLUSIVEアクセスのためにロックされます。表がEXCLUSIVEアクセス用に予約されている場合、以降の更新ロックは不要です。
- 読取り専用カーソルを使用すると、データベースを更新しないときにいつでも結果表から行情報にアクセスできます。たとえば、読取り専用カーソルを使用して、表示用に行および列の情報をフェッチできます。
- 挿入専用カーソルは、それ自体を直前に挿入された行に配置します。これにより、行にリストをロードできるようになります。
- 更新専用カーソルは、結果表の多数の行を変更する場合に使用します。UPDATE ONLYオプションが使用されると、SQLではよりアグレッシブなロック・モードが使用され、最初の読取り時にEXCLUSIVEアクセス用に行がロックされます。このモードでは、SHARED READまたはPROTECTED READからEXCLUSIVEアクセスへのロックの拡大を回避します。したがって、ロック拡大時に通常発生するデッドロックを回避できます。
- 読取り専用カーソルがリスト・カーソルのデフォルトです。既存のリストを読み取れるようにします。読取り専用のリスト・カーソル句にSCROLLキーワードを追加することによって、必要に応じてOracle Rdbでリスト・セグメント全体を前後にスクロールできるようになります。
- 挿入専用カーソルによってリストにデータを挿入できます。
表6-7に、SQLで提供されるクラス、タイプおよびカーソル・モードを示します。
表6-7 クラス、タイプおよびカーソル・モード DECLARE CURSOR 動的DECLARE CURSOR 拡張動的DECLARE CURSOR 表 リスト 表 リスト 表 リスト 挿入専用 挿入専用 挿入専用 挿入専用 挿入専用 挿入専用 読取り専用 読取り専用 読取り専用 読取り専用 読取り専用 読取り専用 更新専用 更新専用 更新専用
たとえば、挿入専用表カーソルを宣言して表にデータを挿入する必要があります。表にリストが含まれている場合は、表カーソルを使用して正しい行に配置し、挿入専用リスト・カーソルを宣言してその行にリストをロードします。カーソルを使用したデータベースへのデータのロードの詳細は、「INSERT文」を参照してください。
DECLARE CURSOR文によって形成された結果表の行を処理するには、OPEN文を使用して最初の行の前にカーソルを配置する必要があります。後続のFETCH文で、端末での表示用またはプログラムでの処理用に各行の値を取得します。(カーソルは再オープンする前にクローズする必要があります。)リストの要素も、OPEN文を使用してリストの最初の要素の前にカーソルを配置し、FETCH文を繰り返して後続の要素を取得することによって同様に処理できます。
DECLARE CURSOR文は次の環境で使用できます。
- 対話型SQL内
- プリコンパイル対象のホスト言語プログラムに埋め込まれる場合
- SQLモジュールのDECLAREセクションの一部として
- コンテキスト・ファイル内
cursor-name
宣言するカーソルの名前を指定します。モジュールのすべてのカーソル名の間で一意の名前を指定します。有効なSQL名を使用します。ユーザー指定の名前の詳細は、第2.2節を参照してください。拡張動的DECLARE CURSOR文で、実行時にパラメータを使用してカーソル名を指定できます。拡張動的DECLARE CURSOR文の詳細は、「DECLARE CURSOR文、拡張動的」を参照してください。
FOR select-expr
SQLがカーソルにどの表のどの列および行を含めるかを定義する選択式です。選択式の詳細は、第2.8.1項を参照してください。FOR UPDATE OF column-name
ユーザーまたはユーザーのプログラムが後でUPDATE文を使用して変更するカーソルの列を指定します。FOR UPDATE句の列名は、FROM句に指定された表またはビューに属している必要があります。次の場合は、後でUPDATE文を使用して行を変更するためにDECLARE CURSOR文のFOR UPDATE句を指定する必要はありません。
- FOR UPDATE句を指定して、後でFOR UPDATE句にない列をUPDATE文で指定した場合、警告メッセージが発行され、更新変更が続行されます。
- FOR UPDATE句を指定しない場合は、UPDATE文を使用して任意の列を更新できます。この場合、メッセージは表示されません。
SELECT文のFOR UPDATE OF句は、選択された行をすべてロックしてUPDATE ONLY CURSORセマンティクスを提供します。
INSERT ONLY
新規リストまたは新規行を作成またはオープンするように指定します。リスト・カーソルを指定してINSERT ONLY句を指定しなかった場合、SQLではデフォルトで読取り専用リスト・カーソルを指定します。
表カーソルを指定してINSERT ONLY句を指定しなかった場合、SQLではデフォルトで更新カーソルを指定します。
挿入専用カーソルを指定した場合、選択リスト内のすべての値式は読取り/書込みである必要があります。挿入リストに対して挿入専用表カーソルを宣言した場合、FROM句に表列名とリスト列名の両方を指定する必要があります。
挿入専用カーソルの使用方法の詳細は、「INSERT文」を参照してください。
LIST CURSOR
データ型LIST OF BYTE VARYINGの列の操作に使用するカーソルを指定します。OPTIMIZE AS query-name
名前を問合せに割り当てます。SET FLAGS 'STRATEGY'文を定義して、問合せ結果の作成に使用されるアクセス・メソッドを確認する必要があります。OPTIMIZE FOR
OPTIMIZE FOR句は、選択式を指定する文の優先オプティマイザ計画を指定します。次のオプションを使用できます。
- FAST FIRST
FAST FIRST用に最適化された問合せが、これにより全体のスループットが低下しても、できるかぎり速やかにデータをユーザーに返します。
問合せが早期に取り消されることがある場合は、FAST FIRSTの最適化を指定する必要があります。FAST FIRST最適化の有力な候補は、レコードのグループをユーザーに表示する対話型アプリケーションです。このようなアプリケーションでは、ユーザーは最初の数画面の確認後、問合せを中断することもできます。たとえば、シングルトンSELECT文では、FAST FIRST最適化がデフォルトで設定されます。
最適化計画を明示的に設定しない場合は、FAST FIRSTがデフォルトとなります。- TOTAL TIME
アプリケーションをバッチで実行し、問合せのすべてのレコードにアクセスして更新またはレポートの書込みを行う場合は、TOTAL TIME最適化を指定する必要があります。TOTAL TIME最適化は、ほとんどの問合せに効果があります。
次の例は、優先される最適化モードを設定するためのDECLARE CURSOR構文を示しています。
SQL> DECLARE TEMP1 TABLE CURSOR cont> FOR cont> SELECT * cont> FROM EMPLOYEES cont> WHERE EMPLOYEE_ID > '00400' cont> OPTIMIZE FOR FAST FIRST; SQL> -- SQL> DECLARE TEMP2 TABLE CURSOR cont> FOR cont> SELECT LAST_NAME, FIRST_NAME cont> FROM EMPLOYEES cont> ORDER BY LAST_NAME cont> OPTIMIZE FOR TOTAL TIME;
- SEQUENTIAL ACCESS
順次アクセスの使用を強制します。このオプションは、厳密なパーティション化機能を使用する表では特に有用です。
OPTIMIZE USING outline-name
選択式で使用する問合せアウトラインを明示的に指定します。これには、選択式とアウトラインでアウトラインIDが異なる場合も含まれます。アウトラインの作成方法の詳細は、「CREATE OUTLINE文」を参照してください。
OPTIMIZE WITH
以前のOracle Rdbバージョンで使用されていたDEFAULT、行数が少ない方が選択されると仮定するAGGRESSIVE、問合せにリテラルを使用して索引で予備評価を行うSAMPLEDの3つの最適化制御のいずれかを選択します。PRESERVE ON COMMIT
PRESERVE ON ROLLBACK
PRESERVE ALL
PRESERVE NONE
カーソルがオープン状態を保持するタイミングを指定します。
- PRESERVE ON COMMIT
コミット時に、WITH HOLD PRESERVE ON COMMIT構文で定義したものを除き、すべてのカーソルがクローズします。ロールバック時に、WITH HOLD PRESERVE ON COMMIT構文で定義したものを含めて、すべてのカーソルがクローズします。これは保存オプションなしでWITH HOLD句を指定することと同じです。- PRESERVE ON ROLLBACK
ロールバック時に、WITH HOLD PRESERVE ON ROLLBACK構文で定義したものを除き、すべてのカーソルがクローズします。コミット時に、WITH HOLD PRESERVE ON ROLLBACK構文で定義したものを含めて、すべてのカーソルがクローズします。- PRESERVE ALL
コミットまたはロールバックの後、すべてのカーソルがオープンしたままです。カーソルはCLOSE文の使用により、またはセッションの終了時に、クローズします。- PRESERVE NONE
すべてのカーソルがクローズするのは、CLOSE文、COMMIT文またはROLLBACK文の後の、プログラム停止時、または対話型SQL終了時です。
これはWITH HOLD句を指定しないことと同じです。
READ ONLY
データベースの更新にカーソルが使用されないことを指定します。SCROLL
Oracle Rdbでリストの項目をいずれかの方向(上下)またはランダムに読み取ることができることを指定します。次のようなフェッチ・オプションを使用する場合は、SCROLLキーワードを使用する必要があります。
- NEXT
- PRIOR
- FIRST
- LAST
- RELATIVE
- ABSOLUTE
SCROLLを指定しない場合、FETCHのデフォルトはNEXTです。SCROLLはLISTカーソルでのみサポートされます。
TABLE CURSOR
宣言するカーソルがリスト・カーソルではなく表カーソルであることを指定します。カーソル・タイプを指定しなかった場合、SQLではデフォルトで表カーソルを宣言します。UPDATE ONLY
データベースの更新にカーソルが使用されることを指定します。フェッチしている行の大部分を更新する場合は更新専用カーソルを使用します。更新専用カーソルによって、Oracle Rdbでは初期の読取り操作中のロックより制約の強いロックが適用されます。このため、READから排他的なWRITEにロックをアップグレードする必要はありません。これによって問合せ当たりのロック・リクエストの総数が削減され、デッドロックの回避に有用な場合があります。
更新専用表カーソルを使用して、表の行を変更します。SQLでは、更新専用リスト・カーソルは使用できません。
WHERE CURRENT OF table-cursor-name
リスト・カーソルに行コンテキストを提供する表カーソルを指定します。指定された表カーソルはDECLARE CURSOR文を使用して定義されている必要があります。WITH HOLD
カーソルがオープンしたままでトランザクションの終了後にその位置を保持することを指示します。これは保持可能カーソルと呼ばれます。
- INSERT文、OPEN文、CLOSE文、FETCH文、UPDATE文およびDELETE文のカーソルを参照します。ホスト言語ソース・ファイルでのこれらの文の順序は重要ではありません。カーソル用のCLOSE文は、プログラム制御が実行時に最初にOPEN文を処理するように分岐するかぎり、その対応するOPEN文に優先します。ただし、カーソルをクローズして再度オープンする必要があります。
- SQL CLOSE文を使用してカーソルを個別にクローズしたり、sql_close_cursors()ルーチンを使用してオープンしているすべてのカーソルをクローズできます。sql_close_cursors()ルーチンは引数を取りません。このルーチンの例は、『Oracle Rdb7 Guide to Distributed Transactions』を参照してください。
- SQLでは、一度にオープンできるカーソルの数に制限がありません。複数のカーソルを同時に宣言およびオープンできます。ただし、同じプログラム内で静的、動的および拡張動的なカーソルを使用する場合は、同じスコープまたはエクステントを共有する異なるなカーソルに同じ名前を付けないようにしてください。
- UPDATE文またはDELETE文では、リスト・カーソルを参照できません。
- 次の機能を持つものは読取り専用カーソルとみなされます。
- DISTINCT引数を使用して結果表から重複行を削除する機能
- FROM句で複数の表またはビューに名前を付ける機能
- 選択リストに集計関数を含める機能
- 主問合せにUNION演算子、EXCEPT演算子またはINTERSECT演算子を含める機能
- 主問合せにGROUP BY句またはHAVING句を含める機能
カーソルがREAD ONLYとして宣言された場合、位置UPDATE文やDELETE文またはINSERT INTO cursor-name文では参照できません。
INSERT ONLY、READ ONLYまたはUPDATE ONLYのいずれも指定されていない場合、カーソルはDELETE文、INSERT文またはUPDATE文に使用できる一般カーソルとみなされます。ただし、前述の項目が発生した場合、SQLでは暗黙的にカーソルがREAD ONLYカーソルであるとみなされます。- 表カーソルは順方向でしか処理できません。処理済の行に表カーソルを戻す場合は、表カーソルをクローズして再度オープンする必要があります。
- 結果表の順序は、DECLARE CURSOR文にORDER BY句を指定した場合を除き予測不能です。(ORDER BY句は、リスト・カーソル宣言では無効です。)
- SQLでカーソルのOPEN文を実行した場合、(SELECT文で指定された)カーソルの結果表が評価されます。
- SQLは、カーソルのOPEN文の実行時にDECLARE CURSOR文の選択式のパラメータを評価します。パラメータの再評価は、カーソルをクローズして再度オープンするまで実行されません。
- DECLARE CURSOR文にパラメータが指定されている場合、OPEN文を含むプロシージャで宣言することによってパラメータを渡します。また、OPEN文を含むプロシージャに対するホスト言語コールのパラメータを指定する必要があります。DECLARE CURSOR文は、プロシージャではなくモジュールの宣言部に出現するため、パラメータを直接DECLARE CURSOR文に渡すことはできません。
パラメータを指定したカーソルの宣言、およびSQLモジュールへのパラメータ渡しの例は、第3章を参照してください。- 次の文では挿入専用カーソルを参照できません。
- CURRENT OF句を指定するDELETE文およびUPDATE文
- FETCH文
- 主問合せに次の句を1つ以上含むDECLARE CURSOR文では、INSERT ONLY句を使用できません。
- DISTINCT
- WHERE
- ORDER BY
- GROUP BY
- UNION、EXCEPT (MINUS)、INTERSECT
- 表カーソルへの新規行やリスト・カーソルへの新規要素の追加に使用するINSERT文でのカーソル名には、挿入専用カーソルしか使用できません。
- 挿入専用カーソルを定義した場合、表カーソルの選択リストにLIST列を組み込む必要があります。例3を参照してください。
- 文およびカーソル名の指定にパラメータを使用するDECLARE CURSOR文は、拡張動的DECLARE CURSOR文です。拡張動的DECLARE CURSOR文によって、実行時にプログラムにカーソルおよび文の名前を指定できます。拡張動的DECLARE CURSOR文の詳細は、「DECLARE CURSOR文、拡張動的」を参照してください。
拡張動的DECLARE CURSOR文は実行可能文であり、ステータス値を返します。モジュール言語では、プロシージャにそのような文を組み込む必要があります。- リスト・データへのアクセス時は、表カーソルの次の行をフェッチする前にリスト・カーソルをクローズするように注意する必要があります。リスト・カーソルから(全部ではなく)一部の行をフェッチし、リスト・カーソルをクローズせずに表カーソルの次の行に移動した場合は、引き続き前のリスト・カーソルから行をフェッチします。SQLでは、2つのリスト・カーソルをオープンしたことを通知する警告またはエラー・メッセージは発行しません。