[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-chem-otlichayutsya-funktsii-ot-protsedur-v-postgresql":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},1052,"chem-otlichayutsya-funktsii-ot-protsedur-v-postgresql",28,"postgresql","PostgreSQL","🐘","Чем отличаются функции от процедур в PostgreSQL?","Начиная с PostgreSQL 11 поддерживаются как функции (FUNCTION), так и процедуры (PROCEDURE). Ключевое различие: процедуры могут управлять транзакциями (COMMIT\u002FROLLBACK внутри тела), а функции — нет.\n\n### Функции (FUNCTION)\n\n```sql\nCREATE OR REPLACE FUNCTION get_account_balance(p_account_id bigint)\nRETURNS numeric AS $$\nDECLARE\n    v_balance numeric;\nBEGIN\n    SELECT balance INTO v_balance\n    FROM accounts WHERE id = p_account_id;\n\n    IF NOT FOUND THEN\n        RAISE EXCEPTION 'Счёт % не найден', p_account_id;\n    END IF;\n\n    RETURN v_balance;\nEND;\n$$ LANGUAGE plpgsql;\n\nSELECT get_account_balance(1);\n```\n\n### Процедуры (PROCEDURE)\n\n\u003Cdetails>\u003Csummary>Пример процедуры перевода средств\u003C\u002Fsummary>\n\n```sql\nCREATE OR REPLACE PROCEDURE transfer_funds(\n    p_from_account bigint,\n    p_to_account bigint,\n    p_amount numeric\n)\nLANGUAGE plpgsql AS $$\nBEGIN\n    IF p_amount \u003C= 0 THEN\n        RAISE EXCEPTION 'Сумма перевода должна быть положительной';\n    END IF;\n\n    UPDATE accounts SET balance = balance - p_amount WHERE id = p_from_account;\n    IF NOT FOUND THEN\n        RAISE EXCEPTION 'Счёт-отправитель % не найден', p_from_account;\n    END IF;\n\n    UPDATE accounts SET balance = balance + p_amount WHERE id = p_to_account;\n    IF NOT FOUND THEN\n        RAISE EXCEPTION 'Счёт-получатель % не найден', p_to_account;\n    END IF;\n\n    -- Процедура может управлять транзакциями!\n    COMMIT;\nEND;\n$$;\n\nCALL transfer_funds(1, 2, 50000);\n```\n\n\u003C\u002Fdetails>\n\n### Ключевые отличия\n\n| Свойство | FUNCTION | PROCEDURE |\n|---|---|---|\n| Возвращает значение | Да (RETURNS) | Нет |\n| Управление транзакциями | Нет (COMMIT\u002FROLLBACK запрещены) | Да (COMMIT\u002FROLLBACK разрешены) |\n| Использование в SELECT | `SELECT func()` | Нет |\n| Вызов | `SELECT func()` или в выражениях | `CALL proc()` |\n| Используется в триггерах | Да | Нет |\n\nПроцедуры полезны для длительных пакетных операций, где нужно промежуточно фиксировать результаты (например, миграция данных большими батчами).\n\n> **На собеседовании:** единственный критический факт — процедуры могут делать COMMIT\u002FROLLBACK, функции — нет. Это определяет выбор: если нужно промежуточно фиксировать результаты в длительной операции — процедура, если нужно вернуть значение или использовать в SELECT — функция.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Чем отличаются функции от процедур в PostgreSQL? — Gymterview","Начиная с PostgreSQL 11 поддерживаются как функции (FUNCTION), так и процедуры (PROCEDURE). Ключевое различие: процедуры могут управлять транзакциями (COMMIT\u002FRO","Начиная с PostgreSQL 11 поддерживаются как функции (FUNCTION), так и процедуры (PROCEDURE). Ключевое различие: процедуры",[7,13],"Начиная с PostgreSQL 11 поддерживаются как функции (FUNCTION), так и процедуры (PROCEDURE). Ключевое различие: процедуры могут управлять транзакциями (COMMIT\u002FROLLBACK внутри тела), а функции — нет.",true]