2013-02-15 3 views
5

편집 :이 질문에 대한 답변 중 일부는 다른 문제점을 가진 다른 사용자에게 도움이 될 수 있지만 솔루션은 실제로 데이터베이스 연결의 자동 커미트 기능과 관련된 일부 버그와 관련이 있습니다! 쿼리를 실행 한 후 커밋을 실행하면 데이터베이스에 변경 내용이 반영되므로 아래에 표시된 코드가이 유형의 저장 프로 시저를 호출하는 올바른 방법입니다.Java : 오라클 데이터베이스의 스토어드 프로 시저 호출

Oracle에서 간단한 저장 프로 시저를 호출하려고합니다. 데이터 베이스.

procedure clear_orderProcDtlByOrdId(p_order_id in order_header.order_id%type, 
            p_transaction_id in sl_order_processing_dtl.transaction_id%type DEFAULT NULL, 
            p_item_action_id in sl_order_processing_dtl.item_action_id%type DEFAULT NULL) 
... 

내가 전혀 오류를받을 수없는이

try 
    { 
     CallableStatement storedProc = conn.prepareCall("{call PKG_PI_FRAUD.clear_orderProcDtlByOrdId(?)}"); 
     storedProc.setString(1, orderID); 
     storedProc.execute(); 
    } 
    catch (SQLException e) 
    { 
     e.printStackTrace(); 
    } 

같은 외모에 문제가 자바 코드, 그러나 거기 번호 :

절차는 다음과 같습니다 데이터베이스 변경 사항이 반영됩니다. SQL Developer에서 프로 시저를 실행하면 결과가 표시됩니다. 커밋 문제로 인한 것일 수 있다고 생각했지만, 내가 만든 연결은 자동 커밋 모드입니다.

도움이 될 것입니다.

+0

은 DB에서 VARCHAR로 orderID를 설정 했습니까? – PermGenError

+0

@PremGenError orderID는 DB의 VARCHAR2입니다 – aeros

+0

다음 줄 2의 매개 변수를 따옴표로 묶으십시오. storedProc.setString ("1", "orderID"); – twoleggedhorse

답변

1

이 질문에 대한 답변 중 일부는 다른 문제를 가진 다른 사용자에게 도움이 될 수 있지만 솔루션은 실제로 데이터베이스 연결에 자동 커밋 기능이있는 버그와 관련이 있습니다! 쿼리를 실행 한 후 커밋을 실행하면 데이터베이스에 변경 내용이 반영되므로이 유형의 저장 프로 시저를 호출하는 올바른 방법은 질문에 표시된 코드입니다.

1

Oracle 데이터베이스에서 프로 시저 리턴을 캡처하려면 다음을 시도하십시오.

SimpleJdbcCall call = Util.getSimpleJdbcCallInstance(); 
    call.setProcedureName("PROCED_CONDOMINIAL"); 
    call.declareParameters(
      new SqlParameter("CONDOMINIO", Types.VARCHAR), 
      new SqlParameter("BLOCO", Types.VARCHAR),, 
      new SqlOutParameter("P_NUMERO", Types.NUMERIC), 
      new SqlOutParameter("P_LOG", Types.VARCHAR)); 

    Map<String, Object> parametros = new HashMap<String, Object>(); 
    parametros.put("CONDOMINIO_IC", descricaoCondominio); 
    parametros.put("BLOCO_IC", imovelCondominial.getBloco()); 

    Map<String, Object> out = call.execute(parametros); 
    BigDecimal chave = (BigDecimal) out.get("P_NUMERO"); 
    imovelCondominial.setId(chave.longValue()); 

여기에 근무하는 절차

create or replace PROCEDURE   PROCED_CONDOMINIAL 
       (CONDOMINIO   VARCHAR2, 
       BLOCO     VARCHAR2, 
       NUMERO    OUT NUMBER, 
       LOG     OUT VARCHAR2)  -- PARAMETROS DE SAIDAS (OUT).- 

의 선언 :

public static void main(String[] args) { 

     try { 

      Class.forName("oracle.jdbc.driver.OracleDriver"); 
      String url = "jdbc:oracle:thin:@localhost:1521:xe"; 
      Connection con = DriverManager.getConnection(url, db_user, password); 
      System.out.println("Connected to database"); 

      SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
      Date now = new java.sql.Date(simpleDateFormat.parse("12/02/2001").getTime()); 

      String command = "{call SALDOS(?,?)}"; 
      CallableStatement cstmt = con.prepareCall(command); 
      cstmt.registerOutParameter(2, Types.DECIMAL); 

      cstmt.setDate(1, now); 
      cstmt.execute(); 
      Double str = cstmt.getDouble(2); 

      cstmt.close(); 
      System.out.println("Retorno: " + str); 

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

다른 반환 값을 사용하는 경우

는 SimpleJdbcCall이 방법을지도. 이 블로그를보십시오.

http://jameajudo.blogspot.com.br/2009/03/call-procedure-oracle-with-java-and.html

오라클 10xe 및 11xe에서 테스트.

관련 문제