Обращение к элементами пакета — КиберПедия 

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

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Обращение к элементами пакета

2022-12-20 15
Обращение к элементами пакета 0.00 из 5.00 0 оценок
Заказать работу

К элементам из спецификации пакета можно обращаться из внешних процедур так:

 

имя_пакета. имя_элемента

 

Например:

 

DBMS_OUTPUT. PUT_LINE(‘This is a parameter data’);

time_package. resettimestamp;

 

 

Глобальные) данные пакета

Данные пакета – это данные, объявленные в спецификации или теле вне тел подпрограмм. Область их доступности ограничивается сеансом, то есть они являются глобальными данными для сеанса связи с БД. При этом для данных пакета полезно учитывать следующее:

 

- на них не распространяется действие COMMIT и ROLLBACK

- курсор, открытый где-нибудь в пакете остается в состоянии OPEN, пока не будет закрыт явно или пока не завершится сеанс

- хорошей практикой считается прятать описания структур данных в тело пакета, предоставляя для пользователей пакета процедуры типа Set и Get для обращения с данными

 

 

Взаимные вызовы и повторения имен

Для подпрограмм в составе пакета

 

- рекурсивный вызов разрешен и глубина рекурсии не регламентирована

- взаимный вызов разрешен и зацикливание не контролируется

- повторение имен разрешено

 

Пример повторения в описании системного пакета DBMS_OUTPUT:

 

PACKAGE DBMS_OUTPUT

IS

           PROCEDURE PUT_LINE (a VARCHAR2);

           PROCEDURE PUT_LINE (a NUMBER);

           PROCEDURE PUT_LINE (a DATE);        -- в последних версиях отсутствует

END;

 

Здесь решение о том, к какой из трех процедур PUT_LINE поставить обращение, компилятор принимает на основе анализа типа параметра.

 

 

14.5. Прагма SERIALLY_REUSABLE

Если переменные пакета не используются для передачи подпрограммами значений друг другу, а употребляются только в процессе выполнения подпрограмм, полезно в описании пакета указать PRAGMA SERIALLY_REUSABLE. В этом случае после каждого завершения подпрограммы на PL/SQL будут закрываться курсоры и освобождаться память (курсоров и других переменных), а рабочие области данных будут размещаться не в UGA, а в SGA СУБД. В противном случае общая память, требуемая для работы пакета, будет расти линейно с ростом пользователей, одновременно обращающихся к подпрограммам или данным пакета.

 

Пример использования SERIALLY_REUSABLE:

 

CREATE OR REPLACE PACKAGE mypackage IS

           PRAGMA SERIALLY_REUSABLE;

           PROCEDURE abc;

END mypackage;

 

CREATE OR REPLACE PACKAGE BODY mypackage IS

           PRAGMA SERIALLY_REUSABLE;

           PROCEDURE abc IS

END mypackage;

 

 

Инициализация пакета

При первом обращении к какому-либо элементу пакета он весь целиком помещается в SGA экземпляра СУБД, с которым работает пользователь. С этого момента весь код пакета становится доступным для всех пользователей с правом EXECUTE на пакет.

 

Если в пакета объявлены данные, они помещаются в область UGA сеанса, которая физически может размещаться и в SGA и в PGA. После этого, если объявлен, выполняется код инициализации пакета.

 

В следующем примере показана техника, позволяющая запоминать в БД данные в закодированном виде, препятствующем их прочтение даже обладателю привилегии SELECT ANY TABLE (например, пользователю SYS):

 

CREATE OR REPLACE PACKAGE crypting_package IS

           FUNCTION encoded (str VARCHAR2) RETURN VARCHAR2;

           FUNCTION encoded (num NUMBER) RETURN NUMBER;

           FUNCTION decoded (str VARCHAR2) RETURN VARCHAR2;

           FUNCTION decoded (num NUMBER) RETURN NUMBER;

END crypting_package;

/

 

CREATE OR REPLACE PACKAGE BODY crypting_package IS

           keyvalue CHAR(8) DEFAULT 'xxxxxxxx';

 

           FUNCTION encoded (str VARCHAR2) RETURN VARCHAR2 IS BEGIN … END;

           FUNCTION encoded (num NUMBER) RETURN NUMBER IS BEGIN … END;

           FUNCTION decoded (str VARCHAR2) RETURN VARCHAR2 IS BEGIN … END;

           FUNCTION decoded (num NUMBER) RETURN NUMBER IS BEGIN … END;

 

-- раздел инициализации:

BEGIN

keyvalue:= …;

EXCEPTION...

END crypting_package;

/

 

В основу такого пакета можно положить пакет DBMS_OBFUSCATION_TOOLKIT или DBMS_CRYPTO, а значение ключа вводить в течение сеанса единожды на основании данных из разных источников, например с диска, самой БД, из сети или из клиентской программы.

 

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

 

INSERT INTO some_table (a, b) VALUES ('open text', crypting_package. encoded('encrypted text'));

 

SELECT crypting_package. decoded(b) FROM some_table;

 

Дальнейшим усовершенствованием может стать создание выводимой таблицы и триггерных процедур типа INSTEAD OF для нее, например:

 

CREATE VIEW view_of_some_table AS

SELECT a, crypting_package. decoded(b) b FROM some_table;

 

 


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

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

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

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

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...



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

0.014 с.