ПЛ/SQL
![]() | В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
PL/SQL ( процедурный язык для SQL ) — это Oracle корпорации процедурное расширение для SQL и реляционной базы данных Oracle . PL/SQL доступен в базе данных Oracle (начиная с версии 6 — хранимые процедуры/функции/пакеты/триггеры PL/SQL, начиная с версии 7), в базе данных TimesTen в памяти (начиная с версии 11.2.1) и IBM Db2 (начиная с версии 9.7). . [1] Корпорация Oracle обычно расширяет функциональные возможности PL/SQL с каждым последующим выпуском базы данных Oracle.
PL/SQL включает в себя элементы процедурного языка, такие как условия и циклы , и может обрабатывать исключения (ошибки времени выполнения). Он позволяет объявлять константы и переменные , процедуры, функции, пакеты, типы и переменные этих типов, а также триггеры. Поддерживаются массивы с использованием коллекций PL/SQL. Реализации Oracle Database, начиная с версии 8, включают функции, связанные с объектной ориентацией . Можно создавать модули PL/SQL, такие как процедуры, функции, пакеты, типы и триггеры, которые сохраняются в базе данных для повторного использования приложениями, использующими любой из программных интерфейсов базы данных Oracle.
Первая общедоступная версия определения PL/SQL. [2] был в 1995 году. Он реализует стандарт ISO SQL/PSM . [3]
Программный модуль PL/SQL
[ редактировать ]Основной особенностью SQL (непроцедурного) является также и его недостаток: операторы управления ( принятие решений или итеративное управление ) не могут использоваться, если будет использоваться только SQL. PL/SQL обеспечивает функциональность других процедурных языков программирования, например, принятие решений, итерацию и т. д. Программная единица PL/SQL — это одна из следующих единиц: анонимный блок PL/SQL, процедура , функция , спецификация пакета , тело пакета, триггер, спецификация типа, тело типа, библиотека. Программные модули — это исходный код PL/SQL, который разрабатывается, компилируется и в конечном итоге выполняется в базе данных. [4]
Анонимный блок PL/SQL
[ редактировать ]Базовой единицей исходной программы PL/SQL является блок, который группирует связанные объявления и операторы. Блок PL/SQL определяется ключевыми словами DECLARE, BEGIN, EXCEPTION и END. Эти ключевые слова делят блок на декларативную часть, исполняемую часть и часть обработки исключений. Раздел объявлений является необязательным и может использоваться для определения и инициализации констант и переменных. Если переменная не инициализирована, то по умолчанию ей присваивается значение NULL . Дополнительная часть обработки исключений используется для обработки ошибок во время выполнения. Требуется только исполняемая часть. Блок может иметь метку. [5]
Например:
<<label>> -- this is optional
DECLARE
-- this section is optional
number1 NUMBER(2);
number2 number1%TYPE := 17; -- value default
text1 VARCHAR2(12) := ' Hello world ';
text2 DATE := SYSDATE; -- current date and time
BEGIN
-- this section is mandatory, must contain at least one executable statement
SELECT street_number
INTO number1
FROM address
WHERE name = 'INU';
EXCEPTION
-- this section is optional
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error Code is ' || TO_CHAR(sqlcode));
DBMS_OUTPUT.PUT_LINE('Error Message is ' || sqlerrm);
END;
Символ :=
функционирует как оператор присваивания для сохранения значения в переменной.
Блоки могут быть вложенными – т.е., поскольку блок представляет собой исполняемый оператор, он может появляться в другом блоке везде, где разрешено выполнение исполняемого оператора. Блок можно отправить в интерактивный инструмент (например, SQL*Plus) или встроить в прекомпилятор Oracle или программу OCI . Интерактивный инструмент или программа запускает блок один раз. Блок не хранится в базе данных, и по этой причине он называется анонимным блоком (даже если у него есть метка).
Функция
[ редактировать ]Функция PL/SQL обычно используется для вычисления и возврата одного значения. Это возвращаемое значение может быть одним скалярным значением (например, числом, датой или строкой символов) или одной коллекцией (например, вложенной таблицей или массивом). Пользовательские функции дополняют встроенные функции, предоставляемые Oracle Corporation. [6]
Функция PL/SQL имеет вид:
CREATE OR REPLACE FUNCTION <function_name> [(input/output variable declarations)] RETURN return_type
[AUTHID <CURRENT_USER | DEFINER>] <IS|AS> -- heading part
amount number; -- declaration block
BEGIN -- executable part
<PL/SQL block with return statement>
RETURN <return_value>;
[Exception
none]
RETURN <return_value>;
END;
Табличные функции с конвейерной структурой возвращают коллекции [7] и примем форму:
CREATE OR REPLACE FUNCTION <function_name> [(input/output variable declarations)] RETURN return_type
[AUTHID <CURRENT_USER | DEFINER>] [<AGGREGATE | PIPELINED>] <IS|USING>
[declaration block]
BEGIN
<PL/SQL block with return statement>
PIPE ROW <return type>;
RETURN;
[Exception
exception block]
PIPE ROW <return type>;
RETURN;
END;
Функция должна использовать только параметр типа IN по умолчанию. Единственным выходным значением функции должно быть значение, которое она возвращает.
Процедура
[ редактировать ]Процедуры напоминают функции в том смысле, что они представляют собой именованные программные модули, которые можно вызывать неоднократно. Основное отличие состоит в том, что функции можно использовать в операторах SQL, а процедуры — нет . Другое отличие состоит в том, что процедура может возвращать несколько значений, тогда как функция должна возвращать только одно значение. [8]
Процедура начинается с обязательного заголовка, содержащего имя процедуры и, при необходимости, список параметров процедуры. Далее идут декларативная, исполняемая части и части обработки исключений, как в анонимном блоке PL/SQL. Простая процедура может выглядеть так:
CREATE PROCEDURE create_email_address ( -- Procedure heading part begins
name1 VARCHAR2,
name2 VARCHAR2,
company VARCHAR2,
email OUT VARCHAR2
) -- Procedure heading part ends
AS
-- Declarative part begins (optional)
error_message VARCHAR2(30) := 'Email address is too long.';
BEGIN -- Executable part begins (mandatory)
email := name1 || '.' || name2 || '@' || company;
EXCEPTION -- Exception-handling part begins (optional)
WHEN VALUE_ERROR THEN
DBMS_OUTPUT.PUT_LINE(error_message);
END create_email_address;
В приведенном выше примере показана отдельная процедура — процедуры этого типа создаются и сохраняются в схеме базы данных с помощью оператора CREATE PROCEDURE. Процедуру также можно создать в пакете PL/SQL — это называется процедурой пакета. Процедура, созданная в анонимном блоке PL/SQL, называется вложенной процедурой. Автономные или пакетные процедуры, хранящиеся в базе данных, называются « хранимыми процедурами ».
Процедуры могут иметь три типа параметров: IN, OUT и IN OUT.
- Параметр IN используется только как входной. Параметр IN передается по ссылке, хотя он может быть изменен неактивной программой.
- Параметр OUT изначально имеет значение NULL. Программа присваивает значение параметра, и это значение возвращается вызывающей программе.
- Параметр IN OUT может иметь или не иметь начальное значение. Это начальное значение может быть изменено или не изменено вызываемой программой. Любые изменения, внесенные в параметр, по умолчанию возвращаются в вызывающую программу путем копирования, но с подсказкой NO-COPY могут быть переданы по ссылке .
PL/SQL также поддерживает внешние процедуры через стандарт базы данных Oracle. ext-proc
процесс. [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.
Числовые переменные
[ редактировать ]variable_name number([P, S]) := 0;
Чтобы определить числовую переменную, программист добавляет переменную типа NUMBER к определению имени . Чтобы указать (необязательную) точность (P) и (необязательный) масштаб (S), можно добавить их в круглые скобки, разделенные запятой. («Точность» в этом контексте относится к количеству цифр, которые может содержать переменная, а «масштаб» относится к количеству цифр, которые могут следовать за десятичной запятой.)
Выбор других типов данных для числовых переменных может включать: двоичный_плавающий, двоичный_двойной, десятичный, десятичный, двойной точности, с плавающей запятой, целое число, целое число, числовое, действительное, маленькое целое число, двоичное целое число.
Символьные переменные
[ редактировать ]variable_name varchar2(20) := 'Text';
-- e.g.:
address varchar2(20) := 'lake view road';
Чтобы определить символьную переменную, программист обычно добавляет к определению имени переменную типа VARCHAR2. В скобках указано максимальное количество символов, которое может хранить переменная.
Другие типы данных для символьных переменных включают: varchar, char, long, raw, long raw, nchar, nchar2, clob, blob и bfile.
Переменные даты
[ редактировать ]variable_name date := to_date('01-01-2005 14:20:23', 'DD-MM-YYYY hh24:mi:ss');
Переменные даты могут содержать дату и время. Время можно не указывать, но невозможно определить переменную, содержащую только время. Типа DATETIME нет. И есть тип ВРЕМЯ. Но не существует типа TIMESTAMP, который мог бы содержать детальную метку времени с точностью до миллисекунды или наносекунды.
TO_DATE
Функция может использоваться для преобразования строк в значения даты. Функция преобразует первую строку в кавычках в дату, используя в качестве определения вторую строку в кавычках, например:
to_date('31-12-2004', 'dd-mm-yyyy')
или
to_date ('31-Dec-2004', 'dd-mon-yyyy', 'NLS_DATE_LANGUAGE = American')
Для преобразования дат в строки используется функция TO_CHAR (date_string, format_string)
.
PL/SQL также поддерживает использование литералов даты и интервала ANSI. [11] В следующем пункте указан 18-месячный диапазон:
WHERE dateField BETWEEN DATE '2004-12-30' - INTERVAL '1-6' YEAR TO MONTH
AND DATE '2004-12-30'
Исключения
[ редактировать ]Исключения — ошибки во время выполнения кода — бывают двух типов: определяемые пользователем и предопределенные.
Пользовательские исключения всегда вызываются программистами явно, используя метод RAISE
или RAISE_APPLICATION_ERROR
команды в любой ситуации, когда они определяют, что продолжение нормального выполнения невозможно. RAISE
команда имеет синтаксис:
RAISE <exception name>;
Корпорация Oracle предопределила несколько исключений, например NO_DATA_FOUND
, TOO_MANY_ROWS
, и т. д.
Каждое исключение имеет номер ошибки SQL и связанное с ним сообщение об ошибке SQL. Программисты могут получить к ним доступ, используя SQLCODE
и SQLERRM
функции.
Типы данных для определенных столбцов
[ редактировать ]Variable_name Table_name.Column_name%type;
Этот синтаксис определяет переменную типа столбца, на который ссылаются, в таблицах, на которые ссылаются.
Программисты определяют определяемые пользователем типы данных с помощью синтаксиса:
type data_type is record (field_1 type_1 := xyz, field_2 type_2 := xyz, ..., field_n type_n := xyz);
Например:
declare
type t_address is record (
name address.name%type,
street address.street%type,
street_number address.street_number%type,
postcode address.postcode%type);
v_address t_address;
begin
select name, street, street_number, postcode into v_address from address where rownum = 1;
end;
В этом примере программы определяется собственный тип данных, называемый t_address , который содержит поля name, street, street_number и почтовый индекс .
Итак, согласно примеру, мы можем скопировать данные из базы данных в поля программы.
Используя этот тип данных, программист определил переменную с именем v_address и загрузил в нее данные из таблицы ADDRESS.
Программисты могут обращаться к отдельным атрибутам в такой структуре посредством точечной записи, таким образом:
v_address.street := 'High Street';
Условные операторы
[ редактировать ]В следующем сегменте кода показана конструкция IF-THEN-ELSIF-ELSE. Части ELSIF и ELSE не являются обязательными, поэтому можно создавать более простые конструкции IF-THEN или IF-THEN-ELSE.
IF x = 1 THEN
sequence_of_statements_1;
ELSIF x = 2 THEN
sequence_of_statements_2;
ELSIF x = 3 THEN
sequence_of_statements_3;
ELSIF x = 4 THEN
sequence_of_statements_4;
ELSIF x = 5 THEN
sequence_of_statements_5;
ELSE
sequence_of_statements_N;
END IF;
Оператор CASE упрощает некоторые большие структуры IF-THEN-ELSIF-ELSE.
CASE
WHEN x = 1 THEN sequence_of_statements_1;
WHEN x = 2 THEN sequence_of_statements_2;
WHEN x = 3 THEN sequence_of_statements_3;
WHEN x = 4 THEN sequence_of_statements_4;
WHEN x = 5 THEN sequence_of_statements_5;
ELSE sequence_of_statements_N;
END CASE;
Оператор CASE можно использовать с предопределенным селектором:
CASE x
WHEN 1 THEN sequence_of_statements_1;
WHEN 2 THEN sequence_of_statements_2;
WHEN 3 THEN sequence_of_statements_3;
WHEN 4 THEN sequence_of_statements_4;
WHEN 5 THEN sequence_of_statements_5;
ELSE sequence_of_statements_N;
END CASE;
Обработка массива
[ редактировать ]PL/SQL называет массивы «коллекциями». Язык предлагает три типа коллекций:
- Ассоциативные массивы (индексные таблицы)
- Вложенные таблицы
- Varrays (массивы переменного размера)
Программисты должны указать верхний предел для массивов varray, но не обязательно для таблиц с индексированием или для вложенных таблиц. Язык включает в себя несколько методов сбора , используемых для управления элементами коллекции: например, FIRST, LAST, NEXT, PRIOR, EXTEND, TRIM, DELETE и т. д. Таблицы с индексированием можно использовать для имитации ассоциативных массивов, как в этом примере функции memo. для функции Аккермана в PL/SQL .
Ассоциативные массивы (индексные таблицы)
[ редактировать ]В таблицах с индексированием массив можно индексировать по числам или строкам. Он аналогичен Java карте , которая содержит пары ключ-значение. Существует только одно измерение, и оно безгранично.
Вложенные таблицы
[ редактировать ]При использовании вложенных таблиц программисту необходимо понимать, что является вложенным. Здесь создается новый тип, который может состоять из нескольких компонентов. Затем этот тип можно использовать для создания столбца в таблице, и в этот столбец вложены эти компоненты.
Varrays (массивы переменного размера)
[ редактировать ]При использовании Varrays вам необходимо понимать, что слово «переменная» во фразе «массивы переменного размера» не относится к размеру массива так, как вы могли бы подумать. Размер объявленного массива на самом деле фиксирован. Количество элементов в массиве варьируется в пределах объявленного размера. Возможно, тогда массивы переменного размера не являются такими переменными по размеру.
Курсоры
[ редактировать ]Курсор — это указатель на частную область SQL, в которой хранится информация , поступающая из оператора SELECT или языка манипулирования данными (DML) (INSERT, UPDATE, DELETE или MERGE). Курсор содержит строки (одну или несколько) , возвращаемые инструкцией SQL. Набор строк, который удерживает курсор , называется активным набором. [12]
Курсор . может быть явным или неявным В цикле FOR следует использовать явный курсор, если запрос будет использоваться повторно, в противном случае предпочтителен неявный курсор. При использовании курсора внутри цикла рекомендуется использовать FETCH при необходимости массового сбора или при необходимости динамического SQL.
Зацикливание
[ редактировать ]Как процедурный язык по определению, PL/SQL предоставляет несколько итерационных конструкций, включая базовые операторы LOOP, циклы WHILE , циклы FOR и курсорные циклы FOR. Начиная с Oracle 7.3 был введен тип REF CURSOR, позволяющий возвращать наборы записей из хранимых процедур и функций. В Oracle 9i появился предопределенный тип SYS_REFCURSOR, что означает, что нам больше не нужно определять собственные типы REF CURSOR.
Операторы LOOP
[ редактировать ]<<parent_loop>>
LOOP
statements
<<child_loop>>
loop
statements
exit parent_loop when <condition>; -- Terminates both loops
exit when <condition>; -- Returns control to parent_loop
end loop child_loop;
if <condition> then
continue; -- continue to next iteration
end if;
exit when <condition>;
END LOOP parent_loop;
Циклы можно завершить с помощью EXIT
ключевое слово или путем создания исключения .
Циклы FOR
[ редактировать ]DECLARE
var NUMBER;
BEGIN
/* N.B. for loop variables in PL/SQL are new declarations, with scope only inside the loop */
FOR var IN 0 .. 10 LOOP
DBMS_OUTPUT.PUT_LINE(var);
END LOOP;
IF var IS NULL THEN
DBMS_OUTPUT.PUT_LINE('var is null');
ELSE
DBMS_OUTPUT.PUT_LINE('var is not null');
END IF;
END;
Выход:
0 1 2 3 4 5 6 7 8 9 10 var is null
Курсор циклов FOR
[ редактировать ]FOR RecordIndex IN (SELECT person_code FROM people_table)
LOOP
DBMS_OUTPUT.PUT_LINE(RecordIndex.person_code);
END LOOP;
Циклы Cursor-for автоматически открывают курсор , считывают его данные и снова закрывают курсор.
В качестве альтернативы программист PL/SQL может заранее определить оператор SELECT курсора, чтобы (например) разрешить повторное использование или сделать код более понятным (особенно полезно в случае длинных или сложных запросов).
DECLARE
CURSOR cursor_person IS
SELECT person_code FROM people_table;
BEGIN
FOR RecordIndex IN cursor_person
LOOP
DBMS_OUTPUT.PUT_LINE(recordIndex.person_code);
END LOOP;
END;
Концепция person_code в цикле FOR выражается с помощью точечной записи ("."):
RecordIndex.person_code
Динамический SQL
[ редактировать ]В то время как программисты могут легко встраивать операторы языка манипулирования данными (DML) непосредственно в код PL/SQL, используя простые операторы SQL, язык определения данных (DDL) требует более сложных операторов «динамического SQL» в коде PL/SQL. Однако операторы DML лежат в основе большей части кода PL/SQL в типичных программных приложениях.
В случае динамического SQL PL/SQL ранние версии базы данных Oracle требовали использования сложной системы Oracle. DBMS_SQL
библиотека пакетов. Однако в более поздних версиях представлен более простой «Native Dynamic 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 имеют Pascal общего предка , поэтому PL/SQL также во многом напоминает Pascal. Однако структура пакета 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. Конструктор и методы абстрактного типа данных написаны на 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]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Серж Рило ( [электронная почта защищена] ), архитектор SQL, STSM, IBM. «DB2 10: запуск приложений Oracle в DB2 10 для Linux, UNIX и Windows» . IBM.com . Проверено 26 июля 2012 г.
{{cite web}}
: CS1 maint: несколько имен: список авторов ( ссылка ) - ^ Стивен Фейерштейн (1995), «Программирование Oracle PL/SQL», 1-е, первое издание.
- ^ «Соответствие Oracle SQL/PSM» .
- ^ «Функции сервера Oracle» . Оракул . Проверено 21 сентября 2020 г.
- ^ «Анонимные блоки PL/SQL» . Оракул . Проверено 21 сентября 2020 г.
- ^ «Справочник по SQL базы данных» . Оракул . Проверено 21 сентября 2020 г.
- ^
Нанда, Аруп; Фейерштейн, Стивен (2005). Oracle PL/SQL для администраторов баз данных . Серия О'Рейли. O'Reilly Media, Inc., стр. 122, 429. ISBN. 978-0-596-00587-0 . Проверено 11 января 2011 г.
Конвейерная табличная функция [...] возвращает набор результатов в виде коллекции [...] итеративно. [... Поскольку] каждая строка готова к назначению коллекции, она «выводится» из функции.
- ^ «Справочник по SQL базы данных» . Оракул . Проверено 21 сентября 2020 г.
- ^
Гупта, Саураб К. (2012). «5: Использование расширенных методов интерфейса». Расширенное руководство разработчика Oracle PL/SQL . Обобщенный профессиональный опыт (2-е изд.). Бирмингем: Packt Publishing Ltd (опубликовано в 2016 г.). п. 143. ИСБН 9781785282522 . Проверено 8 июня 2017 г.
Всякий раз, когда механизм выполнения PL/SQL встречает вызов внешней процедуры, база данных Oracle запускает процесс extproc. База данных передает информацию, полученную из спецификации вызова, в
extproc
процесс, который помогает ему найти внешнюю процедуру в библиотеке и выполнить ее с использованием предоставленных параметров.extproc
процесс загружает динамически подключаемую библиотеку, выполняет внешнюю процедуру и возвращает результат обратно в базу данных. - ^ «Кодирование процедур и пакетов PL/SQL» . Оракул . Проверено 21 сентября 2020 г.
- ^ «Литералы» . Справочник по Oracle iSQL 10g, выпуск 2 (10.2) . Оракул . Проверено 20 марта 2009 г.
- ^ Фейерштейн, Стивен. «Работа с курсорами» . oracle.com .
- ^ «Руководство и справочник пользователя по базам данных PL/SQL» . скачать.oracle.com .
- ^ «Что нового в MariaDB Server 10.3» (PDF) . МарияДБ . Проверено 21 августа 2018 г.
- ^ «SQL ПЛ» . Публикация.boulder.ibm.com . Проверено 26 июля 2012 г.
- ^ Документация Oracle «Частные и общедоступные элементы в PL/SQL»
- ^ «Миграция с Oracle на SQL Server — различия T-SQL, PL/SQL: домашняя страница Нараяны Вьяса Кондредди» . vyaskn.tripod.com .
- ^ Бурд, Грегори (24 марта 2010 г.). «@humanications Мы не реализовали заново API SQLite, мы включили версию SQLite, которая использует Berkeley DB для хранения (заменяя btree.c)» .
- ^ «Официальные часто задаваемые вопросы по Berkeley DB» . Корпорация Оракл . Проверено 30 марта 2010 г.
Поддерживает ли Berkeley DB PL/SQL?
Дальнейшее чтение
[ редактировать ]- Фейерштейн, Стивен ; Билл Прибыл (2014). Программирование Oracle PL/SQL (6-е изд.). О'Рейли и партнеры . ISBN 978-1449324452 .
- Наде, Франк (9 июня 2005 г.). «Часто задаваемые вопросы по Oracle PL/SQL, версия 2.08» .
Внешние ссылки
[ редактировать ]