PL/SQL - Переменные: Путеводитель для начинающих

Здравствуйте, будущие маги PL/SQL! Сегодня мы отправимся в увлекательное путешествие в мир переменных PL/SQL. Не волнуйтесь, если вы новички в программировании – я буду вашим доброжелательным проводником, и мы будем идти шаг за шагом. К концу этого руководства вы будете управляться с переменными, как профессионал!

PL/SQL - Variables

Что такое переменные?

Прежде чем мы углубимся, давайте поймем, что такое переменные. Представьте переменные как маленькие контейнеры в памяти вашего компьютера, которые хранят данные. Точно так же, как вы можете использовать разные коробки для хранения разных типов вещей в своей комнате, мы используем переменные для хранения разных типов данных в наших программах.

Объявление переменных в PL/SQL

В PL/SQL объявление переменной похоже на знакомство с кем-то новым. Вы говорите программе: "Эй, я здесь, и вот что я могу держать!"

Основной синтаксис

Основной синтаксис для объявления переменной в PL/SQL следующий:

имя_переменной тип_данных;

Давайте разберем это:

  • имя_переменной – это то, как вы решите назвать свою переменную
  • тип_данных – это тип данных, который может содержать переменная

Примеры

DECLARE
my_name VARCHAR2(50);
my_age NUMBER;
is_student BOOLEAN;
BEGIN
-- Ваш код здесь
END;

В этом примере:

  • my_name может содержать до 50 символов
  • my_age может содержать число
  • is_student может быть TRUE или FALSE

Помните, в PL/SQL мы объявляем переменные в секции DECLARE, перед оператором BEGIN.

Общие типы данных

Вот таблица общих типов данных, с которыми вы столкнетесь:

Тип данных Описание Пример
VARCHAR2 Строка переменной длины 'Привет, мир!'
NUMBER Числовые значения 42, 3.14
DATE Значения даты и времени '01-ЯНВ-2023'
BOOLEAN Логические значения (TRUE/FALSE) TRUE

Инициализация переменных в PL/SQL

Теперь, когда мы объявили наши переменные, давайте дадим им значения! Этот процесс называется инициализацией.

Основная инициализация

Вы можете инициализировать переменную сразу при объявлении:

DECLARE
greeting VARCHAR2(20) := 'Привет, PL/SQL!';
lucky_number NUMBER := 7;
BEGIN
DBMS_OUTPUT.PUT_LINE(greeting);
DBMS_OUTPUT.PUT_LINE('Мое幸运ное число: ' || lucky_number);
END;

В этом примере мы saludуем PL/SQL и делимся своим幸运ным числом. Оператор := является оператором присваивания в PL/SQL.

Инициализация с NULL

Иногда вы можете хотите объявить переменную, но не присваивать ей значение. В этом случае вы можете использовать NULL:

DECLARE
user_input VARCHAR2(100) := NULL;
BEGIN
-- Мы получим ввод пользователя позже
END;

Примеры переменных в PL/SQL

Пример с использованием переменных

DECLARE
my_name VARCHAR2(50) := 'Иван';
my_age NUMBER := 30;
is_student BOOLEAN := FALSE;
BEGIN
DBMS_OUTPUT.PUT_LINE('Мое имя: ' || my_name);
DBMS_OUTPUT.PUT_LINE('Мой возраст: ' || my_age);
DBMS_OUTPUT.PUT_LINE('Я студент: ' || CASE WHEN is_student THEN 'Да' ELSE 'Нет' END);
END;

Пример с использованием курсора

DECLARE
CURSOR employee_cursor IS
SELECT first_name, last_name, salary FROM employees;
employee_record employee_cursor%ROWTYPE;
BEGIN
OPEN employee_cursor;
LOOP
FETCH employee_cursor INTO employee_record;
EXIT WHEN employee_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Сотрудник: ' || employee_record.first_name || ' ' || employee_record.last_name);
DBMS_OUTPUT.PUT_LINE('Зарплата: $' || employee_record.salary);
END LOOP;
CLOSE employee_cursor;
END;

Scope переменных в PL/SQL

Примеры scope переменных:

Локальные переменные

Переменные, объявленные в блоке, являются локальными для этого блока. Они не видны за пределами своего блока.

DECLARE
outer_variable VARCHAR2(20) := 'Я снаружи!';
BEGIN
DBMS_OUTPUT.PUT_LINE(outer_variable);

DECLARE
inner_variable VARCHAR2(20) := 'Я внутри!';
BEGIN
DBMS_OUTPUT.PUT_LINE(outer_variable);  -- Это работает
DBMS_OUTPUT.PUT_LINE(inner_variable);  -- Это также работает
END;

DBMS_OUTPUT.PUT_LINE(outer_variable);  -- Это работает
-- DBMS_OUTPUT.PUT_LINE(inner_variable);  -- Это вызовет ошибку
END;

В этом примере inner_variable похож на стеснительного друга, который выходит только на inner блок-вечеринку. Внешний блок не может его увидеть!

Глобальные переменные

Если вы хотите, чтобы переменная была видна везде в вашей программе, вы можете объявить ее в внешнем блоке.

DECLARE
global_var NUMBER := 100;

PROCEDURE print_global IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Значение глобальной переменной: ' || global_var);
END;

BEGIN
print_global;
global_var := global_var + 50;
print_global;
END;

Здесь global_var похож на популярного ребенка – все знают его и могут взаимодействовать с ним!

Присваивание результатов SQL-запросов переменным PL/SQL

Одна из coolest вещей в PL/SQL – это его无缝ная интеграция с SQL. Вы можете использовать SQL-запросы для присваивания значений вашим переменным PL/SQL!

Запрос для одной строки

DECLARE
employee_name VARCHAR2(100);
employee_salary NUMBER;
BEGIN
SELECT first_name || ' ' || last_name, salary
INTO employee_name, employee_salary
FROM employees
WHERE employee_id = 100;

DBMS_OUTPUT.PUT_LINE('Сотрудник: ' || employee_name);
DBMS_OUTPUT.PUT_LINE('Зарплата: $' || employee_salary);
END;

В этом примере мы извлекаем имя и зарплату сотрудника из таблицы employees и сохраняем их в наши переменные PL/SQL.

Запрос для нескольких строк

Для нескольких строк нам нужно использовать курсор или bulk collect. Вот пример с bulk collect:

DECLARE
TYPE name_table_type IS TABLE OF VARCHAR2(100);
employee_names name_table_type;
BEGIN
SELECT first_name || ' ' || last_name
BULK COLLECT INTO employee_names
FROM employees
WHERE department_id = 60;

FOR i IN 1..employee_names.COUNT LOOP
DBMS_OUTPUT.PUT_LINE('Сотрудник ' || i || ': ' || employee_names(i));
END LOOP;
END;

Этот скрипт извлекает имена всех сотрудников из отдела 60 и сохраняет их в таблицу PL/SQL. Затем мы循环 по этой таблице, чтобы вывести каждое имя.

И вот и все,folks! Мы рассмотрели основы переменных PL/SQL, от объявления до инициализации, scope и даже как populate их результатами SQL-запросов. Помните, практика делает perfect, так что не бойтесь экспериментировать с этими концепциями.

Before I sign off, here's a little programmer joke for you: Why did the programmer quit his job? Because he didn't get arrays (a raise)! ?

Happy coding, and may your variables always be well-behaved!

Credits: Image by storyset