Hitachi

ノンストップデータベース HiRDB Version 10 UAP開発ガイド


18.3.2 SQLの記述規則

〈この項の構成〉

(1) SQL文の記述形式

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

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

表18‒2 SQL文の記述形式

機能

形式

用途

SQLの実行

#sql [コンテキスト] { SQL文 } ;

SQL文を実行します。スタンダードインタフェース版とネイティブインタフェース版とでは,使用できるSQLが違います。詳細については,「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 SQLリファレンス」を参照してください。