この付録では、生成されるコードの例を次の各項で説明しています。
この項では、「Java間の型変換用にJPublisherで生成されるサブクラス」の例で生成されるコードについて説明します。この例では、スタイル・ファイルとホルダー・クラスを使用して、PL/SQLの出力引数をサポートし、WebサービスでサポートされるJava型を使用するユーザー・サブクラスを生成しています。この例で示されているのは、ストアド・ファンクションfoo
で構成される次のPL/SQLパッケージfoo_pack
を、Webサービスに適したJava型を使用して公開するためにJPublisherで生成されるインタフェース、ベース・クラスおよびユーザー・サブクラスです。
CREATE OR REPLACE PACKAGE foo_pack AS FUNCTION foo(a IN OUT SYS.XMLTYPE, b INTEGER) RETURN CLOB; END; /
foo_pack
パッケージを次のように変換するとします。
% jpub -u scott -s foo_pack:FooPack -style=webservices10
Enter scott password: password
次の点に注意してください。
SQL型xmltype
は、最初にJPublisher型マップ内でJava型oracle.sql.SimpleXMLType
にマップされます。
SimpleXMLType
は、Webサービス用にwebservices10.properties
スタイル・ファイル内でjavax.xml.transform.Source
にマップされます。
Source
データのホルダー・クラスjavax.xml.rpc.holders.SourceHolder
は、出力のSource
引数に使用されます。
スタイル・ファイルでは、次のJPublisherコマンドに関連して生成されるコードのネーミング・パターン%2Base:%2User#%2
が指定されています。
-s foo_pack:FooPack
この結果、インタフェース・コードはFooPack.java
に、ベース・クラス・コードはFooPackBase.java
に、ユーザー・サブクラス・コードはFooPackUser.java
に生成されます。
FooPackUser
ユーザー・サブクラス内のfoo()
ラッパー・メソッドでは、次の型変換機能が使用され、生成されたベース・クラスの対応する_foo()
メソッドがコールされます。このメソッドでは、ラップされたストアド・ファンクションfoo
をコールするためのJava Database Connectivity(JDBC)コールが発生します。
foo (SourceHolder, Integer) { SourceHolder -> Source Source -> SimpleXMLType _foo (SimpleXMLType[], Integer); SimpleXMLType -> Source Source -> SourceHolder }
次のコードは、FooPack.java
に生成されるJavaインタフェース・コードです。
import java.sql.SQLException; import sqlj.runtime.ref.DefaultContext; import sqlj.runtime.ConnectionContext; import java.sql.Connection; // Ensure that the java.io.* package and other required packages are imported. import java.io.*; public interface FooPack extends java.rmi.Remote { public java.lang.String foo(SourceHolder _xa_inout_x, Integer b) throws java.rmi.RemoteException; }
次のコードは、FooPackBase.java
に生成されるベース・クラス・コードです。_foo()
メソッドはユーザー・サブクラスのfoo()
メソッドによりコールされ、JDBCを使用してJPublisherで公開されるfoo_pack
PL/SQLパッケージのfoo
ストアド・ファンクションをコールします。
注意: コメントは、対応するSQLJコードを示します。このコードは、JPublisherによりクラス生成時に自動的に変換されます。 |
import java.sql.SQLException; import sqlj.runtime.ref.DefaultContext; import sqlj.runtime.ConnectionContext; import java.sql.Connection; // Ensure that the java.io.* package and other required packages are imported. import java.io.*; public class FooPackBase { /* connection management */ protected DefaultContext __tx = null; protected Connection __onn = null; public void _setConnectionContext(DefaultContext ctx) throws SQLException { release(); __tx = ctx; ctx.setStmtCacheSize(0); ctx.setDefaultStmtCacheSize(0); if (ctx.getConnection() instanceof oracle.jdbc.OracleConnection) { try { java.lang.reflect.Method m = ctx.getConnection().getClass().getMethod("setExplicitCachingEnabled", new Class[]{Boolean.TYPE}); m.invoke(ctx.getConnection(), new Object[]{Boolean.FALSE}); } catch(Exception e) { /* do nothing for pre-9.2 JDBC drivers*/ } }} 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 FooPackBase() throws SQLException { __tx = DefaultContext.getDefaultContext(); } public FooPackBase(DefaultContext c) throws SQLException { __tx = c; } public FooPackBase(Connection c) throws SQLException {__onn = c; __tx = new DefaultContext(c); } /* *** _foo() USES JDBC TO INVOKE WRAPPED foo STORED PROCEDURE *** */ public oracle.sql.CLOB _foo ( oracle.sql.SimpleXMLType a[], Integer b) throws SQLException { oracle.sql.CLOB __jPt_result; // ************************************************************ // #sql [_getConnectionContext()] __jPt_result = { VALUES(SCOTT.FOO_PACK.FOO( // :a[0], // :b)) }; // ************************************************************ { // declare temps oracle.jdbc.OracleCallableStatement __sJT_st = null; sqlj.runtime.ref.DefaultContext __sJT_cc = _getConnectionContext(); 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 = "BEGIN :1 := SCOTT.FOO_PACK.FOO (\n :2 ,\n :3 ) \n; END;"; __sJT_st = __sJT_ec.prepareOracleCall(__sJT_cc,"0FooPackBase",theSqlTS); if (__sJT_ec.isNew()) { __sJT_st.registerOutParameter(1,oracle.jdbc.OracleTypes.CLOB); __sJT_st.registerOutParameter(2,2007,"SYS.XMLTYPE"); } // set IN parameters if (a[0]==null) __sJT_st.setNull(2,2007,"SYS.XMLTYPE"); else __sJT_st.setORAData(2,a[0]); if (b == null) __sJT_st.setNull(3,oracle.jdbc.OracleTypes.INTEGER); else __sJT_st.setInt(3,b.intValue()); // execute statement __sJT_ec.oracleExecuteUpdate(); // retrieve OUT parameters __jPt_result = (oracle.sql.CLOB) __sJT_st.getCLOB(1); a[0] = (oracle.sql.SimpleXMLType)__sJT_st.getORAData (2,oracle.sql.SimpleXMLType.getORADataFactory()); } finally { __sJT_ec.oracleClose(); } } // ************************************************************ return __jPt_result; } }
次のコードは、FooPackUser.java
に生成されるユーザー・サブクラス・コードです。このクラスはFooPackBase
クラスを拡張し、FooPack
インタフェースを実装します。foo()
メソッドは、ベース・クラスの_foo()
メソッドをコールします。Java間の変換は、コードのコメントが示すようにtry
ブロックで処理されます。
import java.sql.SQLException; import sqlj.runtime.ref.DefaultContext; import sqlj.runtime.ConnectionContext; import java.sql.Connection; // Ensure that the java.io.* package and other required packages are imported. import java.io.*; public class FooPackUser extends FooPackBase implements FooPack, java.rmi.Remote { /* constructors */ public FooPackUser() throws SQLException { super(); } public FooPackUser(DefaultContext c) throws SQLException { super(c); } public FooPackUser(Connection c) throws SQLException { super(c); } /* superclass methods */ public java.lang.String foo(SourceHolder _xa_inout_x, Integer b) throws java.rmi.RemoteException { oracle.sql.CLOB __jRt_0 = null; java.lang.String __jRt_1 = null; /* *** FOLLOWING try BLOCK CONVERTS SourceHolder TO Source *** */ try { javax.xml.transform.Source[] a_inout; // allocate an array for holding the OUT value a_inout = new javax.xml.transform.Source[1]; if (_xa_inout_x!=null) a_inout[0] = _xa_inout_x.value; oracle.sql.SimpleXMLType[] xa_inoutx; xa_inoutx = new oracle.sql.SimpleXMLType[1]; /* *** FOLLOWING try BLOCK TRANSFORMS Source TO SimpleXMLType *** */ try { javax.xml.transform.Transformer trans = javax.xml.transform.TransformerFactory.newInstance().newTransformer(); xa_inoutx[0] = null; if (a_inout[0]!=null) { java.io.ByteArrayOutputStream buf = new java.io.ByteArrayOutputStream(); javax.xml.transform.stream.StreamResult streamr = new javax.xml.transform.stream.StreamResult(buf); trans.transform(a_inout[0], streamr); xa_inoutx[0] = new oracle.sql.SimpleXMLType(_getConnection()); xa_inoutx[0] = xa_inoutx[0].createxml(buf.toString()); } } catch (java.lang.Throwable t) { throw OC4JWsDebugPrint(t); } /* *** CALL _foo() FROM BASE CLASS (SUPER CLASS) *** */ __jRt_0 = super._foo(xa_inoutx, b); /* *** FOLLOWING try BLOCK TRANSFORMS SimpleXMLType TO Source *** */ try { javax.xml.parsers.DocumentBuilder db = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder(); a_inout[0] = null; if (xa_inoutx[0]!=null) { org.w3c.dom.Document _tmpDocument_ = db.parse (new java.io.ByteArrayInputStream(xa_inoutx[0].getstringval().getBytes())); a_inout[0]= new javax.xml.transform.dom.DOMSource(_tmpDocument_); } } catch (java.lang.Throwable t) { throw OC4JWsDebugPrint(t); } /* *** FOLLOWING CODE CONVERTS Source TO SourceHolder *** */ // convert OUT value to a holder if (a_inout!=null) _xa_inout_x.value = a_inout[0]; if (__jRt_0==null) { __jRt_1=null; } else { __jRt_1=readerToString(__jRt_0.getCharacterStream()); } } catch (Exception except) { try { Class sutil = Class.forName("com.evermind.util.SystemUtils"); java.lang.reflect.Method getProp = sutil.getMethod("getSystemBoolean", new Class[]{String.class, Boolean.TYPE}); if (((Boolean)getProp.invoke(null, new Object[]{"ws.debug", Boolean.FALSE})).booleanValue()) except.printStackTrace(); } catch (Throwable except2) {} throw new java.rmi.RemoteException(except.getMessage(), except); } return __jRt_1; } private java.lang.String readerToString(java.io.Reader r) throws java.sql.SQLException { CharArrayWriter caw = new CharArrayWriter(); try { //Read from reader and write to writer boolean done = false; while (!done) { char[] buf = new char[4096]; int len = r.read(buf, 0, 4096); if(len == -1) { done = true; } else { caw.write(buf,0,len); } } } catch(Throwable t) { throw OC4JWsDebugPrint(t); } return caw.toString(); } private void populateClob(oracle.sql.CLOB clb, java.lang.String data) throws Exception { java.io.Writer writer = clb.getCharacterOutputStream(); writer.write(data.toCharArray()); writer.flush(); writer.close(); } private boolean OC4JWsDebug() { boolean debug = false; try { // Server-side Debug Info for "java -Dws.debug=true -jar oc4j.jar" Class sutil = Class.forName("com.evermind.util.SystemUtils"); java.lang.reflect.Method getProp = sutil.getMethod("getSystemBoolean", new Class[]{String.class, Boolean.TYPE}); if (((Boolean)getProp.invoke(null, new Object[]{"ws.debug", Boolean.FALSE})).booleanValue()) { debug = true; } } catch (Throwable except2) {} return debug; } private java.sql.SQLException OC4JWsDebugPrint(Throwable t) { java.sql.SQLException t0 = new java.sql.SQLException(t.getMessage()); if (!OC4JWsDebug()) return t0; t.printStackTrace(); try { java.lang.reflect.Method getST = Exception.class.getMethod("getStackTrace", new Class[]{}); java.lang.reflect.Method setST = Exception.class.getMethod("setStackTrace", new Class[]{}); setST.invoke(t0, new Object[]{getST.invoke(t, new Object[]{})}); } catch (Throwable th){} return t0; } }
この項では、「変換対象の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 10g リリース2(10.2)では、JPublisherの-dbjava
オプションがサーバー・サイドJavaのコールに使用されます。-java
オプションとは異なり、-dbjava
オプションはシリアライズ不可能なパラメータまたは戻り型をサポートします。
この項では、サーバー・サイドJavaのコールの例を説明します。この項の内容は次のとおりです。
注意: 11g リリース1(11.1)バージョンの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