orafce
Совместимость логики Oracle для PL/Pgsql.
Схема размещения:
ext.Модуль
orafce реализует некоторые функции из СУБД Oracle, которые отсутствуют или ведут себя по-другому в СУБД PostgreSQL.Модуль является функциональным расширением совместимости для логики, написанной под Oracle.
Функциональность модуля:
- пакет
dbms_alertдобавляет модель межсессионного взаимодействия;
| Тип | Имя | Входные переменные функции | Выходные переменные функции | Описание |
|---|---|---|---|---|
Процедура | _signal | name::text,message::text | – | Internal |
Триггер | deferred_signal | – | trigger | Internal |
Процедура | register | name::text | – | Регистрация ipc c именем name |
Процедура | remove | name::text | – | Удаление ipc с именем name |
Процедура | removeall | – | – | Удаление всех ipc |
Процедура | set_defaults | sensitivity::float8 | – | Определение sensitivity |
Процедура | signal | event::text,_message::text | – | Регистрация сигнала для ipc event с сообщением _message |
Функция | waitany | timeout::float8 | name::text,message::text,status::int | Ожидание сигналов в течение timeout секунд |
Функция | waitone | name::text,timeout::float8 | message::text,status::int | Ожидание сигнала в ipc name в течение timeout секунд |
-
пакет
dbms_assertдобавляет дополнительные проверки в целях защиты от SQL injection;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияenquote_literalstr::varchar::varcharКвотирование строки; верификация двойного квотирования строки Функцияenquote_namestr::varchar,[lowercase::bool]::varcharКвотирование имени объекта SQL. Опциональный параметр - приведение имени к нижнему регистру
ВНИМАНИЕ: поведение отличается от Oracle, где имя приводится к верхнему региструФункцияnoopstr::varchar::varcharФункция-заглушка. Изменений не производится Функцияqualified_sql_namestr::varchar::varcharПроверка того, что входной параметр является правильным именем объекта SQL Функцияschema_namestr::varchar::varcharПроверка существования в БД определенной схемы Функцияsimple_sql_namestr::varchar::varcharПроверка применимости входного параметра для использования в качестве идентификатора SQL Функцияobject_namestr::varchar::varcharПроверка существования нефункционального объекта в БД с именем входного параметра -
пакет
dbms_outputдобавляет консольный вывод сообщений;В Компоненте используетсяRAISE, однако поведение функций пакета отличается от принятого в Компоненте порядка выдачи сообщений. Функции пакета представляют собой очередь сообщений и могут быть прочитаны внутри сеанса.Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураdisable– – Отключение вывода сообщений Процедураenable[buffer_size::int]– Включение вывода сообщений. Опциональный параметр указывает размер буфера в байтах Функцияget_line– line::text,status::intПолучение сообщений Функцияget_linesnumlines::intlines::text[],numlines::intПолучение блока последних сообщений Процедураnew_line– – Добавление нового пустого сообщения Функцияputa::text– Добавление нового сообщения (блок) Функцияput_linea::text– Добавление нового сообщения (строка) Процедураserveroutput::bool– Переключение вывода сообщений в консоль -
пакет
dbms_pipeдобавляет эмуляцию каналов Oracle. Реализация основана на использовании shared memory инстанса. Характеристики:- максимальное количество каналов - 50;
- длина канала определяется не в байтах, а в количестве элементов;
- возможна отправка сообщений без ожидания;
- возможна отправка пустых сообщений;
- тип
timestampдляnext_item_type=13; - Postgresql SE не поддерживает тип
RAW. Используйте типbytea.
Тип Имя Входные переменные функции Выходные переменные функции Описание Представлениеdb_pipes– name::varchar;items::int4;size::int4;limit::int4;private::bool;owner::varcharСписок каналов Процедураcreate_pipe::text;[::int4,[::bool]]– Передача параметров (имени, размера, признака) при создании канала Функцияnext_item_type::int4Определение формата сообщения в канале:
0 - канал пуст;
9 -numeric/int4/int8;
11 -text;
12 -date;
13 -timestamptz;
23 -byte;
24 -recordПроцедураpack_message::bytea;::int4;::int8;::numeric;::text;::date;::timestamptz;::bytea;::record– Добавление сообщения в канал Процедураpurge::text– Очистка канала.
Параметр - имя каналаФункцияreceive_message::text [::int4]::int4Прием сообщения. Копирование сообщения в локальный буфер.
Параметры:
- имя канала;
- время ожидания в секундах.
Результат: код возврата.
0 - успех;
1 - таймаут;
2 - Ошибка: размер сообщения превышает размер буфера;
3 - Прерывание;
? - Недостаточно привилегийПроцедураremove_pipe::text– Удаление канала.
Параметр - имя каналаПроцедураreset_buffer– – Очистка буфера Функцияsend_message::text[::int4 [::int4]]::int4Передача сообщения.
Параметры:
- имя канала;
- таймаут в секундах;
- максимальный размер канала.
Канал, созданный этой функцией будет удален после передачи сообщения (в отличие от канала, созданного функциейcreate_pipe).
Код возврата совпадает с кодами функцииreceive_messageФункцияunique_session_name– ::varcharВозвращает уникальное имя сессии, в которой создан канал Функцияunpack_message_bytea– ::byteaРаспаковка сообщения byteaФункцияunpack_message_date– ::dateРаспаковка сообщения dateФункцияunpack_message_number– ::numericРаспаковка сообщения numberФункцияunpack_message_record– ::recordРаспаковка сообщения recordФункцияunpack_message_timestamp– ::timestamptzРаспаковка сообщения timestampФункцияunpack_message_text– ::textРаспаковка сообщения text -
пакет
dbms_randomдобавляет псеводслучайные числа Oracle;Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураinitialize::int4– Инициализация генератора псевдослучайных чисел c заданным зерном ( seed)Функцияnormal– ::floatГенерация числа в нормальном распределении Функцияrandom– ::int4Генерация числа в полном диапазоне int4 (-2^31..2^31) Процедураseed::int4– Передача зерна ( seed) генераторуПроцедураseed::text– Передача зерна ( seed) генераторуФункцияstringopt::text;len::int4textГенерация случайной строки длиной len.
Параметры:
'u','U' - UPPERCASE ALPHA;
'l','L' - lowercase alpha;
'a','A' - MiXeD AlPhA;
'x','X' – UPPERCASE ALPHANUMERIC;
'p','P' - Any printable characters.Процедураterminate– – Окончание работы пакета Функцияvalue[ low::float, high::float]– Генерация псевдослучайного номера из диапазона с нижней границей lowвключительно и верхней границейhighне включительно) -
пакет
dbms_utilityдобавляет просмотр стека вызовов;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияformat_call_stack[ ::text ]textВозвращает стек вызовов внутри блока pl/pgsql -
пакет
utl_fileдобавляет операции с файловой системой;В каждой сессии допускается до 10 открытых файловых дескрипторов. Длина строки ограничена 32 Кб.Тип Имя Входные переменные функции Выходные переменные функции Описание Таблицаutl_file_dirdir::text;dirname::text– Таблица алиасов Доменfile_typefile_type::integer– Домен для хранения файлового дескриптора Функцияfclosefile::utl_file.file_type::utl_file.file_typeЗакрытие файлового дескриптора Процедураfclose_all– – Закрытие всех открытых файловых дескрипторов Процедураfcopysrc_location::text;src_filename::text;dest_location::text;dest_filename::text;[ start_line::int4 ];[[ end_line::int4]]– Копирование файла.
Передаваемые параметры:
- исходный каталог;
- исходное имя файла;
- каталог назначения;
- имя файла назначения.
Опционально:
- начальная строка;
- конечная строкаПроцедураfflushfile::utl_file.file_type– Сброс буфера на диск Функцияfgetattrlocation::text;filename::textfexist::boolean;file_length::bigint;block size::int4Получение атрибутов файла Функцияfopenlocation::text;filename::text;open_mode::text;[ max_linesize::int4 ];[[ encoding::name ]]::utl_file.file_typeОткрытие файлового дескриптора.
Параметрopen_modeстандартный (r,rw,a, ...)Процедураfremovelocation::text;filename::text– Удаление файла Процедураfrenamelocation::text;filename::text;[ dest_dir::text ];[ dest_file::text ];[[ overwrite::bool ]]– Переименование/перемещение файла Функцияget_linefile::utl_file.file_type;len::int4buffer::textПолучение строки из открытого файла Функцияget_nextlinefile::utl_file.file_typebuffer::textПолучение строки из открытого файла Функцияis_openfile::utl_file.file_type::booleanПроверка валидности файлового дескриптора Функцияnew_linefile::utl_file.file_type;[ lines::int4]::booleanДобавление новой строки в открытый файл Функцияputfile::utl_file.file_type;(buffer::text | buffer::anyelement )::booleanДобавление записи в файл Функцияput_linefile::utl_file.file_type;(buffer::text | buffer::anyelement );[ autoflush::boolean ]::booleanДобавление новой строки в открытый файл Функцияputffile::utl_file.file_type;format::text;[ arg1::text ];[[ arg2::text ]];[[[ arg3::text ]]];[[[[ arg4::text ]]]];[[[[[ arg5::text ]]]]]::booleanФорматированный вывод в открытый файл Функцияtmpdir– ::textВывод значения системной переменной $TEMP -
пакет
plunitдобавляет функции проверок;Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураassert_equalsexpected::anyelement;actual::anyelement;[ message::varchar]– Проверка условия expected = actualПроцедураassert_equalsexpected::float8;actual::float8;range::float8;[ message::varchar]– Проверка условия expected = actualв пределахrangeПроцедураassert_falsecondition::bool;[ message::varchar]– Проверка логического условия FALSEПроцедураassert_truecondition::bool;[ message::varchar]– Проверка логического условия TRUEПроцедураassert_not_equalsexpected::anyelement;actual::anyelement;[ message::varchar].– Проверка условия expected != actualПроцедураassert_not_equalsexpected::float8;actual::float8;range::float8;[ message::varchar]– Проверка условия expected != actualв пределахrangeПроцедураassert_not_nullactual::anyelement;[ message::varchar]– Проверка входного параметра на присутствие значения NOT NULLПроцедураassert_nullactual::anyelement;[ message::varchar]– Проверка входного параметра на отсутствие значения IS NULLПроцедураfail[ message::varchar]– Безусловный возврат с ошибкой -
пакет
plvchrдобавляет специфичные для Oracle функции при работе с текстом;Тип Имя Входные переменные функции Выходные переменные функции Описание Функция_is_kindstr::text,kind::int4;c::int4, kind::int4booleanСкрытый траппер для функций is_%Функцияchar_namec::textvarcharВозвращает код символа в кодировке ASCIIФункцияfirststr::textvarcharВозвращает первый символ в строке Функцияlaststr::textvarcharВозвращает последний символ в строке Функцияnthstr::text;n::int4textВозвращает n-ый символ в строкеФункцияquoted1str::textvarcharВозвращает текст, заключенный в апострофы Функцияquoted2str::textvarcharВозвращает текст, заключенный в кавычки Функцияstrippedstr::text;char_in::textvarcharУдаление символов подстроки char_inизstrс учетом регистра символовФункцияis_blankstr::text;c::int4booleanПроверка значения параметра на заполненность Функцияis_digitstr::text;c::int4booleanПроверка значения параметра на цифровой формат Функцияis_letterstr::text;c::int4booleanПроверка значения параметра на текстовый формат Функцияis_otherstr::text;c::int4booleanПроверка значения параметра на несоответствие ни цифровому, ни текстовому формату Функцияis_quotestr::text;c::int4booleanПроверка значения текстового параметра на квотирование (кавычки или апострофы) -
пакет
plvdateдобавляет специфичные для Oracle функции при работе с датами;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияadd_bizdays::date;::int4dateПолучение рабочей даты, спустя <n>рабочих дней от заданнойФункцияbizdays_between::date;::dateint4Количество рабочих дней между двумя датами Функцияdays_inmonth::dateint4Количество дней в месяце Процедураdefault_holidays::text– Загрузка рабочего календаря.
Принимаемые конфигурации:
–Czech;
–German;
–Austria;
–Poland;
–Slovakia;
–Russia;
–GB;
–USAФункцияinclude_start[ ::boolean ]booleanВключение первой даты в расчет Функцияnoinclude_start– booleanИсключение первой даты из расчета Функцияisbizday::datebooleanПроверить, является ли дата рабочим днем Функцияisleapyear::datebooleanПроверить, является ли год високосным Функцияnearest_bizday::datedateПолучить ближайшую дату рабочего дня Функцияnext_bizday::datedateПолучить дату следующего рабочего дня от заданного Функцияprev_bizday::datedateПолучить дату предыдущего рабочего дня относительно заданного Функцияset_nonbizday::datebooleanЗадать дату как нерабочий день Процедураset_nonbizday::text::date,::boolean– Задать день недели как нерабочий.
Задать день как нерабочий. Второй параметр - рекурсия (каждый год)Функцияunset_nonbizday::datebooleanОпределение рабочего дня. Возвращаемый параметр - рекурсия (каждый год) Процедураunset_nonbizday::text::date,::boolean– Задать день недели как рабочий.
Задать день как рабочий. Второй параметр - рекурсия (каждый год)Функцияuse_easter– booleanЗадать Пасху как нерабочий день. Возвращаемый параметр - рекурсия (каждый год) Процедураuse_easter::boolean– Задать Пасху как нерабочий день Функцияunuse_easter– booleanЗадать Пасху как рабочий день. Возвращаемый параметр - рекурсия (каждый год) Процедураunuse_easter::boolean– Задать Пасху как рабочий день Функцияuse_great_friday– booleanЗадать Страстную пятницу как нерабочий день. Возвращаемый параметр - рекурсия (каждый год) Процедураuse_great_friday::boolean– Задать Страстную пятницу как нерабочий день Функцияusing_easter– booleanПроверить, является ли Пасха рабочим днем Функцияusing_great_friday– booleanПроверить, является ли Страстная пятница рабочим днем Функцияversion– cstringВерсия схем -
пакет
plvlexоснован на оригинальномPL/Vision LEXical analysisи добавляет специфичные для Oracle функции при работе с лексемами. Данный пакет основан на ключевых словах Postgresql и не является полностью совместимым с Oracle;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияtokensstr::text;skip_spaces::boolean;qualified_names::booleanSETOF record;pos::integer;token::text;code::int4;class::text;separator::text;mod::textЛексический парсер.
Возвращаемые параметры:
–pos: позиция лексемы;
–token: лексема;
–code: порядковый номер в классе для лексем, являющихся ключевыми словами и идентификаторами в Pangolin;
–class: класс лексемы;
–separator: разделитель;
–mod: модификатор -
пакет
plvstrдобавляет специфичные для Oracle функции при работе со строками и текстовыми данными;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияbetwnstr::text,start::int4,_end::int4[,inclusive:boolean]str::text,start::text,_end::text[,startnth::int4,endth::int4[,inclusive::boolean,gotoend::boolean]]textПоиск подстроки в пределах от startдо_endсимволаФункцияinstrstr::text,patt::text[,start::int4[,nth::int4]]int4Поиск позиции подстроки Функцияis_prefixstr::int8,prefix::int8str::int4,prefix::int4str::text,prefix::text[,cs::boolean]booleanПроверка, начинается ли искомая строка с определенного префикса Функцияleftstr::text,n::int4varcharВозвращает nсимволов с начала строкиФункцияrightstr::text,n::int4varcharВозвращает nсимволов с конца строкиФункцияlpartstr::text,div::text[,start::int4[,nth::int4[,allifnotfound::boolean]]]textВозвращает подстроку, находящуюся до строки поиска Функцияrpartstr::text,div::text[,start::int4[,nth::int4[,allifnotfound::boolean]]]textВозвращает подстроку, находящуюся после первого символа строки поиска Функцияlstripstr::text,substr::text[,num::int4]textУсекает строку слева, если строка начинается с поисковой строки Функцияrstripstr::text,substr::text[,num::int4]textУсекает строку справа, если строка заканчивается на поисковую строку Функцияrvrsstr::text,start::int4[,_end::int4]textРеверсирует порядок символов в строке Функцияsubstrstr::text,start::int4[,len::int4]varcharВозвращает подстроку, начиная с позиции startи длинойlenФункцияswapstr::text,replace::text[,start::int4,length::int4]textПоиск и замена подстроки replaceв строке, начиная с позицииstart, длинойlength -
пакет
plvsubstдобавляет специфичные для Oracle функции форматирования текста.Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураsetsubst[ str::text]– Задать маску поиска.
Маска по умолчанию -%sФункцияsubst– textПолучить маску поиска Функцияstringtemplate_in::text[,vals_in::text[,delim_in::text[,substr-in::text]]]template_in::text[,values_in::text[][,subst::text]]textПрименение форматирования по шаблону
Новые обьекты (изменения уровня базы данных):
| Тип | Имя | Входные переменные функции | Выходные переменные функции | Описание |
|---|---|---|---|---|
Представление | dual | – | dummy::varchar | Специфичное для Oracle представление, необходимое для поддержки стандарта SQL |
Тип | dummy | – | – | Специфичный для Oracle тип фиктивных данных, служащий для формирования корректного по форме запроса со всеми необходимыми полями и значениями |
Тип | varchar2 | – | – | Специфичный для Oracle тип текстовых данных single-byte |
Тип | nvarchar2 | – | – | Специфичный для Oracle тип текстовых данных multi-byte |
- Для эксплуатации решения необходимо придерживаться принципа установки одинаковых версий расширения на всех узлах кластера высокой доступности, используемых в потоковой и логической репликации.
- Схему
extследует добавить в параметрsearch_pathпоследней в порядке поиска. - Все дополнительные пакеты и функции являются дополнительной функциональностью, не меняют поведения продукта в целом и требуют дополнительного тестирования в рамках миграции БД.
-
dbms_alert – модель межсессионного взаимодействия;
Сессия 1 Сессия 2 Сессия 3 Комментарий SELECT dbms_alert.register('alert1');SELECT dbms_alert.register('alert1');– Регистрация очереди событий alert1 SELECT * from dbms_alert.waitany(10);SELECT * from dbms_alert.waitany(10);– Ожидание событий в течение 10 секунд –– SELECT dbms_alert.signal('alert1','Alert 1');Добавление события "Alert 1" в очереди alert1 -
dbms_assert – дополнительные проверки в целях защиты от SQL injection;
Сессия 1 Результат SELECT dbms_assert.enquote_literal(E'O\'Reilly');'O''Reilly'SELECT dbms_assert.enquote_name(E'O\'Reilly');"o'reilly"SELECT dbms_assert.enquote_name(E'O\'Reilly',false);"O'Reilly"SELECT dbms_assert.noop(E'O\'Reilly');O'ReillySELECT dbms_assert.qualified_sql_name(E'O\'Reilly');ERROR: string is not qualified SQL nameSELECT dbms_assert.qualified_sql_name(E'noop');noopSELECT dbms_assert.qualified_sql_name(E'noop1');noop1SELECT dbms_assert.qualified_sql_name(E'1noop');1noopSELECT dbms_assert.qualified_sql_name(E'noOP');noOPSELECT dbms_assert.schema_name(E'public');publicSELECT dbms_assert.schema_name(E'noop');ERROR: invalid schema nameSELECT dbms_assert.simple_sql_name(E'public');publicSELECT dbms_assert.simple_sql_name(E'O\'Reilly');ERROR: string is not simple SQL nameSELECT dbms_assert.object_name(E'object_name');ERROR: invalid object nameSELECT dbms_assert.object_name(E'information_schema');ERROR: invalid object nameSELECT dbms_assert.object_name(E'pg_class');pg_class -
dbms_output – консольный вывод сообщений;
SELECT dbms_output.enable() enable -------- (1 row)SELECT dbms_output.put(E'One\nTwo'); put ----- (1 row)SELECT dbms_output.get_lines(2); get_lines ------------ ("{""One + Two""}",1) (1 row)SELECT dbms_output.get_line(); get_line ---------- (,1) (1 row)SELECT dbms_output.put_line(E'One\nTwo'); put_line ---------- (1 row)SELECT dbms_output.get_line(); get_line ---------- ("One + Two",0) (1 row)SELECT dbms_output.serveroutput(true); serveroutput -------------- (1 row)SELECT dbms_output.put(E'One\nTwo'); put ----- (1 row)SELECT dbms_output.get_line(); get_line ---------- ("One + Two",0) (1 row)SELECT dbms_output.disable(); disable --------- (1 row) -
dbms_pipe – эмуляция каналов Oracle;
Сессия 1 Сессия 2 Комментарий SELECT dbms_pipe.create_pipe('pipe1',10,true);Создание частного канала с именем pipe1SELECT * from dbms_pipe.db_pipes;Список: name | items | size | limit | private | owner-------+-------+------+-------+---------+--------pipe1| 0 | 0 | 10 | t | pguser(1 row)SELECT * from dbms_pipe.pack_message(timestamp 'epoch'+interval '2 days');SELECT * from dbms_pipe.pack_message((date 'epoch'+interval '2 days')::date);SELECT * from dbms_pipe.pack_message(2::int4);SELECT * from dbms_pipe.pack_message(2::int8);SELECT * from dbms_pipe.pack_message(2::numeric);SELECT * from dbms_pipe.pack_message(2::text);SELECT * from dbms_pipe.send_message('pipe1',20,0);Вывод кода возврата: 0 SELECT dbms_pipe.receive_message('pipe1',1);Вывод кода возврата: 0 SELECT dbms_pipe.next_item_type();Вывод 13 ( timestamp)SELECT dbms_pipe.unpack_message_timestamp();Вывод 1970-01-03 00:00:00+03(для таймзоны MSK)SELECT dbms_pipe.next_item_type();Вывод 12 ( date)SELECT dbms_pipe.unpack_message_timestamp();ERROR: datatype mismatch SELECT dbms_pipe.unpack_message_date();Вывод: 1970-01-03SELECT dbms_pipe.next_item_type();Вывод: 9 ( number)SELECT dbms_pipe.unpack_message_number();Вывод: 2 SELECT dbms_pipe.next_item_type();Вывод 9 ( number)SELECT dbms_pipe.unpack_message_number();Вывод: 2 SELECT dbms_pipe.next_item_type();Вывод 9 ( number)SELECT dbms_pipe.unpack_message_number();Вывод: 2 SELECT dbms_pipe.next_item_type();Вывод 11 ( text)SELECT dbms_pipe.unpack_message_text();Вывод: 2 SELECT dbms_pipe.next_item_type();Вывод: 0 (конец канала) SELECT * from dbms_pipe.remove_pipe('pipe1'); -
dbms_random – псевдослучайные числа Oracle;
Сессия 1 Результат SELECT dbms_random.initialize(ceil(random()*1000)::int4);SELECT dbms_random.normal();-0.0777241069451229SELECT dbms_random.normal();0.498490513945213SELECT dbms_random.string('u',10);UREURVOTTQSELECT dbms_random.string('l',10);jjrfoxiqrzSELECT dbms_random.string('a',15);hjNFMsoOWNyKvGzSELECT dbms_random.string('x',10);2G1T7O6KCDSELECT dbms_random.string('p',15);0]I{VU"0m."HAW}SELECT dbms_random.value(-10,10);0.17908088862896SELECT dbms_random.terminate();
-
dbms_utility – просмотр стека вызовов;
do $$ declare res text; begin SELECT dbms_utility.format_call_stack() into res; raise notice 'Call stack: %',res; end $$;Пример результата запроса:NOTICE: Call stack: ----- PL/pgSQL Call Stack ----- object line object handle number name 0 function anonymous object 0 5 function anonymous object DO -
utl_file – операции с файловой системой;
INSERT INTO utl_file.utl_file_dir(dir,dirname) VALUES ('temp','/tmp'); COPY (SELECT * FROM pg_settings) TO '/tmp/pg_settings.csv';Содержимое файла/tmp/pg_settings.csv:do $$ declare f utl_file.file_type; begin if (SELECT fexists from utl_file.fgetattr('temp','pg_settings.csv')) then f := utl_file.fopen('temp', 'pg_settings.csv', 'r'); <<readl>> loop begin raise notice '%', utl_file.get_line(f); exception when no_data_found then exit readl; end; end loop; f := utl_file.fclose(f); end if; end; $$;SELECT utl_file.fremove('temp','pg_settings.csv');SELECT utl_file.fclose_all(); -
plunit – функции проверок;
SELECT plunit.assert_equals(clock_timestamp(),current_timestamp,'Failed'); ERROR: Failed DETAIL: Plunit.assertation fails (assert_equals).SELECT plunit.assert_equals(clock_timestamp()::date,current_timestamp::date,'Failed'); assert_equals --------------- (1 row)SELECT plunit.assert_not_equals(clock_timestamp(),current_timestamp,'Failed'); assert_not_equals ------------------- (1 row)SELECT plunit.assert_not_equals(clock_timestamp()::date,current_timestamp::date,'Failed'); ERROR: Failed DETAIL: Plunit.assertation fails (assert_not_equals).SELECT plunit.assert_false(clock_timestamp()::date=current_timestamp::date,'Failed'); ERROR: Failed DETAIL: Plunit.assertation fails (assert_false).SELECT plunit.assert_true(clock_timestamp()=current_timestamp,'Failed'); ERROR: Failed DETAIL: Plunit.assertation fails (assert_true).SELECT plunit.assert_not_null(clock_timestamp(),'Failed'); assert_not_null ----------------- (1 row)SELECT plunit.assert_null(clock_timestamp(),'Failed'); ERROR: Failed DETAIL: Plunit.assertation fails (assert_null).SELECT plunit.fail('Failed'); ERROR: Failed DETAIL: Plunit.assertation (assert_fail). -
plvchr – специфичные для Oracle функции при работе с текстом;
Сессия 1 Результат SELECT plvchr.char_name('Pangolin');PSELECT plvchr.first('Pangolin');PSELECT plvchr.last('Pangolin');nSELECT plvchr.nth('Pangolin',2);aSELECT plvchr.nth('Pangolin',-2);iSELECT plvchr.quoted1('Pangolin');'Pangolin'SELECT plvchr.quoted2('Pangolin');"Pangolin"SELECT plvchr.stripped('Pangolin','Pango');liSELECT plvchr.stripped('Pangolin','pango');PliSELECT plvchr.is_blank('Pangolin');f,falseSELECT plvchr.is_digit('Pangolin');f,falseSELECT plvchr.is_letter('Pangolin');t,trueSELECT plvchr.is_other('Pangolin');f,falseSELECT plvchr.is_quote('Pangolin');f,falseSELECT plvchr.is_quote('''Pangolin"');t,true -
plvdate – специфичные для Oracle функции при работе с датами;
Сессия 1 Результат SELECT plvdate.default_holidays('Russia');SELECT plvdate.isleapyear('2020-01-01');trueSELECT plvdate.isleapyear('2021-01-01');falseSELECT plvdate.isbizday('2023-03-08');falseSELECT plvdate.isbizday('2021-02-22');trueSELECT plvdate.add_bizdays('2021-02-22',15);2021-03-15SELECT plvdate.bizdays_between('2021-04-30','2021-05-10');7SELECT plvdate.days_inmonth('2023-02-01');28SELECT plvdate.nearest_bizday('2023-02-22');2023-02-21SELECT plvdate.next_bizday('2023-03-03');2023-03-06SELECT plvdate.prev_bizday('2023-03-05');2023-03-03SELECT plvdate.set_nonbizday('2021-02-22',false);SELECT plvdate.unset_nonbizday('2021-02-20',false);ERROR: nonbizday unregisteration errorDETAIL: Nonbizday not found.SELECT plvdate.using_easter();falseSELECT plvdate.using_greater_friday();falseSELECT plvdate.version();version-----------------------------------------------PostgreSQL PLVdate, version 3.7, October 2018(1 row) -
plvlex – специфичные для Oracle функции при работе с лексемами;
SELECT * from plvlex.tokens (' SELECT n.nspname AS schemaname, c.relname AS viewname, pg_get_userbyid(c.relowner) AS viewowner, pg_get_viewdef(c.oid) AS definition FROM pg_class c LEFT JOIN pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind = ''v''::"char";' ,true,true);
Пример результата выполнения запроса:
pos | token | code | class | separator | mod -----+-----------------+------+---------+-----------+---------- 0 | SELECT | 604 | KEYWORD | | 7 | n.nspname | | IDENT | | 17 | as | 290 | KEYWORD | | 20 | schemaname | | IDENT | | 30 | , | 44 | OTHERS | | self 32 | c.relname | | IDENT | | 42 | as | 290 | KEYWORD | | 45 | viewname | | IDENT | | 53 | , | 44 | OTHERS | | self 55 | pg_get_userbyid | | IDENT | | 70 | ( | 40 | OTHERS | | self 71 | c.relowner | | IDENT | | 81 | ) | 41 | OTHERS | | self 83 | as | 290 | KEYWORD | | 86 | viewowner | | IDENT | | 95 | , | 44 | OTHERS | | self 97 | pg_get_viewdef | | IDENT | | 111 | ( | 40 | OTHERS | | self 112 | c.oid | | IDENT | | 117 | ) | 41 | OTHERS | | self 119 | as | 290 | KEYWORD | | 122 | definition | | IDENT | | 133 | from | 418 | KEYWORD | | 138 | pg_class | | IDENT | | 147 | c | | IDENT | | 149 | left | 477 | KEYWORD | | 154 | join | 467 | KEYWORD | | 159 | pg_namespace | | IDENT | | 172 | n | | IDENT | | 174 | on | 524 | KEYWORD | | 177 | n.oid | | IDENT | | 183 | = | 61 | OTHERS | | self 185 | c.relnamespace | | IDENT | | 200 | where | 689 | KEYWORD | | 206 | c.relkind | | IDENT | | 216 | = | 61 | OTHERS | | self 218 | v | | SCONST | | qs 221 | v | 267 | OTHERS | | typecast 223 | char | | IDENT | | dq 229 | ; | 59 | OTHERS | | self (40 rows)
-
plvstr – специфичные для Oracle функции при работе со строками и текстовыми данными;
Сессия 1 Результат SELECT plvstr.betwn('Pangolin','go','i');goliSELECT plvstr.instr('Pangolin','go');4SELECT plvstr.is_prefix('Pangolin','Pan');trueSELECT plvstr.is_prefix('Pangolin','pan');falseSELECT plvstr.left('Pangolin',5);PangoSELECT plvstr.right('Pangolin',5);golinSELECT plvstr.lpart('Pangolin','go');PanSELECT plvstr.rpart('Pangolin','go');olinSELECT plvstr.lstrip('Pangolin','go');PangolinSELECT plvstr.lstrip('Pangolin','Pan');golinSELECT plvstr.rstrip('Pangolin','lin');PangoSELECT plvstr.rvrs('Pangolin');nilognaPSELECT plvstr.substr('Pangolin',5);olinSELECT plvstr.swap('Pangolin','go')gongolin -
plvsubst – специфичные для Oracle функции форматирования текста:
-
Применить форматирования по шаблону:
SELECT plvsubst.string('%s codename %s','Postgresql,Pangolin');илиSELECT plvsubst.string('%s codename %s',ARRAY['Postgresql','Pangolin']);Результат выполнения запросов:string ------------------------------ Postgresql codename Pangolin (1 row) -
Получить маску поиска:
SELECT plvsubst.subst();Результат выполнения запросов:subst ------- %s (1 row)
Дополнительную информацию по поставляемому модулю orafce можно получить по ссылке.