这是我要调试的一些实际代码:

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;


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

因此,谁编写了此代码并期望它引发异常,这是对的吗?该注释似乎暗示着需要进行空获取,然后为以后的处理设置了一个标志,但是我认为该代码也可能无法通过空集进行测试。

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

最佳答案

当参数化游标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;
/


版画

1: X
2: X


因此,谁编写了此代码并期望它引发异常,这是对的吗?是

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

10-02 17:58