2013-02-15 5 views
5

EDIT: хотя некоторые ответы в этом вопросе могут помочь другим людям с различными проблемами, решение фактически связано с некоторой ошибкой с функцией автоматической фиксации в соединении с базой данных! Принуждение фиксации после выполнения запроса заставило базу данных отражать изменения, поэтому приведенный ниже код является правильным способом вызова хранимой процедуры такого типаJava: вызов хранимой процедуры в базе данных оракула

Я пытаюсь вызвать простую хранимая процедуру в оракуле база данных.

Процедура выглядит следующим образом:

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) 
... 

Java-кода У меня возникли проблемы с внешностью, как этот

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

есть заказID установлен в VARCHAR в БД? – PermGenError

+0

@PremGenError orderID - это VARCHAR2 в БД – aeros

+0

Попробуйте помещать кавычки вокруг параметра, а затем в строке 2: storedProc.setString («1», «orderID»); – twoleggedhorse

ответ

1

Хотя некоторые ответы в этом вопросе могут помочь другим людям с различными проблемами, решение действительно связано с некоторой ошибкой с функцией автоматической фиксации в соединении с базой данных! При принудительной фиксации после выполнения запроса база данных отражала изменения, поэтому код, показанный в вопросе, является правильным способом вызова хранимой процедуры этого типа!

1

Чтобы уметь возвращать процедуру в базе данных Oracle, попробуйте это.

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 так:

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).- 

Работала здесь. Посмотрите на этот блог.

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

Проверено на Oracle 10xe и 11xe.

Смежные вопросы