PL/SQL предоставляет широкие возможности для работы с переменными. Объявление переменных является фундаментальным элементом при написании процедур, функций и других программных конструкций. Корректное использование переменных обеспечивает читаемость, поддержку и расширяемость кода.
Объявление переменных в PL/SQL осуществляется в блоке деклараций, который следует за ключевым словом DECLARE
или в секции DECLARE
внутри анонимного или именованного блока. Общая форма объявления переменной выглядит следующим образом:
cssимя_переменной тип_данных [:= значение_по_умолчанию];
Пример:
scssDECLARE v_employee_id NUMBER := 100; v_employee_name VARCHAR2(50);
Имя переменной — должно быть уникальным в пределах области видимости и следовать соглашениям об именовании.
Тип данных — может быть встроенным (например, NUMBER
, VARCHAR2
, DATE
) или основанным на столбце таблицы с использованием %TYPE
.
Значение по умолчанию — необязательное выражение, которое присваивается переменной при инициализации.
PL/SQL поддерживает различные типы данных:
Числовые типы: NUMBER
, PLS_INTEGER
, BINARY_FLOAT
, BINARY_DOUBLE
Строковые типы: VARCHAR2
, CHAR
, CLOB
Дата и время: DATE
, TIMESTAMP
Булев тип: BOOLEAN
(используется только в PL/SQL, не поддерживается в SQL)
Также возможно использование %TYPE и %ROWTYPE для привязки переменных к типам столбцов или строк таблицы.
Пример с %TYPE
:
pgsqlv_salary employees.salary%TYPE;
Пример с %ROWTYPE
:
pgsqlv_employee_record employees%ROWTYPE;
Инициализация переменной может быть выполнена во время объявления с использованием оператора :=
. Также переменной можно присвоить значение позднее с помощью оператора SELECT INTO
или операторов присваивания.
Пример:
cssv_hire_date DATE := SYSDATE;
Или позднее присваивание:
sqlSELECT hire_date INTO v_hire_date FROM employees WHERE employee_id = 100;
Переменные могут иметь различную область видимости:
Локальные переменные — объявляются внутри процедуры, функции или анонимного блока.
Пакетные переменные — объявляются в спецификации пакета и доступны в его теле.
Глобальные переменные — могут быть реализованы через пакет с сохранением состояния между вызовами.
Рекомендуется использовать префиксы в именах переменных, например:
v_
— для обычных переменных
p_
— для параметров процедуры
c_
— для констант
Это улучшает читаемость кода и облегчает поддержку.
Простой пример объявления и использования переменной:
sqlDECLARE v_total NUMBER := 0; BEGIN v_total := v_total + 100; END;
Пример с использованием %TYPE
:
pgsqlDECLARE v_name employees.first_name%TYPE; BEGIN SELECT first_name INTO v_name FROM employees WHERE employee_id = 101; END;
Наиболее распространённые ошибки:
Объявление переменной с именем, совпадающим с именем столбца — может вызвать неоднозначность.
Отсутствие инициализации при необходимости — может привести к ошибкам времени выполнения.
Использование неподдерживаемого типа данных — например, BOOLEAN
в SQL-запросах.
При создании процедур и функций переменные используются как параметры и локальные данные. Пример процедуры:
pgsqlCREATE OR REPLACE PROCEDURE update_salary ( p_emp_id IN NUMBER, p_new_salary IN NUMBER ) IS v_old_salary employees.salary%TYPE; BEGIN SELECT salary INTO v_old_salary FROM employees WHERE employee_id = p_emp_id; UPDATE employees SET salary = p_new_salary WHERE employee_id = p_emp_id; END;
Для объявления неизменяемых значений используются ключевые слова CONSTANT
и :=
:
csspi CONSTANT NUMBER := 3.14159;
Константы полезны для хранения фиксированных значений, используемых многократно.
Объявление переменной с %TYPE
позволяет ей автоматически наследовать тип данных и ограничения соответствующего столбца таблицы. Это упрощает сопровождение кода при изменении структуры таблиц.
Нет. Все переменные в PL/SQL должны быть объявлены в допустимом блоке декларации: либо в DECLARE
, либо в теле процедуры, функции или пакета.
Необходимо соблюдать правила именования, инициализировать переменные при необходимости, использовать %TYPE
и %ROWTYPE
для привязки к структурам таблиц и избегать неоднозначностей в именах.
Да, переменные могут использоваться при формировании строк SQL-запросов в конструкции EXECUTE IMMEDIATE
. При этом следует использовать параметры привязки для обеспечения безопасности и читаемости.
Только переменные, объявленные в теле пакета без модификатора PRAGMA SERIALLY_REUSABLE
, сохраняют значение между вызовами сессии. Все остальные являются временными.