Oracle программирование на sql и pl sql

В главе 7 объясняется язык структурированных запросов (SQL) и то, как база данных обрабатывает операторы SQL. В этой главе объясняется, как процедурный язык/SQL (PL/SQL) или Java-программы, хранящиеся в базе данных. Могут использовать SQL.

Введение в серверное программирование

В непроцедурном языке, таком как SQL, задается набор данных, с которыми нужно работать, но не операции, которые должны выполняться, или способ. Которым они должны выполняться. В программе на процедурном языке выполнение большинства операторов зависит от предыдущих или последующих операторов и от управляющих структур. Таких как циклы или условные ветви. Которые недоступны в SQL.

Для иллюстрации разницы между процедурным и непроцедурным языками предположим. Что следующая инструкция SQL запрашивает employeesтаблицу:

ВЫБЕРИТЕ employee_id, department_id, last_name, зарплата ОТ сотрудников; 

Предыдущий оператор запрашивает данные, но не применяет к ним логику. Тем не менее, предположим. Что вы хотите, чтобы приложение определило. Заслуживает ли каждый сотрудник в наборе данных повышения на основе заработной платы и производительности отдела. Необходимым условием повышения зарплаты является то. Что работник не получал за последние пять лет более трех повышений.

Если требуется повышение зарплаты. То заявка должна скорректировать ее и отправить менеджеру по электронной почте; в противном случае заявка должна обновить отчет.

Проблема заключается в том, как процедурные приложения баз данных. Требующие условной логики и управления потоком программ. Могут использовать SQL. Основные подходы к развитию заключаются в следующем:

  • Используйте клиентское программирование для встраивания операторов SQL в приложения. Написанные на процедурных языках. Таких как C. C++ или Java

    Вы можете поместить SQL-операторы в исходный код и отправить его в

    прекомпилятор или Java-переводчик перед компиляцией. Кроме того, можно исключить этап предварительной компиляции и использовать API. Такой как Java Database Connectivity (JDBC) или Oracle Call Interface (OCI). Чтобы позволить приложению взаимодействовать с базой данных.

  • Используйте серверное программирование для разработки логики данных. Которая находится в базе данных

    Приложение может явным образом вызывать хранимые подпрограммы (процедуры и функции). Написанные на языке PL/SQL (произносится P L sequel) или Java. Вы также можете создать триггер, который называется программным блоком. Который хранится в базе данных и вызывается в ответ на указанное событие.

В этой главе объясняется второй подход. Основное преимущество серверного программирования заключается в том. Что функциональность. Встроенная в базу данных. Может быть развернута в любом месте. База данных. А не приложение определяет наилучший способ выполнения задач в данной операционной системе. Кроме того, подпрограммы повышают масштабируемость за счет централизации обработки приложений на сервере. Позволяя клиентам повторно использовать код. Поскольку вызовы подпрограмм быстры и эффективны. Один вызов может запустить вычислительно-интенсивную хранимую подпрограмму. Сократив сетевой трафик.

Для хранения логики данных в базе данных Oracle можно использовать следующие языки:

  • PL/SQL

    PL/SQL является процедурным расширением базы данных Oracle для SQL. PL/SQL интегрирован с базой данных. Поддерживая все операторы, функции и типы данных Oracle SQL. Приложения. Написанные на API баз данных. Могут вызывать хранимые подпрограммы PL/SQL и отправлять блоки кода PL/SQL в базу данных для выполнения.

  • Ява

    Oracle Database также обеспечивает поддержку разработки, хранения и развертывания Java-приложений. Хранимые подпрограммы Java выполняются в базе данных и не зависят от программ, работающих на среднем уровне. Хранимые подпрограммы Java взаимодействуют с SQL, используя аналогичную модель выполнения PL/SQL.

смотрите также:

Обзор PL/SQL

PL/SQL предоставляет серверный, хранимый процедурный язык, который прост в использовании. Бесшовен с SQL, надежен. Переносим и безопасен. Вы можете получить доступ к данным базы данных и манипулировать ими с помощью процедурных объектов схемы, называемых программными блоками PL/SQL.

Программные блоки PL/SQL обычно классифицируются следующим образом:

  • Подпрограмма-это блок PL/SQL. Который хранится в базе данных и может быть вызван по имени из приложения. При создании подпрограммы база данных анализирует подпрограмму и сохраняет ее анализируемое представление в базе данных. Подпрограмму можно объявить как процедуру или функцию.

  • Анонимный блок-это блок PL/SQL. Который появляется в вашем приложении и не имеет имени и не хранится в базе данных. Во многих приложениях блоки PL/SQL могут появляться везде, где могут появляться инструкции SQL.

Компилятор и интерпретатор PL/SQL встроены в Oracle SQL Developer. Предоставляя разработчикам согласованную и используемую модель разработки как на клиенте. Так и на сервере. Кроме того, хранимые процедуры PL/SQL могут быть вызваны из нескольких клиентов базы данных. Таких как Pro*C, JDBC. ODBC или OCI. А также из отчетов Oracle и форм Oracle.

смотрите также:

Подпрограммы PL/SQL

Подпрограмма PL/SQL-это именованный блок PL/SQL. Который позволяет вызывающему объекту предоставлять параметры. Которые могут быть только входными. Только выходными или входными и выходными значениями. Подпрограмма решает конкретную проблему или выполняет связанные с ней задачи и служит строительным блоком для модульных. Обслуживаемых приложений баз данных.

Подпрограмма-это либо процедура, либо функция. Процедуры и функции идентичны, за исключением того, что функции всегда возвращают вызывающему одно значение. А процедуры-нет. Термин процедура в этой главе означает процедуру или функцию.

смотрите также:

Преимущества подпрограмм PL/SQL

