Добавить в корзинуПозвонить
Найти в Дзене
Oracle Developer

Какие бывают режимы параметров и чем они отличаются

? Коллеги, всем привет! Этот пост будет полезен джунам. В PL/SQL параметры процедур и функций могут быть трех режимов: IN, OUT и IN OUT. От их выбора зависит, можно ли менять значение аргумента и как оно вернется вызывающему коду. Неправильный режим дает странные баги: значение "не меняется", данные внезапно становятся NULL или теряются. Разберем, чем режимы отличаются и когда что выбирать. Кратко о каждом режиме 🔹 IN - значение передается "только на чтение". Внутри можно менять локальную копию, но вызывающая сторона этого не увидит. Это режим по умолчанию. 🔹 OUT - параметр "только на запись". В начале он считается неопределенным; то, что в него передали при вызове, игнорируется. Вы обязаны присвоить ему значение в процедуре, иначе снаружи получите NULL. 🔹 IN OUT - и вход, и выход. В процедуру попадает текущее значение аргумента, и вы можете его изменить, результат вернется вызывающему коду. Пример declare v_in number := 10; v_out number; v_in_out number := 5; proced

Какие бывают режимы параметров и чем они отличаются?

Коллеги, всем привет!

Этот пост будет полезен джунам.

В PL/SQL параметры процедур и функций могут быть трех режимов: IN, OUT и IN OUT. От их выбора зависит, можно ли менять значение аргумента и как оно вернется вызывающему коду. Неправильный режим дает странные баги: значение "не меняется", данные внезапно становятся NULL или теряются. Разберем, чем режимы отличаются и когда что выбирать.

Кратко о каждом режиме

🔹 IN - значение передается "только на чтение". Внутри можно менять локальную копию, но вызывающая сторона этого не увидит. Это режим по умолчанию.

🔹 OUT - параметр "только на запись". В начале он считается неопределенным; то, что в него передали при вызове, игнорируется. Вы обязаны присвоить ему значение в процедуре, иначе снаружи получите NULL.

🔹 IN OUT - и вход, и выход. В процедуру попадает текущее значение аргумента, и вы можете его изменить, результат вернется вызывающему коду.

Пример

declare

v_in number := 10;

v_out number;

v_in_out number := 5;

procedure demo_proc(p_in in number

,p_out out number

,p_in_out in out number) is

begin

p_out := p_in * 2;

p_in_out := p_in_out + p_out;

end;

begin

demo_proc(v_in, v_out, v_in_out);

dbms_output.put_line('IN=' || v_in);

dbms_output.put_line('OUT=' || v_out);

dbms_output.put_line('IN OUT=' || v_in_out);

end;

/

Результат: v_in осталось 10, v_out стало 20, v_in_out стало 25. Так видно, что IN не меняется, OUT заполняется внутри, IN OUT изменяется на основе старого значения.

Практические рекомендации

✅ Для всех входных параметров почти всегда используйте IN.

✅ OUT используйте для "результатов" процедуры, когда их немного. Если данных много, лучше возвращать курсор, коллекцию или объект.

✅ IN OUT нужен реже всего. Он ухудшает читаемость: из вызова неочевидно, что параметр меняется. Применяйте только если есть реальная выгода (например, изменение большого объекта без копирования).

Подведем итог

🔹 IN - безопасно для чтения, лучший выбор по умолчанию.

🔹 OUT - для возвращаемых значений, не опирайтесь на его начальное значение.

🔹 IN OUT - изменяемый аргумент, используйте осознанно.

А вы часто используете параметры IN OUT в своем PL/SQД-коде? Поделитесь примерами и граблями в комментариях 💬

Всем хорошего дня! 🚀

#oracle #plsql #sql #базы_данных #junior #middle #процедуры

Канал Oracle Developer | Чатик 💬

Мини-курс Оптимизация: Быстрый старт 🚀

📱 YouTube 📱 ВКонтакте 📱 LinkedIn 📱Threads RUTUBE