source

Java에서 Oracle 함수 호출

ittop 2023. 7. 6. 22:35
반응형

Java에서 Oracle 함수 호출

Java 1.6에서 ojdbc14.jar를 사용하여 Oracle FUNCTION(저장 프로시저가 아님)을 호출하는 데 문제가 있습니다.

원격 서버에서 호출하기 때문에 함수에 무엇이 포함되어 있는지 알 수 없습니다. 아는 것은 다음과 같습니다.

FUNCTION ap_ch_get_acct_balances (VAR_PI_MOB_NO_ACCT_NO VARCHAR2,
VAR_REPLY_CODE OUT NUMBER, VAR_EXT_RESPONSE OUT VARCHAR2, VAR_PO_ACC_BAL OUT CHAR,
VAR_PO_ACCT_NO OUT CHAR)   

사용할 스키마는 FCRLIVE.AP_CH_GET_ACCT_BALANS입니다.

저는 이것을 시도 중입니다.

String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
CallableStatement cstmt = conn.prepareCall(call);
cstmt.setQueryTimeout(1800);
cstmt.setString(1, inputCode);
cstmt.registerOutParameter(2, oracle.jdbc.OracleTypes.NUMBER);
cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.VARCHAR);
cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CHAR);
cstmt.registerOutParameter(5, oracle.jdbc.OracleTypes.CHAR);
cstmt.executeUpdate();

하지만 로그 파일에 계속 표시됩니다.

java.sql.SQLException: ORA-01006: bind variable does not exist
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573)
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1891)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2688)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)

제가 그 기능을 잘못 부르고 있나요?아니면 이것이 무엇일까요?

도움을 주셔서 미리 감사드립니다!

다음과 같아야 합니다.

String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";

함수에 의해 반환되는 파라미터를 정의해야 합니다.

String call = "{ ? = call FCRLIVE.AP_CH_GET_ACCT_BALANCES(?, ?, ?, ?, ?) }";
                  CallableStatement cstmt = conn.prepareCall(call);
                  cstmt.setQueryTimeout(1800);
                  cstmt.registerOutParameter(1, ...Type returned by function);
                  cstmt.setString(2, inputCode);
                  cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.NUMBER);
                  cstmt.registerOutParameter(4, oracle.jdbc.OracleTypes.VARCHAR);
                  cstmt.registerOutParameter(5, oracle.jdbc.OracleTypes.CHAR);
                  cstmt.registerOutParameter(6, oracle.jdbc.OracleTypes.CHAR);
                  cstmt.executeUpdate();

반환 매개 변수는 하나뿐입니다.첫 번째 것그것이 당신이 그것의 유형을 등록해야 하는 유일한 것입니다. 그러므로, 먼저:

cstmt.registerOutParameter(1, oracle.jdbc).Oracle 유형.VARCHAR);

그런 다음 필요에 따라 다른 매개 변수를 설정/등록합니다. 그러나 물음표와 같이 6개의 매개 변수가 있고 5개만 처리합니다. 6번째 매개 변수도 설정해야 합니다.

cstmt.setString(6, myVariable);

명확하지 않다면, 당신이 사용하고 있는 sql 함수의 프로토타입을 게시해 주십시오. 제가 당신에게 정확한 누락 바인딩을 알려드리겠습니다.

실제로 그렇게 하는 방법은 여러 가지가 있습니다.하지만 그 중 가장 쉬운 것은 질문을 던지는 것입니다.방법은 다음과 같습니다.

String sql="select myFunction('"+number+"','"+date"') from dual";
statement.execute(sql);

JDBC를 사용하는 경우 입력 및 출력 파라미터를 설정합니다.

최대 절전 모드를 사용하는 경우 다음과 같은 명명된 쿼리를 사용합니다.Mapping.hbm.xml

<sql-query name="my_function" callable="true">
<return alias="demo" class="net.bean.Demo">
<return-property name="id" column="id"/>
<return-property name="fname" column="fname"/>
<return-property name="lname" column="lname"/>
</return>
    {?=call demoFunc(:param1,:param2)}
</sql-query>

이제 함수에 대한 명명된 쿼리가 생성됩니다.

다음으로 해야 할 일은 다음 코드를 사용하여 간단히 호출하는 것입니다.

Query query=session.getNamedQuery("my_function");
query.setParameter("parma1",date);
query.setParameter("parma2",number);
query.executeUpdate();

hbm.xml 파일에서 반환 클래스 이름과 속성은 함수가 적절한 값을 반환하는 경우 반환 값을 매핑한 경우에만 적용됩니다.

언급URL : https://stackoverflow.com/questions/13158212/call-an-oracle-function-from-java

반응형