私は以下のコードを使用してドキュメントやフォーラムを検索し、頑張っています。 最後に私はあなたに助けを求めることにしました。 私が持っているのは、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::間違った列の型)とも試してみました: あなたが間違ったメソッド呼び出しを使用しているようです
この問題を解決しますか?私はこのようなものに直面しています – Forhad
私が覚えている限り、我々はOracle上でそれを行いました。 jdbcがサポートしていたタイプのノードであったため、元の関数を呼び出すOracleでラップされた関数/ prodecureを書きましたが、新しいものには正しいパラメータ型がありました。元のものはdblinkによってアクセスされていたので、私たちのサーバでは何も変更できませんでした。 –