有一个选项psql
可以停止执行错误的命令,即ON_ERROR_STOP
。如果我们可以以某种方式引发错误,这将做我们想要的。
问题是我们必须测试变量并以某种方式产生错误。由于不能使用控制结构psql
(因为没有控制结构)*,所以我唯一的想法是使用SQL进行测试。好吧,有条件地产生错误pl/pgsql
是很擅长的事情,因此我编写了一个会产生错误的函数。我现在可以从一个简单的CASE
结构调用此函数。一个简单的例子:
-- let's assume for clarity that there is no function with this name in the database
CREATE OR REPLACE FUNCTION error_generator()
RETURNS boolean AS
$body$
BEGIN
RAISE 'Meaningful error message here';
RETURN FALSE; -- just for aesthetical purposes
END;
$body$
LANGUAGE plpgsql;
\set ON_ERROR_STOP on
BEGIN;
-- test for the variable value
-- notice that if :var is not set, it fails as well (with a syntax error)
SELECT CASE WHEN 1 = :var THEN error_generator() ELSE TRUE END;
INSERT INTO test_table (integer_value, text_value)
VALUES (:var, 'something');
COMMIT;
*:您可以在shell的后面\!
和条件中使用任何shell命令,但是由于\!
打开了一个新shell,因此执行任何操作都不会对当前psql脚本产生任何影响。
\set ON_ERROR_STOP on
-太好了!