【问题标题】:How to execute PostgreSQL RAISE command dynamically如何动态执行 PostgreSQL RAISE 命令
【发布时间】:2012-08-08 15:38:02
【问题描述】:

如果满足某些条件,如何从 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 ); 

【问题讨论】:

  • 转发 PostgreSQL 邮件列表消息 archives.postgresql.org/message-id/… 。安德鲁斯,请不要在这两个地方发帖而不说你已经这样做了。发布到 Pg 列表时链接到 SO 文章。

标签: postgresql exception-handling plpgsql


【解决方案1】:

您不能在 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

【讨论】:

  • 谢谢。有效。如何也将参数传递给消息?我更新了问题。
  • @Andrus:考虑一下我的答案。
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2016-05-20
  • 2019-04-23
  • 2019-05-21
相关资源
最近更新 更多