PL/SQL - Переменные: Путеводитель для начинающих
Здравствуйте, будущие маги PL/SQL! Сегодня мы отправимся в увлекательное путешествие в мир переменных PL/SQL. Не волнуйтесь, если вы новички в программировании – я буду вашим доброжелательным проводником, и мы будем идти шаг за шагом. К концу этого руководства вы будете управляться с переменными, как профессионал!
Что такое переменные?
Прежде чем мы углубимся, давайте поймем, что такое переменные. Представьте переменные как маленькие контейнеры в памяти вашего компьютера, которые хранят данные. Точно так же, как вы можете использовать разные коробки для хранения разных типов вещей в своей комнате, мы используем переменные для хранения разных типов данных в наших программах.
Объявление переменных в 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