【问题标题】:Need to run a pl/pgsql fn that runs an INSERT需要运行一个运行 INSERT 的 pl/pgsql fn
【发布时间】: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


【解决方案1】:

可能会这样工作:

CREATE OR REPLACE FUNCTION schema.insert_fn (_arg1 text, _arg2 integer)
  RETURNS text AS  -- not SETOF!
$func$
BEGIN

INSERT INTO <schema>.table1 (col1, col2)  -- names here! not types
SELECT _arg1, _arg2                       -- again: names! cast only if needed
WHERE  NOT EXISTS (                       -- only if _arg2 not invalidated
   SELECT 1
   FROM   <schema>.table2
   WHERE  col2 = _arg2
   AND    invalid_date IS NOT NULL
   );

IF NOT FOUND THEN  -- No exception yet, no INSERT either --> invalidated
    RAISE EXCEPTION 'Data >>%<< has been invalidated.', _arg2;
END IF;

RETURN 'complete'::text;  -- return value probably useless

END
$func$ LANGUAGE plpgsql

最突出的错误是您声明该函数返回一个SETOF 值,而实际上您只返回一个值。我可能只使用RETURNs void,因为返回值没有按原样携带信息。
阅读手册herehere

使用SELECTINSERT 直接应用附加条件。

还有更多。请参阅上面代码中的 cmets。

【讨论】:

  • 感谢@ErwinBrandstetter。它确实在某种意义上运行,但我希望能够对 arg_2 进行检查,如果它“无效”以“引发异常”。你给我的东西确实有效。我尝试使用 where 'col2 = arg_2 and invalid_date is null' 但是,这只会完成插入,如果 'invalid_date 为 null',我不希望它这样做。所以我将插入插入到“ELSE”语句中,所以我认为这会起作用,但它更相似。它完成了,它给了我“数据已失效”的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2012-09-13
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多