SQLJ

プログラム内でのSQLとJavaの組み合わせ

SQLJは、 JavaSQLを統合する取り組みの仮称です。これは、 IBMOracleCompaqInformixSybaseCloudscapeSun Microsystemsのエンジニアによって1997年頃に開始された共同の取り組みでした

SQLJは、パート0、パート1、パート2の3つのパートで構成されています。パート0では、SQL文をJavaプログラムに埋め込む方法について説明しています。SQLJパート0は、SQL:1999標準のパート10(SQLオブジェクト言語バインディング(SQL/OLB)とも呼ばれる)の基礎となっています。[1] SQLJパート1とパート2では、SQL文からJavaクラス(ルーチンと型)を使用する逆の可能性について説明しています。パート1とパート2は、SQL標準のパート13( Javaプログラミング言語を使用したSQLルーチンと型(SQL/JRT)) の基礎となっています。

「SQLJ」は通常、SQLJ パート 0 のみを指すために使用されますが、通常はJDBCなど、Java に SQL を埋め込む他の手段と対比して使用されます。

ANSIおよびISO規格

  • SQLJ パート 0: ANSI X3.135.10-1998、「データベース言語 SQL - パート 10: オブジェクト言語バインディング (SQL/OLB)」
  • SQLJ パート 1: ANSI NCITS 331.1-1999、「SQLJ - パート 1: Java プログラミング言語を使用した SQL ルーチン」
  • SQLJ パート 2: ANSI NCITS 331.2-2000、「SQLJ - パート 2: Java プログラミング言語を使用した SQL 型」

パート0はJDBC 2.0との互換性のために更新され、2000年にISOによって承認されました。最後の2つのパートはISOへの提出時に統合されました。パート2は、ANSI版が仕様として形式的に不十分であり、ユーザーマニュアルのスタイルに近かったため、ISOへの提出に向けて大幅に書き直されました。統合版は2002年に承認されました。[1]

  • ISO/IEC 9075-10:2000、情報技術 - データベース言語 - SQL - パート10:オブジェクト言語バインディング(SQL/OLB)
  • ISO/IEC 9075-13:2002、情報技術 - データベース言語 - SQL - パート 13: Java プログラミング言語 (SQL/JRT) を使用した SQL ルーチンおよび型

SQLJ パート 0

SQLJパート0仕様は主にOracleから始まり、Oracleは最初のリファレンス実装も提供しました。[1]

以下の SQLJ は、SQLJ パート 0 の同義語です。

JDBCはAPIを提供します、SQLJは言語拡張で構成されています。そのため、SQLJを含むプログラムは、コンパイルする前に プリプロセッサ(SQLJトランスレータ)を介して実行する必要があります。

利点

JDBC と比較した SQLJ の利点は次のとおりです。

  • SQLJ コマンドは、同等の JDBC プログラムよりも短くなる傾向があります。
  • SQL構文はコンパイル時にチェックできます。返されるクエリ結果も厳密にチェックできます。
  • プリプロセッサは静的SQLを生成する場合があります。静的SQLは動的SQLよりもパフォーマンスが優れています。これは、クエリプランがプログラムのコンパイル時に作成され、データベースに保存され、実行時に再利用されるためです。静的SQLはアクセスプランの安定性を保証します。IBM DB2は、SQLJプログラムでの静的SQLの使用をサポートしています。

デメリット

  • SQLJ では前処理手順が必要です。
  • 多くのIDEではSQLJ がサポートされていません。
  • SQLJ は、 Hibernateなどの一般的な永続化フレームワークのほとんどをサポートしていません
  • Oracle 18c (12.2) では、データベース内の SQLJ はサポートされなくなりました。

次の例では、SQLJ 構文と JDBC の使用法を比較します。

複数行クエリ
JDBC SQLJ
PreparedStatement stmt = conn.prepareStatement ( " SELECT LASTNAME" + " , FIRSTNME" + " , SALARY" + " FROM DSN8710.EMP" + " WHERE SALARY BETWEEN ? AND ?" ) ; stmt.setBigDecimal ( 1 , min ); stmt.setBigDecimal ( 2 , max ); ResultSet rs = stmt.executeQuery ( ) ; while ( rs.next ( ) ) { lastname = rs.getString ( 1 ); firstname = rs.getString ( 2 ) ; salary = rs.getBigDecimal ( 3 ) ; //印刷... } rs.close ( ) ; stmt.close ( ) ;   
   
  
  
  
  
 
 
   
  
    
    
    
  



# sql private static iterator EmployeeIterator ( String , String , BigDecimal ); ... EmployeeIterator iter ; # sql [ ctx ] iter = { SELECT LASTNAME , FIRSTNME , SALARY FROM DSN8710 . EMP WHERE SALARY BETWEEN : min AND : max } ; do { # sql { FETCH : iter INTO : lastname , : firstname , : salary } ; //行を印刷... } while ( ! iter . endFetch ()); iter . close ();      

 
    
   
        
        
     
        

 
   
     
        
  
    
  

単一行クエリ
JDBC SQLJ
PreparedStatement stmt = conn . prepareStatement ( "SELECT MAX(SALARY), AVG(SALARY)" + " FROM DSN8710.EMP" ); rs = stmt . executeQuery ()); if ( ! rs . next ()) { // エラー - 行が見つかりません} maxSalary = rs . getBigDecimal ( 1 ); avgSalary = rs . getBigDecimal ( 2 ); if ( rs . next ()) { // エラー - 複数の行が見つかりました} rs . close (); stmt . close ();   
    
   
  
  
  

  
  
  
  



# sql [ ctx ] { SELECT MAX ( SALARY ), AVG ( SALARY ) INTO : maxSalary , : avgSalary FROM DSN8710 . EMP } ;  
    
      
     

入れる
JDBC SQLJ
stmt = conn . prepareStatement ( "INSERT INTO DSN8710.EMP " + "(EMPNO、FIRSTNME、MIDINIT、LASTNAME、HIREDATE、SALARY) " + "VALUES (?、?、?、?、CURRENT DATE、?)" ); stmt . setString ( 1 empno ); stmt . setString ( 2 firstname ); stmt . setString ( 3 midinit ); stmt . setString ( 4 lastname ); stmt . setBigDecimal ( 5 salary ); stmt . executeUpdate (); stmt . close ();  
    
   
  
 
 
 
 
 


# sql [ ctx ] { INSERT INTO DSN8710 . EMP ( EMPNO FIRSTNME MIDINIT LASTNAME HIREDATE SALARY ) VALUES (: empno : firstname : midinit : lastname CURRENT DATE : salary ) } ;  
    
                  
  
          

参照

参考文献

  1. ^ abc ジム・メルトン (2003). 『Advanced SQL: 1999』 モーガン・カウフマン. pp. 352-364. ISBN 978-1-55860-677-7

さらに読む

  • Connie Tsui、「DB2 V8 Java アプリケーションにおける SQLJ の検討」、IBM developerworks、2003 年 2 月 13 日
  • Owen Cline、「SQLJ を使用したアプリケーションの開発」、IBM DeveloperWorks、2004 年 12 月 16 日
  • Jason Price (2001). 『Java Programming with Oracle SQLJ』 . O'Reilly Media. ISBN 978-0-596-00087-5
  • IBM レッドブック: DB2 for z/OS および OS/390: Java 対応
  • Oracle SQLJ開発者ガイド
「https://en.wikipedia.org/w/index.php?title=SQLJ&oldid=1244434470」から取得