【发布时间】:2014-02-04 07:57:03
【问题描述】:
这就是我所拥有的,我正在尝试创建一个插入 fn,它将行数据基本上加载到每个现有的表中。我还想对特定的列数据进行检查,以确保源数据不是无效的。
我似乎遇到的问题是让它成功运行。出于某种原因,我似乎无法让它发挥作用,我尝试了各种方法并在网站内努力研究(有些很接近,但并没有完全给我我需要的东西)。这基本上是我拥有和想要实现的目标。我知道这可能是基本的,所以提前谢谢。
CREATE OR REPLACE FUNCTION Schema.insert_fn (arg_1 character varying , arg_2 integer)
RETURNS SETOF CHARACTER VARYING AS
$BODY$
BEGIN
--should this insert use some kind of temp table?
insert into <schema>.table1 (character varying, integer)
values (arg_1 character varying, arg_2 integer);
--If I wanted to run some sort of check on say arg_2
If(select distinct (arg_2) from <schema>.table2 where invalid_date is not null)
THEN
raise notice 'Data has been invalidated';
END IF;
Return 'complete';
END;
$BODY$
更新
首先,它告诉我我的退货需要有“NEXT”或“QUERY”
RETURN cannot have a parameter in function returning set; use RETURN NEXT or RETURN QUERY at or near "'complete'"
一旦我这样做了,该功能当然会完成。但是,当我调用它时,我收到一条错误消息,例如:
invalid input syntax for type boolean: "arg_1"
如果我说得有点含糊,我深表歉意。显然,我无法为您提供 arg 名称的完整上下文,因为它们与我正在做的事情有关。感谢您的帮助。
更新
我也收到此错误:
more than one row returned by a subquery used as an expression
我也对这个问题进行了研究,但根本无法关联任何类型的解决方案来至少让它发挥作用,意思是;当我说它时,没有参数我收到此错误。
更新 @ErwinBrandstetter。我传达了错误的信息。我的意思是如果
'col2 = arg_2 and invalid_date is NOT null' to raise an exception
正在发生的事情是“EXIST”语句会将任何实例带到找到行的位置。我尝试了“WHERE EXIST”,但出现错误。我认为的问题是它们(已验证和已失效的数据)是否共享相同的唯一 ID,并且它是否使 EXIST 语句为真(我没有提供此信息请注意)。
更新 @ErwinBrandstetter 它现在运行成功。看起来我需要做的就是将这两个条件分开。谢谢。
IF EXISTS (condition)
THEN
INSERT
ELSEIF EXISTS (invalidated data condition)
THEN
RAISE EXCEPTION'DATA IS INVALIDATED';
END IF;
END;
【问题讨论】:
-
“让它成功运行”有点含糊。你可以说得更详细点吗?当你尝试运行它时会发生什么?
-
我已经进行了几次迭代,每个迭代都有自己独特的问题。
-
首先,它告诉我,我的返回需要有'NEXT' 或'QUERY' RETURN 不能在函数返回集中有参数;在“'完成'”处或附近使用 RETURN NEXT 或 RETURN QUERY 一旦我这样做了,当然 fn 会完成。但是,当我调用它时,我收到一个错误,例如:布尔类型的输入语法无效:“arg_1”如果我有点含糊不清,我深表歉意。显然,我无法为您提供 arg 名称的完整上下文,因为它们与我正在做的事情有关。感谢您的帮助。
标签: function postgresql database-design plpgsql sql-insert