我在检索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
呢?
这是因为 隐式
日期转换失败。添加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);
将设定日期in_cnt__date
;
最后,要获取以下内容中的值,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);
问题内容: 我知道您可以设置用户个人资料或设置查询的一般超时时间。 但是我希望对过程中的特定查询设置超时并捕获异常,例如: 这可能吗?我可以捕获所有超时异常吗?每个块或查询?找不到有关该主题的太多信息。 问题答案: 不,您不能在pl / sql中设置超时。为此,您可以使用宿主语言来嵌入sql和pl / sql。
问题内容: 我在另一个类()中有一个匿名内部类。 双方并返回空数组。 我在Javadocs中找不到关于此的一些提示。 可以使用反射以某种方式检索匿名内部类吗? 匿名内部类和普通内部类之间还有什么显着区别? 问题答案: 如果使用反射,那可能是一个非常糟糕的主意。抛开这些,我相信您可以在运行时添加其他内部类,因此列出可能尚未考虑的类没有意义。我想列出当前加载的类需要通过Java代理或类似的代理。 匿名
我需要为给定类的匿名祖先检索公理的子类。例如: 然后,我需要能够通过访问类的匿名祖先提供给类的公理,在类上检索。 现在我显然可以通过递归来实现,但是我想知道是否还有通过OWL API访问这些信息的另一种方式。事先谢谢你的帮助。
可能重复: 什么是双大括号初始化在Java? 在查看一些遗留代码时,我遇到了一些非常令人困惑的问题: 在调试模式下运行代码后,我发现匿名块是在调用构造函数之后调用的。上面的功能和做的有什么不同: ?我会认为它们在功能上是等价的,并且会认为后一种方式是更好/更干净的编写代码的方式。
问题内容: http://play.golang.org/p/vhaKi5uVmm [第一个问题] 我们如何以及为什么需要这种看起来很奇怪的结构?它是空结构还是匿名结构?我用谷歌搜索,但是找不到正确的答案或说明文档。 原始资料来自Andrew Gerrand的演讲 http://nf.wh3rd.net/10things/#10 这里 完成是struct {}类型的通道 所以我尝试了 但这是行不通
问题内容: 在Groovy中是否可以使用匿名代码块?例如,我正在尝试将以下Java代码转换为Groovy: 我能想到的最接近的翻译如下: 我知道匿名代码块通常是一种反模式。但是具有类似“ inputStream0”和“ inputStream1”之类的变量的变量也是一种反模式,因此对于我正在处理的这段代码,匿名代码块会有所帮助。 问题答案: 您可以在Groovy中使用匿名代码块,但这些代码和闭包之