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