Как объяснено в разделе , серверное программирование имеет много преимуществ перед клиентским. Подпрограммы PL/SQL обеспечивают следующие преимущества:

  • Улучшенная производительность

    • Объем информации, которую приложение должно отправить по сети. Невелик по сравнению с выдачей отдельных операторов SQL или отправкой текста всего блока PL/SQL в базу данных Oracle. Поскольку информация отправляется только один раз и затем вызывается при ее использовании.

    • Скомпилированная форма процедуры легко доступна в базе данных. Поэтому компиляция не требуется во время выполнения.

    • Если процедура присутствует в общем пуле SGA, то базе данных не нужно извлекать ее с диска и она может начать выполнение немедленно.

  • Выделение памяти

    Поскольку хранимые процедуры используют возможности общей памяти базы данных Oracle. Она должна загружать в память только одну копию процедуры для выполнения несколькими пользователями. Совместное использование кода между пользователями приводит к существенному снижению требований к памяти базы данных для приложений.

  • Повышение производительности

    Хранимые процедуры повышают производительность разработки. Проектируя приложения вокруг общего набора процедур, можно избежать избыточного кодирования. Например, можно написать процедуры для управления строками в employeesтаблице. Любое приложение может вызывать эти процедуры, не требуя переписывания инструкций SQL. Если методы управления данными изменяются, то должны быть изменены только процедуры, а не приложения. Которые используют эти процедуры.

    Хранимые процедуры-это, пожалуй, лучший способ добиться повторного использования кода. Поскольку любое клиентское приложение, написанное на любом языке, который подключается к базе данных. Может вызывать хранимые процедуры. Они обеспечивают максимальное повторное использование кода во всех средах.

  • Целостность

    Хранимые процедуры улучшают целостность и согласованность приложений. Разрабатывая приложения вокруг общей группы процедур, вы уменьшаете вероятность ошибок кодирования.

    Например, вы можете протестировать подпрограмму, чтобы гарантировать, что она возвращает точный результат. И после проверки повторно использовать ее в любом количестве приложений без повторного тестирования. Если структуры данных, на которые ссылается процедура, изменены. То вам нужно только перекомпилировать процедуру. Приложения, вызывающие процедуру, не обязательно требуют изменений.

  • Обеспечение с процедурами прав определителя

    Хранимые процедуры могут помочь обеспечить безопасность данных (см. ). Процедура прав определителя выполняется с привилегиями его владельца, а не текущего пользователя. Таким образом. Вы можете ограничить операции с базой данных, выполняемые пользователями. Разрешив им доступ к данным только через процедуры и функции. Которые выполняются с привилегиями определителя.

    Например, вы можете предоставить пользователям доступ к процедуре, которая обновляет таблицу. Но не предоставлять доступ к самой таблице. Когда пользователь вызывает процедуру, она выполняется с правами ее владельца. Пользователи, имеющие только привилегии на выполнение процедуры (но не привилегии на запрос. Обновление или удаление из базовых таблиц). Могут вызывать процедуру. Но не манипулировать табличными данными каким-либо другим способом.

  • Унаследованные привилегии и контекст схемы с процедурами прав вызывающего

    Процедура прав вызывающего выполняется в схеме текущего пользователя с правами текущего пользователя. Другими словами, процедура прав вызывающего не привязана к конкретному пользователю или схеме. Процедуры прав Invoker позволяют разработчикам приложений легко централизовать логику приложения. Даже если базовые данные распределены между пользовательскими схемами.

    Например, hr_managerпользователь. Выполняющий процедуру обновления hr.employeesтаблицы. Может обновлять зарплаты. В то hr_clerkвремя как пользователь. Выполняющий ту же процедуру. Ограничен обновлением адресных данных.

смотрите также:

Создание подпрограмм PL/SQL

Подпрограмма. Созданная на уровне схемы с CREATE PROCEDURECREATE FUNCTIONпомощью оператора or. Является автономной хранимой подпрограммой. Подпрограммы, определенные в пакете, называются подпрограммами пакета и считаются частью пакета. База данных хранит подпрограммы в словаре данных как объекты схемы.

Подпрограмма имеет спецификацию, которая включает в себя описание любых параметров, и тело. Пример 8-1 показывает часть инструкции создания автономной процедуры PL/SQL hire_employees. Процедура вставляет строку в employeesтаблицу.

Пример 8-1 Процедура PL/SQL

СОЗДАТЬ ПРОЦЕДУРУ hire_employees (p_last_name VARCHAR2, p_job_id VARCHAR2, p_manager_id NUMBER. P_hire_date DATE. P_salary NUMBER. P_commission_pct NUMBER. P_department_id NUMBER) ЭТО НАЧАЛО . . . ВСТАВИТЬ В сотрудников (employee_id, last_name, job_id, manager_id, hire_date, зарплата, commission_pct. Department_id) ЗНАЧЕНИЯ (emp_sequence.NEXTVAL, p_last_name, p_job_id, p_manager_id, p_hire_date, p_salary, p_commission_pct, p_department_id); . ... КОНЕЦ; 

смотрите также:

Выполнение подпрограмм PL/SQL

Пользователи могут выполнять подпрограмму в интерактивном режиме,:

На рис. 8-1 показаны различные вызываемые приложения баз hire_employeesданных .

Кроме того, привилегированный пользователь может использовать Oracle Enterprise Manager или SQL*Plus для выполнения hire_employeesпроцедуры с помощью следующей инструкции:

ВЫПОЛНИТЬ hire_employees ('TSMITH', 'CLERK', 1037, SYSDATE, 500, NULL, 20); 

Предыдущий оператор вставляет новую запись for TSMITHв employeesтаблицу.

Хранимая процедура зависит от объектов, на которые ссылается ее тело. База данных автоматически отслеживает и управляет этими зависимостями. Например, если вы измените определение employeesтаблицы, на которую ссылается hire_employeesпроцедура. Таким образом. Чтобы это повлияло на эту процедуру. То процедуру необходимо перекомпилировать. Чтобы убедиться. Что она по-прежнему работает так. Как задумано. Обычно база данных автоматически управляет таким управлением зависимостями.

