【问题标题】:Calling Oracle Procedure调用 Oracle 过程
【发布时间】:2025-11-23 20:25:01
【问题描述】:

我有一个在插入 oracle 的同时调用 oracle 过程的方法,插入语句有效,但该过程不起作用。我没有收到任何错误。谁能明白为什么这不起作用?

Class.forName("oracle.jdbc.driver.OracleDriver");
String connectionString = "jdbc:oracle:thin:@" + oracle_ip_address + ":" + oracle_db_port + ":" + oracle_db_sid;
Connection conn = DriverManager.getConnection(connectionString, oracle_db_username, oracle_db_password);

ResultSet rs = stmt.executeQuery("Select * from Dropper"); 

CallableStatement cs = conn.prepareCall("{ call TTMS.job_vacationconflict_notify(?,?,?)}");

SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");

    Statement stmt2 = conn.createStatement();

    while (rs.next()){
        String di = rs.getString("DROPPER_ID");
        String sd = rs.getString("BEGIN_DT").replace(" 00:00:00.0", "");
        String ed = rs.getString("END_DT").replace(" 00:00:00.0", "");
        String vi = rs.getString("VACATION_ID");
        String md = rs.getString("MODIFY_DT").replace(" 00:00:00.0", "");

        query = "INSERT INTO DROPPER_VACATIONS(DROPPER_ID, BEGIN_DT, END_DT, CREATE_DT, CREATE_BY, MODIFY_DT, MODIFY_BY, COMMENTS, VACATION_ID) "
        + "VALUES ('"+di+"',to_date('"+sd+"','YYYY-MM-DD'),to_date('"+ed+"','YYYY-MM-DD'),sysdate,'MJRUTLED',to_date('"+md+"','YYYY-MM-DD'),'MJRUTLED','','"+vi+"')";

        stmt2.executeUpdate(query);

        cs.setInt(1,Integer.parseInt(di));
        cs.setString(2,sdf.parse(sd).toString());
        cs.setString(3,sdf.parse(ed).toString());

        cs.execute();
    }

【问题讨论】:

  • “但程序没有” - 你能解释一下吗?
  • 数据已正确插入表中,但过程未执行。
  • @Mike 你在做什么来假设该过程没有执行?你能给我们一些关于 job_vacationconflict_notify 的背景吗?
  • @Perception 该程序应该发送电子邮件,该程序运行正常,cs.set 语句之后的任何打印语句都不会打印任何内容
  • 看起来你正在破坏你的日期,因为你将它们传递给你的存储过程调用。您可能应该只传递字符串sded。请记住,在日期上调用 toString() 只会以 JDK 指定的默认格式将其打印出来,这可能不是您想要做的。

标签: java oracle callable-statement


【解决方案1】:

您的程序是否需要日期作为输入?如果是这样,请尝试传递日期值,而不是依赖隐式转换。如果 SP 需要字符串,请确保您以与 SP 期望的方式完全相同的方式格式化日期(在两侧添加调试打印,dbms_outputdbms_pipe 是你的朋友)。

另外,请考虑对query 使用参数替换;此代码请求用于 SQL 注入 %)

【讨论】:

  • 我更改了代码,使其包含日期,但仍然无法正常工作cs.setInt(1,Integer.parseInt(di)); cs.setDate(2,(java.sql.Date)sdf.parse(sd)); cs.setDate(3,(java.sql.Date)sdf.parse(ed)); cs.execute();
  • 检查日期格式是否正确,我看到 2 种不兼容的不同格式:代码中的 SimpleDateFormat("dd-MMM-yyyy") 和 'YYYY-MM-DD'