【问题标题】:SQL Constraint Verification FunctionSQL约束验证函数
【发布时间】:2016-03-22 12:00:54
【问题描述】:

我想在请求期间检查约束是否得到遵守,如果没有,而不是发送错误消息,只需返回 FALSE。我该怎么做?

我正在使用的 TABLE 示例:

CREATE TABLE tree (
    name   VARCHAR(64) UNIQUE PRIMARY KEY,
    leaf   INT CHECK (leaf > 0)
);

我会使用的函数示例:

CREATE FUNCTION add_tree(name, nb_leaf) RETURNS BOOLEAN;
CREATE FUNCTION remove_leaf(tree_name, leaf_to_remove) RETURNS BOOLEAN;

在我的函数中,检查名称会过于重复

IF EXISTS (SELECT name FROM tree WHERE name=tree_name) THEN...

因为我已经有一个 UNIQUE 约束,但是如果我不检查我当然会收到错误消息,我如何不使用检查 (IF..) 并且不会收到错误消息而是返回 false 而不是输入错误?

PS:如果有任何改变,我正在使用 postgresql

【问题讨论】:

  • 在 Oracle 中,您可以创建用户定义的异常。我很确定这在 postgress 中也必须是可能的。执行错误时可以返回 false

标签: sql postgresql constraints unique-constraint check-constraints


【解决方案1】:

当引发异常时,从您的函数中返回 false:

EXCEPTION
  WHEN OTHERS THEN
   return false;
END;

http://www.postgresql.org/docs/9.3/static/plpgsql-control-structures.html

在页面末尾,您将看到一个示例:

DECLARE
  text_var1 text;
  text_var2 text;
  text_var3 text;
BEGIN
  -- some processing which might cause an exception
  ...
EXCEPTION WHEN OTHERS THEN
  GET STACKED DIAGNOSTICS text_var1 = MESSAGE_TEXT,
                          text_var2 = PG_EXCEPTION_DETAIL,
                          text_var3 = PG_EXCEPTION_HINT;
END;

【讨论】:

  • 但是这种语法会强制我执行 WHEN EXISTS (SELECT name FROM tree WHERE name=tree_name) THEN ... 这与在我的核心函数中执行它没有区别吗? (因为我不能使用 WHEN raise 异常,所以在“raise”时出现错误)
  • 在您的函数 add_tree 中,您可以编写一个插入(我猜您这样做),当由于唯一约束或其他错误而失败时,您的 EXCEPTION 将捕获它并返回 false。在 Oracle 中,您可以使用 EXCEPTION WHEN OTHERS THEN。在 postgresql 中也是如此。
  • @sourpet 欢迎您。请你投票给我好吗?
  • 需要更多的声望来投票,但你是公认的答案不能做更多:p
猜你喜欢
  • 1970-01-01
  • 2011-10-19
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 2015-09-30
相关资源
最近更新 更多