смотрите также:

Пакеты PL/SQL

Пакет PL/SQL-это группа связанных подпрограмм вместе с курсорами и переменными, которые они используют. Хранящихся вместе в базе данных для дальнейшего использования в качестве единицы. Упакованные подпрограммы могут быть вызваны явно приложениями или пользователями.

Oracle Database включает в себя множество поставляемых пакетов, расширяющих функциональность базы данных и обеспечивающих доступ PL/SQL к функциям SQL. Например, UTL_HTTPпакет позволяет HTTP-выноскам из PL/SQL и SQL получать доступ к данным в Интернете или вызывать картриджи Oracle Web Server. Поставляемые пакеты можно использовать при создании приложений или в качестве источника идей при создании собственных хранимых процедур.

Преимущества пакетов PL/SQL

Пакеты PL/SQL обеспечивают следующие преимущества:

  • Инкапсуляция

    Пакеты позволяют инкапсулировать или группировать хранимые процедуры, переменные, типы данных и т. Д. Инкапсуляция обеспечивает лучшую организацию во время разработки, а также большую гибкость. Вы можете создавать спецификации и ссылаться на общедоступные процедуры, фактически не создавая тело пакета. Инкапсуляция упрощает управление привилегиями. Предоставление привилегии для пакета делает конструкции пакета доступными для получателя.

  • Безопасность данных

    Методы определения пакета позволяют указать, какие переменные. Курсоры и процедуры являются общедоступными и частными. Public означает, что он непосредственно доступен пользователю пакета. Private означает, что он скрыт от пользователя пакета.

    Например, пакет может содержать 10 процедур. Вы можете определить пакет так, что только три процедуры являются открытыми и, следовательно. Доступны для выполнения пользователем пакета. Остальные процедуры являются частными и могут быть доступны только процедурам в пакете. Не путайте публичные и частные переменные пакета с грантами PUBLIC.

  • Лучшая производительность

    Весь пакет загружается в память небольшими порциями, когда процедура в пакете вызывается в первый раз. Эта нагрузка выполняется за одну операцию, в отличие от отдельных нагрузок. Необходимых для автономных процедур. Когда происходят вызовы связанных упакованных процедур. Дисковый ввод-вывод не требуется для запуска скомпилированного кода в памяти.

    Тело пакета можно заменить и перекомпилировать, не влияя на спецификацию. В результате объекты схемы. Которые ссылаются на конструкции пакета (всегда через спецификацию). Не нужно перекомпилировать. Если спецификация пакета также не заменена. При использовании пакетов ненужные перекомпиляции могут быть сведены к минимуму. Что приведет к меньшему влиянию на общую производительность базы данных.

Создание пакетов PL/SQL

Вы создаете пакет из двух частей: спецификации и тела. Спецификация пакета объявляет все публичные конструкции пакета. В то время как тело определяет все конструкции (публичные и частные) пакета.

Пример 8-1 показывает часть инструкции , создающей спецификацию пакета дляemployees_management, которая инкапсулирует несколько подпрограмм. Используемых для управления базой данных сотрудников. Каждая часть пакета создается с помощью другого оператора.

Пример 8-2 Пакет PL/SQL

СОЗДАЙТЕ ПАКЕТ employees_management СЛЕДУЮЩИМ ОБРАЗОМ ФУНКЦИЯ hire_employees (last_name VARCHAR2, job_id VARCHAR2, manager_id NUMBER. Salary NUMBER. Commission_pct NUMBER. Department_id number) ВОЗВРАЩАЕТ НОМЕР ВОЗВРАТА; ПРОЦЕДУРА fire_employees(номер employee_id); ПРОЦЕДУРА salary_raise(НОМЕР employee_id, НОМЕР salary_incr); . . . ИСКЛЮЧЕНИЕ no_sal; КОНЕЧНЫЕ сотрудники управление; 

Спецификация объявляет функцию hire_employees, процедуры fire_employeesи salary_raiseисключение no_sal. Все эти общедоступные программные объекты доступны пользователям, имеющим доступ к пакету.

CREATE PACKAGE BODYКоманда определяет объекты, объявленные в спецификации. Тело пакета должно быть создано в той же схеме, что и сам пакет. После создания пакета можно разрабатывать приложения. Которые вызывают любую из этих открытых процедур или функций или вызывают любое из открытых исключений пакета.

Выполнение подпрограмм пакета PL/SQL

Вы можете ссылаться на содержимое пакета из триггеров базы данных. Хранимых подпрограмм. Прикладных программ 3GL и инструментов Oracle. На рис. 8-2 показаны приложения баз данных, вызывающие процедуры и функции в employees_managementпакете.

Приложения базы данных явно вызывают упакованные процедуры по мере необходимости. После предоставления привилегий для employees_managementпакета пользователь может явно выполнить любую из процедур. Содержащихся в нем. Например, SQL*Plus может выдать следующую инструкцию для выполнения процедуры hire_employeesпакета:

ВЫПОЛНИТЬ employees_management.hire_employees ('TSMITH', 'CLERK', 1037, SYSDATE, 500, NULL, 20); 

смотрите также:

Анонимные блоки PL/SQL

Анонимный блок-это безымянный, неперсонифицированный блок PL/SQL. Типичное использование анонимных блоков включает в себя:

  • Инициирование вызовов подпрограмм и конструкций пакетов

  • Изолирующая обработка исключений

  • Управление управлением путем вложенности кода в другие блоки PL/SQL

Анонимные блоки не обладают преимуществами повторного использования кода хранимых подпрограмм. В таблице 8-1 суммируются различия между двумя типами программных единиц.

