如果集合为空,FETCH INTO 不会引发异常,不是吗?

Cad*_*oux 3 oracle plsql exception cursor

这是我正在尝试调试的一些实际代码:

BEGIN
            OPEN bservice (coservice.prod_id);

            FETCH bservice
            INTO  v_billing_alias_id, v_billing_service_uom_id, v_summary_remarks;

            CLOSE bservice;

            v_service_found := 1;
        -- An empty fetch is expected for some services.
        EXCEPTION
            WHEN OTHERS THEN
                v_service_found := 0;
        END;
Run Code Online (Sandbox Code Playgroud)

当参数化游标 bservice(prod_id) 为空时,它会将 NULL 提取到三个变量中,并且不会引发异常。

那么编写这段代码并期望它抛出异常的人都是错误的,对吗?该注释似乎暗示着空获取是预期的,然后它设置一个标志以供以后处理,但我认为这段代码也不可能用空集进行测试。

显然,它应该使用 bservice%NOTFOUND 或 bservice%FOUND 或类似的。

Ren*_*ger 5

当参数化游标 bservice(prod_id) 为空时,它会将 NULL 提取到三个变量中,并且不会引发异常。

错误的

当 t 为时,它不会获取任何内容,并且不会覆盖任何值。

declare

  cursor c(dt in date) is 
    select dummy from dual 
     where dt > sysdate;

  dummy_ dual.dummy%type;

begin

  open c(sysdate + 2);
  fetch c into dummy_;
  close c;
  dbms_output.put_line('1: ' || dummy_);

  open c(sysdate - 2);
  fetch c into dummy_;
  close c;
  dbms_output.put_line('2: ' || dummy_);

end;
/
Run Code Online (Sandbox Code Playgroud)

印刷

1: X
2: X
Run Code Online (Sandbox Code Playgroud)

那么编写这段代码并期望它抛出异常的人都是错误的,对吗?是的

显然,它应该使用 bservice%NOTFOUND 或 bservice%FOUND 或类似的。是的