如果选择查询返回行,如何引发错误

时间:2019-02-05 13:44:07

标签: postgresql plpgsql

我有一个返回“坏”行的视图。如果视图返回任何记录,我想要一个引发异常的过程。我将从外部程序中调用它。如何实现呢?伪代码如下:

create procedure pr_bad_records_check()
language sql
as
$$
if 
    select count(*) from vw_my_bad_records > 0
then 
    raise error 'some bad rows were found, run select * from vw_my_bad_records for details'
end if
$$;

2 个答案:

答案 0 :(得分:0)

我知道有一个可以接受的答案,但是让我向您展示另一种方法。 由于可以使用特殊变量FOUND,因此不需要声明任何变量。 另外,最好在您的选择中添加LIMIT子句,因为一行足以引发异常:

CREATE OR REPLACE FUNCTION pr_bad_records_check() RETURNS void AS $$
BEGIN 
  PERFORM * FROM vw_my_bad_records LIMIT 1;
  IF FOUND THEN 
    RAISE EXCEPTION 'some bad rows were found, run select * from vw_my_bad_records for details'; 
  END IF; 
END;
$$ LANGUAGE plpgsql;

答案 1 :(得分:0)

PLpgSQL允许在表达式内部使用SQL查询。因此,您的任务可以有一个简单,可读和快速的解决方案:

CREATE OR REPLACE FUNCTION pr_bad_records_check()
RETURNS void AS $$
BEGIN
  IF EXISTS(SELECT * FROM vw_my_bad_records) THEN
    RAISE EXCEPTION
       USING MESSAGE='some bad rows were found',
             HINT='Run select * from vw_my_bad_records for details.';
  END IF;
END;
$$ LANGUAGE plpgsql;