0 Replies Latest reply: Apr 5, 2011 9:08 PM by 853112 RSS

    DBへthinドライバで接続した際に、PLSQLのwhere句でChar型のout引数を使用したファンクションを実行するとORA-01460が発生する

    853112
      jdbc thinドライバでoracleに接続したときに、
      通常のSQL文は問題なく実行できるのですが
      where句でChar型のout引数を使用したファンクションを実行した際にORA-01460が発生する状態です。

      既存のOracleDBに対して新たにJavaのサービスを構築する案件で、
      要件的にPLSQL等のデータベース内部オブジェクトの改修はできないため、
      Java部分の修正で対応したいと考えています。


      原因や回避策をご存知の方がおられましたら、ご教授願います。


      また、下記のソースをthinドライバからociドライバに変更してみたことろ
      エラーなく動くことを確認できました。
      ただ変更する事で修正できる根拠となる情報を見つけることができなかったため
      こちらについても情報をご存知の方がおられましたら、ご教授いただければと思います。



      <環境>
      Oracle Database 11g Release 11.2.0.1.0 - Production(Windows7上で稼働)
      Java1.6
      odbc6.jar

      <エラー内容>
      java.sql.SQLException: ORA-01460: リクエストされた変換はできません。
      ORA-06512: "TESTUSER.TESTPACK", 行17
      ORA-06512: 行1

           at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
           at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:112)
           at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:173)
           at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
           at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:413)
           at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:1030)
           at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:191)
           at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:944)
           at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1222)
           at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3381)
           at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3425)
           at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1490)
           at test.CallTestCastErr.main(CallTestCastErr.java:28)


      <ソース>
      【JAVAソース:CallTestCastErr.java】
      package test;

      import java.sql.Connection;
      import java.sql.DriverManager;
      import oracle.jdbc.OracleCallableStatement;

      public class CallTestCastErr {
           
           public static void main(String[] arg){
                try {
                     // Connection情報を取得
                     DriverManager.registerDriver(new oracle.jdbc.OracleDriver());
                Connection con = DriverManager.getConnection(
                          "jdbc:oracle:thin:@XXXX:YYYY:ZZZZ",usr,pwd);
                //          "jdbc:oracle:oci:@XXXX:YYYY:ZZZZ",usr,pwd);     //ociにした場合エラーは発生しない
                     // OutParameterにサイズを指定するためOracleCallableStatementをキャスト
                     OracleCallableStatement stmt = (OracleCallableStatement) con
                               .prepareCall("{? = call TESTPACK.TEST(?,?,?)}");
                     int userId = 1;

                     // パラメータ設定
                     stmt.registerOutParameter(1, java.sql.Types.INTEGER, 0, 1);
                     stmt.setInt(2, userId);
                     stmt.registerOutParameter(3, java.sql.Types.CHAR, 0, 3);
                     stmt.registerOutParameter(4, java.sql.Types.CHAR, 0, 3);

                     // 「ORA-01460: リクエストされた変換はできません。」発生
                     // 第3引数をFunction内で利用する際にエラーが発生していることを確認済み。
                     stmt.executeQuery();

                     // 戻り値確認
                     System.out.println("RETERN:" + stmt.getInt(1));
                     System.out.println("OUT_PARAM1:" + stmt.getString(3));
                     System.out.println("OUT_PARAM2:" + stmt.getString(4));

                     con.close();
                     stmt.close();
                } catch (Throwable th) {
                     th.printStackTrace();
                }
           }
      }

      【PLSQL宣言部ソース】
      create or replace
      PACKAGE TESTPACK
      IS
      FUNCTION TEST(inparam IN NUMBER , outparam1 OUT TEST_TBL1.CHAR_COLUMN%type,
      outparam2 OUT TEST_TBL2.CHAR_COLUMN2%type)RETURN NUMBER;
      END TESTPACK;

      【PLSQL仕様部ソース】
      create or replace
      PACKAGE BODY TESTPACK
      IS
      FUNCTION TEST(inparam IN NUMBER , outparam1 OUT TEST_TBL1.CHAR_COLUMN%type, outparam2 OUT TEST_TBL2.CHAR_COLUMN2%type)RETURN NUMBER
      IS
      BEGIN
      -- INパラメータの取得結果からoutparam1を設定
           SELECT
                CHAR_COLUMN
           into
                outparam1
           FROM
                TEST_TBL1
           WHERE
                KEY = inparam;
      -- outparam1を条件としてSQLを実行した場合、
      -- ORA1460が発生しABEND
           SELECT
                CHAR_COLUMN2
           into
                outparam2
           FROM
                TEST_TBL2
           WHERE
                CHAR_COLUMN1 = outparam1;
      RETURN 0;
      END TEST;
      END TESTPACK

      【DDLソース】
      CREATE TABLE "TEST_TBL1"
      (     "KEY" NUMBER NOT NULL ENABLE,
           "CHAR_COLUMN" CHAR(3 BYTE),
           PRIMARY KEY ("KEY")
      );
      CREATE TABLE "TEST_TBL2"
      (     "CHAR_COLUMN1" CHAR(3 BYTE),
      "CHAR_COLUMN2" CHAR(3 BYTE),
           PRIMARY KEY ("CHAR_COLUMN1")
      );