我正在阅读有关管道表函数的内容,并且想知道是否可以依赖在过程中的可预测点抛出 NO_DATA_EXCEPTION 。
我创建了以下类型和过程:
create or replace type pok_pip_t as table of number;
CREATE OR REPLACE FUNCTION pok_pip RETURN pok_pip_t PIPELINED AS
BEGIN
dbms_output.ENABLE(NULL);
FOR indx IN 1..1000 LOOP
dbms_output.put_line(indx);
PIPE ROW (1);
dbms_output.put_line(indx||'x');
END LOOP;
RETURN;
END;
现在,当我跑步时
DECLARE
v_pok NUMBER;
BEGIN
SELECT COUNT(column_value) INTO v_pok FROM pok_pip() WHERE ROWNUM < 10;
END;
/
我看到了输出
1
1x
2
2x
3
3x
4
4x
5
5x
6
6x
7
7x
8
8x
9
意味着该过程在最后一次需要的 PIPE ROW 调用处停止。我可以相信情况确实如此吗?
编辑:我当然是指 NO_DATA_NEEDED 异常。
您没有抛出
NO_DATA_FOUND
异常或任何其他异常。由于 ROWNUM < 10
,您正在停止执行,其功能与大多数过滤器略有不同,因为 Oracle 有一项优化,实际上会在达到限制时中止进一步的行处理。
由于函数是管道化的,控制会不断在 SQL(消耗行)和函数(生成行)之间来回传递,因此调用查询能够在函数继续进行后续循环迭代之前中止进一步执行。中止发生在
PIPE ROW
,因此您看不到 9x
输出,因为它从未被执行。