UFO ET IT

Java에서 Oracle의 사용 재개(JDBC, 준비된 설명문)

ufoet 2023. 6. 22. 23:05
반응형

Java에서 Oracle의 사용 재개(JDBC, 준비된 설명문)

JDBC를 사용하여 다음과 같은 Oracle 문을 실행하고 있습니다.

"INSERT INTO MYTABLE(MYDATA) VALUES(?) RETURNING MY_CALCULATED_DATA INTO ?"
// MYTABLE's def makes MY_CALCULATED_DATA be auto-generated by DB on insert

위의 문장을 자바로 부르는 몇 가지 방법을 찾았는데, 주로 다음과 같습니다.

  • Oracle Preparated Statement 사용:

    ps = (OraclePreparedStatement)conn.prepareStatement(sql);
    ps.setString(1, "myvalue");
    ps.registerReturnParameter(2, Types.VARCHAR);
    ps.execute();
    rs = ps.getReturnResultSet();
    rs.next();
    System.out.print(rs.getString(1));
    
  • 호출 가능한 문 사용:

    cs = conn.prepareCall(sql);
    cs.setString(1, "myvalue");
    cs.registerOutParameter(2, Types.VARCHAR);
    cs.execute();
    System.out.print(cs.getString(1));
    

질문:

  1. 메소드 #2는 "SQL 예외: 모든 반환 매개 변수가 등록된 것은 아니지만 SQL 문을 "BEGIN...END;"로 묶으면 메서드 #2가 제대로 작동합니다.
    • BEGIN 없이 #1 방법이 작동하는 이유END" 그러나 방법 #2에는 "BEGIN..."" 작업?
    • 어떤 종류의 "마법적인" "BEGIN..END"는 "모든 매개 변수가 등록되지 않은" 문제가 갑자기 해결되도록 문에 적용됩니까?

  2. 위와 같은 것들을 할 수 있는 세 번째, 더 나은 방법이 있습니까?

감사합니다, AG.

반환 절에 지정된 파라미터는 일반 출력 파라미터(getReturnResultSet vs getResultSet vs. 호출 가능한 문에서 반환 파라미터)와 비교하여 다른 방식으로 처리되기 때문입니다.
Oracle Preparated Statement를 사용하여 처리해야 합니다.두 번째 경우에는 insert 문을 begin에서 랩핑합니다.삽입 끝은 데이터베이스 자체에서 처리되며 aljdbc는 익명 plsql 블록을 봅니다.
http://docs.oracle.com/cd/E11882_01/java.112/e16548/oraint.htm#BABJJDDA

자동 생성된 키를 가져오려면 prepare 문에 getGeneratedKeys 메서드가 있습니다. 이 메서드는 키 값을 포함하는 반환 결과 집합으로, 문을 준비하기 위해 키 열 이름만 전달하면 됩니다.

pstm = con.prepareStatement("insert query",new String[]{primarykeycolumnname});
int i = pstm.executeUpdate();
if (i > 0) 
{
    ResultSet rs = pstm.getGeneratedKeys();
    while(rs.next())
    {
        System.out.println(rs.getString(1)); 
    }
}

언급URL : https://stackoverflow.com/questions/17320205/oracles-returning-into-usage-in-java-jdbc-prepared-statement

반응형