如果满足某些条件,如何从 PostgreSQL SQL 语句中引发错误?
我尝试了下面的代码但出现了错误。
CREATE OR REPLACE FUNCTION "exec"(text)
RETURNS text AS
$BODY$
BEGIN
EXECUTE $1;
RETURN $1;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
-- ERROR: syntax error at or near "raise"
-- LINE 1: raise 'test'
SELECT exec('raise ''test'' ') WHERE TRUE
在实际应用中,TRUE
被一些条件所取代。
更新
我试图扩展答案以传递异常消息参数。 尝试了下面的代码,但出现语法错误。 如何传递消息参数?
CREATE OR REPLACE FUNCTION exec(text, variadic )
RETURNS void LANGUAGE plpgsql AS
$BODY$
BEGIN
RAISE EXCEPTION $1, $2;
END;
$BODY$;
SELECT exec('Exception Param1=% Param2=%', 'param1', 2 );
最佳答案
您不能在 PL/pgSQL 中动态调用 RAISE
(使用 EXECUTE
)- 这仅适用于 SQL 语句,并且 RAISE
是一个 PL/pgSQL 命令。
改用这个简单的函数:
CREATE OR REPLACE FUNCTION f_raise(text)
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION '%', $1;
END
$func$;
调用:
SELECT f_raise('My message is empty!');
相关:
对 comment 的补充回答
CREATE OR REPLACE FUNCTION f_raise1(VARIADIC text[])
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION 'Reading % % %!', $1[1], $1[2], $1[3];
END
$func$;
调用:
SELECT f_raise1('the','manual','educates');
VARIADIC
不是数据类型,而是 argument mode .必须像处理任何其他数组元素一样处理元素。
要在
RAISE
语句中使用多个变量,请将多个%
放入消息文本中。
如果没有传递 $3
,上面的例子将失败。您必须根据可变数量的输入元素组装一个字符串。示例:
CREATE OR REPLACE FUNCTION f_raise2(VARIADIC _arr text[])
RETURNS void
LANGUAGE plpgsql AS
$func$
DECLARE
_msg text := array_to_string(_arr, ' and '); -- simple string construction
BEGIN
RAISE EXCEPTION 'Reading %!', _msg;
END
$func$;
调用:
SELECT f_raise2('the','manual','educates');
我怀疑您是否需要 VARIADIC
参数。阅读the manual here .
相反,定义所有参数,也许添加默认值:
CREATE OR REPLACE FUNCTION f_raise3(_param1 text = ''
, _param2 text = ''
, _param3 text = 'educates')
RETURNS void
LANGUAGE plpgsql AS
$func$
BEGIN
RAISE EXCEPTION 'Reading % % %!', $1, $2, $3;
END
$func$;
调用:
SELECT f_raise3('the','manual','educates');
或者:
SELECT f_raise3(); -- defaults kick in
关于postgresql - 如何动态执行 PostgreSQL RAISE 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11916838/