如果满足某些条件,如何从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 );
答案 0 :(得分:22)
您无法在PL / pgSQL中动态调用RAISE
(使用EXECUTE
) - 仅适用于SQL语句,而RAISE
是PL / pgSQL命令。
请改用此简单功能:
CREATE OR REPLACE FUNCTION f_exec(text)
RETURNS void LANGUAGE plpgsql AS
$BODY$
BEGIN
RAISE EXCEPTION '%', $1;
END;
$BODY$;
呼叫:
SELECT f_exec('My message is empty!');
我在这个related answer on dba.SE中写了更多内容:解释,链接,功能的更多选项,上下文(包括行号)来自函数调用等。
CREATE OR REPLACE FUNCTION f_exec1(VARIADIC text[])
RETURNS void LANGUAGE plpgsql AS
$BODY$
BEGIN
RAISE EXCEPTION 'Reading % % %!', $1[1], $1[2], $1[3];
END;
$BODY$;
呼叫:
SELECT f_exec1('the','manual','educates');
VARIADIC
不是数据类型,而是argument mode。
元素必须像任何其他数组元素一样处理。
要在RAISE
语句中使用多个变量,请将多个%
放入消息文本中。
如果没有$ 3传递给呼叫,上面的示例将失败。您必须从可变数量的输入元素中组合一个字符串。例如:
CREATE OR REPLACE FUNCTION f_exec2(VARIADIC _arr text[])
RETURNS void LANGUAGE plpgsql AS
$BODY$
DECLARE
_msg text := array_to_string(_arr, ' and '); -- simple string construction
BEGIN
RAISE EXCEPTION 'Reading %!', _msg;
END;
$BODY$;
呼叫:
SELECT f_exec2('the','manual','educates');
我怀疑你需要一个VARIADIC
参数。阅读the manual here。
相反,定义所有参数,可能添加默认值:
CREATE OR REPLACE FUNCTION f_exec3(_param1 text = ''
,_param2 text = ''
,_param3 text = 'educates')
RETURNS void LANGUAGE plpgsql AS
$BODY$
BEGIN
RAISE EXCEPTION 'Reading % % %!', $1, $2, $3;
END;
$BODY$;
呼叫:
SELECT f_exec3('the','manual','educates');
SELECT f_exec3(); -- defaults kick in