Archive for the ‘SQLJ’ Category
-
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!