gpt4 book ai didi

java - 检索匿名 PLSQL block 结果

转载 作者:行者123 更新时间:2023-12-01 22:40:49 24 4
gpt4 key购买 nike

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

这是 block :

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: 在需要数字的地方发现了非数字字符
ORA-06512: 在第 1 行

那么如何检索 hv_cnt_id

最佳答案

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

隐式转换通常取决于 session 的 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);

将为in_cnt__date设置日期;

最后,检索hv_cnt_id中的值以下内容已添加到您的 PL/SQL block

"? := hv_cnt_id;"

从 JDBC 中,我们得到这样的结果:

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

关于java - 检索匿名 PLSQL block 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26182869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com