我有一個通用的 SYS_REFCURSOR,我想檢查它是否為空。
代碼是這樣的:
declare
v_cursor SYS_REFCURSOR;
begin
OPEN v_cursor FOR <any select statement>.
check if v_cursor is empty.
end;
有人可以告訴我如何檢查弱游標是否為空嗎?我不得不提到,基本 SELECT 陳述句可以是任何表中的任何內容。列號或型別僅在運行時才知道。
謝謝,
uj5u.com熱心網友回復:
您無法查看 ref 游標是否包含資料而無需獲取資料并從中消耗至少一行。
如果您確實需要在打開游標時確定這一點,而不知道該點的結構,您可以執行修改后的查詢,僅計算實際查詢回傳的行數 - 如果這有助于提高性能,可能限制為單行- 無論是簡單execute immediate ... into ...的還是單獨的打開/獲取/關閉以保持一致性;就像是:
declare
v_cursor SYS_REFCURSOR;
v_query VARCHAR2(4000);
v_count PLS_INTEGER;
begin
v_query := <any select statement>;
-- see if the query finds any data
OPEN v_cursor FOR 'select count(*) from (' || v_query || ')'; -- could limit rows
FETCH v_cursor INTO v_count;
CLOSE v_cursor;
if v_count = 0 then
dbms_output.put_line('No data');
return;
end if;
dbms_output.put_line('Found data, opening cursor for real');
OPEN v_cursor FOR v_query;
-- loop over results, return to caller, etc.
end;
/
db<>小提琴
uj5u.com熱心網友回復:
嘗試獲取一行然后使用v_cursor%NOTFOUND來判斷游標是否為空:
DECLARE
v_cursor SYS_REFCURSOR;
v_value DUAL.DUMMY%TYPE;
BEGIN
OPEN v_cursor FOR SELECT DUMMY FROM DUAL WHERE 1 = 0;
FETCH v_cursor INTO v_value;
IF v_cursor%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Cursor empty');
ELSE
DBMS_OUTPUT.PUT_LINE('Cursor not empty');
END IF;
END;
/
要么
DECLARE
CURSOR v_cursor IS
SELECT DUMMY FROM DUAL WHERE 1 = 0;
v_row v_cursor%ROWTYPE;
BEGIN
OPEN v_cursor;
FETCH v_cursor INTO v_row;
IF v_cursor%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Cursor empty');
ELSE
DBMS_OUTPUT.PUT_LINE('Cursor not empty');
END IF;
END;
/
兩個輸出:
Cursor empty
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/432924.html
上一篇:根據上個月的值創建條件欄位
