繁体   English   中英

我正在尝试使用 JdbcTemplate 从 oracle 匿名块中读取一个值

[英]I am trying to read a value from oracle anonymous block using JdbcTemplate

我正在尝试使用 JdbcTemplate 从 oracle 匿名块中读取一个值。 这是我的 java 代码:

getJdbcTemplate().queryForObject(sql, Boolean.class);

这是 sql:

DECLARE
    CRS                SYS_REFCURSOR;

BEGIN

    OPEN CRS FOR SELECT CASE
                            WHEN
                                      1 > 0
                                THEN 1
                            ELSE 0
                            END
                 FROM DUAL;
END;

我收到此错误:

 SQL state [99999]; error code [17166]; Cannot perform fetch on a PLSQL statement: next; nested exception is java.sql.SQLException: Cannot perform fetch on a PLSQL statement: next

public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException采用 SQL 查询,该查询将生成具有单行的结果集,并使用返回结果集中的该行构造所需类型的 object。

代码:

DECLARE
  CRS SYS_REFCURSOR;
BEGIN
  OPEN CRS FOR
    SELECT CASE WHEN 1 > 0 THEN 1 ELSE 0 END FROM DUAL;
END;

打开一个 cursor,它包含一个单行的结果集; 然而,cursor 作为局部变量保存在 PL/SQL 匿名块中,永远不会“返回”给调用 PL/SQL 的应用程序代码。

传统的方法是在没有 PL/SQL 包装器的情况下使用 SQL:

String sql = "SELECT CASE WHEN 1 > 0 THEN 1 ELSE 0 END FROM DUAL";
getJdbcTemplate().queryForObject(sql, Boolean.class);

您可以尝试使用 PL/SQL 块中的DBMS_SQL.RETURN_RESULT ,但这只能从 Oracle 12 获得,并且它没有与传统 SQL 查询相同级别的支持,因此它可能无法工作:

DECLARE
  crs SYS_REFCURSOR;
BEGIN
  OPEN crs FOR
    SELECT CASE WHEN 1 > 0 THEN 1 ELSE 0 END FROM DUAL;
  DBMS_SQL.RETURN_RESULT(crs);
END;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM