2013-03-19 25 views
6

私は以下のコードを使用してドキュメントやフォーラムを検索し、頑張っています。 最後に私はあなたに助けを求めることにしました。 私が持っているのは、TYPES、FUNCTION宣言、FUNCTION BODY宣言によるパッケージです。 将来私はMYPACKAGEにSYNONYMを使用したいと思います(私はデータベースでパッケージ宣言と型宣言はしませんが、プロシージャや関数を実行するためには外部データベースとJavaコードにdblinkを使用しますが、このデータベース・リンクがアクセス持ち)とmypackageとは、データベース・リンクを通じてアクセス可能なものになります。春のSimpleJdbcCallでStruggingしてOracle関数を呼び出す

create public synonym dblink_MYPACKAGE for [email protected]_externalDB; 

と私はJavaコードでdblink_MYPACKAGEの代わりに、mypackageとを使用することになります。 (しかし、これは問題ではないそれをしない?)外部データベースは我々ではないので、我々はそこに何かを変更することはできません...

public class TestClassSpringBased { 

private DataSource dataSource; 

private SimpleJdbcCall jdbcCall; 

@Override 
public void testMe(Integer id) { 

    int iid = 1; 
    SqlParameterSource in = new MapSqlParameterSource().addValue("IN_1", iid); 

    Map<String, Object> out = jdbcCall.execute(in); 

} 

public DataSource getDataSource() { 
    return dataSource; 
} 

public void setDataSource(DataSource dataSource) { 
    this.dataSource = dataSource; 
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); 
    jdbcTemplate.setResultsMapCaseInsensitive(true); 

    this.jdbcCall = new SimpleJdbcCall(dataSource) 
      .withCatalogName("MYPACKAGE") 
      .withProcedureName("MYFUNCTION") 
      .withReturnValue() 
      .useInParameterNames("IN_1") 
      .declareParameters(
        new SqlInOutParameter("IN_1", OracleTypes.NUMBER), 
        new SqlInOutParameter("OUT_1", OracleTypes.STRUCT, "MYPACKAGE.CUSTOMELEMENTSTYPE", 
          new SqlReturnType() { 
           public Object getTypeValue(CallableStatement cs, int colIndx, int sqlType, 
             String typeName) throws SQLException { 

            return null; //just let it work, the I will think what to write here 
           } 
          })); 

} 

} 





create or replace 
PACKAGE   MYPACKAGE IS 


    TYPE CUSTOMELEMENTSTYPE_R IS RECORD (
    C1 VARCHAR2(60), 
    C2 VARCHAR2(30) 

); 

    TYPE CUSTOMELEMENTSTYPE IS TABLE OF CUSTOMELEMENTSTYPE_R 
    INDEX BY PLS_INTEGER; 



FUNCTION MYFUNCTION(
    IN_1 IN INTEGER, OUT_1 OUT CUSTOMELEMENTSTYPE) 
RETURN VARCHAR2; 


    END; 



create or replace 
PACKAGE BODY MYPACKAGE IS 

    FUNCTION MYFUNCTION(
    IN_1 IN INTEGER, OUT_1 OUT CUSTOMELEMENTSTYPE) 
    RETURN VARCHAR2 IS 

    BEGIN 

SELECT * BULK COLLECT INTO OUT_1 
    FROM SOME_TABLE; 
    RETURN 'return param'; 
END MYFUNCTION; 

    END MYPACKAGE ; 

ERRORは次のとおりです。 org.springframework.jdbc.UncategorizedSQLException: CallableStatementCallback; SQLのための未分類のSQLException [{? = MYPACKAGE.MYFUNCTION(?,?)}]を呼び出します。 SQLステート[99999];エラーコード[17074]。無効な名前パターン:MYPACKAGE.CUSTOMELEMENTSTYPE;ネストされた例外はjava.sql.SQLExceptionです。無効な名前パターン:MYPACKAGE.CUSTOMELEMENTSTYPE

問題は、OUTパラメータのみを使用し、OUTパラメータを渡して別のバージョンのMYFUNCTIONに対して実行すると、同じコードが機能します。 OUTパラメータではありません。

私はOracleTypes.ARRAY(無効な名前のパターン)とOracleTypes.OTHER(に起因する1111:ます。java.sql.SQLException::間違った列の型)とも試してみました: あなたが間違ったメソッド呼び出しを使用しているようです

+1

この問題を解決しますか?私はこのようなものに直面しています – Forhad

+0

私が覚えている限り、我々はOracle上でそれを行いました。 jdbcがサポートしていたタイプのノードであったため、元の関数を呼び出すOracleでラップされた関数/ prodecureを書きましたが、新しいものには正しいパラメータ型がありました。元のものはdblinkによってアクセスされていたので、私たちのサーバでは何も変更できませんでした。 –

答えて

3

あなたのコード:

.withProcedureName( "MyFunctionを")[..].withFunctionNameに置き換える必要があります[...]

ここでは、全体の関数呼び出しのいくつかの簡単なexamleです3210

JdbcTemplate jdbc = new JdbcTemplate(txManager.getDataSource()); 
    SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbc) 
      .withCatalogName("p_adm_www") 
      .withFunctionName("fn_usr_get_login_sequence") 
      .declareParameters(new SqlOutParameter("RETURN", OracleTypes.NUMBER)) 
      .withoutProcedureColumnMetaDataAccess(); 
    jdbcCall.setAccessCallParameterMetaData(false); 
    BigDecimal returnId = jdbcCall.executeFunction(BigDecimal.class, null); 
    return returnId.longValue(); 
+0

offcourse INパラメータまたはINOUTパラメータを追加することができます。同じことが問題なく動作します。 –

関連する問題