資訊:
當您查詢應該回傳 n 個元素的流水線函式時,也不需要資料。但是您已經添加了條件 nb_row< m 和 m<n。
例子:
select *
from table ( my_pieplined_function()) -- this function should returns 20 elements
where rownum < 10;
它應該與fetch next n rows only. 但我已經測驗過了。
我了解到我不需要處理流水線函式中發生的例外“no_data_needed”。當我進行查詢時,邏輯上 oracle 會捕獲此例外,取出已通過管道傳輸的行,其余的則不執行任何操作。
let oracle catch 例外是等價的。
create my_pieplined_function return sys.odcinumberlist is
i integer:=0;
begin
for loop
pipe row (i);
i:=i 1;
if i=20 then return i; end;
end loop;
exception
when no_data_needed then null;
end;
更多資訊https://asktom.oracle.com/Misc/nodataneeded-something-i-learned.html
問題
我想知道是否還有其他例外被 oracle 捕獲而無需執行任何操作。如果是,我在哪里可以找到這些例外的串列。
其他問題:
為什么我沒有在 [預定義例外摘要] ( https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/07_errs.htm )中找到 no_data_needed
uj5u.com熱心網友回復:
為什么我沒有在 [預定義例外摘要] ( https://docs.oracle.com/cd/B14117_01/appdev.101/b10807/07_errs.htm )中找到 no_data_needed
因為它沒有記錄在那個版本中。
它位于Oracle 11g 資料庫 PL/SQL 語言參考中。
我了解到我不需要處理
no_data_needed流水線函式中發生的例外。
如果在流水線函式之后進行清理時不需要做任何事情,則不需要處理該例外。
如果你這樣做:
CREATE FUNCTION my_pipelined_function
RETURN sys.odcinumberlist PIPELINED
IS
BEGIN
DBMS_OUTPUT.PUT_LINE( 'Initialise' );
FOR i IN 1 .. 2 LOOP
DBMS_OUTPUT.PUT_LINE( 'Loop ' || i );
pipe row (i);
END LOOP;
DBMS_OUTPUT.PUT_LINE( 'Cleanup' );
RETURN;
END;
/
如果您呼叫該函式,則使用:
SELECT * FROM TABLE(my_pipelined_function());
然后輸出是:
COLUMN_VALUE 1 2 Initialise Loop 1 Loop 2 Cleanup
但是如果你限制行數:
SELECT * FROM TABLE(my_pipelined_function()) WHERE rownum = 1;
然后輸出將是:
COLUMN_VALUE 1 Initialise Loop 1
并且Cleanup當您在回圈中間停止呼叫該函式時,該部分永遠不會到達。
如果將函式定義為:
CREATE FUNCTION my_pipelined_function
RETURN sys.odcinumberlist PIPELINED
IS
BEGIN
DBMS_OUTPUT.PUT_LINE( 'Initialise' );
FOR i IN 1 .. 2 LOOP
DBMS_OUTPUT.PUT_LINE( 'Loop ' || i );
pipe row (i);
END LOOP;
DBMS_OUTPUT.PUT_LINE( 'Cleanup 1' );
RETURN;
EXCEPTION
WHEN NO_DATA_NEEDED THEN
DBMS_OUTPUT.PUT_LINE( 'Cleanup 2' );
RETURN;
END;
/
并使用以下方法呼叫它:
SELECT * FROM TABLE(my_pipelined_function()) WHERE rownum = 1;
然后輸出將是:
COLUMN_VALUE 1 Initialise Loop 1 Cleanup 2
因此,如果您的流水線函式在函式完成時無事可做,則您不需要處理該例外;但是,如果您初始化某些東西并需要在函式結束時清理它,那么您應該處理NO_DATA_NEEDED例外,因為它允許您在回圈提前終止時執行清理。
db<>在這里擺弄
我想知道是否還有其他例外被 oracle 捕獲而無需執行任何操作。
在 SQL 范圍內(但不是 PL/SQL 范圍),Oracle 將默默地捕獲NO_DATA_FOUND例外并將其替換為一個NULL值:
例如:
SELECT (SELECT 1 FROM DUAL WHERE 1 = 0) AS value
FROM DUAL;
外部查詢需要一個值:
SELECT <something> AS value
FROM DUAL;
內部查詢:
SELECT 1 FROM DUAL WHERE 1 = 0
生成零行,因此沒有值;這會引發一個NO_DATA_FOUND例外,該例外會被靜默捕獲并替換為一個NULL值。
這可以通過以下方式更清楚地看到:
WITH FUNCTION ndf RETURN NUMBER
IS
BEGIN
RAISE NO_DATA_FOUND;
END;
SELECT ndf() AS value FROM DUAL;
哪個輸出:
價值 無效的
PL/SQL 中的行為不同:
DECLARE
v_value NUMBER;
BEGIN
SELECT 1 INTO v_value FROM DUAL WHERE 1 = 0;
END;
/
不會捕獲NO_DATA_FOUND例外,它會導致塊的執行提前終止。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/484727.html
