Oracle wrapped что это

Обновлено: 02.07.2024

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

В этом уроке вы узнаете

Компоненты пакетов

Пакет PL / SQL состоит из двух компонентов.

Спецификация упаковки

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

Ниже приведены некоторые характеристики спецификации пакета.

Синтаксис

Приведенный выше синтаксис показывает создание спецификации пакета.

Корпус

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

Ниже приведены характеристики корпуса упаковки.

Синтаксис:

  • Приведенный выше синтаксис показывает создание тела пакета.

Теперь мы увидим, как ссылаться на элементы пакета в программе.

Ссылающиеся элементы пакета

Как только элементы объявлены и определены в пакете, нам нужно обратиться к элементам, чтобы использовать их.

Все общедоступные элементы пакета могут быть переданы путем вызова имени пакета, за которым следует имя элемента, разделенное точкой, т.е. «<имя_пакета>. <Имя_элемента>».

Открытая переменная пакета также может быть использована таким же образом для назначения и извлечения значений из них, то есть «<имя_пакета>. <Имя_переменной>».

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

В PL / SQL всякий раз, когда пакет вызывается / вызывается в сеансе, для этого пакета будет создан новый экземпляр.

Oracle предоставляет возможность инициализировать элементы пакета или выполнять какие-либо действия во время создания этого экземпляра с помощью «Инициализация пакета».

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

Синтаксис

Пакеты в PL / SQL

  • Приведенный выше синтаксис показывает определение инициализации пакета в теле пакета.

Форвардные декларации

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

Пакеты в PL / SQL

Синтаксис:

Приведенный выше синтаксис показывает предварительное объявление. Закрытые элементы объявляются отдельно в передней части пакета, и они были определены в более поздней части.

Использование курсоров в пакете

В отличие от других элементов, нужно соблюдать осторожность при использовании курсоров внутри пакета.

Если курсор определен в спецификации пакета или в глобальной части тела пакета, то один раз открытый курсор будет сохраняться до конца сеанса.

перегрузка

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

Пример 1 : В этом примере мы собираемся создать пакет для получения и установки значений информации о сотруднике в таблице «emp». Функция get_record возвращает вывод типа записи для данного номера сотрудника, а процедура set_record вставляет запись типа записи в таблицу emp.

Шаг 1) Создание спецификации пакета

Пакеты в PL / SQL

Вывод:

Код Объяснение

  • Строка кода 1-5 : создание спецификации пакета для guru99_get_set с одной процедурой и одной функцией. Эти два в настоящее время являются открытыми элементами этого пакета.

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

Пакеты в PL / SQL

Вывод:

Код Объяснение

  • Строка кода 7 : создание тела пакета.
  • Строка кода 9-16 : определение элемента set_record, который объявлен в спецификации. Это то же самое, что и определение автономной процедуры в PL / SQL.
  • Строка кода 17-24: определение элемента get_record. Это то же самое, что и определение автономной функции.
  • Строка кода 25-26: определение части инициализации пакета.

Шаг 3) Создание анонимного блока для вставки и отображения записей, ссылаясь на созданный выше пакет.

Пакеты в PL / SQL

Вывод:

Объяснение кода:

  • Строка кода 34-37: заполнение данных для переменной типа записи в анонимном блоке для вызова элемента set_record пакета.
  • Строка кода 38: был сделан вызов set_record пакета guru99_get_set. Теперь пакет создается и сохраняется до конца сеанса.
  • Часть инициализации пакета выполняется, так как это первый вызов пакета.
  • Запись вставляется элементом set_record в таблицу.
  • Строка кода 41: вызов элемента get_record для отображения сведений о введенном сотруднике.
  • Пакет передается во второй раз во время вызова get_record. Но на этот раз часть инициализации не выполняется, поскольку пакет уже инициализирован в этом сеансе.
  • Строка кода 42-45: печать сведений о сотруднике.

Зависимость в пакетах

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

Информация о пакете

Как только информация о пакете создана, информация о пакете, такая как источник пакета, детали подпрограммы и информация о перегрузке, доступна в таблицах определения данных Oracle.

Ниже в таблице приведены таблица определения данных и информация о пакете, которая доступна в таблице.

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

