Archive for 4月 7th, 2012

  1. 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!