【问题标题】:Postgresql function updatePostgresql 函数更新
【发布时间】:2015-04-07 02:52:22
【问题描述】:

我有两张桌子:

  1. 日历的第一个日期和开放日(布尔值)

  2. 第二个是假期表。

我做了一个更改日历上开放日状态的功能:

CREATE OR REPLACE FUNCTION add_hol ()
RETURNS boolean AS
UPDATE calendar SET open_day = 'false'
WHERE day IN (
SELECT jour FROM calendar AS c
INNER JOIN calendar_hol AS h
ON c.day=h.day_hol)
LANGUAGE sql 

但总是有错误信息:

“更新”处或附近的语法错误。

请问如何改正? (我尝试了很多方法,但没有结果......)

【问题讨论】:

    标签: postgresql function boolean


    【解决方案1】:

    你需要引用函数体。您可以使用普通的' 引用并将函数体内的所有's 加倍,或者您可以使用PostgreSQL 扩展$$ 引用。

    更新:此外,由于它不返回任何结果,因此应将其声明为 RETURNS void

    CREATE OR REPLACE FUNCTION add_hol ()
    RETURNS void AS
    $$
    UPDATE calendar SET open_day = 'false'
    WHERE day IN (
    SELECT jour FROM calendar AS c
    INNER JOIN calendar_hol AS h
    ON c.day=h.day_hol)
    $$
    LANGUAGE sql;
    

    详见手册。


    更新,因为您正在寻找触发程序但没有这么说。

    这作为触发器没有任何意义。我认为您实际上试图在插入或更新行时对其进行修改。为此,您必须在 NEW 变量中设置值。

    一个疯狂的猜测,但你可能正在寻找这样的东西:

    CREATE OR REPLACE FUNCTION add_hol ()
    RETURNS trigger AS
    $$
    BEGIN
      IF tg_op = 'INSERT' OR tg_op = 'UPDATE'
      THEN
    
        NEW.open_day = NOT EXISTS (
          SELECT 1
          FROM calendar_hol AS h
          WHERE h.day_hol = NEW.day
        );
    
        RETURN NEW;
    
      END IF;
    END;
    $$
    LANGUAGE plpgsql;
    

    这是基于缺失信息的疯狂猜测。这可能是完全错误的。如果您在阅读 cmets 中链接的手册后仍然卡住,请发布一个新问题,并正确解释您要解决的问题。

    【讨论】:

    • 我已经这样做了,但是我得到了错误:在声明返回布尔值的函数中返回类型不匹配。如果我尝试 RETURNS 触发器,也会遇到同样的问题...
    • @Cipango 它不返回任何东西,所以RETURNS void。请参阅用户手册。 postgresql.org/docs/current/static/sql-createfunction.html
    • 是的,谢谢,但随后出现错误:函数 add_hol 必须返回类型“触发器”...
    • @Cipango 好吧,如果你想创建一个触发函数,你应该这么说。触发函数不能是LANGUAGE sql,必须用PL/PgSQL编写。阅读有关触发器的手册:trigger proceduresCREATE TRIGGER。您必须使用LANGUAGE plpgsql 并将其包装在BEGIN...END 中。在以后的问题中,您应该尝试多解释一下您正在做什么,并显示所有相关的错误消息等,以避免这种浪费时间。
    • 好的,抱歉。我迷失了这个功能。我也用 plpgsql 做的,但总是有问题。然后,我不明白我有什么样的问题。很抱歉浪费了您的时间,我再去阅读触发程序。
    猜你喜欢
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-01
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多