Postgresql 返回与情况相关的消息(异常)

Postgresql 返回与情况相关的消息(异常),postgresql,stored-procedures,unique,plpgsql,Postgresql,Stored Procedures,Unique,Plpgsql,我的PostgreSQL环境中有存储过程。其中一个过程存储用户定义的数据 在plpgsql语言中,我想实现以下处理: 因为目标表中有唯一的约束,所以我首先检查受影响的属性是否已经在该表中。如果是这样,我希望存储过程返回这些受影响的属性,这样用户就知道:呃,我的一些数据已经存在,让我们尝试一些不同的方法 例如,受影响表格的一部分: CREATE TABLE XYZ ( Name varchar UNIQUE ... ) 现在我想向XYZ添加一个新行。如果函数注意到该名称已经存在,它应该返

我的PostgreSQL环境中有存储过程。其中一个过程存储用户定义的数据

在plpgsql语言中,我想实现以下处理:

因为目标表中有唯一的约束,所以我首先检查受影响的属性是否已经在该表中。如果是这样,我希望存储过程返回这些受影响的属性,这样用户就知道:呃,我的一些数据已经存在,让我们尝试一些不同的方法

例如,受影响表格的一部分:

CREATE TABLE XYZ (
  Name varchar UNIQUE
  ...
)
现在我想向XYZ添加一个新行。如果函数注意到该名称已经存在,它应该返回一条带有错误名称的消息。可以有多个副本,函数应返回所有副本。如何实现这一点

我最初想单独检查每个属性,但速度非常慢:

-检查是否已存在缩写或名称。 选择存在 选择 1. 从…起 sample-scheme.sample-table作为表名 哪里 tableName.缩写=arg缩写 或 tableName.name=argName 进入 varEntryExists; -如果存在缩写或名称,则返回错误消息。 如果Varentry存在,那么 返回已存在。; 如果结束;
此示例也不会返回有问题的属性。

您所需要的只是这个简单的查询:

SELECT name
FROM   XYZ
JOIN   unnest ('{name1, name2, name3}'::varchar[]) AS n(name) USING (name);
或者对小型阵列使用更快的:

SELECT name
FROM   XYZ
WHERE  name <@ '{name1, name2, name3}'::varchar[]
电话:

返回表XYZ中已存在的所有名称。有关可变变量的更多详细信息:

CREATE OR REPLACE FUNCTION f_name_dupes(VARIADIC _names varchar[])
  RETURNS SETOF varchar AS
$func$
BEGIN
   SELECT name
   FROM   XYZ x
   WHERE  name <@ $1;
END
$func$  LANGUAGE sql;
SELECT * FROM f_name_dupes('name1', 'name2', 'name3');