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

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

PL/SQL - Procedures

Что такое процедура PL/SQL?

Прежде чем мы углубимся, давайте поймем, что такое процедура. Представьте procedure как повторно используемый рецепт в кулинарии. Точно так же, как у вас может быть рецепт ваших любимых шоколадных cookies, который вы используете снова и снова, процедура – это набор SQL и PL/SQL операторов, которые вы можете вызывать whenever вам нужно выполнить определенную задачу.

Части подпрограммы PL/SQL

Теперь давайте разберем анатомию подпрограммы PL/SQL (которая включает процедуры). Это как понимание разных частей бутерброда – каждый компонент имеет свою роль!

  1. Секция объявления: Это место, где мы представляем наши ингредиенты (переменные, константы и т.д.).
  2. Исполняемая секция: Вот где происходит магия – наш реальный код находится здесь.
  3. Секция обработки исключений: Это наш страховой полис, который перехватывает любые возможные ошибки.

Вот простое визуальное представление:

DECLARE
-- Секция объявления
BEGIN
-- Исполняемая секция
EXCEPTION
-- Секция обработки исключений
END;

Создание процедуры

Давайте натянем рукава и создадим нашу первую процедуру! Мы начнем с чего-то простого – процедуры, которая говорит "Привет, мир!".

CREATE OR REPLACE PROCEDURE say_hello IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Привет, мир!');
END;
/

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

  • CREATE OR REPLACE PROCEDURE: Это命令 Oracle создать новую процедуру или заменить существующую с таким же именем.
  • say_hello: Это имя, которое мы даем нашей процедуре.
  • IS: Этот ключевой слово отделяет заголовок процедуры от ее тела.
  • BEGIN и END: Эти ключевые слова охватывают исполняемую секцию.
  • DBMS_OUTPUT.PUT_LINE: Это встроенная процедура, которая выводит текст.
  • /: Этот слеш выполняет весь оператор CREATE PROCEDURE.

Выполнение самостоятельной процедуры

Отлично! Мы создали нашу процедуру, но как мы ее запустим? Это так же просто, как pie:

BEGIN
say_hello;
END;
/

Когда вы выполните это, вы должны увидеть "Привет, мир!" выведенным. Поздравляю! Вы только что создали и выполнили свою первую процедуру PL/SQL!

Удаление самостоятельной процедуры

Иногда нам нужно навести порядок. Если вы хотите удалить процедуру, это просто:

DROP PROCEDURE say_hello;

Этот命令 удалит нашу процедуру say_hello. Будьте осторожны с этой властью – с великой властью приходит великая ответственность!

Режимы параметров в подпрограммах PL/SQL

Теперь давайте сделаем наши процедуры более гибкими, добавив параметры. В PL/SQL параметры могут иметь разные режимы:

Режим Описание
IN Передача значений в процедуру
OUT Возврат значений из процедуры
IN OUT Передача значений в и возврат значений из процедуры

Давайте создадим процедуру с параметром IN:

CREATE OR REPLACE PROCEDURE greet_user(p_name IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Привет, ' || p_name || '!');
END;
/

Теперь мы можем поприветствовать разных пользователей:

BEGIN
greet_user('Алиса');
greet_user('Боб');
END;
/

Это выведет:

Привет, Алиса!
Привет, Боб!

Методы передачи параметров

При вызове процедур с параметрами у нас есть два основных метода:

  1. Позиционная запись: Мы передаем параметры в порядке их определения.
  2. Значимая запись: Мы указываем, какое значение corresponds к каждому параметру.

Давайте посмотрим оба метода в действии с новой процедурой:

CREATE OR REPLACE PROCEDURE calculate_rectangle(
p_length IN NUMBER,
p_width IN NUMBER,
p_area OUT NUMBER,
p_perimeter OUT NUMBER
) IS
BEGIN
p_area := p_length * p_width;
p_perimeter := 2 * (p_length + p_width);
END;
/

Теперь вызовем эту процедуру с использованием обеих записей:

DECLARE
v_area NUMBER;
v_perimeter NUMBER;
BEGIN
-- Позиционная запись
calculate_rectangle(5, 3, v_area, v_perimeter);
DBMS_OUTPUT.PUT_LINE('Позиционная: Площадь = ' || v_area || ', Периметр = ' || v_perimeter);

-- Значимая запись
calculate_rectangle(p_width => 3, p_length => 5, p_perimeter => v_perimeter, p_area => v_area);
DBMS_OUTPUT.PUT_LINE('Значимая: Площадь = ' || v_area || ', Периметр = ' || v_perimeter);
END;
/

Оба вызова дадут такой же результат:

Позиционная: Площадь = 15, Периметр = 16
Значимая: Площадь = 15, Периметр = 16

Значимая запись особенно полезна, когда у вас много параметров или вы хотите пропустить可选ивные.

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

Before we wrap up, here's a quick joke: Why did the database administrator leave his wife? She had too many views and wasn't normalized!

Счастливого кодирования, и пусть ваши процедуры всегда выполняются успешно!

Credits: Image by storyset