ヘッダーをスキップ
Oracle® Database JPublisherユーザーズ・ガイド
11gリリース2 (11.2)
B56279-03
  目次へ
目次
索引へ
索引

前へ
前へ
 
次へ
次へ
 

A 生成されるコードの例

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

生成されるコード: 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 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クラスの公開

必要なソース・ファイルを作成した後、それらのファイルを公開する必要があります。サーバー・サイド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