スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド
SQL文は,一つのSQL文ごとに,SQL先頭子(#sql)とSQL終了子(;)で囲みます。SQL文自体は,更に{}で囲みます。接続クラスやカーソルの宣言についても,SQL先頭子とSQL終了子で囲みます。
SQL文の記述形式を次の表に示します。
表19-2 SQL文の記述形式
機能 | 形式 | 用途 |
---|---|---|
SQLの実行 | #sql [コンテキスト] { SQL文 } ; |
SQL文を実行します。スタンダードインタフェース版とネイティブインタフェース版とでは,使用できるSQLが違います。詳細については,「19.3.3 SQLJで使用できるSQL文」を参照してください。 |
列名指定反復子クラスの宣言 |
|
カーソルの宣言で使用するクラスを宣言します。FETCH文には使用できません。 |
位置指定反復子クラスの宣言 |
(データ型,…) ; |
カーソルの宣言で使用するクラスを宣言します。FETCH文で使用します。 |
接続クラスの宣言 | #sql 修飾子 context クラス名 ; |
接続で使用するクラスを宣言します。 |
カーソルの宣言 | #sql 反復子オブジェクト = { SELECT文 } ; |
カーソルの定義とオープンをします。 |
結果セットの変換 |
|
JDBCの結果セットをSQLJ用に変換します。 |
複数接続機能を使用する場合,SQL先頭子とSQL文との間に,接続コンテキストを[ ]で囲んで記述して,使用する接続を明示します。例を次に示します。
#sql [connCtx] { DELETE FROM EMP WHERE SAL > 1000}; |
接続コンテキストを明示指定しない場合,デフォルトの接続コンテキストが仮定されます。
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 }; |
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 }; |
SQLJでは標識変数がないため,埋込み変数にナル値を設定する場合は,基本データ型ではなく,sql.langパッケージで定義されているWrapper型を使用します。ナル値を基本データ型のJava変数で受け取った場合,SQLNullException例外が発生します。
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メソッドで取得できます。
SQLJでは静的SQLだけ記述できます。動的SQLは記述できません。
動的SQLを使用したい場合は,JDBCのAPIを使用してください。
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文は使用できません。使用した場合,トランスレート時にエラーとなります。
スタンダードインタフェース版の場合,CONNECT文及びDISCONNECT文は使用できません。ネイティブインタフェース版の場合は使用できます。なお,スタンダードインタフェース版,及びネイティブインタフェース版共に,Javaの命令を使用すると,HiRDBサーバとの接続,切り離しができます。
HiRDBの埋込み型SQLでは,次の場合に警告が発生しますが,SQLJでは例外が発生します。
SQL先頭子からSQL終了子までの間に記述した注釈(/*〜*/)は削除します。ただし,カーソルの宣言とSQL文の実行の場合,{ }内に記述したSQL最適化指定(/*>>〜<<*/)は削除しないで,SQL文として扱います。これ以外のSQL最適化指定(/*>>〜<<*/)については,注釈とみなされます。SQL文中での注釈及びSQL最適化指定については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.