Резюме

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

Инструкции Oracle wrap and unwrap (шифрование и дешифрование)

1. Описание упаковки

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

APL/SQL Source Text Wrapping

You can wrap the PL/SQL source text for any of thesestored PL/SQL units, therebypreventing anyone from displaying or editing that text:

A file containing wrapped PL/SQL source text is called awrapped file. Awrapped file can be moved, backed up, or processed by SQL*Plus or the Importand Export utilities.

To produce a wrapped file, use either the PL/SQL Wrapper utility or aDBMS_DDLsubprogram.The PL/SQL Wrapper utility wraps the source text of every wrappable PL/SQL unitcreated by a specified SQL file. TheDBMS_DDLsubprograms wrap thesource text of single dynamically generated wrappable PL/SQL units.

Both the PL/SQL Wrapper utility andDBMS_DDLsubprograms detecttokenization errors (for example, runaway strings), but not syntax or semanticerrors (for example, nonexistent tables or views).

Wrapped files are upward-compatible between Oracle Database releases. For example, youcan load files produced by the V8.1.5 PL/SQL Wrapper utility into a V8.1.6 OracleDatabase.

В статье на itpub упоминался принцип шифрования с переносом:

Принцип шифрования Oracle состоит в том, чтобы выполнить сжатие lz исходного кода lzstr, затем выполнить операцию SHA-1 для сжатых данных, чтобы получить 40-битную зашифрованную строку shstr, затем объединить зашифрованную строку со сжатой строкой для получения shstr + lzstr, а затем выполнить объединенную строку Выполните преобразование двойных символов Oracle (таблица преобразования). Наконец, base64 кодирует преобразованную строку и, наконец, получает зашифрованную строку с переносом.

The default file extension forinput_fileissql. The default nameofoutput_fileisinput_file.plb. Therefore, these commands are equivalent:

Thisexample specifies a different file extension forinput_fileand adifferent name foroutput_file:

Шаги по использованию обертывания следующие:

(1) Сохраните оператор sql, который мы хотим зашифровать, в текст sql.

(2) Используйте перенос для обработки, укажите входной sql, который является нашим первым шагом, а затем укажите выходной путь и имя файла.Расширение по умолчанию - plb.

(3) Выполните наш второй sql, который был обработан wrap, то есть файл plb, и создайте наш объект.

Пример 1: функция переноса