Таблица 8-1 Различия между Анонимными Блоками и Подпрограммами

Это блок PL/SQL … Анонимные Блоки Подпрограммы

Указано с именем?

НЕТ

ДА

Компилируется при каждом повторном использовании?

НЕТ

НЕТ

Хранится в базе данных?

НЕТ

ДА

Вызывается другими приложениями?

НЕТ

ДА

Способен возвращать значения переменных привязки?

ДА

ДА

Способен возвращать значения функций?

НЕТ

ДА

Способен принимать параметры?

НЕТ

ДА

Анонимный блок состоит из необязательной декларативной части. Исполняемой части и одного или нескольких необязательных обработчиков исключений. Следующий пример анонимного блока выбирает фамилию сотрудника в переменную и печатает ее:

ОБЪЯВЛЯТЬ v_lname VARCHAR2(25); НАЧАТЬ ВЫБЕРИТЕ last_name В v_lname ОТ сотрудников ГДЕ employee_id = 101; DBMS_OUTPUT.PUT_LINE('Фамилия сотрудника-это '||v_lname); КОНЕЦ; 

Oracle Database компилирует блок PL/SQL и помещает его в общий пул SGA. Но не сохраняет исходный код или скомпилированную версию в базе данных для повторного использования за пределами текущего экземпляра. В отличие от триггеров, анонимный блок компилируется каждый раз. Когда он загружается в память. Общий SQL позволяет анонимным блокам PL/SQL в общем пуле повторно использоваться и совместно использоваться до тех пор. Пока они не будут удалены из общего пула.

Конструкции языка PL/SQL

Блоки PL/SQL могут включать в себя множество различных конструкций языка PL/SQL. Эти конструкции включают в себя следующее:

  • Переменные и константы

    Эти конструкции можно объявить в процедуре, функции или пакете. Вы можете использовать переменную или константу в операторе SQL или PL/SQL для захвата или предоставления значения. Когда оно необходимо.

  • Курсоры

    Вы можете явно объявить курсор в процедуре, функции или пакете. Чтобы облегчить ориентированную на запись обработку данных базы данных Oracle. Движок PL/SQL также может неявно объявлять курсоры.

  • Исключения

    PL/SQL позволяет явно обрабатывать внутренние и пользовательские условия ошибок, называемые исключениями, которые возникают при обработке кода PL/SQL.

PL/SQL может запускать динамические операторы SQL, полный текст которых неизвестен до времени выполнения. Динамические операторы SQL хранятся в символьных строках. Которые вводятся или создаются программой во время выполнения. Этот метод позволяет создавать процедуры общего назначения. Например, можно создать процедуру, которая работает с таблицей, имя которой неизвестно до времени выполнения.

смотрите также:

Коллекции и записи PL/SQL

Многие методы программирования используют типы коллекций, такие как массивы, пакеты, списки, вложенные таблицы. Наборы и деревья. Для поддержки этих методов в приложениях баз данных PL/SQL предоставляет типы данных TABLEandVARRAY, которые позволяют объявлять ассоциативные массивы . Вложенные таблицы и массивы переменных размеров.

Коллекции

Коллекция — это упорядоченная группа элементов одного типа. Каждый элемент имеет уникальный индекс, который определяет его положение в коллекции. Чтобы создать коллекцию, вы сначала определяете тип коллекции, а затем объявляете переменную этого типа.

Коллекции работают подобно массивам, найденным в большинстве языков программирования третьего поколения. Кроме того, коллекции могут передаваться в качестве параметров. Таким образом. Вы можете использовать их для перемещения столбцов данных в таблицы базы данных и из них или между клиентскими приложениями и хранимыми подпрограммами.

Записи

Запись-это составная переменная, которая может хранить значения данных различных типов. Подобно типу структуры в C. C++ или Java. Записи полезны для хранения данных из строк таблицы или определенных столбцов из строк таблицы.

Предположим, у вас есть данные о сотруднике, такие как имя, зарплата и дата найма. Эти элементы различны по типу, но логически связаны. Запись, содержащая поле для каждого элемента, позволяет рассматривать данные как логическую единицу.

Этот атрибут можно использовать %ROWTYPEдля объявления записи, представляющей строку таблицы или строку. Извлеченную из курсора. С помощью пользовательских записей вы можете объявлять свои собственные поля.

Как Работает PL/SQL

PL/SQL поддерживает как собственное, так и интерпретируемое выполнение. При интерпретируемом выполнении исходный код PL/SQL компилируется в так называемое представление байт-кода. Которое выполняется портативным виртуальным компьютером. Реализованным как часть базы данных Oracle. В машинном исполнении. Которое обеспечивает наилучшую производительность на вычислительно интенсивных программных единицах. Исходный код программных единиц PL/SQL компилируется непосредственно в объектный код для данной платформы. Этот объектный код связан с базой данных Oracle.

Движок PL/SQL — это инструмент, используемый для определения, компиляции и запуска программных блоков PL/SQL. Этот движок является специальным компонентом многих продуктов Oracle, включая Oracle Database. Хотя многие продукты Oracle имеют компоненты PL/SQL, этот раздел специально охватывает программные блоки. Которые могут храниться в базе данных Oracle и обрабатываться с помощью Oracle Database PL/SQL engine. Возможности PL/SQL каждого инструмента Oracle описаны в документации к этому инструменту.

На рис. 8-3 показан механизм PL/SQL, содержащийся в базе данных Oracle.

