0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p><strong>PL/SQL</strong>(Programming Language for SQL) - язык программирования от компании Oracle, предоставляющий средства для сложной обработки данных. В этой статье мы рассмотрим основы PL/SQL.</p>
1
<p><strong>PL/SQL</strong>(Programming Language for SQL) - язык программирования от компании Oracle, предоставляющий средства для сложной обработки данных. В этой статье мы рассмотрим основы PL/SQL.</p>
2
<p>Начнём с программных единиц.</p>
2
<p>Начнём с программных единиц.</p>
3
<h2>Программные единицы PL/SQL</h2>
3
<h2>Программные единицы PL/SQL</h2>
4
<p>К программным единицам в PL/SQL относят: 1.<strong>Процедуру</strong>- подпрограмму, выполняющую специфическое действие (CREATE PROCEDURE); 2.<strong>Функцию</strong>- подпрограмму, вычисляющую значение (CREATE FUNCTION). 3.<strong>PL/SQL-пакеты</strong>- объект БД, группирующий логически связанные типы, подпрограммы и программные объекты PL/SQL. Как правило, пакеты состоят из 2 частей - тела и спецификации. Спецификация представляет собой интерфейс с вашими приложениями (объявляет типы, константы, переменные, исключения, подпрограммы, курсоры - всё, что доступно для использования в пакете). Вторая часть - это тело пакета, полностью определяющая подпрограммы и курсоры, реализуя тем самым спецификацию пакета. 4.<strong>Динамический SQL</strong>: a. Native Dynamic SQL (NDS); b. DBMS_SQL. 5.<strong>Опции компилятора</strong>. 6.<strong>Триггеры</strong>- хранимые процедуры особого типа, которые юзер не вызывает непосредственно, т. к. их исполнение обусловлено действиями по модификации данных. Триггеры бывают разные: BEFORE INSERT, BEFORE UPDATE, AFTER INSERT и пр. 7.<strong>Управление зависимостями</strong>. 8.<strong>Хинты либо подсказки</strong>(Oracle Hints) - средства, которые позволяют оказывать явное влияние на план запроса. Подсказки определяют общие подходы и цели, оптимизирующие план исполнения запроса, в том числе методы и правила доступа к данным (например, указание метода и порядка соединения таблиц, индекса для доступа к таблице).</p>
4
<p>К программным единицам в PL/SQL относят: 1.<strong>Процедуру</strong>- подпрограмму, выполняющую специфическое действие (CREATE PROCEDURE); 2.<strong>Функцию</strong>- подпрограмму, вычисляющую значение (CREATE FUNCTION). 3.<strong>PL/SQL-пакеты</strong>- объект БД, группирующий логически связанные типы, подпрограммы и программные объекты PL/SQL. Как правило, пакеты состоят из 2 частей - тела и спецификации. Спецификация представляет собой интерфейс с вашими приложениями (объявляет типы, константы, переменные, исключения, подпрограммы, курсоры - всё, что доступно для использования в пакете). Вторая часть - это тело пакета, полностью определяющая подпрограммы и курсоры, реализуя тем самым спецификацию пакета. 4.<strong>Динамический SQL</strong>: a. Native Dynamic SQL (NDS); b. DBMS_SQL. 5.<strong>Опции компилятора</strong>. 6.<strong>Триггеры</strong>- хранимые процедуры особого типа, которые юзер не вызывает непосредственно, т. к. их исполнение обусловлено действиями по модификации данных. Триггеры бывают разные: BEFORE INSERT, BEFORE UPDATE, AFTER INSERT и пр. 7.<strong>Управление зависимостями</strong>. 8.<strong>Хинты либо подсказки</strong>(Oracle Hints) - средства, которые позволяют оказывать явное влияние на план запроса. Подсказки определяют общие подходы и цели, оптимизирующие план исполнения запроса, в том числе методы и правила доступа к данным (например, указание метода и порядка соединения таблиц, индекса для доступа к таблице).</p>
5
<h2>Блочная структура PL/SQL</h2>
5
<h2>Блочная структура PL/SQL</h2>
6
<p>В блоке PL/SQL может содержаться до 4-х разделов, но лишь один считается обязательным. 1.<strong>Заголовок</strong>. Применяется лишь в именованных блоках, служит для определения способа вызова программы либо именованного блока. 2.<strong>Раздел объявлений</strong>. Включает описания переменных, вложенных блоков и курсоров. 3.<strong>Раздел исключений</strong>. Служит для обработки исключений (предупреждений и ошибок). 4.<strong>Исполняемый раздел</strong>. Речь идёт о командах, которые выполняются ядром PL/SQL в процессе работы приложения. Обратите внимание, что это ОБЯЗАТЕЛЬНЫЙ раздел.</p>
6
<p>В блоке PL/SQL может содержаться до 4-х разделов, но лишь один считается обязательным. 1.<strong>Заголовок</strong>. Применяется лишь в именованных блоках, служит для определения способа вызова программы либо именованного блока. 2.<strong>Раздел объявлений</strong>. Включает описания переменных, вложенных блоков и курсоров. 3.<strong>Раздел исключений</strong>. Служит для обработки исключений (предупреждений и ошибок). 4.<strong>Исполняемый раздел</strong>. Речь идёт о командах, которые выполняются ядром PL/SQL в процессе работы приложения. Обратите внимание, что это ОБЯЗАТЕЛЬНЫЙ раздел.</p>
7
<p>Давайте посмотрим на структуру PL/SQL-блока для процедуры:</p>
7
<p>Давайте посмотрим на структуру PL/SQL-блока для процедуры:</p>
8
<p>Следующее изображение - это пример процедуры, содержащей все 4 раздела:</p>
8
<p>Следующее изображение - это пример процедуры, содержащей все 4 раздела:</p>
9
<h2>Хранимая процедура</h2>
9
<h2>Хранимая процедура</h2>
10
<p>Под хранимой процедурой понимают некоторый перечень инструкций, которые написаны на PL/SQL. Вызов такой процедуры обеспечивает выполнение содержащихся в этой процедуре инструкций. Сама она хранится в БД, поэтому и считается хранимой. Состоит из тела и спецификации.</p>
10
<p>Под хранимой процедурой понимают некоторый перечень инструкций, которые написаны на PL/SQL. Вызов такой процедуры обеспечивает выполнение содержащихся в этой процедуре инструкций. Сама она хранится в БД, поэтому и считается хранимой. Состоит из тела и спецификации.</p>
11
<p>Спецификация содержит имя процедуры, а также описание её выходных и входных данных, которые являются формальными параметрами либо формальными аргументами. Когда при вызове процедуры указывают параметры командной строки либо иные входные данные, указанные значения называют фактическими параметрами/фактическими аргументами.</p>
11
<p>Спецификация содержит имя процедуры, а также описание её выходных и входных данных, которые являются формальными параметрами либо формальными аргументами. Когда при вызове процедуры указывают параметры командной строки либо иные входные данные, указанные значения называют фактическими параметрами/фактическими аргументами.</p>
12
<p>Рассмотрим пример спецификации:</p>
12
<p>Рассмотрим пример спецификации:</p>
13
increase_salary_find_tax ( increase_percent IN NUMBER := 7, sal IN OUT NUMBER, tax OUT NUMBER )<p>В примере выше перед нами процедура с 3-мя формальными параметрами.<strong>IN</strong>после имени параметра значит, что в процессе вызова процедура может из данного параметра считать входное значение.<strong>OUT</strong>значит, что процедура может применять этот параметр в целях возврата значения в ту программу, из которой она вызывалась. Комбинация<strong>IN OUT</strong>значит, что параметр может использоваться в качестве передачи значения процедуре, а также в целях возврата значения.</p>
13
increase_salary_find_tax ( increase_percent IN NUMBER := 7, sal IN OUT NUMBER, tax OUT NUMBER )<p>В примере выше перед нами процедура с 3-мя формальными параметрами.<strong>IN</strong>после имени параметра значит, что в процессе вызова процедура может из данного параметра считать входное значение.<strong>OUT</strong>значит, что процедура может применять этот параметр в целях возврата значения в ту программу, из которой она вызывалась. Комбинация<strong>IN OUT</strong>значит, что параметр может использоваться в качестве передачи значения процедуре, а также в целях возврата значения.</p>
14
<p>Что касается тела процедуры, то это блок кода PL/SQL.</p>
14
<p>Что касается тела процедуры, то это блок кода PL/SQL.</p>
15
<h2>Хранимые функции</h2>
15
<h2>Хранимые функции</h2>
16
<p>Функция PL/SQL напоминает процедуру PL/SQL: у неё тоже есть тело и спецификация. Основное различие - функция нужна для возврата значения, которое можно применять в более крупном операторе SQL.</p>
16
<p>Функция PL/SQL напоминает процедуру PL/SQL: у неё тоже есть тело и спецификация. Основное различие - функция нужна для возврата значения, которое можно применять в более крупном операторе SQL.</p>
17
<h2>Триггеры</h2>
17
<h2>Триггеры</h2>
18
<p>Триггером называют процедуру PL/SQL, выполняемую автоматически, когда происходит некоторое событие, которое называется триггерным событием.</p>
18
<p>Триггером называют процедуру PL/SQL, выполняемую автоматически, когда происходит некоторое событие, которое называется триггерным событием.</p>
19
<p>К примеру, мы можем писать триггеры, которые срабатывают в процессе выполнения над таблицей операций UPDATE, INSERT либо DELETE; во время выдачи команд DDL; во время входа пользователя в систему либо его выхода; во время запуска либо остановки БД; во время возникновения ошибок.</p>
19
<p>К примеру, мы можем писать триггеры, которые срабатывают в процессе выполнения над таблицей операций UPDATE, INSERT либо DELETE; во время выдачи команд DDL; во время входа пользователя в систему либо его выхода; во время запуска либо остановки БД; во время возникновения ошибок.</p>
20
<p>Существуют 3 различия между процедурами PL/SQL и триггерами: 1. Триггеры невозможно вызвать из кода программы. Они вызываются автоматически как ответ на некоторое событие. 2. У триггеров нет списка параметров. 3. Спецификации триггера и процедуры немного отличаются.</p>
20
<p>Существуют 3 различия между процедурами PL/SQL и триггерами: 1. Триггеры невозможно вызвать из кода программы. Они вызываются автоматически как ответ на некоторое событие. 2. У триггеров нет списка параметров. 3. Спецификации триггера и процедуры немного отличаются.</p>
21
<h2>Переменные в PL/SQL</h2>
21
<h2>Переменные в PL/SQL</h2>
22
<p>Переменными называют именованные контейнеры. Они способны содержать информацию разных видов. С учётом помещаемой информации данных они имеют разные типы данных, а чтобы отличать эти данные друг от друга, присваиваются имена. К примеру, числа в PL/SQL хранятся в переменных типа NUMBER, текст - в переменных CHAR либо VARCHAR2. Что касается синтаксиса объявления переменной, то в PL/SQL он имеет любую из нижеперечисленных форм записи:</p>
22
<p>Переменными называют именованные контейнеры. Они способны содержать информацию разных видов. С учётом помещаемой информации данных они имеют разные типы данных, а чтобы отличать эти данные друг от друга, присваиваются имена. К примеру, числа в PL/SQL хранятся в переменных типа NUMBER, текст - в переменных CHAR либо VARCHAR2. Что касается синтаксиса объявления переменной, то в PL/SQL он имеет любую из нижеперечисленных форм записи:</p>
23
имя_переменной тип_данных [[NOTNULL] := выражение_по_умолчанию]; имя_переменной тип_данных [[NOT NULL] DEFAULT выражение_по_умолчанию];<p>Здесь<strong>имя_переменной</strong>- любой правильный PL/SQL идентификатор. Такой идентификатор должен: 1. Иметь в длину не больше 30 символов, причём не иметь в записи пробелов и знаков табуляции. 2. Начинаться с буквы. 3. Состоять лишь из букв, цифр 0-9, символа подчеркивания, знака доллара и знака фунта. 4. Не совпадать с зарезервированными словами SQL и PL/SQL, имеющими спецзначение. Пример неправильной записи для переменной - слово BEGIN, обозначающее начало выполняемой секции основного PL/SQL-блока.</p>
23
имя_переменной тип_данных [[NOTNULL] := выражение_по_умолчанию]; имя_переменной тип_данных [[NOT NULL] DEFAULT выражение_по_умолчанию];<p>Здесь<strong>имя_переменной</strong>- любой правильный PL/SQL идентификатор. Такой идентификатор должен: 1. Иметь в длину не больше 30 символов, причём не иметь в записи пробелов и знаков табуляции. 2. Начинаться с буквы. 3. Состоять лишь из букв, цифр 0-9, символа подчеркивания, знака доллара и знака фунта. 4. Не совпадать с зарезервированными словами SQL и PL/SQL, имеющими спецзначение. Пример неправильной записи для переменной - слово BEGIN, обозначающее начало выполняемой секции основного PL/SQL-блока.</p>
24
<p>Следующее, это<strong>тип_данных</strong>- любой допустимый тип данных в SQL либо PL/SQL. Здесь обратите внимание, что модификатору NOT NULL требуется, чтобы переменная имела значение. И если модификатор указан, то переменной должно присвоиться значение по умолчанию.</p>
24
<p>Следующее, это<strong>тип_данных</strong>- любой допустимый тип данных в SQL либо PL/SQL. Здесь обратите внимание, что модификатору NOT NULL требуется, чтобы переменная имела значение. И если модификатор указан, то переменной должно присвоиться значение по умолчанию.</p>
25
<h2>Объявляем константы PL/SQL</h2>
25
<h2>Объявляем константы PL/SQL</h2>
26
<p>Запись объявления константы выглядит следующим образом:</p>
26
<p>Запись объявления константы выглядит следующим образом:</p>
27
имя_переменной тип_данных CONSTANT := выражение;<p>В отличие, скажем, от тех же переменных, константам обязательно присваивается значение, причём это значение нельзя будет поменять в течение всего срока жизни константы. При этом константы весьма полезны при поддержании безопасности и дисциплины во время разработки приложений повышенной сложности. К примеру, если вы желаете гарантировать, что PL/SQL-процедура не будет модифицировать данные, передаваемые ей, то вы можете объявить их константами. А если процедура всё-таки попытается модифицировать эти данные, PL/SQL возбудит исключение.</p>
27
имя_переменной тип_данных CONSTANT := выражение;<p>В отличие, скажем, от тех же переменных, константам обязательно присваивается значение, причём это значение нельзя будет поменять в течение всего срока жизни константы. При этом константы весьма полезны при поддержании безопасности и дисциплины во время разработки приложений повышенной сложности. К примеру, если вы желаете гарантировать, что PL/SQL-процедура не будет модифицировать данные, передаваемые ей, то вы можете объявить их константами. А если процедура всё-таки попытается модифицировать эти данные, PL/SQL возбудит исключение.</p>
28
<h2>Записи в PL/SQL</h2>
28
<h2>Записи в PL/SQL</h2>
29
<p>Говоря о записи в PL/SQL, мы говорим о наборе данных базовых типов. К записи мы можем обращаться, как к единому целому. При этом для доступа к отдельным полям записи используют нотацию имя_записи_имя_поля. Записи бывают одного из 3-х нижеперечисленных типов: 1.<strong>Table-based</strong>(основанные на таблице). Такие записи имеют поля, которые совпадают по типу и имени со столбцами таблицы. Когда курсор выбирает всю строку - к примеру, оператором<strong>SELECT * FROM примерная_таблица</strong>, то возвращаемые записи можно копировать в переменную, имеющую тип записи, которая основана на таблице<strong>примерная_таблица</strong>. 2.<strong>Cursor-based</strong>(основанные на курсоре). Что касается полей этих записей, то они совпадают по имени, порядку и типу с заключительным списком столбцов в курсорном операторе SELECT. 3.<strong>Programmer-defined</strong>(определённые программистом). Тут речь идёт про записи, тип которых определяет программист, то есть вы сами.</p>
29
<p>Говоря о записи в PL/SQL, мы говорим о наборе данных базовых типов. К записи мы можем обращаться, как к единому целому. При этом для доступа к отдельным полям записи используют нотацию имя_записи_имя_поля. Записи бывают одного из 3-х нижеперечисленных типов: 1.<strong>Table-based</strong>(основанные на таблице). Такие записи имеют поля, которые совпадают по типу и имени со столбцами таблицы. Когда курсор выбирает всю строку - к примеру, оператором<strong>SELECT * FROM примерная_таблица</strong>, то возвращаемые записи можно копировать в переменную, имеющую тип записи, которая основана на таблице<strong>примерная_таблица</strong>. 2.<strong>Cursor-based</strong>(основанные на курсоре). Что касается полей этих записей, то они совпадают по имени, порядку и типу с заключительным списком столбцов в курсорном операторе SELECT. 3.<strong>Programmer-defined</strong>(определённые программистом). Тут речь идёт про записи, тип которых определяет программист, то есть вы сами.</p>
30
<h2>Record PL/SQL</h2>
30
<h2>Record PL/SQL</h2>
31
<p>Давайте посмотрим, как применять спецификатор записи Record в PL/SQL с синтаксисом.</p>
31
<p>Давайте посмотрим, как применять спецификатор записи Record в PL/SQL с синтаксисом.</p>
32
<p>Record (запись) - это группа связанных элементов данных, которые хранятся в полях, причём каждая имеет своё имя и тип данных. При этом мы можем применять Record как переменную, способную содержать строку таблицы либо некоторые столбцы из строки таблицы.</p>
32
<p>Record (запись) - это группа связанных элементов данных, которые хранятся в полях, причём каждая имеет своё имя и тип данных. При этом мы можем применять Record как переменную, способную содержать строку таблицы либо некоторые столбцы из строки таблицы.</p>
33
<h2>Определяем и объявляем Record в PL/SQL</h2>
33
<h2>Определяем и объявляем Record в PL/SQL</h2>
34
<p>Объявить запись поможет атрибут<strong>%ROWTYPE</strong>, представляющий строку в таблице БД без непосредственного перечисления всех столбцов. При этом ваш код будет продолжать функционировать даже после добавления в таблицу столбцов. Но если вы желаете представить подмножество столбцов в таблице либо столбцы из различных таблиц, можно определить VIEW либо объявить CURSOR в целях выбора правильных столбцов и любых нужных объединений, а потом задействовать атрибут %ROWTYPE к CURSOR либо VIEW.</p>
34
<p>Объявить запись поможет атрибут<strong>%ROWTYPE</strong>, представляющий строку в таблице БД без непосредственного перечисления всех столбцов. При этом ваш код будет продолжать функционировать даже после добавления в таблицу столбцов. Но если вы желаете представить подмножество столбцов в таблице либо столбцы из различных таблиц, можно определить VIEW либо объявить CURSOR в целях выбора правильных столбцов и любых нужных объединений, а потом задействовать атрибут %ROWTYPE к CURSOR либо VIEW.</p>
35
<p>Посмотрим на синтаксис объявления переменной в PL/SQL и определения типа Record:</p>
35
<p>Посмотрим на синтаксис объявления переменной в PL/SQL и определения типа Record:</p>
36
TYPE type_rec_name IS Record (field_1 datatype, field_2 datatype, … field_n datatype); var_rec type_rec_name;<p>Мы видим следующие параметры: 1) type_rec_name - имя конкретного типа Record; 2) var_rec - имя переменной Record-типа; 3) field_1, field_2,… field_n - поля Record-типа; 4) datatype - тип данных для полей Record-типа. Может быть любой из списка:</p>
36
TYPE type_rec_name IS Record (field_1 datatype, field_2 datatype, … field_n datatype); var_rec type_rec_name;<p>Мы видим следующие параметры: 1) type_rec_name - имя конкретного типа Record; 2) var_rec - имя переменной Record-типа; 3) field_1, field_2,… field_n - поля Record-типа; 4) datatype - тип данных для полей Record-типа. Может быть любой из списка:</p>
37
<p><em>При подготовке статьи использовались следующие материалы: 1. "<a>PL SQL - функции, процедуры, переменные, курсоры и циклы plsql</a>". 2. "<a>Record Oracle PL/SQL</a>".</em></p>
37
<p><em>При подготовке статьи использовались следующие материалы: 1. "<a>PL SQL - функции, процедуры, переменные, курсоры и циклы plsql</a>". 2. "<a>Record Oracle PL/SQL</a>".</em></p>
38
38