Обращение в SQL к функциям из состава пакетов — КиберПедия 

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...

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

Обращение в SQL к функциям из состава пакетов

2022-12-20 18
Обращение в SQL к функциям из состава пакетов 0.00 из 5.00 0 оценок
Заказать работу

Для версий Oracle 8.0 и предшествующих хранимые функции, принадлежащие пакетам, должны иметь в своем описании явное указание качества изменений (purity level), определяемого для функции. Начиная с версии 8.1, если такое указание отсутствует, оно будет проверяться PL/SQL-машиной автоматически во время выполнения программы или же их могут восполнять другие указания типа DETERMINISTIC или PARALLEL_ENABLED. 

 

Синтаксис указания качества изменений в пакетной функции:

 

PRAGMA RESTRICT_REFERENCES (имя_программы | DEFAULT, качество_изменений);

 

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

 

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

 

Purity level Описание Степень ограничения в программном коде
WNDS Write No Database State Отсутствуют операции INSERT, UPDATE, DELETE
RNDS Read No Database State Отсутствуют операции SELECT
WNPS Write No Package State Не делаются изменения переменных пакета
RNPS Read No Package State Отсутствуют обращения к переменным пакета
TRUST   Сообщение компилятору “поверить” продекларированному уровню качаства изменений “на слово” и не отрабатывать специальных действий, ограждающих от побочных эффектов

 

(Уровень TRUST имеется только начиная с версии 8.1).

 

Для разных мест использования в SQL пакетной функции требуется иметь различный минимальный уровень качества производимых изменений:

 

- для использования в SQL-предложениях вообще, все хранимые функции должны быть странслированы с указанием WNDS

- все функции, используемые не в SELECT, VALUES или SET, должны быть странслированы с указанием WNPS

- чтобы иметь возможность быть вызванной с удаленного сервера, функция должна быть странслирована с указанием RNPS

- чтобы иметь возможность быть обработанной параллельно, функция должна быть странслирована с указанием одновременно четырех главных уровней (WNDS, RNDS, WNPS, RNPS) или PARALLEL_ENABLED (в Oracle 8.1)

- функция не должна обращаться к подпрограммам, имеющим более низкий уровень качества изменений

- в Oracle 7 в случае, если пакет содержит раздел инициализации, он также должен быть помечен определенным уровнем качества изменений

- подменяемые (overloaded) функции не обязаны иметь одинаковый уровень качества изменений, но должны иметь его (возможно, каждая – свой) все из них

 

Не все системные пакеты в Oracle имеют продекларированный уровень WNPS или RNPS (например, пакеты DBMS_OUTPUT, DBMS_PIPE, DBMS_SQL), и поэтому использование подпрограмм из них в SQL имеет свои ограничения.

 

 

Разрешение конфликта имен столбцов и функций

Если функция без параметров и ее имя совпадает с именем столбца, конфликт имен в SQL-предложениии будет разрешен в пользу столбца. Для того, чтобы поменять решение Oracle в пользу функции, достаточно уточнить ее имя именем схемы, например:

 

CREATE FUNCTION ename RETURN VARCHAR2 AS BEGIN RETURN ‘I am a function’; END;

/

-- прочитается как имя столбца:

SELECT ename FROM emp;

-- прочитается как имя функции:

SELECT scott.ename FROM emp;

 

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

 

CREATE OR REPLACE PACKAGE scott IS FUNCTION ename RETURN varchar2; END scott;

/

CREATE OR REPLACE PACKAGE BODY scott IS

FUNCTION ename RETURN varchar2 IS BEGIN RETURN 'I am a package function'; END ename;

END scott;

/

-- теперь прочитается как имя пакетированной функции:

SELECT scott.ename FROM DUAL;

 

В отдельных случаях замаскировать самостоятельную функцию ENAME можно и не создавая пакета:

 

DROP PACKAGE scott;

CREATE TABLE scott AS SELECT * FROM emp;

-- функция ENAME снова не видна:

SELECT scott.ename FROM scott;

 

 

Табличные функции в SQL

Табличными в PL/SQL называются функции, принимающие в качестве аргумента коллекции и/или возвращающие коллекции. Их определение и способ обращения к ним из SQL-предложения имеют свои особенности. Более предметно будут рассмотрены после темы «Коллекции».

 

 


Поделиться с друзьями:

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.008 с.