CREATE OR REPLACE FUNCTION F_DAVE (

RETURN 'Dave is DBA!';

ELSIF n = 2 THEN

RETURN 'Dave come from AnQing!';

RETURN 'Dave come from HuaiNing!';

Dave come from HuaiNing!

BTW: Сегодня кто-то в группе спросил меня, почему в примере моего блога есть Аньцин, потому что я из Аньцин Хуайнин.

CREATE OR REPLACE FUNCTION F_DAVE (

RETURN 'Dave is DBA!';

ELSIF n = 2 THEN

RETURN 'Dave come from AnQing!';

RETURN 'Dave come from HuaiNing!';

PL/SQL Wrapper: Release 10.2.0.1.0-Production on Thu Aug 18 22:59:14 2011

Стас Белков

Wrap и DBMS_DDL - защщищаем код PL/SQL

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

Некоторые разработчики считают, что программа wrap «шифрует» код, но это неверно. Если вам нужно передать действительно секретную информацию (например, пароль), полагаться на эту программу не стоит. Однако следует иметь в виду, что с помощью встроенного пакета DBMS_CRYPTO (или DBMS_OBFUSCATION_ TOOLKIT до выхода Oracle10g) Oracle позволяет реализовать в приложении полноценную защиту данных.

Программа wrap преобразует ASCII-текст исходного кода в нечитаемую форму, которую можно передавать пользователям, в региональные филиалы и т. д. для создания соответствующих программ в других экземплярах базы данных. Код характеризуется такой же переносимостью, что и исходный код PL/SQL, и может импортироваться и экспортироваться. Oracle поддерживает зависимости для программ со скрытым кодом точно так же, как для программ с обычным кодом. Иначе говоря, скрытые программы в базе данных с функциональной точки зрения ничем не отличаются от обычных программ PL/SQL; единственное различие заключается в том, что их нельзя прочитать через представление user_source.

Исполняемая программа wrap существует уже много лет. Начиная c Oracle10g Release 2 для сокрытия динамически сконструированного кода PL/SQL применяются программы DBMS_DDL.WRAP и DBMS_DDL.CREATE_WRAPPED .

Ограничения

При работе со скрытым кодом необходимо учитывать следующие обстоятельства:

  • Сокрытие усложняет восстановление исходного кода, однако пароли и другие конфиденциальные данные не должны храниться в коде (и помните, что обработанный код можно восстановить в доступной для человека форме).
  • Исходный код триггеров скрываться не может. Если вам необходимо скрыть содержимое триггеров, переместите код в отдельный пакет, а затем вызовите соответствующую программу из триггера.
  • Скрытый код не может компилироваться в экземплярах Oracle версий ниже той, из которой была взята программа wrap.
  • В коде, к которому будет применяться сокрытие, не могут использоваться подстановочные переменные SQI*Plus.

Использование программы wrap

Чтобы скрыть исходный код PL/SQL, нужно запустить исполняемый файл wrap.exe из каталога bin экземпляра Oracle. Формат команды:

Здесь исх_файл — исходная версия программы, а рез_файл — выходной файл для записи скрытой версии кода. Если исходный файл задан без расширения, по умолчанию используется расширение .sql.

Если аргумент резфайл не задан, программа wrap создает файл с именем, совпадающим с именем исходного файла, и расширением .plb.

Несколько примеров использования программы wrap:

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

Динамическое сокрытие кода с использованием DBMS_DDL

В Oracle10g Release 2 появился механизм сокрытия динамически генерируемого кода: программы wrap и create_wrapped из пакета dbms_ddl :

  • DBMS_DDL.WRAP — возвращает строку, содержащую скрытую версию кода.
  • DBMS_DDL.CREATE_WRAPPED — компилирует скрытую версию кода в базу данных. Обе эти программы имеют перегруженные версии, работающие с одной строкой и с массивами строк на базе коллекционных типов DBMS_SQL.VARCHAR2A и DBMS_SQL.VARCHAR2S . Пара примеров использования этих программ:
  • Сокрытие строки, создающей небольшую процедуру, и ее вывод:
  • Чтение определения программы PL/SQL из файла, сокрытие кода и его компиляция в базу данных:

Работа со скрытым кодом

Ниже приведено несколько советов по работе со скрытым кодом.

  • Создайте командные файлы для быстрого и унифицированного сокрытия файлов. Например, в Windows NT в каталоге исходных файлов можно создать файл с расширением .bat и включить в него следующую строку:

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

  • Скрывать можно только спецификации и тела пакетов, спецификации и тела объектных типов, независимые функции и процедуры. Если программе wrap передать файл, содержащий другой код SQL или PL/SQL , этот файл изменен не будет.
  • Чтобы узнать, скрыта ли программа, достаточно посмотреть на ее заголовок. Если программа скрыта, заголовок будет содержать ключевое слово WRAPPED :

Впрочем, даже если вы не заметите указанного слова в заголовке, то сразу поймете, что исходный код скрыт, потому что в представлении USER_SOURCE он будет выглядеть примерно так:

При наличии некоторой информации сделать это оказалось до смешного просто, несмотря на то, что я потратил на свой online unwrap уйму времени.

Для начала оговорюсь, что речь идет про Oracle 10-12 версии, т.е., в соответствии с этой темой, в начале кода должно быть

CREATE OR REPLACE FUNCTION SomeFunc wrapped
a000000
ab
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
1a2 12c
Sh + 9JFcaiH9SAzc5qQFSernIHO0wgwHIAMvWfHQCmPFekSaibNtEdebgxQw6NfSIfaN / fPXe
vp2rEQ4m / PpCkpt + nUhL8VCTHFl1bwAki0M9JMH420KT50MU8AC4oHph5jyJiRgDZj2ea5Lp
.

можете не пытаться декодировать приведенное выше, это мусор для примера. Можете вытащить любой требуемый код с помощью этого.

Далее, спускаемся до строки 1a2 12c. В простейшем случае берем второе число 12с, что в переводе в 10-ю систему счисления равно 300 и является длиной строки, которую необходимо взять для декодирования. Обратите внимание, что это длина строки с учетом переносов строк, которых в декодируемой строке быть не должно, а всем строкам необходимо делать trim! Я чуть не сдался, пока нашел эту гадость. Алгоритм простой, берем следующую за "1a2 12c" строку, если ее длина меньше 300 (в нашем случае), то добавляем к ней следующую за ней строку и т.д., пока не получим требуемую длину строки, не забывая, что каждая добавляемая строка у нас длиннее на один символ переноса строки.

В итоге получается длинная строка, очевидно, что зашифрованная в Base64. Соответственно, надо ее декодировать обратно Base64->UTF-8.

Получается достаточно интересный мусор, который мы усечем до 20го символа, отсекая информацию SHA-1, и получаем строку, которую надо перекодировать в соответствии с таблицей подстановки, заменяя одни символы на символы в таблице. Я ее нашел в открытом доступе, соответственно, ничто не помешает это же сделать и вам.

После этого остается распаковать строку через ZIP (я воспользовался обычным zlib_decompress) и вуа-ля, получили чистый исходный код.

При декодировании использовался интереснейший и, к сожалению, заброшенный [ блог ] .

В Oracle PL/SQL набор элементов: процедур, функций, определения типов; объявления переменных, констант можно объединить в пакет. После написания пакет PL/SQL компилируется, а затем сохраняется в базе данных Oracle, где его содержимое может использоваться многими приложениями.

Что такое пакет Oracle PL/SQL?

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

Пакеты Oracle PL/SQL

Как показано на рисунке, вы можете думать о спецификации как о рабочем интерфейсе, а о теле - как о «черном ящике». Вы можете отлаживать, улучшать или изменять тело пакета без изменения интерфейса (спецификации) пакета.

Для создания пакетов используйте оператор CREATE PACKAGE.

Синтаксис

Синтаксис CREATE PACKAGE в Oracle PL/SQL:

CREATE [OR REPLACE] PACKAGE package_name
[AUTHID ]

[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition . ]
[record_type_definition . ]
[subtype_definition . ]
[collection_declaration . ]
[constant_declaration . ]
[exception_declaration . ]
[object_declaration . ]
[record_declaration . ]
[variable_declaration . ]
[cursor_spec . ]
[function_spec . ]
[procedure_spec . ]
[call_spec . ]
[PRAGMA RESTRICT_REFERENCES(assertions) . ]
END [package_name];

[CREATE [OR REPLACE] PACKAGE BODY package_name
[PRAGMA SERIALLY_REUSABLE;]
[collection_type_definition . ]
[record_type_definition . ]
[subtype_definition . ]
[collection_declaration . ]
[constant_declaration . ]
[exception_declaration . ]
[object_declaration . ]
[record_declaration . ]
[variable_declaration . ]
[cursor_body . ]
[function_spec . ]
[procedure_spec . ]
[call_spec . ]
[BEGIN
sequence_of_statements]
END [package_name];]

collection_type_definition - определение типа коллекции
record_type_definition - определение типа записи
subtype_definition - определение подтипа
collection_declaration - объявление коллекции
constant_declaration - объявление константы
exception_declaration - объявление исключения
object_declaration - объявление объекта
record_declaration - объявление записи
variable_declaration - объявление переменной
cursor_spec - спецификация курсора
function_spec - спецификация функции
procedure_spec - спецификация процедуры
call_spec - спецификация вызова

Спецификация пакета содержит публичные объявления, которые видны вашему приложению. Вы должны объявить подпрограммы в конце спецификации после всех других элементов (кроме прагм, которые вызывают конкретную функцию; такие прагмы должны следовать спецификации функции).

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

Пример пакета Oracle PL/SQL

В приведенном ниже примере, вы определяете тип запись, курсор и две процедуры по трудоустройству. Обратите внимание, что процедура hire_employee использует последовательность базы данных empno_seq и функцию SYSDATE для вставки нового номера сотрудника и дату приема на работу соответственно.

Читайте также: