返回null值时如何忽略行?

时间:2016-02-10 14:47:10

标签: sql oracle plsql

我继承了一些包含以下错误处理的代码:

if v_complete then 
  if v_response_time is null then
    raise_application_error(-20999, 'Response Time Null');
  end if;

update eventlog e
set e.responded = get_work(v_callback, v_response_time),
complete_flag='Y'
where  rowid = v_min_row;

end if;

对系统的更改意味着某些情况下会抛出NULL值,而不是引发应用程序错误,我希望它忽略这些行。如何将raise_application_error更改为忽略或跳过?

4 个答案:

答案 0 :(得分:2)

您可以通过添加

完全过滤结果集中的NULL项
and (v_response_time is not null)

到查询的where子句

答案 1 :(得分:2)

听起来你只需要:

if v_complete then 

  update eventlog e
  set    e.responded = get_work(v_callback, v_response_time),
         complete_flag='Y'
  where  rowid = v_min_row
  and    v_response_time is not null;

end if;

答案 2 :(得分:0)

最简单的事情是:

if v_complete AND v_response_time IS NOT NULL then
  update eventlog e
    set e.responded = get_work(v_callback, v_response_time),
        complete_flag='Y'
    where  rowid = v_min_row;
end if;

这可能会或可能不会满足您的要求 - 我不确定我是否理解您要做的事情 - 但要看一下,看看这是否符合您的要求。

祝你好运。

答案 3 :(得分:0)

如果要更新事件日志,即使响应时间为NULL,则可以在NULL时为v_response_time提供默认值。我通常使用' 1900-01-01 00:00:00.000'。这可能很有用。

if v_complete then 
  --if v_response_time is null then
    --raise_application_error(-20999, 'Response Time Null');
 --end if;

 update eventlog e
set e.responded = get_work(v_callback, COALESCE(v_response_time,'1900-01-01 00:00:00.000')),
complete_flag='Y'
where  rowid = v_min_row;

end if;