Функции и операторы, эмулирующие подмножество функций и пакетов из СУБД Oracle.
Существует связанная группа Google - https://groups.google.com/forum/?hl=en#!forum/orafce-general.
Orafce поддерживается в AWS Aurora с совместимостью с PostgreSQL, а также в базе данных Azure для PostgreSQL.
Этот модуль содержит некоторые полезные функции, которые могут помочь при переносе приложения Oracle на PostgreSQL или могут быть вообще полезны.
Встроенные функции даты Oracle были протестированы на соответствие Oracle 10. Диапазон дат от 1960 до 2070 работает корректно. Даты до 10.10.1582 в формате J и до 01.11.03 в других форматах не могут быть проверены из-за ошибки в Oracle.
Все функции полностью совместимы с Oracle и учитывают все известные строки формата. Подробные описания можно найти в Интернете. Используйте такие ключевые слова, как: oracle round trunc date iyyy.
Г,ГГ,ГГГ,ГГГГ,СГГГ,ГОД год I,IY,IYY,IYYY iso год К, квартал Неделя WW, день как первый день года IW неделя, начало в понедельник W неделя, день как первый день месяца DAY,DY,D первый день недели, воскресенье МЕСЯЦ,MON,MM,RM месяц CC,SCC века DDD,DD,J день ЧЧ,ЧЧ12,ЧЧ24 часа МИ минута
Функции округляются вверх. То есть дата 1 июля будет округлена до следующего года. 16 июля будет округлено до августа.
add_months(date, целое число) date — Возвращает дату плюс n месяцев.
add_months(дата '2005-05-31',1) -> 2005-06-30
Last_date(date) date — возвращает последний день месяца на основе значения даты.
последний_день (дата '24 мая 2005 г.') -> 31 мая 2005 г.
next_day(date, text) date — возвращает первый день недели, который больше значения даты.
next_day(дата '24 мая 2005 г.', 'понедельник') -> 30 мая 2005 г.
next_day(дата, целое число) дата — то же, что и выше. Второй аргумент должен иметь значение 1..7 и интерпретироваться как воскресенье...суббота.
next_day(дата '24 мая 2005 г.', 1) -> 30 мая 2005 г.
months_between(date, date) numeric — возвращает количество месяцев между датой1 и датой2. Если вычисляется дробный месяц, функцияmonths_between вычисляет дробь на основе 31-дневного месяца.
months_between(дата '1995-02-02', дата '1995-01-01') -> 1.0322580645161
trunc(date, text) date - усекать дату в соответствии с указанным форматом
trunc(дата '2005-07-12', 'iw') -> 2005-07-11
round(date, text) date — округляет даты в соответствии с указанным форматом.
round(дата '2005-07-12', 'гггг') -> 2006-01-01
to_date(text) timestamp — преобразует введенный текст в метку времени. GUC orafce.nls_date_format используется для указания формата входного текста для этой функции. Если значение оставлено пустым или установлено как DEFAULT, тогда введите текстовый формат в соответствии с настройкой GUC PostgreSQL datestyle.
orafce.nls_date_format значение DEFAULT
to_date('2014-05-19 17:23:53+5:30') -> 2014-05-19 17:23:53
orafce.nls_date_format='ГГГГ-ММДД ЧЧ24:МИ:СС'
to_date('2014-0519 17:23:53+5:30') -> 2014-05-19 17:23:53
to_date(text, text) timestamp — преобразует входной текст указанного формата в метку времени. GUC orafce.orafce_emit_error_on_date_bug
используется для указания, сообщается ли об ошибке, когда значение даты достигает ошибки Oracle в датах. Эта ошибка появляется с датами до 1582-10-05
, когда используется формат 'J'
( 'J2299159'
), и до 1100-03-01
при использовании других форматов. По умолчанию сообщается об ошибке. Чтобы отключить это поведение, set orafce.orafce_emit_error_on_date_bug to off
.
SELECT oracle.to_date('112012', 'J'); ОШИБКА: Даты до 1582-10-05 («J2299159») не могут быть проверены из-за ошибки в Oracle. SELECT oracle.to_date('1003-03-15', 'гггг-мм-дд'); ОШИБКА: Даты до 01.03.1100 не могут быть проверены из-за ошибки в Oracle. SET orafce.oracle_compatibility_date_limit TO off; SELECT oracle.to_date('112012', 'J'); на сегодняшний день ------------------------ 4407-07-30 00:00:00 до н.э. (1 ряд) SELECT oracle.to_date('1003/03/15', 'гггг/мм/дд'); на сегодняшний день --------------------- 1003-03-15 00:00:00 (1 ряд)
Этот модуль содержит реализацию совместимого с Oracle типа данных DATE «oracle.date» и функций, которые используют тип данных DATE, таких как oracle.add_months, oracle.last_day(), oracle.next_day(), oracle.months_between() и т. д.
Пример:
установить search_path TO oracle, "$user", public, pg_catalog; создать таблицу oracle_date (дата col1); вставить в значения oracle_date('2014-06-24 12:12:11'::date); выберите * из oracle_date; столбец 1 --------------------- 2014-06-24 12:12:11 (1 ряд)
oracle.add_months(временная метка с часовым поясом, целое число) — возвращает дату и время плюс n месяцев.
oracle.add_months(oracle.date'2005-05-31 10:12:12',1) -> 2005-06-30 10:12:12
oracle.last_day(временная метка с часовым поясом) — возвращает последний день месяца на основе значения даты.
oracle.last_day(oracle.date '2005-05-24 11:12:12') -> 2005-05-31 11:12:12
oracle.next_day(временная метка с часовым поясом, текстом) — возвращает первый день недели, который больше значения даты.
oracle.next_day(oracle.date '2005-05-24 10:12:12', 'понедельник') -> 2005-05-30 10:12:12
oracle.next_day(временная метка с часовым поясом, целое число) — то же, что и выше. Второй аргумент должен иметь значение 1..7 и интерпретироваться как воскресенье...суббота.
oracle.next_day(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-29 11:21:12
oracle.months_between(метка времени с часовым поясом, метка времени с часовым поясом) — возвращает количество месяцев между отметкой времени1 и отметкой времени2. Если вычисляется дробный месяц, функцияmonths_between вычисляет дробь на основе 31-дневного месяца.
oracle.months_between(oracle.date '1995-02-02 10:00:00', oracle.date '1995-01-01 10:21:11') -> 1.03225806451613
oracle.to_date(text,text) — возвращает метку времени без часового пояса.
oracle.to_date('16.02.09 04:12:12', 'ММ/ДД/ГГ ЧЧ24:МИ:СС') -> 2009-02-16 04:12:12
oracle.to_date(text) — возвращает oracle.date
oracle.to_date('16.02.09 04:12:12') -> 2009-02-16 04:12:12
oracle.sysdate() — возвращает временную метку инструкции в часовом поясе сервера (orafce.timezone)
oracle.sysdate() -> 2015-12-09 17:47:56
oracle.dbtimezone — возвращает часовой пояс сервера — эмулируется через orafce.timezone
oracle.dbtimezone() -> GMT
oracle.sessiontimezone() — возвращает часовой пояс сеанса — текущий часовой пояс PostgreSQL
oracle.sessiontimezone() → Европа/Прага
oracle.sys_extract_utc(временная метка с часовым поясом) — возвращает временную метку в часовом поясе utc.
oracle.sys_extract_utc(current_timestamp)
oracle.sys_extract_utc(oracle.date) — возвращает временную метку в часовом поясе utc, если часовой пояс не указан, используется часовой пояс сеанса (текущий PostgreSQL).
oracle.sys_extract_utc(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-24 09:21:12
oracle.to_char(timestamp) — возвращает метку времени в формате nls_date_format.
orafce.nls_date_format='ГГ-ПнДД ЧЧ24:МИ:СС' oracle.to_char(to_date('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49 orafce.nls_date_format='ГГ-ПнДД ЧЧ24:МИ:СС' oracle.to_char(oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 14-May21 12:13:44
oracle.+(oracle.date,smallint) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') + 9::smallint -> 2014-07-11 10:08:55
oracle.+(oracle.date,integer) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') + 9::integer -> 2014-07-11 10:08:55
oracle.+(oracle.date,bigint) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') + 9::bigint -> 2014-07-11 10:08:55
oracle.+(oracle.date,numeric) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') + 9::числовой -> 2014-07-11 10:08:55
oracle.-(oracle.date,smallint) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') - 9::smallint -> 2014-06-23 10:08:55
oracle.-(oracle.date,integer) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') - 9::integer -> 2014-06-23 10:08:55
oracle.-(oracle.date,bigint) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') - 9::bigint -> 2014-06-23 10:08:55
oracle.-(oracle.date,numeric) — возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','ГГГГ-ММ-ДД ЧЧ:МИ:СС') - 9::числовой -> 2014-06-23 10:08:55
oracle.-(oracle.date,oracle.date) — возвращает двойную точность.
oracle.to_date('2014-07-17 11:10:15', 'гггг-мм-дд чч24:ми:сс') - oracle.to_date('2014-02-01 10:00:00', 'гггг -мм-дд чч24:ми:сс') -> 166.048785
Вам необходимо установить search_path TO oracle, "$user", public, pg_catalog, поскольку такие функции, как oracle.add_months,oracle.last_day,oracle.next_day,oracle.months_between, устанавливаются параллельно с pg_catalog.add_months,pg_catalog.last_day, pg_catalog.next_day,pg_catalog.months_between.
PostgreSQL не нуждается в двойной таблице Oracle, но поскольку она интенсивно используется пользователями Oracle, она была добавлена в orafce. Эта таблица находится в схеме oracle
. Обычно вы хотите разрешить неквалифицированный доступ, поэтому вам следует добавить эту схему в конфигурацию search_path
(например, search_path = 'oracle, pg_catalog, "$user", public'
в postgresql.conf
).
PostgreSQL отправляет информацию клиенту через RAISE NOTICE. Oracle использует dbms_output.put_line(). Это работает иначе, чем RAISE NOTICE. В Oracle есть очередь сеансов, put_line() добавляет строку в очередь, а функция get_line() считывает данные из очереди. Если установлен флаг «serveroutput», то клиент по всем операторам sql читает очередь. Вы можете использовать:
выберите dbms_output.enable(); выберите dbms_output.put_line('first_line'); выберите dbms_output.put_line('next_line'); выберите * из dbms_output.get_lines(0);
или
выберите dbms_output.enable(); выберите dbms_output.serveroutput('t'); выберите dbms_output.put_line('first_line');
Этот пакет содержит следующие функции: Enable(), Disable(), serveroutput(), put(), put_line(), new_line(), get_line(), get_lines(). Очередь пакетов реализована в локальной памяти сеанса.
Этот пакет позволяет программам PL/pgSQL читать и записывать любые файлы, доступные с сервера. Каждый сеанс может открыть максимум десять файлов, а максимальный размер строки составляет 32 КБ. Этот пакет содержит следующие функции:
utl_file.fclose(file utl_file.file_type) — закрыть файл
utl_file.fclose_all() — закрыть все файлы
utl_file.fcopy(src_location, src_filename, dest_location, dest_filename[, start_line][, end_line]) — копировать текстовый файл
utl_file.fflush(file utl_file.file_type) — очищает все данные из буферов
utl_file.fgetattr(location, filename) — получить атрибуты файла
utl_file.fopen(текст местоположения, текст имени файла, текст режима_файла [, maxlinesize int] [, имя кодировки]) utl_file.file_type — открыть файл
utl_file.fremove(location, filename) — удалить файл
utl_file.frename(location, filename, dest_dir, dest_file[, overwrite]) — переименовать файл
utl_file.get_line(file utl_file.file_type) текст — прочитать одну строку из файла
utl_file.get_nextline(file utl_file.file_type) текст — читает одну строку из файла или возвращает NULL
utl_file.is_open(file utl_file.file_type) bool — возвращает true, если файл открыт
utl_file.new_line(file utl_file.file_type [,rows int]) — помещает в файл несколько символов новой строки.
utl_file.put(file utl_file.file_type, buffer text) — помещает буфер в файл
utl_file.put_line(file utl_file.file_type, текст буфера) — помещает строку в файл
utl_file.putf(file utl_file.file_type, format buffer [,arg1 text][,arg2 text][..][,arg5 text]) — поместить форматированный текст в файл
utl_file.tmpdir() — получить путь к временному каталогу
Поскольку PostgreSQL не поддерживает вызов по ссылке, некоторые функции немного отличаются: fclose и get_line.
объявить f utl_file.file_type; начинать f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<читать>> петля начинать поднять уведомление '%', utl_file.get_line(f); исключение когда no_data_found тогда выйти из чтения; конец; конечная петля; е := fclose(f); конец;
или второй (с помощью специальной функции PostgreSQL get_nextline)
объявить f utl_file.file_type; текст строки; начинать f := utl_file.fopen('/tmp', 'sample.txt', 'r'); петля линия: = utl_file.get_nextline(f); выйти, когда строка равна NULL; поднять уведомление '%', линия; исключение когда другие тогда utl_file.fclose_all(); конец;
Перед использованием пакета вам необходимо настроить таблицу utl_file.utl_file_dir. Он содержит все разрешенные каталоги без завершающего символа ('/' или ''). На платформе WinNT пути каждый раз должны заканчиваться символом ''.
Записям каталога можно присвоить имя (второй столбец в таблице utl_file.utl_file_dir
). Параметром location
может быть либо имя каталога, либо путь к словарю. Местоположение сначала интерпретируется и проверяется как имя каталога. Если оно не найдено (во втором столбце), то местоположение интерпретируется и проверяется как путь.
Функции из пакета utl_file (схема на Postgres) требуют доступа к таблице utl_file.utl_file_dir. Этот факт можно использовать для контроля того, какие пользователи могут использовать эти функции или нет. Настройка по умолчанию — ЧТЕНИЕ для ПУБЛИЧНОГО. INSERT, UPDATE может делать только привилегированный пользователь (суперпользователь). Таким образом, непривилегированный пользователь может использовать функции из этого пакета, но не может изменять список безопасных каталогов (содержимое таблицы utl_file.utl_file_dir). Содержимое этой таблицы видно для PUBLIC (или должно быть видно пользователям, использующим функции из этого пакета).
Это реализация API Oracle пакета DBMS_SQL.
Это не гарантирует полную совместимость, но должно уменьшить объем работы, необходимой для успешной миграции.
Внимание: архитектура PostgreSQL отличается от архитектуры Oracle. PL/pgSQL выполняется в том же контексте, что и движок SQL. Тогда нет никаких причин использовать шаблоны Oracle, такие как массовый сбор и итерация по сбору в Postgres, для достижения хорошей производительности. Этот код предназначен для сокращения работы, связанной с переносом некоторых приложений из Oracle в Postgres, и он может работать хорошо. Но никакого преимущества в производительности по сравнению со сборкой операторов PL/pgSQL не будет. Эмуляция API Oracle требует дополнительных затрат памяти и ЦП, что может быть значительным при работе с большими данными.
Это расширение реализует подмножество интерфейса Oracle dbms_sql. Целью этого расширения является не совместимость с Oracle, оно предназначено для сокращения некоторых рабочих процессов, связанных с миграцией приложений Oracle на Postgres. Поддерживаются некоторые базовые функции массового DML:
сделай $$ объявить с инт; интервал []; б варчар[]; числовое []; начинать c := dbms_sql.open_cursor(); вызов dbms_sql.parse(c, 'вставить в значения foo(:a, :b, :c)'); а := МАССИВ[1, 2, 3, 4, 5]; b := ARRAY['Аходж', 'Наздар', 'Базар']; ок := МАССИВ[3.14, 2.22, 3.8, 4]; вызов dbms_sql.bind_array(c, 'a', a, 2, 3); вызов dbms_sql.bind_array(c, 'b', b, 3, 4); вызовите dbms_sql.bind_array(c, 'c', ca); поднять уведомление «вставлены строки %d», dbms_sql.execute(c); конец; $$; сделай $$ объявить с инт; интервал []; б варчар[]; числовое []; начинать c := dbms_sql.open_cursor(); вызов dbms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0,003 fromgenerate_series(1, 35) g(i)'); вызов dbms_sql.define_array(c, 1, a, 10, 1); вызов dbms_sql.define_array(c, 2, b, 10, 1); вызов dbms_sql.define_array(c, 3, ca, 10, 1); выполнить dbms_sql.execute(c); в то время как dbms_sql.fetch_rows(c) > 0 петля вызов dbms_sql.column_value(c, 1, a); вызов dbms_sql.column_value(c, 2, b); вызовите dbms_sql.column_value(c, 3, ca); поднять уведомление 'a = %', a; поднять уведомление 'b = %', b; поднять уведомление 'c = %', ca; конечная петля; вызов dbms_sql.close_cursor(c); конец; $$;
Существует функция dbms_sql.describe_columns_f
, похожая на процедуру dbms_sql.describe_columns
. Внимание, идентификаторы типов связаны с системой типов PostgreSQL. Значения не преобразуются в числа Oracle.
сделай $$ объявить с инт; запись; d dbms_sql.desc_rec; начинать c := dbms_sql.open_cursor(); вызов dbms_sql.parse(c, 'select * from pg_class'); г := dbms_sql.describe_columns(c); поднять уведомление '%', r.col_cnt; foreach d в массиве r.desc_t петля поднять уведомление '% %', d.col_name, d.col_type::regtype; конечная петля; вызов dbms_sql.close_cursor(c); конец; $$; сделай $$ объявить с инт; п инт; d dbms_sql.desc_rec; да dbms_sql.desc_rec[]; начинать c := dbms_sql.open_cursor(); вызов dbms_sql.parse(c, 'select * from pg_class'); вызовите dbms_sql.describe_columns(c, n, da); поднять уведомление '%', n; foreach d в массиве da петля поднять уведомление '% %', d.col_name, d.col_type::regtype; конечная петля; вызов dbms_sql.close_cursor(c); конец; $$;
Этот пакет является эмуляцией пакета Oracle dbms_pipe. Он обеспечивает межсессионную связь. Вы можете отправлять и читать любое сообщение с ожиданием или без него; вывести список активных каналов; установить канал как частный или публичный; и используйте явные или неявные каналы.
Максимальное количество труб – 50.
Общая память используется для отправки сообщений.
Ниже приводится пример:
-- Сессия А выберите dbms_pipe.create_pipe('my_pipe',10,true); -- явное создание канала выберите dbms_pipe.pack_message('neco je jinak'); select dbms_pipe.pack_message('все остальное'); выберите dbms_pipe.send_message('my_pipe',20,0); -- изменить лимит и отправить без ожидания выберите * из dbms_pipe.db_pipes; -- список текущих каналов -- Сессия Б выберите dbms_pipe.receive_message('my_pipe',1); -- ждать сообщения максимум 1 секунду выберите dbms_pipe.next_item_type(); -- -> 11, текст выберите dbms_pipe.unpack_message_text(); выберите dbms_pipe.next_item_type(); -- -> 11, текст выберите dbms_pipe.unpack_message_text(); выберите dbms_pipe.next_item_type(); -- -> 0, больше нет элементов выберите dbms_pipe.remove_pipe('my_pipe');
Однако есть некоторые различия по сравнению с Oracle:
предел для каналов не в байтах, а в элементах в канале
вы можете отправить сообщение, не дожидаясь
вы можете отправлять пустые сообщения
next_item_type знает о TIMESTAMP (тип 13)
PostgreSQL не знает о типе RAW, вместо этого используйте bytea
Еще одно средство межпроцессного взаимодействия.
-- Сессия А выберите dbms_alert.register('бу'); выберите * из dbms_alert.waitany(10); -- Сессия Б выберите dbms_alert.register('бу'); выберите * из dbms_alert.waitany(10); -- Сессия С выберите dbms_alert.signal('бу','Хороший день');
Этот модуль содержит некоторые функции для работы с рабочими днями из пакета PLVdate. Подробную документацию можно найти в библиотеке PLVision. Этот пакет является мультикультурным, но конфигурации по умолчанию предназначены только для европейских стран (см. исходный код).
Вы должны определить свои собственные нерабочие дни (максимум 50 дней) и праздничные дни (максимум 30 дней). Праздник – любой нерабочий день, который один и тот же каждый год. Например, Рождество в западных странах.
plvdate.add_bizdays(day date,days int) date — получить дату, созданную добавлением <n> рабочих дней к дате.
plvdate.nearest_bizday(day date) date — Получить ближайшую рабочую дату к заданной дате, определяемой пользователем.
plvdate.next_bizday(day date) date — Получить следующую рабочую дату из заданной даты, определяемой пользователем.
plvdate.bizdays_between(day1 date, day2 date) int — Получить количество рабочих дней между двумя датами.
plvdate.prev_bizday(day date) date — Получить предыдущую рабочую дату из заданной даты.
plvdate_isbizday(date) bool — вызовите эту функцию, чтобы определить, является ли дата рабочим днем.
plvdate.set_nonbizday(dow varchar) — Установить день недели как нерабочий день
plvdate.unset_nonbizday(dow varchar) — день недели не устанавливается как нерабочий день.
plvdate.set_nonbizday(day date) — Установить день как нерабочий.
plvdate.unset_nonbizday(day date) — отменить установку дня как нерабочего дня.
plvdate.set_nonbizday(day date, restart bool) — установить день как нерабочий день, если значение «repeat» истинно, то каждый год день нерабочий.
plvdate.unset_nonbizday(day date, restart bool) — день не устанавливается как нерабочий, если значение «repeat» истинно, то каждый год день нерабочий.
plvdate.use_easter() — Пасхальное воскресенье и пасхальный понедельник будут выходными.
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool — если мы используем пасху, то возвращает true
plvdate.use_great_friday() — Пасхальная Великая Пятница будет выходным
plvdate.unuse_easter();
plvdate.use_easter(useit boolean);
plvdate.using_easter() bool — если мы используем Пасху Великую пятницу как праздник, тогда возвращается true
plvdate.include_start() — включить дату начала в расчет bizdays_between
plvdate.noinclude_start();
plvdate.include_start(включить логическое значение);
plvdate.include_start() bool;
plvdate.default_holidays(varchar) — загрузить конфигурации по умолчанию. На данный момент вы можете использовать следующие конфигурации: Чехия, Германия, Австрия, Польша, Словакия, Россия, Великобритания и США.
конфигурация содержит только общие праздники для всех регионов. Вы можете добавить свой собственный региональный праздник с помощью plvdate.set_nonbizday(nonbizday, true)
Пример:
postgres=# select plvdate.default_holidays('czech'); default_holidays ----------------- (1 ряд) postgres=# select to_char(current_date, 'day'), plvdate.next_bizday(текущая_дата), to_char(plvdate.next_bizday(current_date),'день'); to_char | следующий_бизнес | to_char ----------+-------------+----------- суббота | 13 марта 2006 г. | понедельник (1 ряд)
Изменение для неевропейской среды:
выберите plvdate.unset_nonbizday('суббота'); выберите plvdate.unset_nonbizday('воскресенье'); выберите plvdate.set_nonbizday('пятница'); выберите plvdate.set_nonbizday('2006-05-19', true); выберите plvdate.unuse_easter();
Этот пакет содержит несколько полезных строковых и символьных функций. Каждая функция поддерживает положительные и отрицательные смещения, т. е. смещение от конца строки. Например:
plvstr.left('abcdef',2) -> ab plvstr.left('abcdef',-2) -> abcd plvstr.substr('abcdef',1,1) -> a plvstr.substr('abcdef',-1,1) -> f plvstr.substr('abcde',-2,1) -> d
Список функций:
plvstr.normalize(str text) — Нормализовать строку — Заменить белые символы пробелом, заменить пробелы пробелом
plvstr.is_prefix(str text, prefix text, cs bool) — возвращает true, если префикс является префиксом str.
plvstr.is_prefix(str text, prefix text) — возвращает true, если префикс является префиксом str.
plvstr.is_prefix(str int, prefix int) — возвращает true, если префикс является префиксом str.
plvstr.is_prefix(str bigint, prefix bigint) — возвращает true, если префикс является префиксом str.
plvstr.substr(str text, start int, len int) — возвращает подстроку, начатую в start_in, до конца.
plvstr.substr(str text, start int) — возвращает подстроку, начатую в start_in, до конца.
plvstr.instr(str text, patt text, start int, nth int) — Шаблон поиска в строке
plvstr.instr(str text, patt text, start int) — Шаблон поиска в строке
plvstr.instr(str text, Patt text) — Шаблон поиска в строке.
plvstr.lpart(str text, div text, start int, nth int, all_if_notfound bool) — вызовите эту функцию, чтобы вернуть левую часть строки.
plvstr.lpart(str text, div text, start int, nth int) — вызовите эту функцию, чтобы вернуть левую часть строки.
plvstr.lpart(str text, div text, start int) — вызовите эту функцию, чтобы вернуть левую часть строки.
plvstr.lpart(str text, div text) — вызовите эту функцию, чтобы вернуть левую часть строки.
plvstr.rpart(str text, div text, start int, nth int, all_if_notfound bool) — вызовите эту функцию, чтобы вернуть правую часть строки.
plvstr.rpart(str text, div text, start int, nth int) — вызовите эту функцию, чтобы вернуть правую часть строки.
plvstr.rpart(str text, div text, start int) — вызовите эту функцию, чтобы вернуть правую часть строки.
plvstr.rpart(str text, div text) — вызовите эту функцию, чтобы вернуть правую часть строки.
plvstr.lstrip(str text, substr text, num int) — вызовите эту функцию, чтобы удалить символы с начала.
plvstr.lstrip(str text, substr text) — вызовите эту функцию, чтобы удалить символы с начала.
plvstr.rstrip(str text, substr text, num int) — вызовите эту функцию, чтобы удалить символы с конца.
plvstr.rstrip(str text, substr text) — вызовите эту функцию, чтобы удалить символы с конца.
plvstr.rvrs(str text, start int, _end int) — перевернуть строку или часть строки
plvstr.rvrs(str text, start int) — перевернуть строку или часть строки
plvstr.rvrs(str text) — перевернуть строку или часть строки
plvstr.left(str text, n int) — возвращает первое количество символов. Вы можете использовать отрицательный num_in
plvstr.right(str text, n int) — возвращает последние num_in символов. Вы можете использовать отрицательный num_ni
plvstr.swap(str text, replace text, start int, length int) — Заменить подстроку в строке указанной строкой.
plvstr.swap(str text, replace text) — Заменить подстроку в строке указанной строкой.
plvstr.betwn(str text, start int, _end int, inclusive bool) — найти подстроку между начальным и конечным местоположениями.
plvstr.betwn(str text, start text, _end text, startnth int, endnth int, inclusive bool, gotoend bool) — найти подстроку между начальным и конечным местоположениями.
plvstr.betwn(str text, start text, _end text) — найти подстроку между начальным и конечным местоположениями.
plvstr.betwn(str text, start text, _end text, startnth int, endnth int) — найти подстроку между начальным и конечным местоположениями.
plvchr.nth(str text, n int) — вызовите эту функцию, чтобы вернуть N-й символ в строке.
plvchr.first(str text) — вызовите эту функцию, чтобы вернуть первый символ строки.
plvchr.last(str text) — вызовите эту функцию, чтобы вернуть последний символ строки.
plvchr.is_blank(c int) — пусто
plvchr.is_blank(c text) — пусто
plvchr.is_digit(c int) — цифра
plvchr.is_digit(c text) — цифра
plvchr.is_quote(c int) — цитата
plvchr.is_quote(c text) — цитата
plvchr.is_other(c int) — Другое
plvchr.is_other(c text) — Другое
plvchr.is_letter(c int) — буква
plvchr.is_letter(c text) — буква
plvchr.char_name(c text) — возвращает имя символа в коде ascii в виде VARCHAR.
plvchr.quoted1(str text) — текст в кавычках между '''
plvchr.quoted2(str text) — текст в кавычках между '"'
plvchr.striped(str text, char_in text) — удаляет из строки все вхождения указанных символов.
Пакет PLVsubst выполняет замену строк на основе ключевого слова замены.
plvsubst.string(template_in text, vals_in text[]) — сканирует строку на наличие всех экземпляров ключевого слова подстановки и заменяет ее следующим значением в списке значений подстановки.
plvsubst.string(текст шаблона_in, текст vals_in[], текст subst_in)
plvsubst.string(текст шаблона_в, текст vals_in, текст разделителя_в)
plvsubst.string(текст шаблона_in, текст vals_in, текст delim_in, текст subst_in)
plvsubst.setsubst(str text) — установить ключевое слово замены по умолчанию «%s»
plvsubst.subst() — Получить ключевое слово замены
Примеры:
select plvsubst.string('Меня зовут %s %s.', ARRAY['Павел','Стехуле']); нить -------------------------- Меня зовут Павел Стехуле. (1 ряд) select plvsubst.string('Меня зовут %s %s.', 'Павел,Стехуле'); нить -------------------------- Меня зовут Павел Стехуле. (1 ряд) select plvsubst.string('Меня зовут $$ $$.', 'Павел|Стехуле','|','$$'); нить -------------------------- Меня зовут Павел Стехуле. (1 ряд)
dms_utility.format_call_stack() — возвращает отформатированную строку с содержимым стека вызовов.
postgres=# выберите foo2(); фу2 --------------------------------- ----- Стек вызовов ----- Линейный объект название оператора числа 1 возвращающая функция foo 1 функция возврата foo1 1 функция возврата foo2 (1 ряд)
Этот пакет несовместим с оригинальным PLVlex.
postgres=# выбрать * из plvlex.tokens('выберите * из abc join d ON x=y', true, true); пос | жетон | код | класс | сепаратор | мод ----+--------+------+---------+-----------+------ 0 | выбрать | 527 | КЛЮЧЕВОЕ СЛОВО | | 7 | * | 42 | ДРУГИЕ | | себя 9 | из | 377 | КЛЮЧЕВОЕ СЛОВО | | 25 | азбука | | ИДЕНТ | | 20 | присоединиться | 418 | КЛЮЧЕВОЕ СЛОВО | | 25 | д | | ИДЕНТ | | 27 | на | 473 | КЛЮЧЕВОЕ СЛОВО | | 30 | х | | ИДЕНТИФИКАТОР | | 31 | = | 61 | ДРУГИЕ | | себя 32 | й | | ИДЕНТИФИКАТОР | | (10 рядов)
Внимание: коды ключевых слов могут меняться в разных версиях PostgreSQL! o plvlex.tokens(str text,skip_spaces bool,qual_names bool) — Возвращает таблицу лексических элементов в str.
Этот пакет защищает ввод пользователя от SQL-инъекций.
dbms_assert.enquote_literal(varchar) varchar — добавьте начальные и конечные кавычки, убедитесь, что все одинарные кавычки соединены с соседними одинарными кавычками.
dbms_assert.enquote_name(varchar [, boolean]) varchar — заключить имя в двойные кавычки. Необязательный второй параметр обеспечивает уменьшение имени. Внимание: в Oracle второй параметр пишется с заглавной буквы!
dbms_assert.noop(varchar) varchar — возвращает значение без какой-либо проверки.
dbms_assert.qualified_sql_name(varchar) varchar — эта функция проверяет, является ли входная строка квалифицированным именем SQL.
dbms_assert.schema_name(varchar) varchar — функция проверяет, что входная строка является существующим именем схемы.
dbms_assert.simple_sql_name(varchar) varchar — эта функция проверяет, является ли входная строка простым именем SQL.
dbms_assert.object_name(varchar) varchar — проверяет, что входная строка является квалифицированным идентификатором SQL существующего объекта SQL.
Этот модуль содержит некоторые функции утверждения.
plunit.assert_true(bool [, varchar]) — утверждает, что условие истинно.
plunit.assert_false(bool [, varchar]) — утверждает, что условие является ложным.
plunit.assert_null(anyelement [, varchar]) — утверждает, что фактическое значение равно нулю.
plunit.assert_not_null(anyelement [, varchar]) — утверждает, что фактическое значение не равно нулю.
plunit.assert_equals(anyelement, Anyelement [, двойная точность] [, varchar]) — утверждает, что ожидаемое и фактическое значение равны.
plunit.assert_not_equals(anyelement, Anyelement [, двойная точность] [, varchar]) — утверждает, что ожидаемое и фактическое значения равны.
plunit.fail([varchar]) — Fail может использоваться для немедленного сбоя процедуры тестирования с использованием предоставленного сообщения.
dbms_random.initialize(int) — инициализировать пакет с начальным значением.
dbms_random.normal() — возвращает случайные числа в стандартном нормальном распределении.
dbms_random.random() — возвращает случайное число от -2^31 .. 2^31.
dbms_random.seed(целое)
dbms_random.seed(text) — сбросить начальное значение.
dbms_random.string(opt text(1), len int) — Создать случайную строку
dbms_random.terminate() — Завершить пакет (ничего не делать в Pg)
dbms_random.value() — возвращает случайное число от [0,0 до 1,0).
dbms_random.value(низкая двойная точность, высокая двойная точность) — возвращает случайное число из [низкая – высокая)
Этот модуль содержит реализацию функций: concat, nvl, nvl2, lnnvl, decode, great, less, bitand, nanvl, sinh, cosh, tanh, oracle.substr и oracle.mod.
oracle.substr(str text, start int, len int) — подстрока, совместимая с Oracle
oracle.substr(str text, start int) — подстрока, совместимая с Oracle
oracle.substr(str numeric, start numeric) — подстрока, совместимая с Oracle.
oracle.substr(str numeric, start numeric, len numeric) — подстрока, совместимая с Oracle.
oracle.substr(str varchar, start numeric) — подстрока, совместимая с Oracle
oracle.substr(str varchar, start numeric,len numeric) — подстрока, совместимая с Oracle.
oracle.lpad(string, length [, fill]) — lpad, совместимый с Oracle.
oracle.rpad(string, length [, fill]) — rpad, совместимый с Oracle.
oracle.ltrim(строка текста [, текст символов]) — ltrim, совместимый с Oracle.
oracle.rtrim(строка текста [, текст символов]) — rtrim, совместимый с Oracle.
oracle.btrim(строка текста [, текст символов]) — btrim, совместимый с Oracle.
oracle.length(string char) — длина, совместимая с Oracle
oracle.listagg(str text [, текст-разделитель]) — агрегировать значения для вывода в список
oracle.wm_concat(str text) — агрегировать значения в список, разделенный запятыми
oracle.median(float4) — вычислить медиану
oracle.median(float8) — вычислить медиану
oracle.to_number(text) — преобразует строку в число
oracle.to_number(numeric) — преобразует строку в число
oracle.to_number(numeric,numeric) — преобразует строку в число.
public.to_multi_byte(text) — конвертирует все однобайтовые символы в соответствующие им многобайтовые символы.
public.to_single_byte(text) — конвертирует все многобайтовые символы в соответствующие им однобайтовые символы.
oracle.greestest(anyelement, Anyelement[]) — максимальная совместимость с Oracle, возвращает NULL при вводе NULL
oracle.least(anyelement, Anyelement[]) — наименьшая совместимость с Oracle, возвращает NULL при вводе NULL
oracle.mod(int, int) — мод совместимости Oracle. Если второй параметр равен нулю, он возвращает первый параметр.
Oracle.Remainder (int, int) - возвращает оставшуюся часть числа, разделенное на другое число
Oracle.Remainder (числовое, числовое) - возвращает оставшуюся часть числа, разделенное на другое число
Oracle.sys_guid () - Возвращает байт - 16 байт глобального идентификатора Uniq
Возможно, вам придется установить search_path в Oracle, pg_catalog, «$ user», public ', потому что Oracle.substr, Oracle.lpad, Oracle.rpad, Oracle.ltrim, Oracle.rtrim, Oracle.btrim, oracle.length установлена стороной -my-side с pg_catalog.substr, pg_catalog.lpad, pg_catalog.rpad, pg_catalog.ltrim, pg_catalog.rtrim, pg_catalog.btrim, pg_catalog.length соответственно.
Функции oracle.decode, oracle.greatest и oracle. Без имени схемы внутренние функции всегда будут использоваться.
Обратите внимание, что в случае LPAD и RPAD, параметры строки и заполнения могут быть типа ChAR, VARCHAR, TEXT, VARCHAR2 или NVARCHAR2 (Обратите внимание, что последние два-это типы, предоставленные ORAFCE). Символ заполнения по умолчанию-это место полгины. Точно так же для LTRIM, RTRIM и BTRIM.
Обратите внимание, что Oracle.Length имеет ограничение, что он работает только в единицах символов, потому что PostgreSQL Char Type поддерживает только семантику символов.
Oracle.substr с тремя аргументами может возвращать различный результат (нулевая или пустая строка) в зависимости от установки orafce.using_substring_zero_width_in_substr (Oracle, Warning_oracle, Orafce, Warning_orafce). Этот другой результат возвращается только тогда, когда третий аргумент (substring_length) равен нулю. По умолчанию это Warning_oracle, это означает повышение предупреждения и возврата NULL.
Эти функции возвращает глобальный уникальный идентификатор. Он вызывает указанные функции из расширения «UUID-OSPP», и затем эта функция должна быть установлена до использования функции sys_guid. По умолчанию эта функция использует функцию uuid_generate_v1, но функция uuid_generate_v1mc, uuid_generate_v4 также может использоваться (установив orafce.sys_guid_source). Oracle.sys_guid может использовать Builin Gen_Random_Uuid Func. В этом случае расширение «uuid-ossp» не требуется.
VARCHAR2 Orafce реализует части спецификации базы данных Oracle о VARCHAR2:
Единица типа Modifier = 'Bytes' (для семантики символов см. NVARCHAR2)
В отличие от PostgreSQL VARCHAR, неявный лист в VARCHAR2 не усекает белые пространства на объявленную максимальную длину
Для этих типов можно использовать NULL Safe || Оператор, когда вы включите Orafce.varchar2_Null_Safe_Concat в true. Поведение очень похоже на Oracle.
Внимание: - Когда результат является пустой строкой, результат - это нулевой. Это поведение есть Отключено по умолчанию.
ВНИМАНИЕ: - Существует возможная несовместимость между 3,7 и старше Orafce выпуски. Функция оператора теперь отмечена как стабильная (была неизменна раньше). Невозможно создать функциональные индексы по сравнению с стабильными или летучими выражениями.
- Null Safe Concat (по умолчанию отключен) Выберите NULL || «Привет» :: varchar2 || НУЛЕВОЙ; Установить orafce.varchar2_null_safe_concat в true; Выберите NULL || «Привет» :: varchar2 || НУЛЕВОЙ;
Обратите внимание, что PostgreSQL не позволяет динамически указывать, как мы интерпретируем строки Varchar. Он всегда интерпретирует их как строки «символа», как определено кодированием базы данных. Таким образом, мы не можем поддерживать семантику как байта, так и символов для данного типа варчара в одной и той же базе данных. Мы решили реализовать байтовую семантику, поскольку это по умолчанию в Oracle. Для семантики персонажа см. NVARCHAR2, который по умолчанию всегда реализует семантику персонажа.
Пожалуйста, будьте осторожны при использовании вышеупомянутого типа для хранения строк, состоящих из кодируемых мультибитных символов, в которых каждый символ может состоять из произвольного числа байтов.
Nvarchar2 реализует следующее:
Единица типа Modifier = 'символы' (используя набор символов/кодирование базы данных)
Используйте этот тип, если предпочтительна семантика символа.
Обратите внимание, что в отличие от Oracle, VARCHAR2 и NVARCHAR2 Oracle не налагают предел 4000 байтов на объявленный »размер. На самом деле это то же самое, что и у PostgreSQL Varchar, который составляет около 10 МБ (хотя Varchar может теоретически сохранять значения размера до 1 ГБ)
Некоторые строковые функции на основе байтов, которые будут использоваться со строками varchar2
substrb (varchar2, int [, int]) - извлечь подстроение указанной длины (в байтах), начиная с заданного положения байта (подсчет из одного); Если третий аргумент не указан, тогда рассматривается длина до конца строки
strposb (varchar2, varchar2) - Возвращает местоположение указанной подстроки в данной строке (подсчет из одной)
LengthB (varChar2) - возвращает длину (в байтах) данной строки
Oracle не делает различий между нулевой и пустой строкой (когда значение используется в качестве текста). Для Postgres Null и пустой строки являются разными значениями. Для простоты хорошо обеспечить (в базе данных Postgres) использовать только нули (и не используйте пустые строки) или используйте только пустые строки (и не используйте Nulls) для столбцов типа текста. Оба варианта имеют некоторые преимущества и недостатки.
Это может быть заправлено с помощью триггерных функций:
oracle.replace_empty_strings (['on' | 'true' | 'Warning' | 'error']) oracle.replace_null_strings (['on' | 'true' | 'warning' | 'error'])
Необязательный аргумент строки используется в качестве индикатора, поэтому эти функции должны поднять предупреждение (возможно, ошибку), когда строка была изменена внутри этих функций.
Создать табличный тест (ID Serial, имя varchar, фамилия Varchar); Создать триггер test_trg Перед вставкой или обновлением На тесте Для каждого ряда Выполнить процедуру oracle.replace_empty_strings (); Вставить в тест (имя, фамилия) значения ('', 'stehule'); - Имя будет заменено NULL
oracle.user_tab_columns
oracle.user_tables
oracle.user_cons_columns
oracle.user_constraints
oracle.product_componenent_version
oracle.user_objects
oracle.dba_segments
Лучшая документация
Лучшая серализация в DBMS_PIPE (через функции _SEND и _RECV)
ALTER SALE SAREED MEMYER -структуры по временным таблицам: только блокировки находятся в SHMEM, (растворы), данные в TMP TBL
Этот модуль выпускается по лицензии BSD.
Проект был основан в 2008 году Павелом Стехуле <[email protected]>.
Другие участники:
Габриэле Бартолини (Гбартолини)
Джеффри Коэн (JCOHEN)
Джайлс Дарольд (Дарольд)
Pavan deolasee (Pavanvd)
Питер Эйзентраут (Петер)
BESA EMERSON (B-Emerson)
Такахиро Итагаки (Итагаки)
Zdenek Kotala (Hlipa)
Амит Ланготе (Амитлан)
Хейкки Линнакангас (Хлиннака)
Fujii Masao
Marco Nenciarini (Mnencia)
Винаяк Покале
Гэвин Шерри (SWM)
Павел Стехуле (Окбоб)
Рахила Сайед (Рахила)