有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java检索匿名PLSQL块结果

在java中检索匿名PLSQL块的结果时遇到一些问题

这里是街区:

DECLARE
in_cnt_date DATE := '&1';
hv_cnt_id NUMBER := 0;
BEGIN
DBMS_OUTPUT.ENABLE (NULL);
INSERT INTO dt_contexts
(CNT_ID, CNT_CONTEXT, CNT_TYPE, CNT_SOURCE, CNT_COMMENT, CNT_DATE, CNT_DATE_INSERT, CNT_DATE_UPDATE)
VALUES
(0, 'EPE_CONTEXT', 'ROUTE', 'bdd', 'Built from ROUTE', in_cnt_date, SYSDATE, SYSDATE);

SELECT SEQ_DT_CNT_ID.CURRVAL
INTO hv_cnt_id
FROM DUAL;
EXCEPTION WHEN OTHERS THEN RAISE ;
END;

我把这个查询放在一个字符串中:

public static final String CONTEXT = "DECLARE in_cnt__date DATE := '&1'; " +
"hv_cnt_id NUMBER := 0; " +
"BEGIN DBMS_OUTPUT.ENABLE (NULL); " +
"INSERT INTO dt_contexts (CNT_ID, CNT_CONTEXT, CNT_TYPE, CNT_SOURCE, CNT_COMMENT, CNT_DATE, CNT_DATE_INSERT, CNT_DATE_UPDATE) " +
"VALUES (0, 'EPE_CONTEXT', 'ROUTE', 'bdd', 'Built from ROUTE', ?, SYSDATE, SYSDATE); " +
"SELECT SEQ_DT_CNT_ID.CURRVAL INTO hv_cnt_id FROM DUAL; " +
"EXCEPTION WHEN OTHERS THEN RAISE ; END;";

那根线对吗

尝试检索hv_cnt_id的方法:

public int getContextId(Connection conn) throws Exception {
    CallableStatement cs = null;
    ResultSet rs = null;
    int contextId = 0;
    try {
        conn.setAutoCommit(false);
        cs = conn.prepareCall(CONTEXT);
        cs.setDate(1, (java.sql.Date) Route.datePrf);

        cs.execute();
        contextId = (Integer) cs.getObject(1);

        conn.commit();
    } catch (Exception e) {
        e.printStackTrace();
        throw e;
    } finally {
        close(rs, cs);
    }
    return contextId;
}

它不起作用,因为我得到了这个信息:

java.sql.SQLException: ORA-01858: a non-numeric character was found where a numeric was expected ORA-06512: at line 1

那么我如何检索hv_cnt_id


共 (1) 个答案

  1. # 1 楼答案

    这是因为隐式日期转换失败。添加TO_DATE(),而不是直接将日期字符串赋给日期变量。如果使用java.sql.Date,则不需要TO_DATE()

    隐式转换通常取决于会话的NLS_DATE_FORMAT

    在你的情况下in_cnt__date DATE := '&1'是罪魁祸首&1将实际尝试转换为日期。。因此引发了异常

    public static final String CONTEXT = "DECLARE in_cnt__date DATE := ? ;" +
    "hv_cnt_id NUMBER := 0; " +
    "BEGIN DBMS_OUTPUT.ENABLE (NULL); " +
    "INSERT INTO dt_contexts (CNT_ID, CNT_CONTEXT, CNT_TYPE, CNT_SOURCE, CNT_COMMENT, CNT_DATE, CNT_DATE_INSERT, CNT_DATE_UPDATE) " +
    "VALUES (0, 'EPE_CONTEXT', 'ROUTE', 'bdd', 'Built from ROUTE', in_cnt__date, SYSDATE, SYSDATE); " +
    "SELECT SEQ_DT_CNT_ID.CURRVAL INTO hv_cnt_id FROM DUAL; " +
    "? := hv_cnt_id;
    "EXCEPTION WHEN OTHERS THEN RAISE ; END;";
    

    然后

    cs.setDate(1, (java.sql.Date) Route.datePrf);
    

    将为^{设置日期

    最后,检索hv_cnt_id中的值 以下内容将添加到PL/SQL块中

    "? := hv_cnt_id;"
    

    从JDBC我们可以看到

     cs.setDate(1, (java.sql.Date) Route.datePrf);
     cs.registerOutParameter(2, Types.NUMBER);
     cs.execute();
     contextId = cs.getInt(2);