Программный блок хранится в базе данных. Когда приложение вызывает хранимую процедуру. База данных загружает скомпилированный программный блок в общий пул в глобальной области системы (SGA) (см. Исполнители PL/SQL и инструкций SQL работают вместе для обработки инструкций в процедуре.

Вы можете вызвать хранимую процедуру из другого блока PL/SQL. Который может быть либо анонимным блоком. Либо другой хранимой процедурой. Например, можно вызвать хранимую процедуру из Oracle Forms.

Процедура PL/SQL, выполняемая в базе данных Oracle, может вызывать внешнюю процедуру или функцию. Написанную на языке программирования C и хранящуюся в общей библиотеке. Процедура C выполняется в отдельном адресном пространстве от пространства базы данных Oracle.

смотрите также:

Обзор Java в базе данных Oracle

Java стал предпочтительным языком объектно-ориентированного программирования. Java включает в себя следующие функции:

  • Виртуальная машина Java (JVM), которая обеспечивает основу для независимости платформы

  • Автоматизированные методы управления хранилищами данных. Такие как сбор мусора

  • Синтаксис языка, который заимствует из C и обеспечивает строгий ввод

Примечание:

В этой главе предполагается, что вы уже знакомы с языком Java.

База данных предоставляет Java-программам динамический механизм обработки данных. Поддерживающий сложные запросы и множественные представления данных. Клиентские запросы собираются в виде запросов данных для немедленной обработки. Результаты запроса генерируются динамически.

Сочетание Java и Oracle Database помогает создавать компонентные, ориентированные на сеть приложения. Которые можно легко обновлять по мере изменения бизнес-потребностей. Кроме того, вы можете перемещать приложения и хранилища данных с рабочего стола на интеллектуальные сети и сетевые серверы. Что еще более важно. Вы можете получить доступ к этим приложениям и хранилищам данных с любого клиентского устройства.

На рис. 8-4 показана традиционная двухуровневая конфигурация клиент/сервер. В которой клиенты вызывают хранимые процедуры Java точно так же. Как они вызывают подпрограммы PL/SQL.

Обзор виртуальной машины Java (JVM)

JVM-это виртуальный процессор, который запускает скомпилированный Java-код. Исходный код Java компилируется в низкоуровневые машинные инструкции, известные как байт-коды . Которые не зависят от платформы. Байт-коды Java интерпретируются через JVM в платформозависимые действия.

Обзор Oracle JVM

Oracle JVM-это полная, совместимая с Java2 среда для запуска чистых Java-приложений. Он совместим со спецификациями JLS и JVM. Он поддерживает стандартный двоичный формат Java и API. Кроме того, Oracle Database придерживается стандартной семантики языка Java. Включая динамическую загрузку классов во время выполнения.

На рис. 8-5 показано, как приложения Oracle Java располагаются поверх библиотек классов Java Core. Которые находятся поверх Oracle JVM. Поскольку система поддержки Oracle Java находится внутри базы данных. JVM взаимодействует с библиотеками баз данных. А не непосредственно с операционной системой.

В отличие от других сред Java, Oracle JVM встроена в базу данных Oracle. Существуют некоторые важные различия между Oracle JVM и типичными клиентскими JVM. Например, в стандартной среде Java вы запускаете Java-приложение через интерпретатор. Выпуская в командной строке следующую команду. Где classnameуказано имя класса. Который JVM должна интерпретировать в первую очередь:

имя класса java 

Предыдущая команда вызывает запуск приложения в рамках процесса в вашей операционной системе. Однако если вы не используете интерфейс командной строки, то вы должны загрузить приложение в базу данных. Опубликовать интерфейс. А затем запустить приложение в словаре данных базы данных.

Основные компоненты Oracle JVM

Oracle JVM работает в том же пространстве процессов и адресного пространства. Что и ядро базы данных. Разделяя свои кучи памяти и непосредственно получая доступ к своим реляционным данным. Такая конструкция оптимизирует использование памяти и увеличивает пропускную способность.

Oracle JVM предоставляет среду выполнения для объектов Java. Он полностью поддерживает структуры данных Java, диспетчеризацию методов. Обработку исключений и потоки на уровне языка. Он также поддерживает все основные библиотеки классов Java. Включаяjava.lang,java.io,java.netjava.math, и java.util.

На рис. 8-6 показаны основные компоненты Oracle JVM.

Oracle JVM встраивает стандартное пространство имен Java в схемы баз данных. Эта функция позволяет Java-программам получать доступ к объектам Java. Хранящимся в базе данных Oracle и серверах приложений по всему предприятию.

Кроме того, Oracle JVM тесно интегрирована с масштабируемой архитектурой общей памяти базы данных. Java-программы эффективно используют время жизни вызовов, сеансов и объектов без вмешательства пользователя. В результате Oracle JVM и бизнес-объекты Java среднего уровня могут масштабироваться. Даже если они имеют состояние сеанса.

Среда программирования Java

Oracle предоставляет разработчикам корпоративных приложений комплексное Java-решение для создания. Развертывания и управления Java-приложениями. Решение состоит из клиентских и серверных программных интерфейсов. Инструментов поддержки разработки Java и виртуальной машины Java. Интегрированной с базой данных Oracle. Все эти продукты совместимы со стандартами Java.

Среда программирования Java состоит из следующих дополнительных функций:

  • Java хранимые процедуры как эквивалент Java и компаньон для PL/SQL. Java хранимые процедуры тесно интегрированы с PL/SQL. Можно вызывать хранимые процедуры Java из пакетов PL/SQL и процедуры из хранимых процедур Java.

  • Программные интерфейсы JDBC и SQLJ для доступа к данным SQL.

  • Инструменты и скрипты, которые помогают в разработке, загрузке и управлении классами.

Хранимые Процедуры Java

Хранимая процедура Java- это метод Java. Опубликованный в SQL и сохраненный в базе данных. Как и подпрограмма PL/SQL, процедура Java может быть вызвана непосредственно с продуктами, такими как SQL*Plus. Или косвенно с триггером. Вы можете получить доступ к нему из любого клиента Oracle Net—OCI, precompiler или JDBC.

Чтобы опубликовать методы Java, вы пишете спецификации вызовов, которые сопоставляют имена методов Java. Типы параметров и типы возвращаемых данных их SQL-аналогам. При вызове клиентскими приложениями хранимая процедура Java может принимать аргументы. Ссылаться на классы Java и возвращать значения результатов Java.

Приложения, вызывающие метод Java, ссылаются на имя спецификации вызова. Система времени выполнения ищет определение спецификации вызова в словаре данных Oracle и запускает соответствующий метод Java.

Кроме того, вы можете использовать Java для разработки мощных программ независимо от PL/SQL. Oracle Database обеспечивает полностью совместимую реализацию языка программирования Java и JVM.

Интеграция Java и PL/SQL

Вы можете вызывать существующие программы PL/SQL из Java и программы Java из PL/SQL. Это решение защищает и использует ваш PL/SQL и Java код.

Oracle Database предлагает два различных подхода для доступа к данным SQL из Java, JDBC и SQLJ. Оба подхода доступны на клиенте и сервере. В результате можно развернуть приложения на клиенте и сервере без изменения кода.

Драйверы JDBC

JDBC-это протокол доступа к базе данных. Который позволяет подключаться к базе данных и выполнять инструкции SQL и запросы к базе данных. Основные библиотеки классов Java предоставляют только один API JDBC,java.sql. Тем не менее, JDBC разработан, чтобы позволить поставщикам поставлять драйверы. Которые предлагают необходимую специализацию для конкретной базы данных. Oracle предоставляет различные драйверы JDBC, показанные в следующей таблице.

Водитель Описание
Тонкий драйвер JDBC Вы можете использовать тонкий драйвер JDBC для написания чистых Java-приложений и апплетов. Получающих доступ к данным Oracle SQL. Тонкий драйвер JDBC особенно хорошо подходит для веб-приложений и апплетов. Поскольку вы можете динамически загружать его с веб-страницы. Как и любой другой Java-апплет.
Драйвер JDBC OCI Драйвер JDBC OCI обращается к специфичному для Oracle машинному коду, то есть не Java-коду. И библиотекам на клиентском или среднем уровне. Обеспечивая повышение производительности по сравнению с тонким драйвером JDBC за счет значительно большего размера и установки на стороне клиента.
Внутренний драйвер на стороне сервера JDBC Oracle Database использует внутренний драйвер на стороне сервера. Когда код Java выполняется на сервере. Он позволяет Java-приложениям, работающим в Oracle JVM на сервере. Получать доступ к локально определенным данным. То есть к данным в той же системе и в том же процессе. Что и JDBC. Он обеспечивает повышение производительности благодаря своей способности напрямую использовать базовые библиотеки СУБД Oracle без накладных расходов на промежуточное сетевое соединение между кодом Java и данными SQL. Поддерживая один и тот же интерфейс Java-SQL на сервере. Oracle Database не требует от вас переделки кода при его развертывании.

смотрите также:

SQLJ

SQLJ -это стандарт ANSI для встраивания SQL-операторов в Java-программы. Вы можете использовать SQLJ в хранимых процедурах, триггерах и методах в среде базы данных Oracle. Кроме того, вы можете комбинировать программы SQLJ с JDBC.

SQLJ предоставляет простой, но мощный способ разработки приложений на стороне клиента и среднего уровня. Которые обращаются к базам данных с Java (см. ). Разработчик пишет программу с помощью SQLJ. А затем использует переводчик SQLJ для перевода встроенного SQL в чистый Java-код на основе JDBC. Во время выполнения программа может взаимодействовать с базами данных нескольких поставщиков с помощью стандартных драйверов JDBC.

В следующем примере показан простой исполняемый оператор SQLJ:

Имя строки; System.out.println(

Поскольку Oracle Database предоставляет полную среду Java. Вы не можете компилировать программы SQLJ на клиенте. Который будет работать на базе данных. Вместо этого вы можете скомпилировать их непосредственно на сервере.

Обзор триггеров

Триггер базы данных-это скомпилированная хранимая программная единица, написанная либо на PL/SQL, либо на Java. Которую Oracle Database автоматически вызывает (

  1. Операторы DML для конкретной таблицы или представления, выданные любым пользователем

    Операторы DML изменяют данные в объектах схемы. Например, вставка и удаление строк-это операции DML.

  2. DDL-операторы, выданные либо конкретным пользователем. Либо любым другим пользователем

    Операторы DDL определяют объекты схемы. Например, создание таблицы и добавление столбца-это операции DDL.

  3. События базы данных

    Вход пользователя или выход из системы, ошибки и запуск или завершение работы базы данных-это события. Которые могут вызывать триггеры.

Триггеры-это объекты схемы. Которые похожи на подпрограммы. Но отличаются способом их вызова. Подпрограмма явно выполняется пользователем. Приложением или триггером. Триггеры неявно вызываются базой данных при возникновении события запуска.

смотрите также:

Преимущества триггеров

Правильное использование триггеров позволяет создавать и развертывать приложения. Которые являются более надежными и более эффективно используют базу данных. Вы можете использовать триггеры для:

  • Автоматическое создание производных значений столбцов

  • Предотвращение недействительных транзакций

  • Обеспечить аудит и ведение журнала событий

  • Запись информации о доступе к таблице

Триггеры можно использовать для применения бизнес-правил низкого уровня, общих для всех клиентских приложений. Например, несколько приложений могут получить доступ к employeesтаблице. Если триггер в этой таблице обеспечивает формат вставленных данных. То эту бизнес-логику не нужно воспроизводить в каждом клиенте. Поскольку триггер не может быть обойден приложением, бизнес — логика в триггере используется автоматически.

Вы можете использовать как триггеры. Так и ограничения целостности для определения и применения любого типа правил целостности. Однако Oracle настоятельно рекомендует использовать триггеры только для применения сложных бизнес-правил. Не определяемых с помощью ограничения целостности (см. ).

Чрезмерное использование триггеров может привести к сложным взаимозависимостям. Которые трудно поддерживать в большом приложении. Например, при вызове триггера оператор SQL в своем действии триггера потенциально может запускать другие триггеры. Что приводит к каскадным триггерам, которые могут вызывать непреднамеренные эффекты.

Типы триггеров

Триггеры можно классифицировать в зависимости от способа их вызова и типа выполняемых ими действий. Oracle Database поддерживает следующие типы триггеров:

  • Триггеры строк

    Триггер строки срабатывает каждый раз. Когда оператор запуска воздействует на таблицу. Например, если оператор обновляет несколько строк, то триггер строки срабатывает один раз для каждой строки. Затронутой оператором UPDATE. Если оператор запуска не влияет ни на какие строки. То триггер строки не запускается. Триггеры строк полезны. Если код в действии триггера зависит от данных. Предоставленных оператором запуска. Или от строк. На которые он влияет.

  • Триггеры операторов

    Триггер оператора запускается один раз от имени запускающего оператора, независимо от количества строк. Затронутых запускающим оператором. Например, если оператор удаляет 100 строк из таблицы. Триггер уровня оператора DELETEсрабатывает только один раз. Триггеры операторов полезны. Если код в действии триггера не зависит от данных. Предоставленных оператором запуска или затронутыми строками.

  • INSTEAD OF раздражители

    INSTEAD OF Триггер запускается базой данных Oracle вместо выполнения инструкции triggering. Эти триггеры полезны для прозрачного изменения представлений. Которые не могут быть изменены непосредственно с помощью операторов DML.

  • Триггеры событий

    Триггеры можно использовать для публикации информации о событиях базы данных подписчикам. Триггеры событий делятся на следующие категории:

    • Триггер системного события может быть вызван такими событиями. Как запуск и завершение работы экземпляра базы данных или сообщения об ошибках.

    • Триггер события пользователя срабатывает из-за событий. Связанных с входом пользователя в систему и выходом из системы. Операторами DDL и операторами DML.

смотрите также:

Хронометраж для триггеров

Вы можете определить время срабатывания триггерадолжно ли действие триггера выполняться до или после оператора запуска. Простой триггер-это единственный триггер в таблице. Который позволяет указать действия точно для одной из следующих временных точек:

  • Перед заявлением об увольнении

  • Перед каждой строкой. На которую влияет оператор запуска

  • После каждой строки. На которую влияет оператор увольнения

  • После заявления об увольнении

Для триггеров операторов и строк BEFOREтриггер может повысить безопасность и включить бизнес-правила перед внесением изменений в базу данных. AFTERТриггер идеально подходит для регистрации действий.

Составной триггер может срабатывать в нескольких точках синхронизации. Составные триггеры помогают программировать подход, в котором действия. Реализуемые для различных временных точек. Совместно используют общие данные.

Создание триггеров

CREATE TRIGGERОператор создает или заменяет триггер базы данных. Триггер PL/SQL имеет следующую общую синтаксическую форму:

СОЗДАТЬ ТРИГГЕР trigger_name triggering_statement [trigger_restriction] НАЧАТЬ triggered_action; КОНЕЦ; 

Триггер PL/SQL имеет следующие основные компоненты:

  • Имя триггера

    Имя должно быть уникальным по отношению к другим триггерам в той же схеме. Например, имя может быть part_reorder_trigger.

  • Триггерное событие или оператор

    Инициирующее событие или оператор-это оператор SQL, событие базы данных или пользовательское событие. Вызывающее триггер. Например, пользователь обновляет таблицу.

  • Ограничение триггера

    Ограничение триггера определяет логическое выражение, которое должно быть trueдля срабатывания триггера. Например, триггер не вызывается, если количество доступных деталей не меньше текущей суммы перезаказа.

  • Срабатывающее действие

    Триггерное действие-это процедура. Содержащая инструкции SQL и код. Которые должны быть запущены. Когда выдается инструкция запуска и ограничение триггера оценивается как true. Например, пользователь вставляет строку в таблицу отложенных ордеров.

Предположим. Что вы создаете таблицы ordersи lineitemsследующим образом:

СОЗДАНИЕ заказов ТАБЛИЦ ( ПЕРВИЧНЫЙ КЛЮЧ НОМЕРА order_id. /* другие атрибуты */ line_items_count НОМЕР ПО УМОЛЧАНИЮ 0 ); СОЗДАТЬ ТАБЛИЦУ lineitems ( order_id ССЫЛАЕТСЯ НА заказы. Seq_no НОМЕР. /* другие атрибуты */ ОГРАНИЧЕНИЕ lineitems ПЕРВИЧНЫЙ КЛЮЧ(order_id,seq_no) ); 

ordersТаблица содержит строку для каждого уникального заказа. В то lineitemsвремя как таблица содержит строку для каждого элемента заказа. Пример 8-3 показывает пример триггера. Который автоматически обновляет ordersтаблицу с количеством элементов в заказе.

Пример 8-3 lineitems_trigger

СОЗДАНИЕ ИЛИ ЗАМЕНА ТРИГГЕРА lineitems_trigger ПОСЛЕ ВСТАВКИ. ОБНОВЛЕНИЯ ИЛИ УДАЛЕНИЯ ON lineitems ДЛЯ КАЖДОЙ СТРОКИ НАЧНИТЕ ЕСЛИ (ВСТАВКА ИЛИ ОБНОВЛЕНИЕ) ЗАТЕМ ОБНОВЛЕНИЕ заказов SET line_items_count = NVL(line_items_count,0)+1 ГДЕ order_id = :new.order_id; КОНЕЦ, ЕСЛИ; ЕСЛИ (УДАЛЕНИЕ ИЛИ ОБНОВЛЕНИЕ) ЗАТЕМ ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(line_items_count,0)-1 ГДЕ order_id = :old.order_id; КОНЕЦ, ЕСЛИ; КОНЕЦ; / 

В примере 8-3инициирующим оператором является INSERTоператор , UPDATE, или DELETEна lineitemsтаблице. Никаких ограничений на запуск не существует. Триггер вызывается для каждой измененной строки. Триггер имеет доступ к старым и новым значениям столбцов текущей строки. На которые влияет инструкция triggering. Для каждого столбца изменяемой таблицы существует два имени корреляции: старое значение (:old) и новое значение (:new).

Если строки lineitemsвставляются или обновляются для заказа. То после выполнения действия триггер вычисляет количество элементов в этом заказе и обновляет ordersтаблицу с помощью счетчика. Таблица 8-2 иллюстрирует сценарий. В котором клиент инициирует два заказа и добавляет и удаляет элементы строки из заказов.

Таблица 8-2 Сценарий запуска на уровне Строк

Инструкция SQL Срабатывает инструкция SQL Описание
создана 1 строка. 
 

Клиент создает заказ с идентификатором 78. На данный момент у клиента нет товаров в заказе.

Поскольку над lineitemsтаблицей не выполняется никаких действий. Триггер не вызывается.

создана 1 строка. 
 

Клиент создает отдельный заказ с идентификатором 92. На данный момент у клиента нет товаров в заказе.

Поскольку над lineitemsтаблицей не выполняется никаких действий. Триггер не вызывается.

создана 1 строка. 
ОБНОВЛЕНИЕ заказов SET line_items_count = NVL(NULL,0)+1 ГДЕ order_id = 78; 

Клиент добавляет товар в заказ 78.

Тот INSERTвызывает спусковой крючок. Оператор triggered увеличивает количество позиций для заказа 78 с 0 до 1.

создана 1 строка. 
ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(1,0)+1 ГДЕ order_id = 78; 

Клиент добавляет дополнительный товар к заказу 78.

Тот INSERTвызывает спусковой крючок. Срабатывающий оператор увеличивает количество позиций для заказа 78 с 1 до 2.

ORDER_ID LINE_ITEMS_COUNT --------- ---------------- 78 2 92 0 
 

Клиент запрашивает статус двух заказов. Заказ 78 содержит два пункта. Заказ 92 не содержит элементов.

ORDER_ID SEQ_NO ---------- ---------- 78 1 78 2 
 

Клиент запрашивает статус позиций. Каждый товар однозначно идентифицируется по идентификатору заказа и порядковому номеру.

обновлено 2 ряда. 
ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(NULL,0)+1 ГДЕ order_id = 92; ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(2,0)-1 ГДЕ order_id = 78; 
ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(1,0)+1 ГДЕ order_id = 92; ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(1,0)-1 ГДЕ order_id = 78; 

Клиент перемещает позиции, которые были в заказе 78, в заказ 92.

UPDATEОператор изменяет 2 строки в lineitemsтаблицах, что вызывает триггер один раз для каждой строки.

Каждый раз. Когда вызывается триггер. Выполняются оба IFусловия в триггере. Первое условие увеличивает количество для порядка 92, тогда как второе условие уменьшает количество для порядка 78. Таким образом. Выполняется четыре полных UPDATEоператора.

ORDER_ID LINE_ITEMS_COUNT --------- ---------------- 78 0 92 2 

Клиент запрашивает статус двух заказов. Чистый эффект заключается в том. Что количество позиций для заказа 92 увеличилось с 0 до 2, в то время как количество позиций для заказа 78 уменьшилось с 2 до 0.

ORDER_ID SEQ_NO ---------- ---------- 92 1 92 2 

Клиент запрашивает статус позиций. Каждый товар однозначно идентифицируется по идентификатору заказа и порядковому номеру.

2 строки удалены. 
ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(2,0)-1 ГДЕ order_id = 92; ОБНОВЛЕНИЕ ордеров SET line_items_count = NVL(1,0)-1 ГДЕ order_id = 92; 

Теперь клиент удаляет все позиции из всех заказов.

DELETEОператор изменяет 2 строки в lineitemsтаблицах, что вызывает триггер один раз для каждой строки. Для каждого вызова триггера выполняется только одно IFусловие в триггере. Каждый раз условие уменьшает количество для порядка 92 на 1. Таким образом. Выполняются два полных UPDATEоператора.

ORDER_ID LINE_ITEMS_COUNT --------- ---------------- 78 0 92 0 строки не выбраны 

Клиент запрашивает статус этих двух заказов. Ни один из заказов не содержит позиций.

Клиент также запрашивает статус позиций. Никаких предметов не существует.

смотрите также:

Выполнение триггеров

Oracle Database выполняет триггер внутренне, используя те же шаги, что и для выполнения подпрограммы. Единственное тонкое различие заключается в том. Что пользователь имеет право запустить триггер. Если у него есть привилегия запустить оператор запуска. За этим исключением база данных проверяет и запускает триггеры так же. Как и хранимые подпрограммы.

Хранение триггеров

Oracle Database хранит триггеры PL/SQL в скомпилированной форме в схеме базы данных. Как и хранимые процедуры PL/SQL. Когда CREATE TRIGGERоператор фиксируется. Скомпилированный код PL/SQL сохраняется в базе данных. А исходный код триггера PL/SQL удаляется из общего пула.

На рис. 8-7 показано приложение базы данных с инструкциями SQL, которые неявно вызывают триггеры PL/SQL. Триггеры хранятся отдельно от связанных с ними таблиц.

Триггеры Java хранятся таким же образом. Как и триггеры PL/SQL. Однако триггер Java ссылается на код Java. Который был отдельно скомпилирован с CALLпомощью оператора. Таким образом. Создание триггера Java включает в себя создание кода Java и создание триггера. Который ссылается на этот код Java.