2016-05-26 7 views
0

呼び出し可能なステートメントを使用してデータベース関数を呼び出そうとしています。ストアドプロシージャの署名は以下の通りです。受信java.sql.SQLException:データベース関数を呼び出す際に無効な列インデックスエラー

function DUMMY_FUNCTION (PARAM1   in Number 
           ,PARAM2 in Number 
           ,PARAM3 in varchar2 
           ,PARAM4   in Number 
           ,PARAM5   in Date 
           ,PARAM6   in Number 
           ,PARAM7   out varchar2 
           ,PARAM8   out varchar2) 

return varchar2;

と呼び出すためのJavaコードは以下の通りです:

//Load SQl Binaries 
 
import java.sql.CallableStatement; 
 
import java.sql.Connection; 
 
import java.sql.Date; 
 
import java.sql.DriverManager; 
 
import java.text.SimpleDateFormat; 
 

 
public class InvokeProcedure { 
 

 
public static String callProcedure(int PARAM1,int PARAM2,String PARAM3,int PARAM4,String PARAM5,int PARAM6) throws Exception { 
 
    //Defining Parameters 
 
\t String result = new String(); 
 
    Connection conn = null; 
 
    CallableStatement cs = null; 
 
    String outParam = null; 
 
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); 
 
    try { 
 
     conn = getDBConnection(); 
 

 
     String proc3Function = 
 
      "{? = call P1SCHEMA.DUMMY_PACKAGE.DUMMY_FUNCTION(?, ?, ?, ?, ?, ?) }"; 
 
     conn.setAutoCommit(false); 
 
     cs = conn.prepareCall(proc3Function); 
 
     java.sql.Date param5date = new java.sql.Date(sdf.parse(PARAM5).getTime()); 
 
     //DefiningInput Parameters 
 
     cs.setInt(1, PARAM1); 
 
     cs.setInt(2, PARAM2); 
 
     cs.setString(3, PARAM3); 
 
     cs.setInt(4, PARAM4); 
 
     cs.setDate(5, param5date); 
 
     cs.setInt(6, PARAM6); 
 
     //Defining Output Parameters 
 
     cs.registerOutParameter(7, java.sql.Types.VARCHAR); 
 
     cs.registerOutParameter(8, java.sql.Types.VARCHAR); 
 
     cs.registerOutParameter(9, java.sql.Types.VARCHAR); 
 
     //Execute Statement 
 
     cs.execute(); 
 
     //Capture Output 
 
     outParam = cs.getString(8); 
 
     String I = new String(outParam); 
 
     //Set Resultant Array 
 
     result = I.toString() + "###" + cs.getString(7) + "###" + cs.getString(8) + "###" + cs.getString(9); 
 
     //Check the Reason Code Returned from Stored Procedure 
 
     if (outParam == "S") 
 
     { 
 
      //Roll back Transaction 
 
     \t conn.rollback(); 
 
     } 
 
     else 
 
     { 
 
      //Commit Transaction 
 
     \t conn.commit(); 
 
     } 
 

 
    } 
 
    catch (Exception e) 
 
    { 
 
     e.printStackTrace(); 
 
    } 
 

 
    finally 
 
    { 
 
     if (cs != null) 
 
     { 
 
      //Close Connection 
 
     \t cs.close(); 
 
     } 
 
     if (conn != null) 
 
     { 
 
     \t //Close Connection 
 
     \t conn.close(); 
 
     } 
 
    } 
 
    // Return Array to Client 
 
    return result; 
 
} 
 

 
public static Connection getDBConnection() throws Exception { 
 
\t String driver = "oracle.jdbc.xa.client.OracleXADataSource"; 
 
\t String url = "jdbc:oracle:thin:@localhost:1539:DEV"; 
 
\t String username = "user"; 
 
\t String password = "password"; 
 

 
\t Class.forName(driver); 
 
\t Connection conn = DriverManager.getConnection(url, username, password); 
 
\t return conn; 
 
\t } 
 

 

 
public static void main(String args[]) throws Exception{ 
 

 
\t InvokeProcedure INP = new InvokeProcedure(); 
 
String Args = INP.callProcedure(1,2,"A",3,"2016-01-23",4); 
 

 
System.out.println(Args); 
 

 
} 
 
}

私は以下の例外を取得していますJavaプログラムを実行している間は、私がやっていないことを確認どこが間違っ

java.sql.SQLException: Invalid column index 
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70) 
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:199) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:263) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:271) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:445) 
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:122) 
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:288) 
at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:379) 
at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1568) 

ありがとう

+0

あなたの関数のみ2パラメータアウトを持っていますが、あなたは3 – Stan

+0

こんにちはスタンを登録しているスキーマを構築しながら、私は、最後にまた戻りVARCHAR2を持っているように思え、私は3つのパラメータを取得しています。 – user3368821

+0

申し訳ありませんが、それはスニペットの外だったのでそれを逃した。あなたは文を持っているので、最初に出力パラメータを登録する必要があると思いますか? ' = ... 'だからcs.registerOutParameter(1、java.sql.Types.VARCHAR);そして最後に他のパラメータがなくても – Stan

答えて

0

によって当然の最後の1ずに他のパラメータは、関数は、8つのパラメータがありますが、コールはわずか6 (?, ?, ?, ?, ?, ?)があります

"{? = call P1SCHEMA.DUMMY_PACKAGE.DUMMY_FUNCTION(?, ?, ?, ?, ?, ?) }"; 

用途:

"{? = call P1SCHEMA.DUMMY_PACKAGE.DUMMY_FUNCTION(?, ?, ?, ?, ?, ?, ?, ?) }"; 

アンその後 - 位置パラメータ?は、左から右に番号が付けられます。

  • {? = - これは、それのインデックスは、連続して2,3,4があるcs.registerOutParameter(1, java.sql.Types.SomeType)
  • (?, ?, ?, ?, ?, ?, ?, ?)
    使用、1最初のパラメータです.... 8,9パラメータ

使用:インデックスと

cs.setInt(2, PARAM1); 
cs.setInt(3, PARAM2); 
cs.setString(4, PARAM3); 
... 

二つの最後のパラメータ:8,9はOUTパラメータです - 使用してそれらを登録:

cs.registerOutParameter(8, java.sql.Types.VARCHAR); 
cs.registerOutParameter(9, java.sql.Types.VARCHAR); 
0

申し訳ありませんが、それはスニペットの外だったのでそれを逃した。あなたは文を持っているので、最初に出力パラメータを登録する必要があると思いますか? ' = ... 'だからcs.registerOutParameter(1、java.sql.Types.VARCHAR);その後、スタン

関連する問題