Java 调用Oracle过程

Java 调用Oracle过程,java,oracle,callable-statement,Java,Oracle,Callable Statement,我有一个方法,在将insert语句插入oracle的同时调用oracle过程,insert语句起作用,但过程不起作用。我没有收到任何错误。有人知道为什么这不起作用吗 Class.forName("oracle.jdbc.driver.OracleDriver"); String connectionString = "jdbc:oracle:thin:@" + oracle_ip_address + ":" + oracle_db_port + ":" + oracle_db_sid; Conn

我有一个方法,在将insert语句插入oracle的同时调用oracle过程,insert语句起作用,但过程不起作用。我没有收到任何错误。有人知道为什么这不起作用吗

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();
    }

您的过程是否希望输入日期?如果是,请尝试传递日期值,而不要依赖隐式转换。如果SP需要字符串,请确保日期的格式与SP所需的格式完全相同(在两侧添加调试打印,
dbms\u输出
dbms\u管道
是您的朋友)


也请考虑使用参数替换<代码>查询< /代码>;这段代码请求SQL注入)

“但过程没有”-您能解释一下吗?数据正确地插入到表中,但过程没有执行。@Mike您如何假设过程没有执行?你能给我们一些关于job_vacationconflict_notify的上下文吗?@Perception该过程应该发送电子邮件,该过程工作正常,
cs之后的任何打印语句。set
语句不打印任何内容在将日期传递到存储过程调用时,看起来你正在删除日期。您可能只需要传递字符串
sd
ed
。请记住,在日期上调用
toString()
只会以JDK指定的默认格式打印出来,这可能不是您想要做的。我更改了代码,使其接收日期,但仍然无法工作
cs.setInt(1,Integer.parseInt(di));setDate(2,(java.sql.Date)sdf.parse(sd));setDate(3,(java.sql.Date)sdf.parse(ed));cs.execute()检查日期格式是否正确,我在代码中看到两种不兼容的格式:SimpleDataFormat(“dd-MMM-yyy”)和“yyy-MM-dd”