簡體   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