スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
UAPを作成するとき,プログラム中にSQLを記述する方法を静的SQLといいます。これに対し,UAPを作成するとき,プログラム中にSQLを記述しないで,UAP実行時にSQLの文字列を組み立てる方法を動的SQLといいます。
静的SQLと動的SQLとでは,実行時の特徴が異なりますので,UAPを作成する前に十分検討する必要があります。
静的SQLと動的SQLの実行時の特徴を次の表に示します。
種 類 | 長 所 | 短 所 |
---|---|---|
静的SQL | 同一のUAPを繰り返し実行する場合,一度実行したSQL文は実行形式に変換され,共用メモリ上で再利用できるため,処理効率が良い。 | UAP中にSQLを埋め込むので,探索条件の変更が限定される。 |
動的SQL | 実行時にSQLの文字列を組み立てるため,探索条件を変更するときの自由度が大きい。 | 実行するたびにSQLを解析して実行形式に変換するため,処理効率が悪い。※ |
静的SQLの実行では,実行時に挿入値,更新値,及び探索条件の値を変更できます。また,動的SQLの実行では,静的SQLの実行時に変更できる値以外に,表名,列名,条件式などSQLの任意の部位を変更できます。
静的SQLの場合と動的SQLの場合とで,各々実行時に変更できる値の例を次の図に示します。なお,枠で囲んである部分が値を変更できる箇所です。
動的SQLは,静的SQLと比較して探索条件を変更するときの自由度は大きいが,条件を変更するたびにSQLを実行しなければならないため,あらかじめ実行時の性能(処理効率)を考慮する必要があります。
動的SQLでは,UAP実行時にPREPARE文で前処理してから実行します。実行は,前処理するSQLが動的SELECT文か動的SELECT文以外かで異なります。前処理するSQLが動的SELECT文の場合,OPEN文,FETCH文,及びCLOSE文で実行し,前処理するSQLが動的SELECT文以外の場合,EXECUTE文で実行します。また,EXECUTE IMMEDIATE文を使用すれば,前処理と実行を一度にできます。値を変えて同じSQLを動的に実行する場合,前処理を何度も実行するより,?パラメタを使用して,前処理を一度だけして,実行時に?パラメタに与える値を変えて実行する方が性能(処理効率)が向上します。?パラメタの詳細については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。
動的SQLの実行形態を図3-3に示します。また,PREPARE文で前処理できるSQLとEXECUTE IMMEDIATE文で前処理と実行が一度にできるSQLを表3-5に示します。
図3-3 動的SQLの実行形態
表3-5 PREPARE文で前処理できるSQLとEXECUTE IMMEDIATE文で前処理と実行が一度に実行できるSQL
分類 | SQL文 | PREPARE | EXECUTE IMMEDIATE |
---|---|---|---|
操作系 SQL | ASSIGN LIST文 | ○※3 | ○ |
CALL | ○※3 | ○ | |
DELETE※1 | ○※3 | ○ | |
準備可能動的DELETE文:位置付け | ○ | ○ | |
DROP LIST文 | ○※3 | ○ | |
INSERT | ○※3 | ○ | |
PURGE TABLE | ○※3 | ○ | |
1行SELECT※2 | ○※3 | ○ | |
動的SELECT | ○※4 | × | |
UPDATE※1 | ○※3 | ○ | |
準備可能動的UPDATE文:位置付け | ○ | ○ | |
代入文 | ○※3 | × | |
制御系 SQL | CALL COMMAND | ○ | ○ |
COMMIT | × | × | |
CONNECT | × | × | |
DISCONNECT | × | × | |
LOCK TABLE | ○※3 | ○ | |
RDノード指定 CONNECT文※6 | × | × | |
RDノード指定 DISCONNECT文※6 | × | × | |
ROLLBACK | × | × | |
SET CONNECTION文※6 | × | × | |
SET SESSION AUTHORIZATION文 | × | × | |
定義系 SQL | ALTER INDEX | ○※3 | ○ |
ALTER PROCEDURE | ○※3 | ○ | |
ALTER ROUTINE | ○※3 | ○ | |
ALTER TABLE | ○※3 | ○ | |
ALTER TRIGGER | ○※3 | ○ | |
COMMENT | ○※3 | ○ | |
CREATE ALIAS※6 | ○※3 | ○ | |
CREATE AUDIT | ○※3 | ○ | |
CREATE CONNECTION SECURITY | ○※3 | ○ | |
CREATE FOREIGN INDEX※5 | ○ | ○ | |
CREATE FOREIGN TABLE※5 | ○ | ○ | |
CREATE FUNCTION | ○※3 | ○ | |
CREATE INDEX | ○※3 | ○ | |
CREATE PROCEDURE | ○※3 | ○ | |
CREATE SCHEMA | ○※3 | ○ | |
CREATE SEQUENCE | ○※3 | ○ | |
CREATE SERVER※5 | ○ | ○ | |
CREATE TABLE | ○※3 | ○ | |
CREATE TRIGGER | ○※3 | ○ | |
CREATE TYPE | ○※3 | ○ | |
CREATE USER MAPPING※5 | ○ | ○ | |
CREATE VIEW | ○※3 | ○ | |
DROP ALIAS※6 | ○※3 | ○ | |
DROP AUDIT | ○ | ○ | |
DROP CONNECTION SECURITY | ○※3 | ○ | |
DROP DATA TYPE | ○※3 | ○ | |
DROP FOREIGN INDEX※5 | ○ | ○ | |
DROP FOREIGN TABLE※5 | ○ | ○ | |
DROP FUNCTION | ○※3 | ○ | |
DROP INDEX | ○※3 | ○ | |
DROP PROCEDURE | ○※3 | ○ | |
DROP SCHEMA | ○※3 | ○ | |
DROP SEQUENCE | ○※3 | ○ | |
DROP SERVER※5 | ○ | ○ | |
DROP TABLE | ○※3 | ○ | |
DROP TRIGGER | ○※3 | ○ | |
DROP USER MAPPING※5 | ○ | ○ | |
DROP VIEW | ○※3 | ○ | |
GRANT | ○※3 | ○ | |
REVOKE | ○※3 | ○ |
動的に指定された表にデータを挿入する場合の例を次の図に示します。
図3-4 動的に指定された表にデータを挿入する例
EXECUTE IMMEDIATE文は,PREPARE文とEXECUTE文を連続して実行するのと同じです。ただし,同じSQLを何度も繰り返して実行する場合,EXECUTE IMMEDIATE文でその都度前処理するより,PREPARE文で前処理してからEXECUTE文で繰り返して実行する方が性能(処理効率)が良くなります。
前処理するSQLが動的SELECT文か動的SELECT文以外かで異なります。前処理するSQLが動的SELECT文の場合,OPEN文,FETCH文,及びCLOSE文で実行し,前処理するSQLが動的SELECT文以外の場合,EXECUTE文で実行します。前処理するSQLが動的SELECT文の場合の動的実行例を,次の図に示します。
図3-5 前処理するSQLが動的SELECT文の場合の動的実行例
動的SELECT文を前処理し,その動的SELECT文に対するカーソルを使用したSQLを,動的に実行する場合,カーソル宣言で宣言したカーソルは使用しません。この場合,前処理した動的SQL文に対してALLOCATE CURSOR文で割り当てたカーソルを使用します。動的SELECT文に対して,カーソルを使用したSQLを動的に実行する場合の例を次に示します。
PREPARE GLOBAL :SEL FROM :XCMND; .................. 埋込み変数(:XCMND)に設定された 動的SELECT文に,拡張文名 (:SEL='SEL1')を付けます。 ALLOCATE GLOBAL :CR CURSOR FOR GLOBAL :SEL; ....... 拡張文名(:SEL='SEL1')が識別する 問合せに対して,カーソル (:CR='CR1')を割り当てます。 PREPARE UPD1 FROM 'UPDATE SET C1=? WHERE CURRENT OF GLOBAL CR1'; .. カーソル(CR1)を使用したUPDATE文 を前処理し,SQL文識別子(UPD1)を 付けます。 OPEN GLOBAL :CR; .................................. カーソル(:CR='CR1')を開きます。 FETCH GLOBAL :CR INTO :XKEKKA; .................... カーソル(:CR='CR1')を使用した 検索結果を埋込み変数(:XKEKKA)に 読み込みます。 EXECUTE UPD1 USING :XDATA; ........................ 前処理したSQL文識別子(UPD1)の UPDATE文を実行します。このとき, ?パラメタに対応する埋込み変数 (:XDATA)を指定します。 CLOSE GLOBAL :CR; ................................. カーソル(:CR='CR1')を閉じます。 |
UAPで動的にSQLを実行した場合,実行時に決定した情報(データ受け渡し領域の個数,属性,番地など)をHiRDBに通知するための領域としてSQL記述領域が使用されます。また,SQL記述領域は,動的に実行するためにPREPARE文で前処理するSQLの検索項目の情報を,次のどちらかの方法で受け取れます。
DESCRIBE文については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。また,SQL記述領域の使用例については,「付録B SQL記述領域」を参照してください。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.