Procedures

PROCEDURE declarations; procedures may COMMIT mid-execution.

Procedures follow the same two-part syntax as functions. The key difference: procedures may call COMMIT mid-body.

Basic procedure

SCHEMA public {
    PROCEDURE process_settlements()
    LANGUAGE plpgsql SECURITY DEFINER
    AS $$
    DECLARE
        v_id settlements.id%TYPE;
    BEGIN
        FOR v_id IN SELECT id FROM settlements WHERE processed = false LOOP
            PERFORM settle_order(v_id);
            COMMIT;
        END LOOP;
    END;
    $$ {
        GRANTS { EXECUTE TO scheduler_role; }
    }
}
-- emits
CREATE OR REPLACE PROCEDURE "public"."process_settlements"()
LANGUAGE plpgsql SECURITY DEFINER
AS $$
DECLARE
    v_id settlements.id%TYPE;
BEGIN
    FOR v_id IN SELECT id FROM settlements WHERE processed = false LOOP
        PERFORM settle_order(v_id);
        COMMIT;
    END LOOP;
END;
$$;

GRANT EXECUTE ON PROCEDURE "public"."process_settlements"() TO "scheduler_role";

Procedure with parameters

PROCEDURE archive_orders(p_before DATE, p_target_schema TEXT DEFAULT 'archive')
LANGUAGE plpgsql
AS $$
BEGIN
    -- archiving logic
    COMMIT;
END;
$$;
CREATE OR REPLACE PROCEDURE "public"."archive_orders"(
    p_before        date,
    p_target_schema text DEFAULT 'archive'
)
LANGUAGE plpgsql
AS $$
BEGIN
    -- archiving logic
    COMMIT;
END;
$$;

Diffing behaviour

Procedure identity is (schema, name, argument_types). Any body change causes CREATE OR REPLACE PROCEDURE. No semantic diff is performed.