ヘッダーをスキップ
Oracle Database JPublisherユーザーズ・ガイド
11gリリース1(11.1)
E05722-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

A 生成されるコードの例

この付録では、生成されるコードの例を次の各項で説明しています。

生成されるコード: Java間変換用のユーザー・サブクラス

この項では、「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

次の点に注意してください。

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文の宣言」の説明に関連して、指定したSQL文用に生成されるコードの例について説明します。

この例では、-sqlstatementオプションに次のサンプル設定を使用しています。

-sqlstatement.class=MySqlStatements
-sqlstatement.getEmp="select ename from emp
                      where ename=:{myname VARCHAR}"
-sqlstatement.return=both

この例では、次の点に注意してください。

UPDATEINSERTまたは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*/

生成されるコード: サーバー・サイドJavaのコールイン

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クラスの公開

必要なソース・ファイルを作成した後、それらのファイルを公開する必要があります。サーバー・サイドJavaクラスを公開するには、最初にこれらのファイルをデータベースにロードする必要があります。Callin2.javaCallin2Bean.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