Java:在oracle数据库中调用存储过程

编辑:虽然这个问题的一些答案可以帮助其他人解决不同的问题,但解决方案实际上与数据库连接上的自动提交function有关! 在执行查询后强制提交导致数据库反映更改,因此下面显示的代码是调用此类存储过程的正确方法

我试图在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 ) ... 

我遇到麻烦的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中运行该过程时,我看到了结果。 我认为这可能是因为提交问题,但我建立的连接处于自动提交模式。

任何帮助,将不胜感激!

为了能够捕获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(); } } 

如果您使用不同的返回Map 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 parametros = new HashMap(); parametros.put("CONDOMINIO_IC", descricaoCondominio); parametros.put("BLOCO_IC", imovelCondominial.getBloco()); Map 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上测试过。

虽然这个问题中的一些答案可能会帮助其他人解决不同的问题,但解决方案实际上与数据库连接上的自动提交function有关! 在执行查询后强制提交导致数据库反映更改,因此问题中显示的代码是调用此类存储过程的正确方法!