首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我正在尝试使用JdbcTemplate从oracle匿名块读取一个值。

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

Stack Overflow用户
提问于 2022-02-24 12:01:05
回答 1查看 209关注 0票数 2

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

代码语言:javascript
运行
复制
getJdbcTemplate().queryForObject(sql, Boolean.class);

下面是sql:

代码语言:javascript
运行
复制
DECLARE
    CRS                SYS_REFCURSOR;

BEGIN

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

我收到这个错误:

代码语言:javascript
运行
复制
 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-25 10:26:19

public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException接受一个SQL查询,该查询将生成带有单个行的结果集,并使用返回的结果集使用该行构造所需类型的对象。

守则:

代码语言:javascript
运行
复制
DECLARE
  CRS SYS_REFCURSOR;
BEGIN
  OPEN CRS FOR
    SELECT CASE WHEN 1 > 0 THEN 1 ELSE 0 END FROM DUAL;
END;

打开包含带有单个行的结果集的游标;但是,游标作为PL/SQL匿名块中的局部变量保存,永远不会“返回”调用PL/SQL的应用程序代码。

传统的方法是不用PL/SQL包装器使用SQL:

代码语言:javascript
运行
复制
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,但只能从Oracle12中获得,而且它没有传统SQL查询所提供的相同级别的支持,因此可能无法工作:

代码语言:javascript
运行
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71251636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档