Java:在oracle数据库中调用存储过程
EDIT:虽然此问题中的一些答案可能会帮助其他人解决不同的问题,但解决方案实际上与数据库连接上的自动提交功能的某些错误有关!执行查询后强制提交会导致数据库反映更改,因此下面显示的代码是调用此类型存储过程的正确方法 我试图调用oracle数据库中的一个简单存储过程 程序如下所示:Java:在oracle数据库中调用存储过程,java,sql,oracle,stored-procedures,jdbc,Java,Sql,Oracle,Stored Procedures,Jdbc,EDIT:虽然此问题中的一些答案可能会帮助其他人解决不同的问题,但解决方案实际上与数据库连接上的自动提交功能的某些错误有关!执行查询后强制提交会导致数据库反映更改,因此下面显示的代码是调用此类型存储过程的正确方法 我试图调用oracle数据库中的一个简单存储过程 程序如下所示: procedure clear_orderProcDtlByOrdId(p_order_id in order_header.order_id%type,
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();
}
我没有收到任何错误,但是没有反映任何数据库更改。在SQLDeveloper中运行该过程时,我会看到结果。我想可能是因为提交问题,但我建立的连接处于自动提交模式
任何帮助都将不胜感激 要在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();
}
}
如果以这种方式使用不同的返回映射SimpleJDBCall:
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());
在这里工作。看看这个博客
在Oracle 10xe和11xe上测试。虽然此问题中的一些答案可能会帮助其他人解决不同的问题,但该解决方案实际上与数据库连接上的自动提交功能的某些错误有关!执行查询后强制提交会导致数据库反映更改,因此问题中显示的代码是调用此类型存储过程的正确方法 数据库中的orderID是否设置为VARCHAR?@PremGenError orderID是数据库中的VARCHAR2尝试在参数周围加引号,然后在第2行:storedProc.setString(“1”,“orderID”)@twoleggedhorse这会导致
PLS-00707:不支持的构造或内部错误[2603]
@user2076524如果从参数名中删除引号,是否仍会出现错误?storedProc.setString(“1”,订单ID);
create or replace PROCEDURE PROCED_CONDOMINIAL
(CONDOMINIO VARCHAR2,
BLOCO VARCHAR2,
NUMERO OUT NUMBER,
LOG OUT VARCHAR2) -- PARAMETROS DE SAIDAS (OUT).-