この付録では、生成されるコードの例を次の各項で説明しています。
この項では、「変換対象のSQL文の宣言」の説明に関連して、指定したSQL文用に生成されるコードの例について説明します。
この例では、-sqlstatement
オプションに次のサンプル設定を使用しています。
-sqlstatement.class=MySqlStatements -sqlstatement.getEmp="select ename from emp where ename=:{myname VARCHAR}" -sqlstatement.return=both
この例では、次の点に注意してください。
コードのコメントは、示されている変換済コードに対応する#sql
文を示しています。
-sqlstatement.return=both
設定により生成されたgetEmpBeans()
メソッドは、JavaBeansの配列を戻します。各要素は結果セットの行を表します。そのためにGetEmpRow
クラスが定義されています。
JPublisherではSQLJクラスが生成されます。結果セットはSQLJイテレータにマップされます。
(UPDATE
、INSERT
またはDELETE
文の場合は、配列バインド用のバッチを使用するコードと使用しないコードの両方が生成されます。)
JPublisherで生成される変換済SQLJコードを次に示します。
public class MySqlStatements_getEmpRow { /* connection management */ /* constructors */ public MySqlStatements_getEmpRow() { } public String getEname() throws java.sql.SQLException { return ename; } public void setEname(String ename) throws java.sql.SQLException { this.ename = ename; } private String ename; } /*@lineinfo:filename=MySqlStatements*/ /*@lineinfo:user-code*/ /*@lineinfo:1^1*/ import java.sql.SQLException; import sqlj.runtime.ref.DefaultContext; import sqlj.runtime.ConnectionContext; import java.sql.Connection; import oracle.sql.*; public class MySqlStatements { /* connection management */ protected DefaultContext __tx = null; protected Connection __onn = null; public void setConnectionContext(DefaultContext ctx) throws SQLException { release(); __tx = ctx; } public DefaultContext getConnectionContext() throws SQLException { if (__tx==null) { __tx = (__onn==null) ? DefaultContext.getDefaultContext() : new DefaultContext(__onn); } return __tx; }; public Connection getConnection() throws SQLException { return (__onn==null) ? ((__tx==null) ? null : __tx.getConnection()) : __onn; } public void release() throws SQLException { if (__tx!=null && __onn!=null) __tx.close(ConnectionContext.KEEP_CONNECTION); __onn = null; __tx = null; } /* constructors */ public MySqlStatements() throws SQLException { __tx = DefaultContext.getDefaultContext(); } public MySqlStatements(DefaultContext c) throws SQLException { __tx = c; } public MySqlStatements(Connection c) throws SQLException {__onn = c; __tx = new DefaultContext(c); } /*@lineinfo:generated-code*/ /*@lineinfo:36^1*/ // ************************************************************ // SQLJ iterator declaration: // ************************************************************ public static class getEmpIterator extends sqlj.runtime.ref.ResultSetIterImpl implements sqlj.runtime.NamedIterator { public getEmpIterator(sqlj.runtime.profile.RTResultSet resultSet) throws java.sql.SQLException { super(resultSet); enameNdx = findColumn("ename"); m_rs = (oracle.jdbc.OracleResultSet) resultSet.getJDBCResultSet(); } private oracle.jdbc.OracleResultSet m_rs; public String ename() throws java.sql.SQLException { return m_rs.getString(enameNdx); } private int enameNdx; } // ************************************************************ /*@lineinfo:user-code*/ /*@lineinfo:36^56*/ public MySqlStatements_getEmpRow[] getEmpBeans (String myname) throws SQLException { getEmpIterator iter; /*@lineinfo:generated-code*/ /*@lineinfo:43^5*/ // ************************************************************ // #sql [getConnectionContext()] // iter = { select ename from emp where ename=:myname }; // ************************************************************ { // declare temps oracle.jdbc.OraclePreparedStatement __sJT_st = null; sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext(); if (__sJT_c c==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 ename from emp where ename= :1"; __sJT_st = __sJT_ec.prepareOracleStatement (__sJT_cc,"0MySqlStatements",theSqlTS); // set IN parameters __sJT_st.setString(1,myname); // execute query iter = new MySqlStatements.getEmpIterator (new sqlj.runtime.ref.OraRTResultSet (__sJT_ec.oracleExecuteQuery(),__sJT_st,"0MySqlStatements",null)); } finally { __sJT_ec.oracleCloseQuery(); } } // ************************************************************ /*@lineinfo:user-code*/ /*@lineinfo:43^84*/ java.util.Vector v = new java.util.Vector(); while (iter.next()) { MySqlStatements_getEmpRow r = new MySqlStatements_getEmpRow(); r.setEname(iter.ename()); v.addElement(r); } MySqlStatements_getEmpRow[] __jPt_result = new MySqlStatements_getEmpRow[v.size()]; for (int i = 0; i < v.size(); i++) __jPt_result[i] = (MySqlStatements_getEmpRow) v.elementAt(i); return __jPt_result; } public java.sql.ResultSet getEmp (String myname) throws SQLException { sqlj.runtime.ResultSetIterator iter; /*@lineinfo:generated-code*/ /*@lineinfo:62^5*/ // ************************************************************ // #sql [getConnectionContext()] iter = // { select ename from emp where ename=:myname }; // ************************************************************ { // declare temps oracle.jdbc.OraclePreparedStatement __sJT_st = null; sqlj.runtime.ref.DefaultContext __sJT_cc = getConnectionContext(); if (__sJT_c c==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 ename from emp where ename= :1"; __sJT_st = __sJT_ec.prepareOracleStatement (__sJT_cc,"1MySqlStatements",theSqlTS); // set IN parameters __sJT_st.setString(1,myname); // execute query iter = new sqlj.runtime.ref.ResultSetIterImpl (new sqlj.runtime.ref.OraRTResultSet (__sJT_ec.oracleExecuteQuery(),__sJT_st,"1MySqlStatements",null)); } finally { __sJT_ec.oracleCloseQuery(); } } // ************************************************************ /*@lineinfo:user-code*/ /*@lineinfo:62^84*/ java.sql.ResultSet __jPt_result = iter.getResultSet(); return __jPt_result; } } /*@lineinfo:generated-code*/
JPublisherでは、データベース内のJavaメソッドに対するデータベース外のJavaクライアントからのコールがサポートされています。Oracle Database 11gリリース2(11.2)では、JPublisherの-dbjava
オプションがサーバー・サイドJavaのコールに使用されます。-java
オプションとは異なり、-dbjava
オプションはシリアライズ不可能なパラメータまたは戻り型をサポートします。
この項では、サーバー・サイドJavaのコールの例を説明します。この項の内容は次のとおりです。
注意: 11gリリース2(11.2)バージョンのOracle Databaseが必要です。 |
この例では、作成するソース・ファイルが3つあります。これを次に示します。
サーバー・サイドJavaクラス
サーバー・サイドJavaクラスで使用されるJavaBeans
公開済クラス内のメソッドをコールするエントリ・ポイントJavaクラス
これらのファイルのソース・コードを次に示します。
サーバー・サイドJavaクラス
サーバー・サイドJavaクラスCallin2.java
のソース・コードは、次のとおりです。
public class Callin2 { public static int testInt(int i) { return i; } public static int[] testInt(int[] i) { return i; } public static int[][] testInt(int[][] i) { return i; } public static Integer testInteger(Integer i) { return i; } public static Integer[] testInteger(Integer[] i) { return i; } public static Integer[][] testInteger(Integer[][] i) { return i; } // Test ORAData public static oracle.sql.NUMBER testNum(oracle.sql.NUMBER num) { return num; } public oracle.sql.NUMBER testInstNum(oracle.sql.NUMBER num) { return num; } public oracle.sql.NUMBER[] testInstNum(oracle.sql.NUMBER[] num) { return num; } public oracle.sql.NUMBER[][] testInstNum(oracle.sql.NUMBER[][] num) { return num; } // Test Beans public static Callin2Bean testBean() { return new Callin2Bean("mybean", new int[]{1,2}); } public static Callin2Bean testBean (Callin2Bean b) { return b; } public static Callin2Bean[] testBean (Callin2Bean[] b) { return b; } public static Callin2Bean[][] testBean (Callin2Bean[][] b) { return b; } public Callin2Bean testInstBean (Callin2Bean b) { return b; } public Callin2Bean[] testInstBean (Callin2Bean[] b) { return b; } public Callin2Bean[][] testInstBean (Callin2Bean[][] b) { return b; } // Test Serializable public static java.io.Serializable testSer() { return new String("test Serializable"); } public static java.io.Serializable testSer (java.io.Serializable b) { return b; } public static java.io.Serializable[] testSer (java.io.Serializable[] b) { return b; } public static java.io.Serializable[][] testSer (java.io.Serializable[][] b) { return b; } public java.io.Serializable testInstSer (java.io.Serializable b) { return b; } public java.io.Serializable[] testInstSer (java.io.Serializable[] b) { return b; } public java.io.Serializable[][] testInstSer (java.io.Serializable[][] b) { return b; } }
サーバー・サイドJavaクラスで使用されるJavaBeans
サーバー・サイドJavaクラスCallin2.java
で使用されるJavaBeansのCallin2Bean.java
のソース・コードは、次のとおりです。
public class Callin2Bean { private String stringValue = ""; private int[] numberValue; public Callin2Bean () { } public Callin2Bean(String string_val, int[] number_val) { stringValue = string_val; numberValue = number_val; } public void setStringValue(String string_val) { stringValue = string_val; } public String getStringValue () { return stringValue; } public void setNumberValue (int[] number_val) { numberValue = number_val; } public int[] getNumberValue () { return numberValue; } public boolean equals(Object other) { if(other instanceof Callin2Bean) { Callin2Bean my_bean = (Callin2Bean)other; if ( stringValue.equals(my_bean.getStringValue()) && compareIntArray(numberValue, my_bean.getNumberValue()) ) { return true; } } return false; } private boolean compareIntArray(int[] b1, int[] b2) { try { if ((b1 == null) && (b2 == null)) return true; if ((b1.length == 0) && (b2.length == 0)) return true; if (b1.length != b2.length) return false; int x; for (x = 0; x < b1.length; x++) { if (b1[x] != b2[x]) return false; } return true; } catch (Exception e) { return false; } } }
エントリ・ポイントJavaクラス
TestCallin2.java
が、この例のエントリ・ポイントJavaクラスです。このクラスが公開済クラス内のメソッドをコールします。TestCallin2.java
ファイルのソース・コードは、次のとおりです。
public class TestCallin2 { public static void main(String[] args) throws Exception { java.sql.DriverManager.registerDriver(new oracle.jdbc.OracleDriver()); oracle.jdbc.OracleConnection conn = (oracle.jdbc.OracleConnection) //java.sql.DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:lsqlj1", "scott", "tiger"); java.sql.DriverManager.getConnection("jdbc:oracle:oci8:@", "scott", "tiger"); Callin2Client tkpu = new Callin2Client (conn); System.out.println("testInstNum() returned " + tkpu.testinstnum(new java.math.BigDecimal(1999))); TblNumber na = new TblNumber(new java.math.BigDecimal[]{new java.math.BigDecimal(2999)}); System.out.println("testInstNum([]) returned " + tkpu.testinstnum(na).getArray()[0]); ObjCallin2bean mb = new ObjCallin2bean("mybean", na); System.out.println("testCallin2Bean() returned " + tkpu.testbean(mb).getStringValue()); System.out.println("testCallin2Bean([]) returned " + tkpu.testbean(new TblObjCallin2bean(new ObjCallin2bean[]{mb})).getArray()[0].getStringValue()); java.io.Serializable s = new java.util.Hashtable(); ((java.util.Hashtable) s).put("bush", "cheny"); ((java.util.Hashtable) s).put("kerry", "dean"); java.io.Serializable[] s1 = new java.io.Serializable[]{s}; java.io.Serializable[][] s2 = new java.io.Serializable[][]{s1}; System.out.println("testSer() returned " + ((java.util.Hashtable) tkpu.testser(s)).get("kerry")); System.out.println("testSer([]) returned " + ((java.util.Hashtable) tkpu.testser0(s1)[0]).get("kerry")); System.out.println("testSer([][]) returned " + ((java.util.Hashtable) tkpu.testser1(s2)[0][0]).get("kerry")); } }
注意: JDBC Thinドライバを使用してデータベースに接続している場合、前出のコード内のgetConnection() メソッドへの最初のコールをコメント解除し、getConnection() メソッドへの2回目のコールをコメント化する必要があります。このコールにはOracle Call Interface(OCI)ドライバ用の接続文が含まれています。 |
必要なソース・ファイルを作成した後、それらのファイルを公開する必要があります。サーバー・サイドJavaクラスを公開するには、最初にこれらのファイルをデータベースにロードする必要があります。Callin2.java
とCallin2Bean.java
の両方をロードしてください。ロード用のコマンドは、次のとおりです。
% loadjava -u scott -r -v -f Callin2.java Callin2Bean.java
Password: password
これらのファイルを公開するには、次のコマンドを発行します。
% jpub -u scott -sysuser=sys/sys_password -dbjava=Callin2:Callin2Client -dir=tmp Enter scott password: password
JPublisherの出力は次のとおりです。
tmp/Callin2JPub.java tmp/plsql_wrapper.sql tmp/plsql_dropper.sql SCOTT.TBL_NUMBER SCOTT.TBL_TBL_NUMBER SCOTT.OBJ_CALLIN2BEAN SCOTT.TBL_OBJ_CALLIN2BEAN SCOTT.TBL_TBL_OBJ_CALLI SCOTT.JPUB_PLSQL_WRAPPER Executing tmp/plsql_dropper.sql Executing tmp/plsql_wrapper.sql Loading Callin2JPub.java
サーバー・サイドJavaクラスを公開すると、JPublisherでいくつかのJavaクラスとPL/SQLスクリプトが生成されます。その一部を次に示します。
Callin2JPub.java
これはCallin2.java
用のサーバー・サイドJavaラッパー・クラスです。
Callin2Client.java
これはクライアント・サイドJavaクラスです。
plsql_wrapper.sql
これはサーバー・サイドJavaクラス用のPL/SQLラッパーです。
plsql_dropper.sql
これは、PL/SQLラッパーを削除するためのPL/SQLスクリプトです。
JPublisherにより生成されるその他のファイルは、次のとおりです。
TblNumber.java
int[]
用に生成されるクライアント・サイド・ラッパー。
TblTblNumber.java
int[]
用に生成されるクライアント・サイド・ラッパー。
ObjCallin2bean.java
サーバー・サイド・クラスCallin2Bean
用に生成されるクライアント・サイド・ラッパー。
ObjCallin2beanRef.java
サーバー・サイド・クラスCallin2Bean
用に生成され、表内でREF
列として使用されるクライアント・サイド・ラッパー。このファイルは生成されますが、コールインの使用例では使用されません。
TblObjCallin2bean.java
Callin2Bean[]
用に生成されるクライアント・サイド・ラッパー。
TblTblObjCalli.java
Callin2Bean[][]
用に生成されるクライアント・サイド・ラッパー。
ファイルの公開後、公開されたクラスを次のコマンドを発行してテストできます。
% javac -classpath tmp:${CLASSPATH} -d tmp TestCallin2.java % java -classpath tmp:${CLASSPATH} TestCallin2