PL / SQL ( процедурный язык для SQL) - это процедурное расширение корпорации Oracle для SQL и реляционной базы данных Oracle . PL / SQL доступен в Oracle Database (начиная с версии 6 - хранимые процедуры / функции / пакеты / триггеры PL / SQL, начиная с версии 7), базы данных Times Ten в памяти (начиная с версии 11.2.1) и IBM DB 2 (начиная с версии 9.7). [1] Корпорация Oracle обычно расширяет функциональность PL / SQL с каждым последующим выпуском Oracle Database.
PL / SQL включает элементы процедурного языка, такие как условия и циклы . Он позволяет объявлять константы и переменные , процедуры и функции, типы и переменные этих типов и триггеры. Он может обрабатывать исключения (ошибки времени выполнения). Поддерживаются массивы с использованием коллекций PL / SQL. Реализации Oracle Database начиная с версии 8 включают функции, связанные с объектной ориентацией . Можно создавать модули PL / SQL, такие как процедуры, функции, пакеты, типы и триггеры, которые хранятся в базе данных для повторного использования приложениями, использующими любой из программных интерфейсов Oracle Database.
Исторически первая общедоступная версия определения PL / SQL [2] была выпущена в 1995 году, а год создания Oracle ~ 1992. Он реализует стандарт ISO SQL / PSM . [3]
Программный модуль PL / SQL
Основная особенность SQL (непроцедурная) также является недостатком SQL: нельзя использовать управляющие операторы ( принятие решений или итеративное управление ), если должен использоваться только SQL. PL / SQL - это, по сути, процедурный язык, который обеспечивает функции принятия решений, итераций и многие другие функции, как и другие языки процедурного программирования. Блок программа А PL / SQL является один из следующих: PL / SQL анонимный блок, процедура , функция , пакет спецификация, тело пакета, триггер, тип спецификация, тип кузова, библиотека. Программные блоки - это исходный код PL / SQL, который компилируется, разрабатывается и в конечном итоге выполняется в базе данных. [4]
Анонимный блок PL / SQL
Базовая единица исходной программы PL / SQL - это блок, который объединяет связанные объявления и операторы. Блок PL / SQL определяется ключевыми словами DECLARE, BEGIN, EXCEPTION и END. Эти ключевые слова делят блок на декларативную часть, исполняемую часть и часть обработки исключений. Раздел объявления является необязательным и может использоваться для определения и инициализации констант и переменных. Если переменная не инициализирована, по умолчанию используется значение NULL . Необязательная часть обработки исключений используется для обработки ошибок времени выполнения. Требуется только исполняемая часть. Блок может иметь метку. [5]
Например:
< - это необязательно DECLARE - этот раздел необязателен number1 NUMBER ( 2 ); число2 число1 % ТИП : = 17 ; - значение по умолчанию text1 VARCHAR2 ( 12 ) : = 'Hello world' ; text2 ДАТА : = SYSDATE ; - текущая дата и время НАЧАТЬ - этот раздел является обязательным, должны содержать по крайней мере один исполняемый оператор SELECT , street_number INTO number1 FROM адреса WHERE имя = «INU» ; ИСКЛЮЧЕНИЕ - этот раздел является необязательным, КОГДА ДРУГИЕ ТО DBMS_OUTPUT . PUT_LINE ( 'Код ошибки' || TO_CHAR ( sqlcode )); DBMS_OUTPUT . PUT_LINE ( 'Сообщение об ошибке' || sqlerrm ); КОНЕЦ ;
Символ :=
функционирует как оператор присваивания для хранения значения в переменной.
Блоки могут быть вложенными, т. Е. Поскольку блок является исполняемым оператором, он может появляться в другом блоке везде, где разрешен исполняемый оператор. Блок можно отправить в интерактивный инструмент (например, SQL * Plus) или встроить в прекомпилятор Oracle или программу OCI . Интерактивный инструмент или программа запускает блок один раз. Блок не хранится в базе данных, и по этой причине он называется анонимным блоком (даже если у него есть метка).
Функция
Функция PL / SQL обычно используется для вычисления и возврата одного значения. Это возвращаемое значение может быть одним скалярным значением (например, числом, датой или символьной строкой) или отдельной коллекцией (например, вложенной таблицей или массивом). Пользовательские функции дополняют встроенные функции, предоставляемые Oracle Corporation. [6]
Функция PL / SQL имеет вид:
CREATE OR REPLACE FUNCTION < function_name > [( входные / вывода переменных деклараций )] ВОЗВРАТ возвращаемый_тип [ AUTHID < CURRENT_USER | ОПРЕДЕЛИТЕЛЬ > ] < ЕСТЬ | AS > - номер количества заголовочной части ; - блок объявления BEGIN - исполняемая часть < блок PL / SQL с оператором возврата > RETURN < return_value > ; [ Нет исключения ] RETURN < return_value > ; КОНЕЦ ;
Конвейерные табличные функции возвращают коллекции [7] и принимают форму:
CREATE OR REPLACE FUNCTION < function_name > [( входные / вывода переменных деклараций )] ВОЗВРАТ возвращаемый_тип [ AUTHID < CURRENT_USER | ОПРЕДЕЛЕНИЕ > ] [ < АГРЕГАТ | ТРУБОПРОВОД > ] < ЕСТЬ | ИСПОЛЬЗОВАНИЕ > [ декларация блок ] НАЧАТЬ < PL / SQL блока с обратным утверждением > PIPE ROW < обратного типа > ; ВОЗВРАТ ; [ Блок исключения исключения ] PIPE ROW < тип возврата > ; ВОЗВРАТ ; КОНЕЦ ;
Функция должна использовать только тип параметра IN по умолчанию. Единственным выходным значением функции должно быть возвращаемое ею значение.
Процедура
Процедуры похожи на функции в том смысле, что они называются программными модулями, которые можно вызывать повторно. Основное отличие состоит в том, что функции могут использоваться в операторе SQL, а процедуры - нет . Другое отличие состоит в том, что процедура может возвращать несколько значений, тогда как функция должна возвращать только одно значение. [8]
Процедура начинается с обязательной части заголовка, содержащей имя процедуры и, необязательно, список параметров процедуры. Далее следуют декларативная, исполняемая части и части обработки исключений, как в анонимном блоке PL / SQL. Простая процедура может выглядеть так:
CREATE PROCEDURE create_email_address ( - Процедура заголовок часть начинается name1 VARCHAR2 , Имя2 VARCHAR2 , компания VARCHAR2 , электронная почта OUT VARCHAR2 ) - Процедура заканчивается заголовок часть AS - начинается декларативная часть ( по желанию) error_message VARCHAR2 ( 30 ) : = «Адрес электронной почты слишком длинный.' ; BEGIN - Исполняемая часть начинается (обязательно) email : = name1 || '.' || name2 || '@' || компания ; ИСКЛЮЧЕНИЕ - Часть обработки исключений начинается (необязательно) КОГДА VALUE_ERROR THEN DBMS_OUTPUT . PUT_LINE (сообщение об ошибке ); КОНЕЦ create_email_address ;
В приведенном выше примере показана автономная процедура - этот тип процедуры создается и сохраняется в схеме базы данных с помощью оператора CREATE PROCEDURE. Процедура также может быть создана в пакете PL / SQL - это называется процедурой пакета. Процедура, созданная в анонимном блоке PL / SQL, называется вложенной процедурой. Автономные процедуры или процедуры пакета, хранящиеся в базе данных, называются « хранимыми процедурами ».
Процедуры могут иметь три типа параметров: IN, OUT и IN OUT.
- Параметр IN используется только как ввод. Параметр IN передается по ссылке, хотя он может быть изменен неактивной программой.
- Параметр OUT изначально равен NULL. Программа присваивает значение параметра, и это значение возвращается вызывающей программе.
- Параметр IN OUT может иметь или не иметь начальное значение. Это начальное значение может или не может быть изменено вызываемой программой. Любые изменения, внесенные в параметр, по умолчанию возвращаются вызывающей программе путем копирования, но - с подсказкой NO-COPY - могут быть переданы по ссылке .
PL / SQL также поддерживает внешние процедуры через стандартный ext-proc
процесс базы данных Oracle . [9]
Упаковка
Пакеты - это группы концептуально связанных функций, процедур, переменных, таблиц PL / SQL и операторов TYPE записей, констант, курсоров и т. Д. Использование пакетов способствует повторному использованию кода. Пакеты состоят из спецификации пакета и дополнительного тела пакета. Спецификация - это интерфейс к приложению; он объявляет типы, переменные, константы, исключения, курсоры и доступные подпрограммы. Тело полностью определяет курсоры и подпрограммы и, таким образом, реализует спецификацию. Два преимущества пакетов: [10]
- Модульный подход, инкапсуляция / скрытие бизнес-логики, безопасность, повышение производительности, возможность повторного использования. Они поддерживают функции объектно-ориентированного программирования, такие как перегрузка функций и инкапсуляция.
- Используя переменные пакета, можно объявить переменные уровня сеанса (ограниченные областью), поскольку переменные, объявленные в спецификации пакета, имеют область действия сеанса.
Курок
Триггер базы данных , как хранимая процедура , которая Oracle Database Запускает автоматически при возникновении определенного события. Это именованный модуль PL / SQL, который хранится в базе данных и может быть вызван повторно. В отличие от хранимой процедуры, вы можете включать и отключать триггер, но не можете вызывать его явно. Пока триггер включен, база данных автоматически вызывает его, то есть триггер срабатывает, когда происходит его инициирующее событие. Пока триггер отключен, он не срабатывает.
Вы создаете триггер с помощью оператора CREATE TRIGGER. Вы указываете инициирующее событие в терминах операторов запуска и элемента, на который они воздействуют. Говорят, что триггер создан или определен для элемента, который является таблицей, представлением , схемой или базой данных. Вы также указываете точку отсчета времени, которая определяет, срабатывает ли триггер до или после запуска оператора триггера, и будет ли он срабатывать для каждой строки, на которую влияет этот оператор триггера.
Если триггер создается в таблице или представлении, то инициирующее событие состоит из операторов DML, и триггер называется триггером DML. Если триггер создается в схеме или базе данных, то инициирующее событие состоит из операторов DDL или операций с базой данных, и триггер называется системным триггером.
Триггер INSTEAD OF - это либо триггер DML, созданный в представлении, либо системный триггер, определенный в операторе CREATE. База данных запускает триггер INSTEAD OF вместо запуска оператора запуска.
Назначение триггеров
Триггеры можно писать для следующих целей:
- Автоматическое создание некоторых производных значений столбцов
- Обеспечение ссылочной целостности
- Регистрация событий и хранение информации о доступе к таблицам
- Аудиторская проверка
- Синхронная репликация таблиц
- Введение авторизации безопасности
- Предотвращение недействительных транзакций
Типы данных
Основные типы данных в PL / SQL включают NUMBER, CHAR, VARCHAR2, DATE и TIMESTAMP.
Числовые переменные
имя_переменной номер ([ P , S ]) : = 0 ;
Чтобы определить числовую переменную, программист добавляет к определению имени тип переменной ЧИСЛО . Чтобы указать (необязательную) точность (P) и (необязательный) масштаб (S), можно добавить их в круглые скобки, разделенные запятой. («Точность» в этом контексте относится к количеству цифр, которое может содержать переменная, а «масштаб» относится к количеству цифр, которые могут следовать за десятичной точкой.)
Выбор других типов данных для числовых переменных будет включать: binary_float, binary_double, dec, decimal, double precision, float, integer, int, numeric, real, small-int, binary_integer.
Символьные переменные
имя_переменной varchar2 ( 20 ) : = 'Текст' ;- например: адрес varchar2 ( 20 ) : = 'дорога с видом на озеро' ;
Чтобы определить символьную переменную, программист обычно добавляет тип переменной VARCHAR2 к определению имени. В скобках указано максимальное количество символов, которое может хранить переменная.
Другие типы данных для символьных переменных включают: varchar, char, long, raw, long raw, nchar, nchar2, clob, blob и bfile.
Переменные даты
имя_переменной date : = to_date ( '01 -01-2005 14:20:23 ' , ' ДД-ММ-ГГГГ чч24: mi: ss ' );
Переменные даты могут содержать дату и время. Время можно не указывать, но невозможно определить переменную, которая содержит только время. Типа DATETIME нет. И есть тип ВРЕМЯ. Но не существует типа TIMESTAMP, который может содержать точную временную метку с точностью до миллисекунды или наносекунды. Типы данных Oracle
TO_DATE
Функция может быть использована для преобразования строк в значение даты. Функция преобразует первую строку в кавычках в дату, используя в качестве определения вторую строку в кавычках, например:
to_date ( '31-12-2004 ' , ' дд-мм-гггг ' )
или же
to_date ( '31-декабрь-2004 ' , ' дд-пн-гггг ' , ' NLS_DATE_LANGUAGE = американский ' )
Для преобразования дат в строки используется функция TO_CHAR (date_string, format_string)
.
PL / SQL также поддерживает использование литералов даты и интервала ANSI. [11] В следующем пункте указан 18-месячный диапазон:
ГДЕ dateField МЕЖДУ ДАТА '2004-12-30' - ИНТЕРВАЛ '1-6' ГОД ДО МЕСЯЦА И ДАТА '2004-12-30'
Исключения
Исключения - ошибки во время выполнения кода - бывают двух типов: определяемые пользователем и предопределенные.
Определяемые пользователем исключения всегда явно вызываются программистами с помощью команд RAISE
или RAISE_APPLICATION_ERROR
в любой ситуации, когда они определяют невозможность продолжения нормального выполнения. Команда RAISE
имеет синтаксис:
RAISE < имя исключения > ;
Корпорация Oracle предопределила несколько исключений, например NO_DATA_FOUND
, TOO_MANY_ROWS
и т. Д. Каждое исключение имеет номер ошибки SQL и сообщение об ошибке SQL, связанное с ним. Программисты могут получить доступ к ним, используя SQLCODE
и SQLERRM
функции.
Типы данных для определенных столбцов
VARIABLE_NAME table_name . Column_name % type;
Этот синтаксис определяет переменную типа указанного столбца в ссылочных таблицах.
Программисты указывают определяемые пользователем типы данных с помощью синтаксиса:
тип data_type - запись ( field_1 type_1 : = xyz , field_2 type_2 : = xyz , ... , field_n type_n : = xyz );
Например:
объявить тип t_address является запись ( имя адрес . Имя Типа% , улица адрес . Улица типа% , street_number адреса . street_number типа% , почтовый индекс адреса . почтовый индекс % Тип ); v_address t_address ; begin выберите имя , улицу , street_number , почтовый индекс в v_address с адреса, где rownum = 1 ; конец ;
Этот пример программы определяет свой собственный тип данных, называемый t_address , который содержит имя поля , улицу, street_number и почтовый индекс .
Итак, согласно примеру, мы можем копировать данные из базы данных в поля программы.
Используя этот тип данных, программист определил переменную с именем v_address и загрузил в нее данные из таблицы ADDRESS.
Программисты могут обращаться к отдельным атрибутам в такой структуре с помощью точечной нотации, таким образом:
v_address.street: = 'Главная улица';
Условные утверждения
В следующем сегменте кода показана конструкция IF-THEN-ELSIF-ELSE. Части ELSIF и ELSE являются необязательными, поэтому можно создавать более простые конструкции IF-THEN или IF-THEN-ELSE.
ЕСЛИ x = 1, ТО последовательность_выражений_1 ; ELSIF x = 2 ТОГДА последовательность_выражений_2 ; ELSIF x = 3 ТОГДА последовательность_условий_3 ; ELSIF x = 4 ТОГДА последовательность_условий_4 ; ELSIF x = 5 THEN sequence_of_statements_5 ; ELSE sequence_of_statements_N ; КОНЕЦ ЕСЛИ ;
Оператор CASE упрощает некоторые большие структуры IF-THEN-ELSIF-ELSE.
СЛУЧАЙ, КОГДА x = 1 ТОГДА последовательность_выражений_1 ; КОГДА x = 2 ТОГДА последовательность_выражений_2 ; КОГДА x = 3 ТОГДА последовательность_условий_3 ; КОГДА x = 4 ТОГДА последовательность_условий_4 ; КОГДА x = 5 ТОГДА последовательность_условий_5 ; ELSE sequence_of_statements_N ; КОНЕЧНЫЙ ДЕЛО ;
Оператор CASE может использоваться с предопределенным селектором:
CASE x WHEN 1 THEN sequence_of_statements_1 ; КОГДА 2 ТО последовательность_выражений_2 ; КОГДА 3 ТО последовательность_условий_3 ; WHEN 4 THEN sequence_of_statements_4 ; WHEN 5 THEN sequence_of_statements_5 ; ELSE sequence_of_statements_N ; КОНЕЧНЫЙ ДЕЛО ;
Обработка массивов
PL / SQL называет массивы «коллекциями». Язык предлагает три типа коллекций:
- Ассоциативные массивы (индексируемые таблицы)
- Вложенные таблицы
- Varrays (массивы переменного размера)
Программисты должны указать верхний предел для varrays, но не для таблиц с индексированием или вложенных таблиц. Язык включает несколько методов сбора, используемых для управления элементами коллекции: например, FIRST, LAST, NEXT, PRIOR, EXTEND, TRIM, DELETE и т. Д. Таблицы индексирования могут использоваться для имитации ассоциативных массивов, как в этом примере функции памятки. для функции Аккермана в PL / SQL .
Ассоциативные массивы (индексные таблицы)
С помощью индексных таблиц массив может быть проиндексирован числами или строками. Он аналогичен карте Java , которая состоит из пар ключ-значение. Есть только одно измерение, и оно безгранично.
Вложенные таблицы
С вложенными таблицами программист должен понимать, что именно вложено. Здесь создается новый тип, который может состоять из ряда компонентов. Затем этот тип можно использовать для создания столбца в таблице, и в этот столбец вложены эти компоненты.
Varrays (массивы переменного размера)
При использовании Varrays вы должны понимать, что слово «переменная» во фразе «массивы переменного размера» не применимо к размеру массива так, как вы могли бы подумать. Размер, с которым объявлен массив, фактически фиксирован. Количество элементов в массиве может изменяться до заявленного размера. Возможно, тогда массивы переменного размера не такие переменные по размеру.
Курсоры
Курсор представляет собой механизм, указатель на частную область SQL , которая хранит информацию , поступающая из SELECT , или язык манипулирования данных (DML) заявления (INSERT, UPDATE, DELETE или MERGE). Курсор держит строки (один или несколько) , возвращаемой SQL заявление. Набор строк, удерживаемых курсором, называется активным набором. [12]
Курсор может быть явным или неявным. В цикле FOR должен использоваться явный курсор, если запрос будет использоваться повторно, в противном случае предпочтителен неявный курсор. При использовании курсора внутри цикла рекомендуется использовать FETCH при необходимости массового сбора данных или при необходимости динамического SQL.
Зацикливание
В процедурном языке по определению, PL / SQL предоставляет несколько итераций конструкции, в том числе основных операторов цикла, циклов WHILE , для циклов и курсора для петель. Начиная с Oracle 7.3 был введен тип REF CURSOR, позволяющий возвращать наборы записей из хранимых процедур и функций. Oracle 9i представил предопределенный тип SYS_REFCURSOR, что означает, что нам больше не нужно определять наши собственные типы REF CURSOR.
Операторы LOOP
<> операторы LOOP<> операторы цикла выходят из parent_loop, когда < condition > ; - Завершает выход из обоих циклов, когда < условие > ; - Возвращает управление родительскому циклу end loop child_loop ; если < условие >, то продолжить ; - продолжить до конца следующей итерации, если ; выйти, когда < условие > ; END LOOP parent_loop ;
[13]
Циклы могут быть прерваны с помощью EXIT
ключевого слова или путем создания исключения .
FOR петли
ОБЪЯВИТЬ var NUMBER ; BEGIN / * NB для переменных цикла в PL / SQL - это новые объявления с областью действия только внутри цикла * / FOR var IN 0 .. 10 LOOP DBMS_OUTPUT . PUT_LINE ( var ); КОНЕЦ ПЕТЛИ ; ЕСЛИ var IS NULL, ТО DBMS_OUTPUT . PUT_LINE ( 'var is null' ); ELSE DBMS_OUTPUT . PUT_LINE ( 'var не равно нулю' ); КОНЕЦ ЕСЛИ ; КОНЕЦ ;
Выход:
0 1 2 3 4 5 6 7 8 9 10 var имеет значение null
Курсор для циклов
FOR RecordIndex IN ( ВЫБЕРИТЕ person_code FROM people_table ) LOOP DBMS_OUTPUT . PUT_LINE ( RecordIndex . Person_code ); КОНЕЦ ПЕТЛИ ;
Циклы Cursor-for автоматически открывают курсор , считывают свои данные и снова закрывают курсор.
В качестве альтернативы, программист PL / SQL может заранее определить оператор SELECT курсора, чтобы (например) разрешить повторное использование или сделать код более понятным (особенно полезно в случае длинных или сложных запросов).
DECLARE CURSOR cursor_person IS SELECT , person_code FROM people_table ; НАЧАТЬ ДЛЯ RecordIndex IN cursor_person LOOP DBMS_OUTPUT . PUT_LINE ( recordIndex . Person_code ); КОНЕЦ ПЕТЛИ ; КОНЕЦ ;
Концепция person_code в цикле FOR выражается точечной нотацией ("."):
RecordIndex . person_code
Динамический SQL
В то время как программисты могут легко встраивать операторы языка манипулирования данными (DML) непосредственно в код PL / SQL, используя простые операторы SQL, язык определения данных (DDL) требует более сложных операторов «динамического SQL» в коде PL / SQL. Однако операторы DML лежат в основе большей части кода PL / SQL в типичных программных приложениях.
В случае динамического SQL PL / SQL ранние версии Oracle Database требовали использования сложной DBMS_SQL
библиотеки пакетов Oracle . Однако более поздние версии представили более простой «собственный динамический SQL» вместе со связанным EXECUTE IMMEDIATE
синтаксисом.
Похожие языки
PL / SQL работает аналогично встроенным процедурным языкам, связанным с другими реляционными базами данных . Например, Sybase ASE и Microsoft SQL Server имеют Transact-SQL , PostgreSQL имеет PL / pgSQL (который в некоторой степени имитирует PL / SQL), MariaDB включает синтаксический анализатор совместимости PL / SQL [14] , а IBM DB2 включает процедурный язык SQL, [15] , который соответствует ISO SQL «с SQL / PSM стандарта.
Разработчики PL / SQL смоделировали его синтаксис на основе Ada . И Ada, и PL / SQL имеют Паскаль в качестве общего предка, поэтому PL / SQL также напоминает Паскаль во многих аспектах. Однако структура пакета PL / SQL не похожа на базовую структуру программы Object Pascal, реализованную модулем Borland Delphi или Free Pascal . Программисты могут определять общедоступные и частные глобальные типы данных, константы и статические переменные в пакете PL / SQL. [16]
PL / SQL также позволяет определять классы и создавать их экземпляры как объекты в коде PL / SQL. Это похоже на использование в объектно-ориентированных языках программирования, таких как Object Pascal , C ++ и Java . PL / SQL относится к классу как к «абстрактному типу данных» (ADT) или «определяемому пользователем типу» (UDT) и определяет его как тип данных Oracle SQL , а не определяемый пользователем тип PL / SQL, что позволяет его использование как в Oracle SQL Engine, так и в Oracle PL / SQL Engine. Конструктор и методы абстрактного типа данных написаны на PL / SQL. Результирующий абстрактный тип данных может работать как объектный класс в PL / SQL. Такие объекты также могут сохраняться как значения столбцов в таблицах базы данных Oracle.
PL / SQL принципиально отличается от Transact-SQL , несмотря на внешнее сходство. Перенос кода с одного языка на другой обычно требует нетривиальной работы не только из-за различий в наборах функций двух языков [17], но также из-за очень значительных различий в том, как Oracle и SQL Server справляются с параллелизмом. и запирание .
Продукт StepSqlite - это компилятор PL / SQL для популярной небольшой базы данных SQLite, который поддерживает подмножество синтаксиса PL / SQL. В выпуске Oracle Berkeley DB 11g R2 добавлена поддержка SQL на основе популярного API SQLite путем включения версии SQLite в Berkeley DB. [18] Следовательно, StepSqlite также можно использовать в качестве стороннего инструмента для запуска кода PL / SQL в Berkeley DB. [19]
Смотрите также
- T-SQL
- SQL PL
- SQL / PSM
- Редакторы PL / SQL
- Системы управления реляционными базами данных
Рекомендации
- ^ Серж Риелау ([email protected]), архитектор SQL, STSM, IBM. «DB2 10: запускайте приложения Oracle в DB2 10 для Linux, UNIX и Windows» . Ibm.com . Проверено 26 июля 2012 .CS1 maint: несколько имен: список авторов ( ссылка )
- ^ Стивен Фейерштейн (1995), «Программирование Oracle PL / SQL», 1-е, первое издание.
- ^ https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Oracle-Compliance-with-SQLPSM2011.html#GUID-651F9066-1511-407B-A002-C04AB2F2A534
- ^ «Возможности Oracle Server» . Oracle . Проверено 21 сентября 2020 .
- ^ «Анонимные блоки PL / SQL» . Oracle . Проверено 21 сентября 2020 .
- ^ «Справочник по базе данных SQL» . Oracle . Проверено 21 сентября 2020 .
- ^ Нанда, Аруп; Фейерштейн, Стивен (2005). Oracle PL / SQL для администраторов баз данных . Серия О'Рейли. O'Reilly Media, Inc., стр. 122, 429. ISBN 978-0-596-00587-0. Проверено 11 января 2011 .
Конвейерная табличная функция [...] итеративно возвращает набор результатов в виде коллекции [...]. [...] Каждая строка готова к присвоению коллекции, она «выводится» из функции.
- ^ «Справочник по базе данных SQL» . Oracle . Проверено 21 сентября 2020 .
- ^ Гупта, Саураб К. (2016) [2012]. «5: Использование расширенных методов интерфейса». Расширенное руководство разработчика Oracle PL / SQL . Профессиональный опыт дистиллированный (2-е изд.). Бирмингем: Packt Publishing Ltd. стр. 143. ISBN. 9781785282522. Проверено 8 июня 2017 .
Каждый раз, когда механизм выполнения PL / SQL встречает вызов внешней процедуры, база данных Oracle запускает процесс extproc. База данных передает информацию, полученную из спецификации вызова, процессу extproc , который помогает ему найти внешнюю процедуру в библиотеке и выполнить ее с использованием предоставленных параметров. Процесс extproc загружает динамически связанную библиотеку, выполняет внешнюю процедуру и возвращает результат обратно в базу данных.
- ^ «Кодирование процедур и пакетов PL / SQL» . Oracle . Проверено 21 сентября 2020 .
- ^ «Литералы» . Oracle iSQL Reference 10g Release 2 (10.2) . Oracle . Проверено 20 марта 2009 .
- ^ Фейерштейн, Стивен. «Работа с курсорами» . oracle.com .
- ^ «Руководство и справочник пользователя по базам данных PL / SQL» . download.oracle.com .
- ^ «Что нового в MariaDB Server 10.3» (PDF) . MariaDB . Проверено 21 августа 2018 .
- ^ «SQL PL» . Publib.boulder.ibm.com . Проверено 26 июля 2012 .
- ^ Документация Oracle «Частные и общедоступные элементы в PL / SQL»
- ^ «Переход с Oracle на SQL Server - различия T-SQL, PL / SQL: домашняя страница Нараяны Вьяса Кондредди» . vyaskn.tripod.com .
- ^ Бурд, Грегори (24 марта 2010 г.). «@humanications Мы не повторно реализовали SQLite API, мы включили версию SQLite, которая использует Berkeley DB для хранения (заменяя btree.c)» .
- ^ "Официальный FAQ Berkeley DB" . Корпорация Oracle . Проверено 30 марта 2010 года .
Поддерживает ли Berkeley DB PL / SQL?
дальнейшее чтение
- Фейерштейн, Стивен ; Билл Прибыл (2014). Программирование Oracle PL / SQL (6-е изд.). O'Reilly & Associates . ISBN 978-1449324452.
- Науд, Франк (9 июня 2005 г.). «Oracle PL / SQL FAQ rev 2.08» .
Внешние ссылки
- Oracle FAQ: PL / SQL
- Технологический центр Oracle
- Поисковая система Oracle Tahiti
- Библиотека Моргана
- ORACLE-BASE: статьи по PL / SQL