Hello, SQLJ World!

Posted on 4月 7th, 2012 by cx20

SQLJ

SQLJ は Oracle Database に対応した Java 用の埋め込み SQL(Embedded SQL)である。類似の製品としては、Pro*C/C++、Pro*COBOL、Pro*FORTRAN、Pro*Pascal 等がある。
なお、埋め込み SQL 自体は、標準SQL として ANSI/ISO にて仕様が策定されている。

ソースコード(SQLJ)

import java.sql.*;
import oracle.sqlj.runtime.Oracle;
 
#sql iterator MessageIter ( String MESSAGE );
 
class Hello {
    public static void main( String[] args ) throws Exception {
        Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
        MessageIter iter;
        #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL };
        while ( iter.next() ) {
            System.out.println( iter.MESSAGE() );
        }
    }
}

上記コードは、SQLJ トランスレータ により、以下の Java のコードが生成される。

ソースコード(Java)

/*@lineinfo:filename=Hello*//*@lineinfo:user-code*//*@lineinfo:1^1*/import java.sql.*;
import oracle.sqlj.runtime.Oracle;
 
/*@lineinfo:generated-code*//*@lineinfo:4^1*/
 
//  ************************************************************
//  SQLJ iterator declaration:
//  ************************************************************
 
class MessageIter
extends sqlj.runtime.ref.ResultSetIterImpl
implements sqlj.runtime.NamedIterator
{
  public MessageIter(sqlj.runtime.profile.RTResultSet resultSet)
    throws java.sql.SQLException
  {
    super(resultSet);
    MESSAGENdx = findColumn("MESSAGE");
    m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet();
  }
  private oracle.jdbc.OracleResultSet m_rs;
  public String MESSAGE()
    throws java.sql.SQLException
  {
    return (String)m_rs.getString(MESSAGENdx);
  }
  private int MESSAGENdx;
}
 
 
//  ************************************************************
 
/*@lineinfo:user-code*//*@lineinfo:4^44*/
 
class Hello {
    public static void main( String[] args ) throws Exception {
        Oracle.connect("jdbc:oracle:oci:@", "scott", "tiger");
        MessageIter iter;
        /*@lineinfo:generated-code*//*@lineinfo:10^9*/
 
//  ************************************************************
//  #sql iter = { SELECT 'Hello, SQLJ World!' AS Message FROM DUAL  };
//  ************************************************************
 
{
  // declare temps
  oracle.jdbc.OraclePreparedStatement __sJT_st = null;
  sqlj.runtime.ref.DefaultContext __sJT_cc = sqlj.runtime.ref.DefaultContext.getDefaultContext(); if (__sJT_cc==null) sqlj.runtime.error.RuntimeRefErrors.raise_NULL_CONN_CTX();
  sqlj.runtime.ExecutionContext.OracleContext __sJT_ec = ((__sJT_cc.getExecutionContext()==null) ? sqlj.runtime.ExecutionContext.raiseNullExecCtx() : __sJT_cc.getExecutionContext().getOracleContext());
  try {
   String theSqlTS = "SELECT 'Hello, SQLJ World!' AS Message FROM DUAL";
   __sJT_st = __sJT_ec.prepareOracleStatement(__sJT_cc,"0MessageIter",theSqlTS);
   // execute query
   iter = new MessageIter(new sqlj.runtime.ref.OraRTResultSet(__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MessageIter",null));
  } finally { __sJT_ec.oracleCloseQuery(); }
}
 
 
//  ************************************************************
 
/*@lineinfo:user-code*//*@lineinfo:10^72*/
        while ( iter.next() ) {
            System.out.println( iter.MESSAGE() );
        }
    }
}/*@lineinfo:generated-code*/

コンパイル&実行方法

C:¥> SET PATH=ORACLE_BASEORACLE_HOMEbin;%PATH%
C:¥> SET CLASSPATH=ORACLE_BASEORACLE_HOMEsqljlibruntime12.jar;
     ORACLE_BASEORACLE_HOMEsqljlibtranslator.jar;
     ORACLE_BASEORACLE_HOMEjdbclibojdbc6.jar;%CLASSPATH%
C:¥> sqlj Hello.sqlj
C:¥> java Hello

実行結果

Hello, SQLJ World!

Tags:

Categories: Java, JDBC, library, Oracle Database, SQL, SQLJ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

WP-SpamFree by Pole Position Marketing