18.3.2 SQLの記述規則
- 〈この項の構成〉
(1) SQL文の記述形式
SQL文は,一つのSQL文ごとに,SQL先頭子(#sql)とSQL終了子(;)で囲みます。SQL文自体は,更に{}で囲みます。接続クラスやカーソルの宣言についても,SQL先頭子とSQL終了子で囲みます。
SQL文の記述形式を次の表に示します。
機能 |
形式 |
用途 |
---|---|---|
SQLの実行 |
#sql [コンテキスト] { SQL文 } ; |
SQL文を実行します。スタンダードインタフェース版とネイティブインタフェース版とでは,使用できるSQLが違います。詳細については,「SQLJで使用できるSQL文」を参照してください。 |
列名指定反復子クラスの宣言 |
|
カーソルの宣言で使用するクラスを宣言します。FETCH文には使用できません。 |
位置指定反復子クラスの宣言 |
(データ型,…) ; |
カーソルの宣言で使用するクラスを宣言します。FETCH文で使用します。 |
接続クラスの宣言 |
#sql 修飾子 context クラス名 ; |
接続で使用するクラスを宣言します。 |
カーソルの宣言 |
#sql 反復子オブジェクト = { SELECT文 } ; |
カーソルの定義とオープンをします。 |
結果セットの変換 |
|
JDBCの結果セットをSQLJ用に変換します。 |
- 注
-
- 修飾子:
-
private,public,protected,final,abstract,protected,static,native,synchronized,transient,及びvolatileの組み合わせ
- コンテキスト:
-
{接続コンテキスト|接続コンテキスト,実行コンテキスト|実行コンテキスト}
- キーワード:
-
holdability,又はupdateColumns
- 値:
-
true,false,又は"列名1,列名2,…"
- データ型:
-
Javaのデータ型
- 列名:
-
検索項目
(2) 複数接続機能を使用する場合の接続コンテキストの明示指定
複数接続機能を使用する場合,SQL先頭子とSQL文との間に,接続コンテキストを[ ]で囲んで記述して,使用する接続を明示します。例を次に示します。
#sql [connCtx] { DELETE FROM EMP WHERE SAL > 1000};
接続コンテキストを明示指定しない場合,デフォルトの接続コンテキストが仮定されます。
(3) 実行環境の明示指定
SQLJでは,デフォルトの実行環境のほかに,ユーザが明示的に指定することもできます。実行環境を指定する場合は,SQL先頭子とSQL文との間に,実行接続コンテキストを[ ]で囲んで記述します。
一つの接続に対して,複数のスレッドで同時にSQLを実行している場合,複数の実行環境を使い分けることで,実行結果がほかのSQLに上書きされることを防げます。例を次に示します。
ExecutionContext execCtx = new ExecutionContext(); try { #sql [execCtx] { DELETE FROM ZAIKO WHERE SCODE > 1000 }; System.out.println ("removed " + execCtx.getUpdateCount() + "goods"); } catch(SQLException e){ System.out.println("SQLException has occurred with "+ " exception " + e); }
実行接続コンテキストを明示指定しない場合,デフォルトの実行環境が使用されます。
実行環境では,次の値を保持します。値は,set<名称>メソッドで設定し,get<名称>で求めます。
名 称 |
内 容 |
---|---|
MaxRows |
検索で返す最大の行数です。 |
MaxFieldSize |
列やOUTPUT変数の値で返される,データの最大バイト数です。 |
QueryTimeout |
SQLの実行完了までの待ち時間最大値です。HiRDBでは無効となります。 |
UpdateCount |
更新,挿入,又は削除した行数です(参照だけです)。 |
SQLWarnings |
SQLWARN0〜SQLWARNFに相当します(参照だけです)。 |
なお,複数接続の指定と併用する場合は,接続コンテキストと実行接続コンテキストの順に,コンマで区切って指定します。例を次に示します。
#sql [connCtX, execCtx] { DELETE FROM ZAIKO WHERE SCODE > 1000 };
(4) 埋込み変数の指定方法
SQLJでは,埋込み変数を宣言するためのBEGIN DECLARE SECTIONは使用しません。
任意の変数,パラメタ,及びオブジェクトのフィールドを,埋込み変数として使用できます。SQL文中では,先頭にコロンを付けて":変数名"と記述します。コロンと変数名の間には空白があってもかまいません。
CALL文のIN,OUT,又はINOUTパラメタは,":{IN|OUT|INOUT}変数名"と記述します。
また,SQLJでは,埋込み変数として":(式)"を使用できます。式は必ず( )で囲む必要があります。なお,これはJavaの式であり,SQLの式ではありません。例を次に示します。
#sql { SELECT COL1, COL2 FROM TABLE1 WHERE :(x[--i]) > COL3 };
(5) 標識変数の指定方法
SQLJでは標識変数がないため,埋込み変数にナル値を設定する場合は,基本データ型ではなく,sql.langパッケージで定義されているWrapper型を使用します。ナル値を基本データ型のJava変数で受け取った場合,SQLNullException例外が発生します。
(6) 例外処理
SQLJでは,埋込み型SQLのWHENEVERでの例外処理ができません。このため,WHENEVERの代わりに,Javaの例外処理(try…catch)を使用します。例を次に示します。
try{ #sql { DELETE FROM ZAIKO WHERE SCODE > 1000 }; } catch(SQLException e){ System.out.println("SQLCODE:" + e.getErrorCode() + "\nERRMSG:" + e.getMessage() ); }
SQL実行時にエラーが発生した場合,JDBCの例外オブジェクト(java.sql.SQLException)が発行されます。
SQLCODE,SQLSTATE,及びエラーメッセージは例外オブジェクトに格納され,値はgetErrorCodeメソッド,getSQLStateメソッド,及びgetMessageメソッドで取得できます。
(7) 静的SQLと動的SQL
SQLJでは静的SQLだけ記述できます。動的SQLは記述できません。
動的SQLを使用したい場合は,JDBCのAPIを使用してください。
(8) 動的カーソルの結果セットの読み出し
JDBCのAPIを使用して作成した,動的カーソルの結果セットをCAST文で変換し,SQLJのカーソルの結果セットとして読み出しができます。例を次に示します。
#sql iterator Employees(String ename, double sal); Statement stmt=conn.createStatement(); String Query="SELECT sname, scode FROM zaiko WHERE scode > 1000"; ResultSet rs=stmt.executeQuery(query); Employees emps; #sql emps ={CAST :rs };
ネイティブインタフェース版では,CAST文は使用できません。使用した場合,トランスレート時にエラーとなります。
(9) HiRDBサーバとの接続,切り離し
スタンダードインタフェース版の場合,CONNECT文及びDISCONNECT文は使用できません。ネイティブインタフェース版の場合は使用できます。なお,スタンダードインタフェース版,及びネイティブインタフェース版共に,Javaの命令を使用すると,HiRDBサーバとの接続,切り離しができます。
(10) 例外の発生条件
HiRDBの埋込み型SQLでは,次の場合に警告が発生しますが,SQLJでは例外が発生します。
-
1行SELECT文で,検索項目とINTO句に指定した変数の個数が一致していない場合
-
1行SELECT文で,検索結果が0行の場合
-
1行SELECT文で,検索結果が複数行の場合
-
FETCH文で,検索項目数とINTO句に指定した変数の個数が一致していない場合
-
位置指定反復子で定義されている列数と,検索項目数が一致していない場合
-
列名指定反復子で定義されている列数より,検索項目数が少ない場合
(11) 注釈及びSQL最適化指定の扱い
SQL先頭子からSQL終了子までの間に記述した注釈(/*〜*/)は削除します。ただし,カーソルの宣言とSQL文の実行の場合,{ }内に記述したSQL最適化指定(/*>>〜<<*/)は削除しないで,SQL文として扱います。これ以外のSQL最適化指定(/*>>〜<<*/)については,注釈とみなされます。SQL文中での注釈及びSQL最適化指定については,マニュアル「HiRDB SQLリファレンス」を参照してください。