检查`RECORD`变量是否已初始化

时间:2019-08-22 01:45:41

标签: postgresql plpgsql

我正在尝试声明数据类型为record的变量,但是在没有结果可填充时遇到麻烦。下面是该函数的简化模型:

    CREATE OR REPLACE FUNCTION do_something()
        RETURNS TRIGGER AS $$
    DECLARE
        engagement record;
    BEGIN
        SELECT code
        INTO engagement
        FROM "mainEngagement" me
        WHERE me.value = NEW.id;

        IF TG_OP = 'INSERT'
        THEN
            INSERT INTO engagement_details (code)
            values (
                case
                    when engagement is not null
                        then exists(select code from engagement where "value" = 'expected')
                    else false
                end
            );
        ELSE
            UPDATE engagement_details
            SET
                code = case
                    when engagement is not null
                        then exists(select 1 from engagement where "value" = 'expected')
                    else false
                end
            WHERE engagement_details.assessment_id = NEW.id;
        END IF;

        RAISE NOTICE 'Updated engagement_details: [%]', NEW;
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;

当触发器运行并且“ mainEngagement”中没有数据时,我在INSERT中遇到错误:

  

错误:关系“订婚”不存在

我找不到测试是否有人参与的方法。我搜索了很多堆栈溢出问题,但是大多数人只建议做engagement := row(null),但是when engagement is not null仍然对我不起作用。

2 个答案:

答案 0 :(得分:1)

使用IF NOT FOUND

SELECT code
INTO engagement
FROM "mainEngagement" me
WHERE me.value = NEW.id;

IF NOT FOUND
THEN
    RAISE WARNING '|W| do_something(): engagement undefined';    -- report warning
    RETURN;    -- exit early, function cannot proceed
END IF;

答案 1 :(得分:0)

我在这里遇到的问题是,RECORD条目只能有一行。我试图返回具有多个行的值,然后在记录上运行CASE语句,但该语句永远无法工作。而是执行以下操作:

    CREATE OR REPLACE FUNCTION do_something()
        RETURNS TRIGGER AS $$
    DECLARE
        engagement boolean;
    BEGIN
        SELECT EXISTS (
            SELECT 1 FROM engagement WHERE "value" = 'expected'
        ) INTO engagement;

        IF TG_OP = 'INSERT'
        THEN
            INSERT INTO engagement_details (code)
            values (engagement);
        ELSE
            UPDATE engagement_details
            SET
                code = engagement
            WHERE engagement_details.assessment_id = NEW.id;
        END IF;

        RAISE NOTICE 'Updated engagement_details: [%]', NEW;
        RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;

更加简单,干净和有效。

相关问题