Java 检索匿名PLSQL块结果

Java 检索匿名PLSQL块结果,java,oracle,plsql,Java,Oracle,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_UPDAT

在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\u cnt\u 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\u cnt\u id

PL/SQL
代码中删除所有
异常处理程序,然后执行块,您将看到错误发生的确切行号

Raise
内部异常永远不会让您知道确切的错误详细信息。请阅读《聚焦于提升》部分


执行此操作后,您将发现存在数据类型转换问题。

PL/SQL
代码中删除所有
异常处理程序,然后执行该块,您将看到发生错误的确切行号

Raise
内部异常永远不会让您知道确切的错误详细信息。请阅读《聚焦于提升》部分


执行此操作后,您将发现存在数据类型转换问题。

PL/SQL
代码中删除所有
异常处理程序,然后执行该块,您将看到发生错误的确切行号

Raise
内部异常永远不会让您知道确切的错误详细信息。请阅读《聚焦于提升》部分


执行此操作后,您将发现存在数据类型转换问题。

PL/SQL
代码中删除所有
异常处理程序,然后执行该块,您将看到发生错误的确切行号

Raise
内部异常永远不会让您知道确切的错误详细信息。请阅读《聚焦于提升》部分


一旦执行此操作,您将发现存在数据类型转换问题。

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

隐式转换通常取决于会话的
NLS\u DATE\u格式

在您的案例中,日期:='&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\u cnt\u 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);

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

隐式转换通常取决于会话的
NLS\u DATE\u格式

在您的案例中,日期:='&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\u cnt\u 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);

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

隐式转换通常取决于会话的
NLS\u DATE\u格式

在您的案例中,日期:='&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\u cnt\u 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);

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

隐式转换通常取决于会话的
NLS\u DATE\u格式

在您的案例中,日期:='&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\u cnt\u 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);

删除所有异常处理程序并执行块,yiu将看到发生错误的确切行号。这是因为隐式日期转换失败。将
添加到_DATE()
,而不是直接将日期字符串赋给日期变量。隐式转换通常取决于会话的
NLS\u DATE\u格式
。看起来您试图将参数传递给匿名块,我认为这是不可能的。删除所有异常处理程序并执行块,yiu将看到发生错误的确切行号。这是因为隐式日期转换失败。将
添加到_DATE()
,而不是直接将日期字符串赋给日期变量。隐式转换通常取决于会话的
NLS\u DATE\u格式
。看起来您正在尝试