我試圖在 sql 查詢中使用游標。這有效:
SELECT 1, CURSOR (SELECT 1 FROM DUAL)
FROM DUAL;
但是當我試圖在 with 陳述句中使用這個子查詢時。它不再起作用了。
WITH t (a, b) AS (
SELECT 1, CURSOR (SELECT 1 FROM DUAL)
FROM DUAL)
SELECT t.a
FROM t;
[錯誤] 執行 (5: 10): ORA-00900: 無效的 SQL 陳述句
為什么?
uj5u.com熱心網友回復:
從CURSOR運算式檔案:
CURSOR運算式的限制以下限制適用于
CURSOR運算式:
- 如果封閉陳述句不是
SELECT陳述句,則嵌套游標只能作為REF CURSOR程序的引數出現。- 如果封閉陳述句是
SELECT陳述句,則嵌套游標也可以出現在查詢規范的最外層選擇串列中或另一個嵌套游標的最外層選擇串列中。- 嵌套游標不能出現在視圖中。
- 您不能對嵌套游標執行
BIND和操作。EXECUTE
不幸的是,措辭不清楚,因為第一個要點中的“只能出現”在第二個要點中得到了擴展,并且可能更清楚地說:
- 如果封閉陳述句是
SELECT陳述句,則嵌套游標也只能出現在查詢規范的最外層選擇串列中或另一個嵌套游標的最外層選擇串列中。
如果您愿意,可以將CURSOR運算式包裝在 PL/SQL 存盤函式中,以將其轉換為集合資料型別(或執行一些其他操作并回傳一個標量)。
例如,定義函式:
CREATE FUNCTION pipe(
i_cur IN SYS_REFCURSOR
) RETURN SYS.ODCINUMBERLIST PIPELINED
IS
v_value PLS_INTEGER;
BEGIN
LOOP
FETCH i_cur INTO v_value;
EXIT WHEN i_cur%NOTFOUND;
PIPE ROW (v_value);
END LOOP;
CLOSE i_cur;
END;
/
然后:
WITH t (a, b) AS (
SELECT 1,
pipe(CURSOR(SELECT 1 FROM DUAL))
FROM DUAL
)
SELECT t.a
FROM t;
有效,但洗掉函式呼叫會產生錯誤。
您還可以使用:
WITH FUNCTION sum_cursor(i_cur IN SYS_REFCURSOR) RETURN NUMBER
IS
v_total NUMBER := 0;
v_value NUMBER;
BEGIN
LOOP
FETCH i_cur INTO v_value;
EXIT WHEN i_cur%NOTFOUND;
IF v_value IS NOT NULL THEN
v_total := v_total v_value;
END IF;
END LOOP;
CLOSE i_cur;
RETURN v_total;
END;
t (a, b) AS (
SELECT 1,
sum_cursor(CURSOR(SELECT 2 FROM DUAL))
FROM DUAL
)
SELECT t.*
FROM t;
哪個輸出:
一種 乙 1 2
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/467498.html
標籤:甲骨文
