当前位置: 首页 > 面试题库 >

检索匿名PLSQL块结果

轩辕华辉
2023-03-14
问题内容

我在检索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中使用匿名代码块,但这些代码和闭包之