【问题标题】:Raising error in postgreSQL在 postgreSQL 中引发错误
【发布时间】:2012-09-21 10:48:39
【问题描述】:
CREATE OR REPLACE FUNCTION msgfailerror() RETURNS trigger AS 
' BEGIN 
    IF NEW.noces< new.first_column THEN 
        RAISE EXCEPTION 'cannot have a negative salary'; 
    END IF; 
   return new; 
END' LANGUAGE plpgsql

触发器

create trigger msgfail before insert on first for each row 
execute procedure msgfailerror()

给出错误:

“cannot”第 5 行或附近的语法错误:RAISE EXCEPTION '不能有负数...

我对行的每个字段几乎都有一个验证。我希望触发器在插入完成时检查所有验证,然后一劳永逸地引发错误日志。我应该在 raise 通知中使用 raise 异常吗?

例如:

Insert into first (first_column, noces,dob) values ('4545','75','545') 

我正在检查 noces 是否小于 first_column,对于同一行,我想检查 dob > 80 以及 first_column 是否为整数并引发所有验证的错误。提前致谢

【问题讨论】:

  • 您正在进行数字比较,但您在 INSERT 语句中使用了字符文字。如果nocesfirst_column 是字符列,则&lt; 不会按照您的预期进行。 从不在字符列中存储数字!

标签: postgresql plpgsql quoting


【解决方案1】:

引用错误。使用美元引号 $$ 更容易:

CREATE OR REPLACE FUNCTION msgfailerror() 
RETURNS trigger AS 
$$
BEGIN 
  IF NEW.noces< new.first_column THEN 
    RAISE EXCEPTION 'cannot have a negative salary'; 
  END IF; 
  return new; 
END;
$$
LANGUAGE plpgsql;

但另一方面,检查约束有什么问题?

【讨论】:

  • 使用上面的代码它没有显示任何错误..但也没有引发任何异常只是插入值..并且检查约束会显示任何错误吗?我不想中止操作,我只想抛出一条消息,例如您输入的值未通过这些限制。
  • 检查约束的另一个 +1
  • @user1686308:如果你抛出异常——就像你在问题中所做的那样——你总是回滚(中止)事务——除非你捕获到异常。违反的 CHECK 约束也会这样做。在这种情况下,您需要发出警告通知
  • @user1686308:请参阅此 SQLFiddle 以获取示例:sqlfiddle.com/#!1/82c39/1
  • 谢谢,我将尽可能使用检查约束,我必须进行大约 180 次验证。祝我好运。谢谢大家的帮助
【解决方案2】:

你没有错,唯一的问题是使用引号

请更改:

RAISE EXCEPTION 'cannot have a negative salary';

到:

RAISE EXCEPTION ''cannot have a negative salary'';

'' 不同于 "

'' = 两个单引号

【讨论】:

  • 欢迎来到 Stack Overflow!请不要在帖子下方留下您的电子邮件地址;联系方式属于您的个人资料。
【解决方案3】:

我同意 Frank 的观点,即您可以更好地使用约束,但您称之为验证。验证通常在插入发生之前完成。如果您想验证插入,可以使用函数而不是触发器或约束。

何时编写函数是您提出异常或通知的问题的答案,只要没有写入操作,通知就足够了(连同离开函数)。写入数据库后,是否必须在执行回滚时使用异常。

像这样:

CREATE OR REPLACE FUNCTION field_validate(p_int int) RETURNS boolean AS $$

DECLARE
 i_id int;
BEGIN 
  if p_int > 10 then
   raise notice 'should be smaller then 10';
   return false;
  end if;
  insert into tbl_numbers(firstfield) values(p_int) returning id in i_id;
  insert into tbl_fake(nofield) values(i_id);
  return true;
EXCEPTION
  WHEN raise exception THEN
   return false;
END;
$$ LANGUAGE plpgsql;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2023-04-06
    • 2015-04-24
    • 2018-06-15
    • 2016-01-10
    相关资源
    最近更新 更多