Чем процедура отличается от функции sql?
В PostgreSQL функцию вызывают через SELECT, а процедуру через CALL. Верно ли, что функция только читает данные, а процедура всегда меняет их?
Дом, ремонт, стройка
Животные и питомцы
Учёба и образование
Фотография
Психология
Пока нет лидеров с лучшими ответами.
Ваш вопрос
В PostgreSQL функцию вызывают через SELECT, а процедуру через CALL. Верно ли, что функция только читает данные, а процедура всегда меняет их?
В PostgreSQL основное различие связано с формой вызова и назначением результата. Функция имеет объявленный возвращаемый тип и может участвовать в выражении или запросе, если ее форма это допускает. Процедуру вызывают отдельной командой CALL. Правило, что любая функция только читает, а любая процедура обязательно меняет данные, неверно.
Учебный пример функции в уже существующей схеме: CREATE FUNCTION training.twice(x integer) RETURNS integer LANGUAGE SQL AS 'SELECT x * 2';. После создания SELECT training.twice(3); возвращает 6. Это функция вычисления значения. Пример формы вызова заранее созданной процедуры: CALL training.refresh_report();. Ее название само по себе не определяет, какие действия она выполняет, нужно смотреть тело.
Функции PostgreSQL могут содержать изменение данных при подходящем языке и допустимых свойствах определения. Процедура тоже может не изменять таблицы. Поэтому возможность записывать данные нельзя определять только по словам FUNCTION и PROCEDURE.
Еще одно различие касается управления транзакциями. Функция не выполняет самостоятельные COMMIT и ROLLBACK. Процедура в подходящем контексте вызова может управлять транзакциями, но не при любых настройках и не внутри произвольного уже открытого транзакционного блока. Есть ограничения, связанные с контекстом CALL, свойствами процедуры и языком.
Процедуры могут иметь выходные параметры, так что утверждение, будто они никогда ничего не возвращают вызывающему коду, тоже слишком грубое. При выборе объекта сначала определите, нужен ли результат как часть запроса или отдельная операция. Точный синтаксис и ограничения проверяйте для PostgreSQL, потому что SQL Server и Oracle различают эти объекты по своим правилам.
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Лучший ответ
v4-flash
v4-flash
Чем процедура отличается от функции sql?