Postgresql 检查'RECORD'变量是否已初始化

Postgresql 检查'RECORD'变量是否已初始化,postgresql,plpgsql,Postgresql,Plpgsql,我试图声明一个数据类型为record的变量,但在没有结果填充它时遇到了问题。以下是该功能的简化模型: CREATE OR REPLACE FUNCTION do_something() RETURNS TRIGGER AS $$ DECLARE engagement record; BEGIN SELECT code INTO engagement FROM "mainEngagement"

我试图声明一个数据类型为
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”中没有数据时,我在插入中得到一个错误:

错误:关系“啮合”不存在


我找不到一种方法来测试是否有人参与。我已经搜索了许多堆栈溢出问题,但大多数人只是建议执行
参与:=行(null)
,但是当参与不为null时
仍然不适用于我。

如果未找到,请使用

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;

我在这里遇到的问题是,
记录
条目只能有一行作为结果。我试图返回一个包含多行的值,然后在记录上运行
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;

更简单、更干净、更有效。

但是,找不到它是有效的,应该只会导致所讨论的列的默认布尔值
false
。因为您只选择表中的一列,所以不需要记录变量开始。但是您使用的只有一个字段:
code
(没有名为
“value”
)的字段。但在任何情况下,都不能从记录变量中“选择”。