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_literal
str::varchar
::varchar
Квотирование строки; верификация двойного квотирования строки Функцияenquote_name
str::varchar
,[lowercase::bool]
::varchar
Квотирование имени объекта SQL. Опциональный параметр - приведение имени к нижнему регистру
ВНИМАНИЕ: поведение отличается от Oracle, где имя приводится к верхнему региструФункцияnoop
str::varchar
::varchar
Функция-заглушка. Изменений не производится Функцияqualified_sql_name
str::varchar
::varchar
Проверка того, что входной параметр является правильным именем объекта SQL Функцияschema_name
str::varchar
::varchar
Проверка существования в БД определенной схемы Функцияsimple_sql_name
str::varchar
::varchar
Проверка применимости входного параметра для использования в качестве идентификатора SQL Функцияobject_name
str::varchar
::varchar
Проверка существования нефункционального объекта в БД с именем входного параметра -
пакет
dbms_output
добавляет консольный вывод сообщений;В Компоненте используетсяRAISE
, однако поведение функций пакета отличается от принятого в Компоненте порядка выдачи сообщений. Функции пакета представляют собой очередь сообщений и могут быть прочитаны внутри сеанса.Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураdisable
– – Отключение вывода сообщений Процедураenable
[buffer_size::int]
– Включение вывода сообщений. Опциональный параметр указывает размер буфера в байтах Функцияget_line
– line::text
,status::int
Получение сообщений Функцияget_lines
numlines::int
lines::text[]
,numlines::int
Получение блока последних сообщений Процедураnew_line
– – Добавление нового пустого сообщения Функцияput
a::text
– Добавление нового сообщения (блок) Функцияput_line
a::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
) генераторуФункцияstring
opt::text
;len::int4
text
Генерация случайной строки длиной 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_dir
dir::text
;dirname::text
– Таблица алиасов Доменfile_type
file_type::integer
– Домен для хранения файлового дескриптора Функцияfclose
file::utl_file.file_type
::utl_file.file_type
Закрытие файлового дескриптора Процедураfclose_all
– – Закрытие всех открытых файловых дескрипторов Процедураfcopy
src_location::text
;src_filename::text
;dest_location::text
;dest_filename::text
;[ start_line::int4 ]
;[[ end_line::int4]]
– Копирование файла.
Передаваемые параметры:
- исходный каталог;
- исходное имя файла;
- каталог назначения;
- имя файла назначения.
Опционально:
- начальная строка;
- конечная строкаПроцедураfflush
file::utl_file.file_type
– Сброс буфера на диск Функцияfgetattr
location::text
;filename::text
fexist::boolean
;file_length::bigint
;block size::int4
Получение атрибутов файла Функцияfopen
location::text
;filename::text
;open_mode::text
;[ max_linesize::int4 ]
;[[ encoding::name ]]
::utl_file.file_type
Открытие файлового дескриптора.
Параметрopen_mode
стандартный (r
,rw
,a
, ...)Процедураfremove
location::text
;filename::text
– Удаление файла Процедураfrename
location::text
;filename::text
;[ dest_dir::text ]
;[ dest_file::text ]
;[[ overwrite::bool ]]
– Переименование/перемещение файла Функцияget_line
file::utl_file.file_type
;len::int4
buffer::text
Получение строки из открытого файла Функцияget_nextline
file::utl_file.file_type
buffer::text
Получение строки из открытого файла Функцияis_open
file::utl_file.file_type
::boolean
Проверка валидности файлового дескриптора Функцияnew_line
file::utl_file.file_type
;[ lines::int4]
::boolean
Добавление новой строки в открытый файл Функцияput
file::utl_file.file_type
;(buffer::text | buffer::anyelement )
::boolean
Добавление записи в файл Функцияput_line
file::utl_file.file_type
;(buffer::text | buffer::anyelement )
;[ autoflush::boolean ]
::boolean
Добавление новой строки в открытый файл Функцияputf
file::utl_file.file_type
;format::text
;[ arg1::text ]
;[[ arg2::text ]]
;[[[ arg3::text ]]]
;[[[[ arg4::text ]]]]
;[[[[[ arg5::text ]]]]]
::boolean
Форматированный вывод в открытый файл Функцияtmpdir
– ::text
Вывод значения системной переменной $TEMP
-
пакет
plunit
добавляет функции проверок;Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураassert_equals
expected::anyelement
;actual::anyelement
;[ message::varchar]
– Проверка условия expected = actual
Процедураassert_equals
expected::float8
;actual::float8
;range::float8
;[ message::varchar]
– Проверка условия expected = actual
в пределахrange
Процедураassert_false
condition::bool
;[ message::varchar]
– Проверка логического условия FALSE
Процедураassert_true
condition::bool
;[ message::varchar]
– Проверка логического условия TRUE
Процедураassert_not_equals
expected::anyelement
;actual::anyelement
;[ message::varchar]
.– Проверка условия expected != actual
Процедураassert_not_equals
expected::float8
;actual::float8
;range::float8
;[ message::varchar]
– Проверка условия expected != actual
в пределахrange
Процедураassert_not_null
actual::anyelement
;[ message::varchar]
– Проверка входного параметра на присутствие значения NOT NULL
Процедураassert_null
actual::anyelement
;[ message::varchar]
– Проверка входного параметра на отсутствие значения IS NULL
Процедураfail
[ message::varchar]
– Безусловный возврат с ошибкой -
пакет
plvchr
добавляет специфичные для Oracle функции при работе с текстом;Тип Имя Входные переменные функции Выходные переменные функции Описание Функция_is_kind
str::text,kind::int4
;c::int4, kind::int4
boolean
Скрытый траппер для функций is_%
Функцияchar_name
c::text
varchar
Возвращает код символа в кодировке ASCII
Функцияfirst
str::text
varchar
Возвращает первый символ в строке Функцияlast
str::text
varchar
Возвращает последний символ в строке Функцияnth
str::text
;n::int4
text
Возвращает n
-ый символ в строкеФункцияquoted1
str::text
varchar
Возвращает текст, заключенный в апострофы Функцияquoted2
str::text
varchar
Возвращает текст, заключенный в кавычки Функцияstripped
str::text
;char_in::text
varchar
Удаление символов подстроки char_in
изstr
с учетом регистра символовФункцияis_blank
str::text
;c::int4
boolean
Проверка значения параметра на заполненность Функцияis_digit
str::text
;c::int4
boolean
Проверка значения параметра на цифровой формат Функцияis_letter
str::text
;c::int4
boolean
Проверка значения параметра на текстовый формат Функцияis_other
str::text
;c::int4
boolean
Проверка значения параметра на несоответствие ни цифровому, ни текстовому формату Функцияis_quote
str::text
;c::int4
boolean
Проверка значения текстового параметра на квотирование (кавычки или апострофы) -
пакет
plvdate
добавляет специфичные для Oracle функции при работе с датами;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияadd_bizdays
::date
;::int4
date
Получение рабочей даты, спустя <n>
рабочих дней от заданнойФункцияbizdays_between
::date
;::date
int4
Количество рабочих дней между двумя датами Функцияdays_inmonth
::date
int4
Количество дней в месяце Процедураdefault_holidays
::text
– Загрузка рабочего календаря.
Принимаемые конфигурации:
–Czech
;
–German
;
–Austria
;
–Poland
;
–Slovakia
;
–Russia
;
–GB
;
–USA
Функцияinclude_start
[ ::boolean ]
boolean
Включение первой даты в расчет Функцияnoinclude_start
– boolean
Исключение первой даты из расчета Функцияisbizday
::date
boolean
Проверить, является ли дата рабочим днем Функцияisleapyear
::date
boolean
Проверить, является ли год високосным Функцияnearest_bizday
::date
date
Получить ближайшую дату рабочего дня Функцияnext_bizday
::date
date
Получить дату следующего рабочего дня от заданного Функцияprev_bizday
::date
date
Получить дату предыдущего рабочего дня относительно заданного Функцияset_nonbizday
::date
boolean
Задать дату как нерабочий день Процедураset_nonbizday
::text
::date
,::boolean
– Задать день недели как нерабочий.
Задать день как нерабочий. Второй параметр - рекурсия (каждый год)Функцияunset_nonbizday
::date
boolean
Определение рабочего дня. Возвращаемый параметр - рекурсия (каждый год) Процедура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;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияtokens
str::text
;skip_spaces::boolean
;qualified_names::boolean
SETOF record
;pos::integer
;token::text
;code::int4
;class::text
;separator::text
;mod::text
Лексический парсер.
Возвращаемые параметры:
–pos
: позиция лексемы;
–token
: лексема;
–code
: порядковый номер в классе для лексем, являющихся ключевыми словами и идентификаторами в Pangolin;
–class
: класс лексемы;
–separator
: разделитель;
–mod
: модификатор -
пакет
plvstr
добавляет специфичные для Oracle функции при работе со строками и текстовыми данными;Тип Имя Входные переменные функции Выходные переменные функции Описание Функцияbetwn
str::text,start::int4,_end::int4[,inclusive:boolean]
str::text,start::text,_end::text[,startnth::int4,endth::int4[,inclusive::boolean,gotoend::boolean]]
text
Поиск подстроки в пределах от start
до_end
символаФункцияinstr
str::text,patt::text[,start::int4[,nth::int4]]
int4
Поиск позиции подстроки Функцияis_prefix
str::int8,prefix::int8
str::int4,prefix::int4
str::text,prefix::text[,cs::boolean]
boolean
Проверка, начинается ли искомая строка с определенного префикса Функцияleft
str::text,n::int4
varchar
Возвращает n
символов с начала строкиФункцияright
str::text,n::int4
varchar
Возвращает n
символов с конца строкиФункцияlpart
str::text,div::text[,start::int4[,nth::int4[,allifnotfound::boolean]]]
text
Возвращает подстроку, находящуюся до строки поиска Функцияrpart
str::text,div::text[,start::int4[,nth::int4[,allifnotfound::boolean]]]
text
Возвращает подстроку, находящуюся после первого символа строки поиска Функцияlstrip
str::text,substr::text[,num::int4]
text
Усекает строку слева, если строка начинается с поисковой строки Функцияrstrip
str::text,substr::text[,num::int4]
text
Усекает строку справа, если строка заканчивается на поисковую строку Функцияrvrs
str::text,start::int4[,_end::int4]
text
Реверсирует порядок символов в строке Функцияsubstr
str::text,start::int4[,len::int4]
varchar
Возвращает подстроку, начиная с позиции start
и длинойlen
Функцияswap
str::text,replace::text[,start::int4,length::int4]
text
Поиск и замена подстроки replace
в строке, начиная с позицииstart
, длинойlength
-
пакет
plvsubst
добавляет специфичные для Oracle функции форматирования текста.Тип Имя Входные переменные функции Выходные переменные функции Описание Процедураsetsubst
[ str::text]
– Задать маску поиска.
Маска по умолчанию -%s
Функцияsubst
– text
Получить маску поиска Функцияstring
template_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'Reilly
SELECT dbms_assert.qualified_sql_name(E'O\'Reilly');
ERROR: string is not qualified SQL name
SELECT dbms_assert.qualified_sql_name(E'noop');
noop
SELECT dbms_assert.qualified_sql_name(E'noop1');
noop1
SELECT dbms_assert.qualified_sql_name(E'1noop');
1noop
SELECT dbms_assert.qualified_sql_name(E'noOP');
noOP
SELECT dbms_assert.schema_name(E'public');
public
SELECT dbms_assert.schema_name(E'noop');
ERROR: invalid schema name
SELECT dbms_assert.simple_sql_name(E'public');
public
SELECT dbms_assert.simple_sql_name(E'O\'Reilly');
ERROR: string is not simple SQL name
SELECT dbms_assert.object_name(E'object_name');
ERROR: invalid object name
SELECT dbms_assert.object_name(E'information_schema');
ERROR: invalid object name
SELECT 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);
Создание частного канала с именем pipe1
SELECT * 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-03
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();
Вывод 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.0777241069451229
SELECT dbms_random.normal();
0.498490513945213
SELECT dbms_random.string('u',10);
UREURVOTTQ
SELECT dbms_random.string('l',10);
jjrfoxiqrz
SELECT dbms_random.string('a',15);
hjNFMsoOWNyKvGz
SELECT dbms_random.string('x',10);
2G1T7O6KCD
SELECT dbms_random.string('p',15);
0]I{VU"0m."HAW}
SELECT dbms_random.value(-10,10);
0.17908088862896
SELECT dbms_random.terminate();
-
dbms_utility – просмотр стека вызовов;
do $$ declare res text; begin SELECT dbms_utility.format_call_stack() into res; raise notice 'Call stack: %',res; end $$;
Пример результата запроса:Раскрыть type=sqlNOTICE: 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');
P
SELECT plvchr.first('Pangolin');
P
SELECT plvchr.last('Pangolin');
n
SELECT plvchr.nth('Pangolin',2);
a
SELECT plvchr.nth('Pangolin',-2);
i
SELECT plvchr.quoted1('Pangolin');
'Pangolin'
SELECT plvchr.quoted2('Pangolin');
"Pangolin"
SELECT plvchr.stripped('Pangolin','Pango');
li
SELECT plvchr.stripped('Pangolin','pango');
Pli
SELECT plvchr.is_blank('Pangolin');
f
,false
SELECT plvchr.is_digit('Pangolin');
f
,false
SELECT plvchr.is_letter('Pangolin');
t
,true
SELECT plvchr.is_other('Pangolin');
f
,false
SELECT plvchr.is_quote('Pangolin');
f
,false
SELECT plvchr.is_quote('''Pangolin"');
t
,true
-
plvdate – специфичные для Oracle функции при работе с датами;
Сессия 1 Результат SELECT plvdate.default_holidays('Russia');
SELECT plvdate.isleapyear('2020-01-01');
true
SELECT plvdate.isleapyear('2021-01-01');
false
SELECT plvdate.isbizday('2023-03-08');
false
SELECT plvdate.isbizday('2021-02-22');
true
SELECT plvdate.add_bizdays('2021-02-22',15);
2021-03-15
SELECT plvdate.bizdays_between('2021-04-30','2021-05-10');
7
SELECT plvdate.days_inmonth('2023-02-01');
28
SELECT plvdate.nearest_bizday('2023-02-22');
2023-02-21
SELECT plvdate.next_bizday('2023-03-03');
2023-03-06
SELECT plvdate.prev_bizday('2023-03-05');
2023-03-03
SELECT plvdate.set_nonbizday('2021-02-22',false);
SELECT plvdate.unset_nonbizday('2021-02-20',false);
ERROR: nonbizday unregisteration error
DETAIL: Nonbizday not found.
SELECT plvdate.using_easter();
false
SELECT plvdate.using_greater_friday();
false
SELECT 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);
Пример результата выполнения запроса:
Раскрыть type=sqlpos | 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');
goli
SELECT plvstr.instr('Pangolin','go');
4
SELECT plvstr.is_prefix('Pangolin','Pan');
true
SELECT plvstr.is_prefix('Pangolin','pan');
false
SELECT plvstr.left('Pangolin',5);
Pango
SELECT plvstr.right('Pangolin',5);
golin
SELECT plvstr.lpart('Pangolin','go');
Pan
SELECT plvstr.rpart('Pangolin','go');
olin
SELECT plvstr.lstrip('Pangolin','go');
Pangolin
SELECT plvstr.lstrip('Pangolin','Pan');
golin
SELECT plvstr.rstrip('Pangolin','lin');
Pango
SELECT plvstr.rvrs('Pangolin');
nilognaP
SELECT plvstr.substr('Pangolin',5);
olin
SELECT plvstr.swap('Pangolin','go')
gongolin
-
plvsubst – специфичные для Oracle функции форматирования текста:
-
Применить форматирования по шаблону:
SELECT plvsubst.string('%s codename %s','Postgresql,Pangolin');
илиSELECT plvsubst.string('%s codename %s',ARRAY['Postgresql','Pangolin']);
Результат выполнения запросов:Раскрыть type=sqlstring ------------------------------ Postgresql codename Pangolin (1 row)
-
Получить маску поиска:
SELECT plvsubst.subst();
Результат выполнения запросов:Раскрыть type=sqlsubst ------- %s (1 row)
Дополнительную информацию по поставляемому модулю orafce можно получить по ссылке.