スケーラブルデータベースサーバ HiRDB Version 8 UAP開発ガイド

[目次][索引][前へ][次へ]

19.3.2 SQLの記述規則

<この項の構成>
(1) SQL文の記述形式
(2) 複数接続機能を使用する場合の接続コンテキストの明示指定
(3) 実行環境の明示指定
(4) 埋込み変数の指定方法
(5) 標識変数の指定方法
(6) 例外処理
(7) 静的SQLと動的SQL
(8) 動的カーソルの結果セットの読み出し
(9) HiRDBサーバとの接続,切り離し
(10) 例外の発生条件
(11) 注釈及びSQL最適化指定の扱い

(1) SQL文の記述形式

SQL文は,一つのSQL文ごとに,SQL先頭子(#sql)とSQL終了子(;)で囲みます。SQL文自体は,更に{}で囲みます。接続クラスやカーソルの宣言についても,SQL先頭子とSQL終了子で囲みます。

SQL文の記述形式を次の表に示します。

表19-2 SQL文の記述形式

機能 形式 用途
SQLの実行
#sql [コンテキスト] { SQL文 } ;
SQL文を実行します。スタンダードインタフェース版とネイティブインタフェース版とでは,使用できるSQLが違います。詳細については,「19.3.3 SQLJで使用できるSQL文」を参照してください。
列名指定反復子クラスの宣言
  • スタンダードインタフェース版の場合
    #sql 修飾子 iterator クラス名
    (データ型 列名,…) ;
  • ネイティブインタフェース版の場合
    使用できません。
カーソルの宣言で使用するクラスを宣言します。FETCH文には使用できません。
位置指定反復子クラスの宣言
  • スタンダードインタフェース版の場合
    #sql 修飾子 iterator クラス名
    (データ型,…) ;
  • ネイティブインタフェース版の場合
    #sql 修飾子 iterator クラス名
    [implements
    JP.co.Hitachi.soft.HiRDB.pdjpp.runtime.
    ForUpdate]
    [with (キーワード=値,…)]
       (データ型,…) ;
カーソルの宣言で使用するクラスを宣言します。FETCH文で使用します。
接続クラスの宣言
#sql 修飾子 context クラス名 ;
接続で使用するクラスを宣言します。
カーソルの宣言
#sql 反復子オブジェクト = { SELECT文 } ;
カーソルの定義とオープンをします。
結果セットの変換
  • スタンダードインタフェース版の場合
    #sql [コンテキスト] 反復子オブジェクト
    = {CAST :JDBCの結果セット} ;
  • ネイティブインタフェース版の場合
    使用できません。
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では例外が発生します。

(11) 注釈及びSQL最適化指定の扱い

SQL先頭子からSQL終了子までの間に記述した注釈(/*〜*/)は削除します。ただし,カーソルの宣言とSQL文の実行の場合,{ }内に記述したSQL最適化指定(/*>>〜<<*/)は削除しないで,SQL文として扱います。これ以外のSQL最適化指定(/*>>〜<<*/)については,注釈とみなされます。SQL文中での注釈及びSQL最適化指定については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。