F.29. Документация Orafce#
F.29. Документация Orafce #
- F.29.1. О модуле Orafce
- F.29.2. Функции Oracle и пакеты Oracle
- F.29.3. Список строк формата для функций trunc, round
- F.29.4. Функции даты
- F.29.5. Тип данных oracle.date
- F.29.6. Функции oracle.date
- F.29.7. Операторы oracle.date
- F.29.8. Таблица dual
- F.29.9. Пакет dbms_output
- F.29.10. Пакет utl_file
- F.29.11. Пакет dbms_sql
- F.29.12. Пакет dbms_pipe
- F.29.13. Пакет dbms_alert
- F.29.14. Пакет PLVdate
- F.29.15. Пакеты PLVstr и PLVchr
- F.29.16. Пакет PLVsubst
- F.29.17. Пакет DBMS_utility
- F.29.18. Пакет PLVlex
- F.29.19. Пакет DBMS_ASSERT
- F.29.20. Пакет PLUnit
- F.29.21. Пакет DBMS_random
- F.29.22. Другие функции
- F.29.23. Функция oracle.sys_guid()
- F.29.24. Поддержка VARCHAR2 и NVARCHAR2
- F.29.25. Триггеры
- F.29.26. Эмулированные представления
- F.29.27. Лицензия
- F.29.28. Участники
- F.29.29. Orafce - функции и пакеты совместимости Oracle
- F.29.30. Глава 1 Обзор
- F.29.31. Глава 2 Примечания по использованию orafce
- F.29.32. Глава 3 Типы данных
- F.29.33. Глава 4 Запросы
- F.29.34. Глава 5 Справочник по функциям SQL
- F.29.35. Глава 6 Справочник по пакетам
- F.29.36. Глава 7 Поведение транзакций
- F.29.37. Миграция: Глава 1 Предварительная настройка перед миграцией
- F.29.38. Миграция: Глава 2 Миграция синтаксических элементов
- F.29.39. Миграция: Глава 3 Миграция функций
- F.29.40. Миграция: Глава 4 Миграция SQL-запросов
- F.29.41. Миграция: Глава 5 Миграция PL/SQL
- F.29.42. Миграция: Глава 6 Примечания по использованию orafce
- F.29.43. Приложение А Соответствие с базами данных Oracle
F.29.2. Функции Oracle и пакеты Oracle #
Этот модуль содержит некоторые полезные функции, которые могут помочь при переносе приложения Oracle на Tantor SE или которые могут быть в общем полезны.
Встроенные функции Oracle для работы с датами были протестированы на совместимость с Oracle 10. Диапазоны дат от 1960 до 2070 работают корректно. Даты до 1100-03-01 не могут быть проверены из-за ошибки в Oracle.
Все функции полностью совместимы с Oracle и принимают все известные строки формата. Подробные описания можно найти в интернете. Используйте ключевые слова, такие как: oracle round trunc date iyyy.
F.29.3. Список строк формата для функций trunc, round #
Y,YY,YYY,YYYY,SYYY,SYEAR year I,IY,IYY,IYYY iso year Q, quarter WW week, day as first day of year IW week, beginning Monday W week, day as first day of month DAY,DY,D first day of week, sunday MONTH,MON,MM,RM month CC,SCC century DDD,DD,J day HH,HH12,HH24 hour MI minute
Функции округляют в большую сторону. То есть, дата 1 июля будет округлена до следующего года. 16 июля округляется до августа.
F.29.4. Функции даты #
add_months(date, integer) date - Возвращает дату плюс n месяцев
add_months(date '2005-05-31',1) -> 2005-06-30
last_date(date) date - Возвращает последний день месяца на основе значения даты
last_day(date '2005-05-24') -> 2005-05-31
next_day(date, text) date - Возвращает первый будний день, который больше значения указанной даты
next_day(date '2005-05-24', 'monday') -> 2005-05-30
next_day(date, integer) date - То же самое, что и выше. Второй аргумент должен быть от 1 до 7 и интерпретироваться как Sunday..Satday (Воскресенье..Суббота).
next_day(date '2005-05-24', 1) -> 2005-05-30
months_between(date, date) numeric - Возвращает количество месяцев между date1 и date2. Если вычисляется не весь месяц, функция months_between вычисляет дробь на основе 31-дневного месяца.
months_between(date '1995-02-02', date '1995-01-01') -> 1.0322580645161
trunc(date, text) date - усекает дату в соответствии с указанным форматом
trunc(date '2005-07-12', 'iw') -> 2005-07-11
round(date, text) date - округляет даты в соответствии с указанным форматом
round(date '2005-07-12', 'yyyy') -> 2006-01-01
to_date(text) timestamp - приведет входной текст к типу timestamp. GUC orafce.nls_date_format используется для указания формата входного текста для этой функции. Если значение оставлено пустым или установлено как DEFAULT, то формат входного текста будет соответствовать настройке GUC datestyle Tantor SE.
Установите значение 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='YYYY-MMDD HH24:MI:SS'
to_date('2014-0519 17:23:53+5:30') -> 2014-05-19 17:23:53
F.29.5. Тип данных oracle.date #
Этот модуль содержит реализацию совместимого с Oracle типа данных DATE "oracle.date" и функций, которые используют тип данных DATE, типа oracle.add_months, oracle.last_day(), oracle.next_day(), oracle.months_between() и т.п.
Пример:
set search_path TO oracle,"$user", public, pg_catalog; create table oracle_date(col1 date); insert into oracle_date values('2014-06-24 12:12:11'::date); select * from oracle_date; col1 --------------------- 2014-06-24 12:12:11 (1 row)
F.29.6. Функции oracle.date #
oracle.add_months(timestamp with time zone, integer) - Возвращает дату и время плюс n месяцев
oracle.add_months(oracle.date'2005-05-31 10:12:12',1) -> 2005-06-30 10:12:12
oracle.last_day(timestamp with time zone) - Возвращает последний день месяца на основе значения даты
oracle.last_day(oracle.date '2005-05-24 11:12:12') -> 2005-05-31 11:12:12
oracle.next_day(timestamp with time zone, text) - Возвращает первый будний день, который больше указанного значения даты
oracle.next_day(oracle.date '2005-05-24 10:12:12', 'monday') -> 2005-05-30 10:12:12
oracle.next_day(timestamp with time zone, integer) - То же самое, что и выше. Второй аргумент должен быть от 1 до 7 и интерпретироваться как Sunday..Saturday (Воскресенье..Суббота).
oracle.next_day(oracle.date '2005-05-24 11:21:12', 1) -> 2005-05-29 11:21:12
oracle.months_between(timestamp with time zone, timestamp with time zone) - Возвращает количество месяцев между timestamp1 и timestamp2. Если рассчитывается не весь месяц, функция 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('02/16/09 04:12:12', 'MM/DD/YY HH24:MI:SS') -> 2009-02-16 04:12:12
oracle.to_date(text) - Returns oracle.date
oracle.to_date('02/16/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() - Возвращает часовой пояс сессии - текущий часовой пояс Tantor SE
oracle.sessiontimezone() -> Europe/Prague
oracle.to_char(timestamp) - Возвращает временную метку в формате nls_date_format.
orafce.nls_date_format='YY-MonDD HH24:MI:SS'
oracle.to_char(to_date('14-Jan08 11:44:49+05:30')) -> 14-Jan08 11:44:49
orafce.nls_date_format='YY-MonDD HH24:MI:SS'
oracle.to_char(oracle.to_date('21052014 12:13:44+05:30','DDMMYYYY HH24:MI:SS')) -> 14-May21 12:13:44
F.29.7. Операторы oracle.date #
oracle.+(oracle.date,smallint) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::smallint -> 2014-07-11 10:08:55
oracle.+(oracle.date,integer) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::integer -> 2014-07-11 10:08:55
oracle.+(oracle.date,bigint) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::bigint -> 2014-07-11 10:08:55
oracle.+(oracle.date,numeric) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') + 9::numeric -> 2014-07-11 10:08:55
oracle.-(oracle.date,smallint) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::smallint -> 2014-06-23 10:08:55
oracle.-(oracle.date,integer) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::integer -> 2014-06-23 10:08:55
oracle.-(oracle.date,bigint) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::bigint -> 2014-06-23 10:08:55
oracle.-(oracle.date,numeric) - Возвращает oracle.date
oracle.to_date('2014-07-02 10:08:55','YYYY-MM-DD HH:MI:SS') - 9::numeric -> 2014-06-23 10:08:55
oracle.-(oracle.date,oracle.date) - Возвращает double precision
oracle.to_date('2014-07-17 11:10:15', 'yyyy-mm-dd hh24:mi:ss') - oracle.to_date('2014-02-01 10:00:00', 'yyyy-mm-dd hh24:mi:ss') -> 166.048785
Вам нужно установить search_path в 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.
F.29.8. Таблица dual #
Tantor SE не нуждается в таблице Oracle 'dual', но поскольку она интенсивно используется пользователями Oracle, она была добавлена в orafce. Эта таблица находится в схеме oracle
. Обычно вы хотите разрешить неквалифицированный доступ - поэтому вам следует добавить эту схему в конфигурацию search_path
(например, search_path = 'oracle, pg_catalog, "$user", public'
в postgresql.conf
).
F.29.9. Пакет dbms_output #
Tantor SE отправляет информацию клиенту через RAISE NOTICE. Oracle использует dbms_output.put_line(). Это работает иначе, чем RAISE NOTICE. У Oracle есть очередь сессий, put_line() добавляет строку в очередь, а функция get_line() читает из очереди. Если установлен флаг 'serveroutput', то клиент через все sql-операторы читает очередь. Вы можете использовать:
select dbms_output.enable(); select dbms_output.put_line('first_line'); select dbms_output.put_line('next_line'); select * from dbms_output.get_lines(0);
или
select dbms_output.enable(); select dbms_output.serveroutput('t'); select dbms_output.put_line('first_line');
Этот пакет содержит следующие функции: enable(), disable(), serveroutput(), put(), put_line(), new_line(), get_line(), get_lines(). Очередь пакета реализована в локальной памяти сессии.
F.29.10. Пакет utl_file #
Этот пакет позволяет программам PL/pgSQL читать и записывать любые файлы, доступные с сервера. Каждая сессия может открыть максимум десять файлов, а максимальный размер строки составляет 32K. Этот пакет содержит следующие функции:
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(location text, filename text, file_mode text [, maxlinesize int] [, encoding name]) 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) text - читает одну строку из файла или возвращает 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, buffer text) - помещает строку в файл
utl_file.putf(file utl_file.file_type, format buffer [,arg1 text][,arg2 text][..][,arg5 text]) - помещает отформатированный текст в файл
utl_file.tmpdir() - получает путь к временному каталогу
Поскольку Tantor SE не поддерживает вызов по ссылке, некоторые функции немного отличаются: fclose и get_line.
declare f utl_file.file_type; begin f := utl_file.fopen('/tmp', 'sample.txt', 'r'); <<readl>> loop begin raise notice '%', utl_file.get_line(f); exception when no_data_found then exit readl; end; end loop; f := fclose(f); end;
или второй (со специфичной для Tantor SE функцией get_nextline)
declare f utl_file.file_type; line text; begin f := utl_file.fopen('/tmp', 'sample.txt', 'r'); loop line := utl_file.get_nextline(f); exit when line is NULL; raise notice '%', line; exception when others then utl_file.fclose_all(); end;
Перед использованием пакета необходимо установить таблицу utl_file.utl_file_dir. Она содержит все разрешенные каталоги без символа на конце ('/' или '\'). На платформе WinNT пути должны всегда заканчиваться символом '\'.
Записи в каталоге могут иметь свои названия (второй столбец в таблице utl_file.utl_file_dir
).
Параметр location
может быть либо именем каталога, либо путем к словарю.
Сначала местоположение интерпретируется и проверяется как имя каталога.
Если не найдено (во 2-м столбце), то местоположение интерпретируется и проверяется как путь.
Функции из пакета utl_file (схема в Postgres) требуют доступа к таблице utl_file.utl_file_dir. Эту особенность можно использовать чтобы контролировать, какие пользователи могут или не могут использовать эти функции. Настройка по умолчанию - READ для PUBLIC. INSERT, UPDATE может выполнять только привилегированный пользователь (суперпользователь). Таким образом, непривилегированный пользователь может использовать функции из этого пакета, но не может изменять список безопасных каталогов (содержимое таблицы utl_file.utl_file_dir). Содержимое этой таблицы видно для PUBLIC (или должно быть видно для пользователей, которые используют функции из этого пакета).
F.29.11. Пакет dbms_sql #
Это реализация API Oracle пакета DBMS_SQL
Полная совместимость не гарантируется, но должна уменьшиться работа, необходимая для успешной миграции.
Внимание: архитектура Tantor SE отличается от архитектуры Oracle. PL/pgSQL выполняется в том же контексте, что и SQL движок. Поэтому нет никакой причины использовать шаблоны Oracle, такие как bulk collect и итерация по коллекции в Postgres для достижения хорошей производительности. Этот код предназначен для уменьшения работы, связанной с переносом некоторых приложений из Oracle в Postgres, и он может хорошо работать. Но не будет никакого преимущества в производительности по сравнению с встроенными операторами PL/pgSQL. Эмуляция API Oracle вызывает издержки на память и CPU, которые могут быть значительными при работе с большими данными.
F.29.11.1. Функциональность #
Это расширение реализует подмножество интерфейса Oracle’s dbms_sql. Цель этого расширения не совместимость с Oracle, оно предназначено для уменьшения некоторых работ, связанных с миграцией приложений Oracle в Postgres. Поддерживается некоторая базовая функциональность массовых DML:
do $$ declare c int; a int[]; b varchar[]; ca numeric[]; begin c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'insert into foo values(:a, :b, :c)'); a := ARRAY[1, 2, 3, 4, 5]; b := ARRAY['Ahoj', 'Nazdar', 'Bazar']; ca := ARRAY[3.14, 2.22, 3.8, 4]; call dbms_sql.bind_array(c, 'a', a, 2, 3); call dbms_sql.bind_array(c, 'b', b, 3, 4); call dbms_sql.bind_array(c, 'c', ca); raise notice 'inserted rows %d', dbms_sql.execute(c); end; $$; do $$ declare c int; a int[]; b varchar[]; ca numeric[]; begin c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'select i, ''Ahoj'' || i, i + 0.003 from generate_series(1, 35) g(i)'); call dbms_sql.define_array(c, 1, a, 10, 1); call dbms_sql.define_array(c, 2, b, 10, 1); call dbms_sql.define_array(c, 3, ca, 10, 1); perform dbms_sql.execute(c); while dbms_sql.fetch_rows(c) > 0 loop call dbms_sql.column_value(c, 1, a); call dbms_sql.column_value(c, 2, b); call dbms_sql.column_value(c, 3, ca); raise notice 'a = %', a; raise notice 'b = %', b; raise notice 'c = %', ca; end loop; call dbms_sql.close_cursor(c); end; $$;
Существует функция dbms_sql.describe_columns_f
, которая похожа на процедуру dbms_sql.describe_columns
.Обратите внимание на то, что идентификаторы типов связаны с системой типов Tantor SE. Значения не преобразуются в числа Oracle.
do $$ declare c int; r record; d dbms_sql.desc_rec; begin c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'select * from pg_class'); r := dbms_sql.describe_columns(c); raise notice '%', r.col_cnt; foreach d in array r.desc_t loop raise notice '% %', d.col_name, d.col_type::regtype; end loop; call dbms_sql.close_cursor(c); end; $$; do $$ declare c int; n int; d dbms_sql.desc_rec; da dbms_sql.desc_rec[]; begin c := dbms_sql.open_cursor(); call dbms_sql.parse(c, 'select * from pg_class'); call dbms_sql.describe_columns(c, n, da); raise notice '%', n; foreach d in array da loop raise notice '% %', d.col_name, d.col_type::regtype; end loop; call dbms_sql.close_cursor(c); end; $$;
F.29.12. Пакет dbms_pipe #
Этот пакет является эмуляцией пакета dbms_pipe Oracle. Он обеспечивает взаимодействие между сессиями. Вы можете отправлять и читать любые сообщения с ожиданием или без него; просматривать активные каналы; устанавливать канал как приватный или публичный; а также использовать явные или неявные каналы.
Максимальное количество каналов составляет 50.
Общая память используется для отправки сообщений.
Например:
-- Session A select dbms_pipe.create_pipe('my_pipe',10,true); -- explicit pipe creating select dbms_pipe.pack_message('neco je jinak'); select dbms_pipe.pack_message('anything is else'); select dbms_pipe.send_message('my_pipe',20,0); -- change limit and send without waiting select * from dbms_pipe.db_pipes; -- list of current pipes -- Session B select dbms_pipe.receive_message('my_pipe',1); -- wait max 1 sec for message select dbms_pipe.next_item_type(); -- -> 11, text select dbms_pipe.unpack_message_text(); select dbms_pipe.next_item_type(); -- -> 11, text select dbms_pipe.unpack_message_text(); select dbms_pipe.next_item_type(); -- -> 0, no more items select dbms_pipe.remove_pipe('my_pipe');
Однако есть некоторые отличия по сравнению с Oracle:
Ограничение для каналов не в байтах, а в элементах в канале
вы можете отправлять сообщение без ожидания
вы можете отправлять пустые сообщения
next_item_type знает о TIMESTAMP (тип 13)
Tantor SE не знает о типе RAW, используйте вместо него bytea
F.29.13. Пакет dbms_alert #
Еще один способ межпроцессного взаимодействия.
-- Session A select dbms_alert.register('boo'); select * from dbms_alert.waitany(10); -- Session B select dbms_alert.register('boo'); select * from dbms_alert.waitany(10); -- Session C select dbms_alert.signal('boo','Nice day');
F.29.14. Пакет PLVdate #
Этот модуль содержит некоторые функции для работы с рабочими днями из пакета PLVdate. Подробная документация может быть найдена в библиотеке PLVision. Этот пакет многокультурный, но конфигурация по умолчанию предназначена только для европейских стран (см. исходный код).
Необходимо определить свои собственные нерабочие дни (максимум 50 дней) и собственные праздники (максимум 30 дней). Праздник - это любой нерабочий день, который повторяется каждый год. Например, день Рождества в западных странах.
F.29.14.1. Функции #
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, repeat bool) - Устанавливает день как нерабочий, если 'repeat' установлено в true, то день является нерабочим каждый год
plvdate.unset_nonbizday(day date, repeat bool) - Отменяет установку дня как нерабочего дня, если 'repeat' установлено в true, то день является нерабочим каждый год
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(включить boolean);
plvdate.including_start() bool;
plvdate.default_holidays(varchar) - загружает конфигурации по умолчанию. Вы можете использовать следующие конфигурации: Чехия, Германия, Австрия, Польша, Словакия, Россия, Великобритания и США на данный момент.
конфигурация содержит только общие праздники для всех регионов. Вы можете добавить свой собственный региональный праздник с помощью plvdate.set_nonbizday(nonbizday, true)
Пример:
postgres=# select plvdate.default_holidays('czech'); default_holidays ----------------- (1 row) postgres=# select to_char(current_date, 'day'), plvdate.next_bizday(current_date), to_char(plvdate.next_bizday(current_date),'day'); to_char | next_bizday | to_char ----------+-------------+----------- saturday | 2006-03-13 | monday (1 row)
Изменение для неевропейской среды:
select plvdate.unset_nonbizday('saturday'); select plvdate.unset_nonbizday('sunday'); select plvdate.set_nonbizday('friday'); select plvdate.set_nonbizday('2006-05-19', true); select plvdate.unuse_easter();
F.29.15. Пакеты PLVstr и PLVchr #
Этот пакет содержит некоторые полезные функции для работы со строками и символами. Каждая функция поддерживает положительные и отрицательные смещения, то есть смещение от конца строки. Например:
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, если prefix является префиксом str
plvstr.is_prefix(str text, prefix text) - Возвращает true, если prefix является префиксом str
plvstr.is_prefix(str int, prefix int) - Возвращает true, если prefix является префиксом str
plvstr.is_prefix(str bigint, prefix bigint) - Возвращает true, если prefix является префиксом 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 символов. Вы можете использовать отрицательное значение 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.stripped(str text, char_in text) - Удаляет все указанные символы из строки
F.29.16. Пакет PLVsubst #
Пакет PLVsubst выполняет замену строк на основе ключевого слова замены.
plvsubst.string(template_in text, vals_in text[]) - Сканирует строку на наличие ключевого слова замены и заменяет его следующим значением в списке значений замены
plvsubst.string(template_in text, vals_in text[], subst_in text)
plvsubst.string(template_in text, vals_in text, delim_in text)
plvsubst.string(template_in text, vals_in text, delim_in text, subst_in text)
plvsubst.setsubst(str text) - Устанавливает ключевое слово замены по умолчанию на '%s'
plvsubst.subst() - Извлекает ключевое слово замены
Примеры:
select plvsubst.string('My name is %s %s.', ARRAY['Pavel','Stěhule']); string -------------------------- My name is Pavel Stěhule. (1 row) select plvsubst.string('My name is %s %s.', 'Pavel,Stěhule'); string -------------------------- My name is Pavel Stěhule. (1 row) select plvsubst.string('My name is $$ $$.', 'Pavel|Stěhule','|','$$'); string -------------------------- My name is Pavel Stěhule. (1 row)
F.29.17. Пакет DBMS_utility #
dms_utility.format_call_stack() — возвращает отформатированную строку с содержимым стека вызовов
postgres=# select foo2(); foo2 --------------------------------- ----- Call Stack ----- line object number statement name 1 return function foo 1 return function foo1 1 return function foo2 (1 row)
F.29.18. Пакет PLVlex #
Этот пакет не совместим с оригинальным PLVlex.
postgres=# select * from plvlex.tokens('select * from a.b.c join d ON x=y', true, true); pos | token | code | class | separator | mod ----+--------+------+---------+-----------+------ 0 | select | 527 | KEYWORD | | 7 | * | 42 | OTHERS | | self 9 | from | 377 | KEYWORD | | 25 | a.b.c | | IDENT | | 20 | join | 418 | KEYWORD | | 25 | d | | IDENT | | 27 | on | 473 | KEYWORD | | 30 | x | | IDENT | | 31 | = | 61 | OTHERS | | self 32 | y | | IDENT | | (10 rows)
Предупреждение: Коды ключевых слов могут различаться в разных версиях Tantor SE! o plvlex.tokens(str text, skip_spaces bool, qualified_names bool) - Возвращает таблицу лексических элементов в str.
F.29.19. Пакет DBMS_ASSERT #
Этот пакет защищает ввод пользователя от внедрения 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-объекта.
F.29.20. Пакет PLUnit #
Этот модуль содержит некоторые функции проверки.
plunit.assert_true(bool [, varchar]) - Устанавливает, что условие истинно.
plunit.assert_false(bool [, varchar]) - Устанавливает, что условие является ложным.
plunit.assert_null(anyelement [, varchar]) - Устанавливает, что фактическое значение является нулевым.
plunit.assert_not_null(anyelement [, varchar]) - Устанавливает, что фактическое значение не является null.
plunit.assert_equals(anyelement, anyelement [, double precision] [, varchar]) - Устанавливает, что ожидаемое и фактическое значения равны.
plunit.assert_not_equals(anyelement, anyelement [, double precision] [, varchar]) - Устанавливает, что ожидаемое и фактическое равны.
plunit.fail([varchar]) - Fail может быть использован для немедленного прерывания тестовой процедуры с использованием предоставленного сообщения.
F.29.21. Пакет DBMS_random #
dbms_random.initialize(int) - Инициализация пакета с начальным значением.
dbms_random.normal() - Возвращает случайные числа в стандартизированном нормальном распределении.
dbms_random.random() - Возвращает случайное число от -2^31 .. 2^31.
dbms_random.seed(int)
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(low double precision, high double precision) - Возвращает случайное число из диапазона [low - high)
F.29.22. Другие функции #
Этот модуль содержит реализацию функций: concat, nvl, nvl2, lnnvl, decode, greatest, least, 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]) - Совместимый с Oracle lpad
oracle.rpad(string, length [, fill]) - Совместимый с Oracle rpad
oracle.ltrim(string text [, characters text]) - Совместимый с Oracle ltrim
oracle.rtrim(string text [, characters text]) - Совместимый с Oracle rtrim
oracle.btrim(string text [, characters text]) - Совместимый с Oracle btrim
oracle.length(string char) - Совместимая с Oracle длина
oracle.listagg(str text [, separator 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.greatest(anyelement, anyelement[]) - функция greatest для совместимости с Oracle, возвращает NULL при вводе NULL
oracle.least(anyelement, anyelement[]) - anyelement least для совместимости с Oracle, возвращает NULL при вводе NULL
oracle.mod(int, int) - модуль совместимости Oracle. Если второй параметр равен нулю, он возвращает первый параметр
oracle.remainder(int, int) - возвращает остаток от деления одного числа на другое
oracle.remainder(numeric, numeric) - возвращает остаток от деления одного числа на другое
oracle.sys_guid() - возвращает bytea - 16 байт глобального уникального идентификатора
Возможно, потребуется установить search_path в 'oracle, pg_catalog, "$user", public', потому что oracle.substr, oracle.lpad, oracle.rpad, oracle.ltrim, oracle.rtrim, oracle.btrim, oracle.length устанавливаются параллельно с 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.least всегда должны стоять имена схемы, даже если oracle стоит перед pg_catalog в search_path, поскольку эти функции реализованы внутри парсера и анализатора Tantor SE. Без имени схемы всегда будут использоваться внутренние функции.
Обратите внимание, что в случае с lpad и rpad, параметры string и fill могут быть типов CHAR, VARCHAR, TEXT, VARCHAR2 или NVARCHAR2 (обратите внимание, что последние два предоставляются orafce). Символ заполнения по умолчанию - полуширинный пробел. Аналогично для ltrim, rtrim и btrim.
Обратите внимание, что oracle.length имеет ограничение: он работает только в единицах символов, потому что тип CHAR Tantor SE поддерживает только семантику символов.
Функция oracle.substr с тремя аргументами может возвращать разные результаты (null или пустую строку) в зависимости от настройки переменной orafce.using_substring_zero_width_in_substr (oracle, warning_oracle, orafce, warning_orafce). Этот различный результат возвращается только тогда, когда третий аргумент (substring_length) равен нулю. По умолчанию используется warning_oracle, что означает выдачу предупреждения и возврат null.
F.29.23. Функция oracle.sys_guid() #
Эта функция возвращает глобальный уникальный идентификатор. Она вызывает указанные функции из расширения "uuid-ossp", и поэтому это расширение должно быть установлено перед использованием функции sys_guid. По умолчанию эта функция использует функцию uuid_generate_v1, но также могут быть использованы функции uuid_generate_v1mc, uuid_generate_v4 (путем установки orafce.sys_guid_source). oracle.sys_guid может также использовать встроенную функцию gen_random_uuid. В этом случае расширение "uuid-ossp" не требуется.
F.29.24. Поддержка VARCHAR2 и NVARCHAR2 #
Orafce VARCHAR2 реализует части спецификации базы данных Oracle о VARCHAR2:
Единица типа модификатора = 'байты' (для семантики символов, см. NVARCHAR2)
В отличие от varchar Tantor SE, неявное преобразование в VARCHAR2 не обрезает пробелы, превышающие объявленную максимальную длину
Для этих типов возможно использование безопасного для null оператора ||, когда вы включаете orafce.varchar2_null_safe_concat в true. Поведение очень похоже на Oracle.
Внимание: - когда результат является пустой строкой, тогда результат NULL. Это поведение отключено по умолчанию.
Внимание: - возможна несовместимость между версией 3.7 и более старыми версиями Orafce. Функция оператора теперь помечена как стабильная (раньше была неизменной). Невозможно создать функциональные индексы для стабильных или изменчивых выражений.
-- null safe concat (disabled by default) SELECT NULL || 'hello'::varchar2 || NULL; SET orafce.varchar2_null_safe_concat TO true; SELECT NULL || 'hello'::varchar2 || NULL;
Обратите внимание, что Tantor SE не позволяет динамически указывать, как мы интерпретируем строки varchar. Он всегда интерпретирует их как строки 'character' в соответствии с кодировкой базы данных. Таким образом, мы не можем поддерживать обе семантики BYTE и CHARACTER для данного типа varchar в одной и той же базе данных. Мы выбрали реализовать семантику BYTE, так как это значение по умолчанию в Oracle. Для семантики CHARACTER пожалуйста, смотрите NVARCHAR2, который по умолчанию всегда реализует семантику CHARACTER.
Пожалуйста, будьте осторожны при использовании указанного выше типа для хранения строк, состоящих из многобайтовых закодированных символов, в которых каждый символ может состоять из произвольного количества байтов.
NVARCHAR2 реализует следующее:
Единица типа модификатора = 'символы' (используя набор символов/кодировку базы данных)
Используйте этот тип, если предпочтительна семантика символов.
Обратите внимание, что в отличие от Oracle, VARCHAR2 и NVARCHAR2 в orafce не накладывают ограничение в 4000 байт на 'объявленный' размер. На самом деле это то же самое, что и varchar в Tantor SE, который составляет около 10 МБ (хотя теоретически varchar может хранить значения размером до 1 ГБ)
Некоторые функции строки, основанные на байтах, для использования со строками VARCHAR2
substrb(VARCHAR2, int [, int]) - извлекает подстроку указанной длины (в байтах), начиная с заданной позиции байта (считая с единицы); если третий аргумент не указан, то считается длина до конца строки
strposb(VARCHAR2, VARCHAR2) - возвращает позицию указанной подстроки в заданной строке (счет начинается с одного)
lengthb(VARCHAR2) - возвращает длину (в байтах) заданной строки
F.29.25. Триггеры #
Oracle не различает NULL и пустую строку (когда значение используется как текст). Для Postgres NULL и пустая строка - это разные значения. Для простоты рекомендуется (в базе данных Postgres) использовать только NULL (и не использовать пустые строки) или использовать только пустые строки (и не использовать NULL) для столбцов типа текст. Оба варианта имеют свои преимущества и недостатки.
Это можно обеспечить с помощью триггерных функций:
oracle.replace_empty_strings([raise_warnings boolean]) oracle.replace_null_strings([raise_warnings boolean])
Опциональный логический аргумент используется как индикатор, чтобы эти функции вызывали предупреждение, когда строка была изменена внутри этих функций.
CREATE TABLE test(id serial, name varchar, surname varchar); CREATE TRIGGER test_trg BEFORE INSERT OR UPDATE ON test FOR EACH ROW EXECUTE PROCEDURE oracle.replace_empty_strings(); INSERT INTO test(name, surname) VALUES('', 'Stehule'); -- name will be replaced by NULL
F.29.26. Эмулированные представления #
oracle.user_tab_columns
oracle.user_tables
oracle.user_cons_columns
oracle.user_constraints
oracle.product_componenent_version
oracle.user_objects
oracle.dba_segments
F.29.27. Лицензия #
Этот модуль выпущен под лицензией BSD.
F.29.28. Участники #
Проект был основан в 2008 году Павлом Стехуле <[email protected]>
.
Другие участники:
Gabriele Bartolini (gbartolini)
Jeffrey Cohen (jcohen)
Giles Darold (дарольд)
Pavan Deolasee (pavanvd)
Peter Eisentraut (petere)
Beena Emerson (b-emerson)
Takahiro Itagaki (itagaki)
Zdenek Kotala (хлипа)
Amit Langote (amitlan)
Heikki Linnakangas (hlinnaka)
Fujii Masao
Marco Nenciarini (mnencia)
Vinayak Pokale
Gavin Sherry (swm)
Pavel Stehule (okbob)
Rahila Syed (rahila)
F.29.29. Orafce - функции и пакеты совместимости Oracle #
Данная документация описывает настройки среды и функциональность, предлагаемую для функций, совместимых с базами данных Oracle.
F.29.30. Глава 1 Обзор #
Предоставляются функции, совместимые с базами данных Oracle. Эти функции позволяют вам легко перейти на Tantor SE и снизить издержки на перенастройку приложений.
Таблица ниже перечисляет функции, совместимые с базами данных Oracle.
F.29.30.1. Функции, совместимые с базами данных Oracle #
Тип данных
Элемент | Обзор |
---|---|
VARCHAR2 | Тип данных с переменной длиной символов |
NVARCHAR2 | Тип данных национальных символов переменной длины |
DATE | Тип данных, который хранит дату и время |
SQL-запросы
Элемент | Обзор |
---|---|
Таблица DUAL | Таблица, предоставляемая системой |
SQL-функции
Математические функции
Элемент | Обзор |
---|---|
BITAND | Выполняет побитовую операцию AND |
COSH | Вычисляет гиперболический косинус числа |
SINH | Вычисляет гиперболический синус числа |
TANH | Вычисляет гиперболический тангенс числа |
Функции строки
Элемент | Обзор |
---|---|
INSTR | Возвращает позицию подстроки в строке |
LENGTH | Возвращает длину строки в количестве символов |
LENGTHB | Возвращает длину строки в количестве байтов |
LPAD | Дополняет строку слева до указанной длины последовательностью символов |
LTRIM | Удаляет указанные символы с начала строки |
NLSSORT | Возвращает байтовую строку, используемую для сортировки строк в лингвистической последовательности сортировки на основе локали |
REGEXP_COUNT | ищет в строке регулярное выражение и возвращает количество совпадений |
REGEXP_INSTR | возвращает начальную или конечную позицию внутри строки, где было найдено совпадение с шаблоном |
REGEXP_LIKE | условие в предложении WHERE запроса, заставляющее запрос возвращать строки, соответствующие заданному шаблону |
REGEXP_SUBSTR | возвращает строку, которая соответствует шаблону, указанному в вызове функции |
REGEXP_REPLACE | заменить подстроку(-и), соответствующую(-ие) регулярному выражению POSIX |
RPAD | Дополняет строку справа до указанной длины последовательностью символов |
RTRIM | Удаляет указанные символы с конца строки |
SUBSTR | Извлекает часть строки, используя символы для указания позиции и длины |
SUBSTRB | Извлекает часть строки, используя байты для указания позиции и длины |
Функции даты/времени
Элемент | Обзор |
---|---|
ADD_MONTHS | Добавляет месяцы к дате |
DBTIMEZONE | Возвращает значение часового пояса базы данных |
LAST_DAY | Возвращает последний день месяца, в который попадает указанная дата |
MONTHS_BETWEEN | Возвращает количество месяцев между двумя датами |
NEXT_DAY | Возвращает дату первого определенного дня недели, который следует за указанной датой |
ROUND | Округляет дату |
SESSIONTIMEZONE | Возвращает часовой пояс сессии |
SYSDATE | Возвращает системную дату |
TRUNC | Усекает дату |
Функции форматирования типов данных
Элемент | Обзор |
---|---|
TO_CHAR | Преобразует значение в строку |
TO_DATE | Преобразует строку в дату в соответствии с указанным форматом |
TO_MULTI_BYTE | Преобразует строку из одного байта в многобайтовую строку |
TO_NUMBER | Преобразует значение в число в соответствии с указанным форматом |
TO_SINGLE_BYTE | Преобразует многобайтовую строку в строку из одного байта |
Условные выражения
Элемент | Обзор |
---|---|
DECODE | Сравнивает значения, и если они совпадают, возвращает соответствующее значение |
GREATEST | Возвращает наибольшее выражение из списка из одного или более выражений |
LEAST | Возвращает наименьшее выражение из списка из одного или более выражений |
LNNVL | Оценивает, является ли значение ложным (false) или неизвестным (unknown) |
NANVL | Возвращает заменяющее значение, когда значение не является числом (NaN) |
NVL | Возвращает заменяющее значение, когда значение NULL |
NVL2 | Возвращает заменяющее значение на основе того, является ли значение NULL или не NULL |
Агрегатные функции
Элемент | Обзор |
---|---|
LISTAGG | Возвращает объединенный список строковых значений с разделителями |
MEDIAN | Вычисляет медиану набора значений |
Функции, возвращающие внутреннюю информацию
Элемент | Обзор |
---|---|
DUMP | Возвращает внутреннюю информацию значения |
Операторы SQL
Элемент | Обзор |
---|---|
Оператор даты и времени | Оператор даты и времени для типа DATE |
Packages
Элемент | Обзор |
---|---|
DBMS_ALERT | Отправляет оповещения в несколько сессий |
DBMS_ASSERT | Проверяет свойства входного значения |
DBMS_OUTPUT | Отправляет сообщения клиентам |
DBMS_PIPE | Создает канал для обмена данными между сессиями |
DBMS_RANDOM | Генерирует случайные числа |
DBMS_UTILITY | Предоставляет различные утилиты |
UTL_FILE | Позволяет выполнять операции с текстовыми файлами |
F.29.31. Глава 2 Примечания по использованию orafce #
Orafce - это пользовательские функции в схеме "public", создаваемые по умолчанию при создании кластеров баз данных, чтобы они были доступны для всех пользователей без специальных настроек. По этой причине, убедитесь, что "public" (без двойных кавычек) включен в список путей поиска схем, указанных в параметре search_path.
Следующие функции, предоставляемые orafce, реализованы в Tantor SE и orafce, использующих различные внешние спецификации. В конфигурации Tantor SE по умолчанию, стандартные функции Tantor SE имеют приоритет.
Функции, реализованные в Tantor SE и orafce с использованием различных внешних спецификаций
тип данных
Элемент | Стандартная функция Tantor SE | Функция совместимости, добавленная orafce |
---|---|---|
DATE | Хранит только дату. | Хранит дату и время. |
Функция
Элемент | Стандартная функция Tantor SE | Функция совместимости, добавленная orafce |
---|---|---|
LENGTH | Если строка имеет тип CHAR, пробелы в конце не включаются в длину. | Если строка имеет тип CHAR, пробелы в конце включаются в длину. |
SUBSTR | Если указано 0 или отрицательное значение для начальной позиции, просто вычитая 1 из начальной позиции, позиция будет сдвинута влево, откуда начнется извлечение. | - Если для начальной позиции указан 0, извлечение начнется с начала строки. - Если для начальной позиции указано отрицательное значение, извлечение начнется с позиции, подсчитанной от конца строки. |
LPAD RPAD | - Если строка имеет тип CHAR, то удаляются пробелы в конце и затем значение дополняется. - Длина результата обрабатывается как количество символов. | - Если строка имеет тип CHAR, значение дополняется без удаления пробелов в конце. - Длина результата основывается на ширине отображаемой строки. Поэтому символы полной ширины обрабатываются с использованием ширины 2, а символы полуширины обрабатываются с использованием ширины 1. |
LTRIM RTRIM BTRIM (*1) | Если строка имеет тип CHAR, удаляются пробелы в конце, а затем удаляется значение. | Если строка имеет тип CHAR, значение удаляется без удаления пробелов в конце. |
TO_DATE | Тип возвращаемого значения - DATE. | Тип возвращаемого значения - TIMESTAMP. |
*1: BTRIM не существует для баз данных Oracle, однако, внешняя спецификация, отличная от Tantor SE, реализована в orafce для соответствия поведению функций TRIM.
Также следующие функции не могут быть использованы в настройках по умолчанию Tantor SE.
Функции, которые не могут быть использованы в конфигурации по умолчанию Tantor SE
Функция
Функция |
---|
SYSDATE |
DBTIMEZONE |
SESSIONTIMEZONE |
TO_CHAR (значение даты/времени) |
Оператор
Функция |
---|
Оператор даты и времени |
Чтобы использовать эти функции, установите "oracle" и "pg_catalog" в параметре "search_path" в Tantor SE.conf. Необходимо указать "oracle" перед "pg_catalog" при этом.
search_path = '"$user", public, oracle, pg_catalog'
Information
Параметр search_path определяет порядок, в котором производится поиск схем. Каждая функция, совместимая с базами данных Oracle, определена в схеме oracle.
Рекомендуется установить search_path в Tantor SE.conf. В этом случае, он будет действовать для каждого экземпляра.
Настройка search_path может быть выполнена на уровне пользователя или на уровне базы данных. Примеры настроек показаны ниже.
Если стандартные функции Tantor SE имеют приоритет, и функции, которые не могут быть использованы в конфигурации по умолчанию Tantor SE, не требуются, то нет необходимости изменять настройки search_path.
Пример установки на уровне пользователя
Можно установить, выполнив SQL-команду. В этом примере используется имя пользователя user1.
ALTER USER user1 SET search_path = "$user",public,oracle,pg_catalog;
Пример установки на уровне базы данных
Можно установить, выполнив SQL-команду. В этом примере db1 используется в качестве имени базы данных.
Необходимо указать "oracle" перед "pg_catalog".
ALTER DATABASE db1 SET search_path = "$user",public,oracle,pg_catalog;
See
Обратитесь к разделу «Администрирование сервера» > «Настройки подключения клиента» > «Поведение оператора» в документации Tantor SE для получения информации о search_path.
Обратитесь к разделу «Справка» > «SQL команды» в документации Tantor SE для получения информации об ALTER USER и ALTER DATABASE.
F.29.32. Глава 3 Типы данных #
Поддерживаются следующие типы данных:
VARCHAR2
NVARCHAR2
DATE
F.29.32.1. VARCHAR2 #
Syntax
Диаграмма F.3. VARCHAR2
![VARCHAR2](images/orafce/VARCHAR2.gif)
Укажите тип VARCHAR2 следующим образом.
Синтаксис типа данных | Объяснение |
---|---|
VARCHAR2(len) | Строка с переменной длиной до len символов Для len укажите целое число больше 0. Если len прне указано, строка может быть любой длины. |
Общие правила
VARCHAR2 - это тип данных символов. Укажите количество байтов для определения длины.
Строки имеют переменную длину. Указанное значение будет сохранено как есть. Верхний предел для этого типа данных составляет примерно один гигабайт.
Note
Тип VARCHAR2 не поддерживает последовательности сортировки. Поэтому, когда требуется последовательность сортировки, подобная предложению ORDER BY выдается следующая ошибка. В этот момент, следующая ПОДСКАЗКА (HINT) предложит использовать предложение COLLATE, однако, поскольку последовательности сортировки не поддерживаются, использовать это предложение невозможно.
ERROR: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly.
Если отображается ошибка, указанная выше, приведите столбец явно к типу VARCHAR или TEXT.
F.29.32.2. NVARCHAR2 #
Syntax
Диаграмма F.4. NVARCHAR2
![NVARCHAR2](images/orafce/NVARCHAR2.gif)
Укажите тип NVARCHAR2 следующим образом.
Синтаксис типа данных | Объяснение |
---|---|
NVARCHAR2(len) | Строка с национальными символами с переменной длиной до len символов. Для len укажите целое число больше 0. Если len прне указано, строка может быть любой длины. |
Общие правила
NVARCHAR2 - это тип данных национального символа. Укажите количество символов для определения длины.
Строки имеют переменную длину. Указанное значение будет сохранено как есть. Верхний предел для этого типа данных составляет примерно один гигабайт.
Note
Тип NVARCHAR2 не поддерживает последовательности сортировки. Поэтому, когда требуется последовательность сортировки, например, как в предложении ORDER BY, возникает следующая ошибка. В этот момент, следующая ПОДСКАЗКА (HINT) предложит использовать предложение COLLATE, однако, поскольку последовательности сортировки не поддерживаются, использовать это предложение невозможно.
ERROR: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly.
Если отображается указанная выше ошибка, приведите столбец явно к типу NCHAR VARYING или TEXT.
F.29.32.3. DATE #
Syntax
Диаграмма F.5. DATE
![DATE](images/orafce/DATE.gif)
Укажите тип DATE следующим образом.
Синтаксис типа данных | Объяснение |
---|---|
DATE | Хранит дату и время |
Общие правила
DATE - это тип данных даты/времени.
Дата и время хранятся в DATE. Часовой пояс не сохраняется.
Note
Если тип DATE orafce используется в DDL-операторах, таких как определения таблиц, всегда устанавливайте search_path перед выполнением DDL- оператора. Даже если search_path изменяется после определения, тип данных будет типом DATE Tantor SE.
Information
Тип DATE в orafce эквивалентен типу TIMESTAMP в Tantor SE. Следовательно, из существующих функций Tantor SE, могут быть использованы те функции, для которых тип данных аргумента - TIMESTAMP.
F.29.33. Глава 4 Запросы #
Поддерживаются следующие запросы:
Таблица DUAL
F.29.33.1. Таблица DUAL #
Таблица DUAL - это виртуальная таблица, предоставляемая системой. Используйте при выполнении SQL, когда доступ к базовой таблице не требуется, как при выполнении тестов для получения результатов выражений, таких как функции и операторы.
Example
В следующем примере возвращается текущая системная дата.
SELECT CURRENT_DATE "date" FROM DUAL; date ------------ 2013-05-14 (1 row)
F.29.34. Глава 5 Справочник по функциям SQL #
F.29.34.1. Математические функции #
Поддерживаются следующие математические функции:
BITAND
COSH
SINH
TANH
F.29.34.1.1. BITAND #
Description
Выполняет побитовую операцию AND.
Syntax
Диаграмма F.6. BITAND
![BITAND](images/orafce/BITAND.gif)
Общие правила
BITAND выполняет операцию AND над каждым битом двух целых чисел и возвращает результат.
Укажите значения типа целого числа.
Тип возвращаемого значения - BIGINT.
Example
В следующем примере возвращается результат операции AND над числовыми литералами 5 и 3.
SELECT BITAND(5,3) FROM DUAL; bitand ------- 1 (1 row)
F.29.34.1.2. COSH #
Description
Вычисляет гиперболический косинус числа.
Syntax
Диаграмма F.7. COSH
![COSH](images/orafce/COSH.gif)
Общие правила
COSH возвращает гиперболический косинус указанного числа.
Число должно быть числовым типом данных.
Тип возвращаемого значения - DOUBLE PRECISION.
Example
В следующем примере возвращается гиперболический косинус числового литерала 2.236.
SELECT COSH(2.236) FROM DUAL; cosh ----------------- 4.7313591000247 (1 row)
F.29.34.1.3. SINH #
Description
Вычисляет гиперболический синус числа.
Syntax
Диаграмма F.8. SINH
![SINH](images/orafce/SINH.gif)
Общие правила
SINH возвращает гиперболический синус указанного числа.
Число должно быть числовым типом данных.
Тип возвращаемого значения - DOUBLE PRECISION.
Example
В следующем примере возвращается гиперболический синус числового литерала 1.414.
SELECT SINH(1.414) FROM DUAL; sinh ----------------- 1.93460168824956 (1 row)
F.29.34.1.4. TANH #
Description
Вычисляет гиперболический тангенс числа.
Syntax
Диаграмма F.9. TANH
![TANH](images/orafce/TANH.gif)
Общие правила
TANH возвращает гиперболический тангенс указанного числа.
Число должно быть числовым типом данных.
Тип возвращаемого значения - DOUBLE PRECISION.
Example
В следующем примере возвращается гиперболический тангенс числового литерала 3.
SELECT TANH(3) FROM DUAL; tanh ----------------- 0.995054753686731 (1 row)
F.29.34.2. Функции строки #
Поддерживаются следующие строковые функции:
BTRIM
INSTR
LENGTH
LENGTHB
LPAD
LTRIM
NLSSORT
REGEXP_COUNT
REGEXP_INSTR
REGEXP_LIKE
REGEXP_SUBSTR
RPAD
RTRIM
SUBSTR
SUBSTRB
F.29.34.2.1. BTRIM #
Description
Удаляет указанные символы с начала и конца строки.
Syntax
Диаграмма F.10. BTRIM
![BTRIM](images/orafce/BTRIM.gif)
Общие правила
BTRIM возвращает строку, у которой символы trimChars удалены с начала и конца строки str.
Если указано несколько символов для обрезки, удаляются все символы, соответствующие символам обрезки. Если trimChars прне указан, удаляются все начальные и конечные полуширинные пробелы.
Тип возвращаемого значения - TEXT.
Note
BTRIM не существует для баз данных Oracle.
Спецификация типа CHAR для BTRIM использует orafce, и при этом поведение отличается от поведения BTRIM в Tantor SE. Параметр search_path должен быть изменен, чтобы он вел себя так же, как описано в спецификации выше.
Information
Общее правило для BTRIM в Tantor SE следующее:
Если строка имеет тип CHAR, то сначала удаляются пробелы в конце строки, а затем удаляются символы обрезки.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Строковые функции и операторы» в документации Tantor SE для получения информации о BTRIM.
Example
В следующем примере возвращается строка, из которой была удалена буква "a" с обоих концов строки "aabcaba".
SELECT BTRIM('aabcaba','a') FROM DUAL; btrim ------- bcab (1 row)
F.29.34.2.2. INSTR #
Description
Возвращает позицию подстроки в строке.
Syntax
Диаграмма F.11. INSTR
![INSTR](images/orafce/INSTR.gif)
Общие правила
INSTR ищет подстроку str2 в строке str1 и возвращает позицию (в символах) в str1 первого символа вхождения.
Поиск начинается с указанной начальной позиции startPos в str1.
Когда startPos равен 0 или отрицательному числу, начальная позиция будет указанным количеством символов слева от конца str1, и INSTR будет выполнять поиск в обратном направлении от этой точки.
Если начальная позиция не указана, поиск будет выполнен с начала str1.
Если указано вхождения, возвращается позиция n-го вхождения str2 в str1. Могут быть указаны только положительные числа.
Если вхождения не указаны, возвращается начальная позиция первого найденного вхождения.
Если str2 не найдена в str1, возвращается 0.
Для startPos и occurrences, укажите тип SMALLINT или INTEGER.
Тип возвращаемого значения - INTEGER.
Example
В следующем примере символы "BC" найдены в строке "ABCACBCAAC", и возвращается позиция этих символов.
SELECT INSTR('ABCACBCAAC','BC') FROM DUAL; instr ------- 2 (1 row) SELECT INSTR('ABCACBCAAC','BC',-1,2) FROM DUAL; instr ------- 2 (1 row)
F.29.34.2.3. LENGTH #
Description
Возвращает длину строки в числе символов.
Syntax
Диаграмма F.12. LENGTH
![LENGTH](images/orafce/LENGTH.gif)
Общие правила
LENGTH возвращает количество символов в строке str.
Если строка имеет тип CHAR, пробелы в конце включаются в длину.
Тип возвращаемого значения - INTEGER.
Note
Спецификация LENGTH, указанная выше, использует orafce, при этом поведение, отличается от поведения LENGTH в Tantor SE. Параметр search_path должен быть изменен, чтобы он соответствовал спецификации orafce.
Information
Общее правило для LENGTH в Tantor SE следующее:
Если строка имеет тип CHAR, пробелы в конце не включаются в длину.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Строковые функции и операторы» в документации Tantor SE для получения информации о LENGTH.
Example
В следующем примере возвращается количество символов в столбце col2 (определенном с использованием CHAR(10)) в таблице t1.
SELECT col2,LENGTH(col2) FROM t1 WHERE col1 = '1001'; col2 | length ------------+-------- AAAAA | 10 (1 row)
F.29.34.2.4. LENGTHB #
Description
Возвращает длину строки в числе байтов.
Syntax
Диаграмма F.13. LENGTHB
![LENGTHB](images/orafce/LENGTHB.gif)
Общие правила
LENGTHB возвращает количество байтов в строке str.
Если строка имеет тип CHAR, пробелы в конце включаются в длину.
Тип возвращаемого значения - INTEGER.
Example
В следующем примере возвращается количество байтов в столбце col2 (определенном с использованием CHAR(10)) в таблице t1. Обратите внимание, что во втором операторе SELECT каждый символ в "*" имеет длину 3 байта, что в сумме дает 9 байтов, и добавляется 7 байтов для 7 пробелов в конце. Это дает результат в 16 байтов.
SELECT col2,LENGTHB(col2) FROM t1 WHERE col1 = '1001'; col2 | lengthb ---------------+--------- AAAAA | 10 (1 row) SELECT col2,LENGTHB(col2) FROM t1 WHERE col1 = '1004'; col2 | lengthb ---------------+--------- *** | 16 (1 row)
F.29.34.2.5. LPAD #
Description
Заполняет строку слева до указанной длины последовательностью символов.
Syntax
Диаграмма F.14. LPAD
![LPAD](images/orafce/LPAD.gif)
Общие правила
LPAD возвращает результат после многократного дополнения начала строки str символами дополнения paddingStr до тех пор, пока строка не достигнет длины len.
Если строка имеет тип CHAR, символы заполнения добавляются к строке без удаления пробелов в конце.
В результирующей строке символы полной ширины распознаются как имеющие длину 2, а символы полуширины - как имеющие длину 1. Если символ полной ширины не может быть включен в результирующую строку, потому что доступно место только для одного символа полуширины, строка дополняется однобайтовым пробелом.
Тип возвращаемого значения - TEXT.
Note
Спецификация LPAD выше использует orafce, при этом поведение отличается от поведения LPAD в Tantor SE. Параметр search_path должен быть изменен, чтобы он соответствовал спецификации orafce.
Information
Общие правила для LPAD в Tantor SE следующие:
Если строка имеет тип CHAR, то удаляются пробелы в конце и затем к строке добавляются символы заполнения.
Длина результата - это количество символов.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Строковые функции и операторы» в документации Tantor SE для получения информации о LPAD.
Example
В следующем примере возвращается 10-символьная строка, которая была сформирована путем дополнения строки "abc" слева символом "a".
SELECT LPAD('abc',10,'a') FROM DUAL; lpad ------------ aaaaaaaabc (1 row)
F.29.34.2.6. LTRIM #
Description
Удаляет указанные символы с начала строки.
Syntax
Диаграмма F.15. LTRIM
![LTRIM](images/orafce/LTRIM.gif)
Общие правила
LTRIM возвращает строку с trimChars удаленными с начала строки str.
Если указано несколько символов для обрезки, удаляются все символы, соответствующие символам обрезки. Если trimChars прне указан, удаляются все ведущие полуширинные пробелы.
Тип возвращаемого значения - TEXT.
Note
Спецификация LTRIM выше использует orafce, при этом поведение отличается от поведения LTRIM в Tantor SE. Параметр search_path должен быть изменен, чтобы он соответствовал спецификации orafce.
Information
Общее правило для LTRIM в Tantor SE следующее:
Если строка имеет тип CHAR, то сначала удаляются пробелы в конце строки, а затем удаляются символы обрезки.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу "Язык SQL" > "Функции и операторы" > "Строковые функции и операторы" в документации Tantor SE для получения информации о LTRIM.
Example
В следующем примере возвращается строка, из которой было удалено "ab" с начала "aabcab".
SELECT LTRIM('aabcab','ab') FROM DUAL; ltrim ------- cab (1 row)
F.29.34.2.7. NLSSORT #
Description
Возвращает байтовую строку, обозначающую лексический порядок локали (COLLATE).
Syntax
Диаграмма F.16. NLSSORT
![NLSSORT](images/orafce/NLSSORT.gif)
Общие правила
NLSSORT используется для сравнения и сортировки в последовательности сопоставления локали (COLLATE), которая отличается от локали по умолчанию.
Значения, которые можно указать для локали, отличаются в зависимости от операционной системы сервера базы данных.
Если локаль не указана, необходимо заранее установить ее с помощью set_nls_sort. Чтобы установить локаль с помощью set_nls_sort, выполните оператор SELECT.
Пример установки set_nls_sort с использованием оператора SELECT
SELECT set_nls_sort('en_US.UTF8');
Тип возвращаемого значения - BYTEA.
Note
Если указывается кодировка локали, убедитесь, что она совпадает с кодировкой базы данных.
See
Обратитесь к разделу «Администрирование сервера» > «Локализация» > «Поддержка локалей» в документации Tantor SE для получения информации о локалях, которые можно указать.
Example
[Состав таблицы (t3)]
col1 | col2 |
---|---|
1001 | aabcababc |
2001 | abcdef |
3001 | aacbaab |
В следующем примере возвращается результат сортировки столбца col2 в таблице t3 по "da_DK.UTF8".
SELECT col1,col2 FROM t3 ORDER BY NLSSORT(col2,'da_DK.UTF8'); col1 | col2 ------+------------ 2001 | abcdef 1001 | aabcababc 3001 | aacbaab (3 row)
F.29.34.2.8. REGEXP_COUNT #
Description
Ищет регулярное выражение в строке и возвращает количество совпадений.
Общие правила
REGEXP_COUNT возвращает количество раз, когда шаблон встречается в исходной строке. Он возвращает целое число, указывающее на количество вхождений шаблона. Если совпадений не найдено, то функция возвращает 0.
Поиск начинается с указанной начальной позиции startPos в string, по умолчанию начинается с начала string.
startPos - это положительное целое число, отрицательные значения для поиска с конца string не допускаются.
flags - это символьное выражение, которое позволяет вам изменить поведение сопоставления по умолчанию функции. Значение flags может включать один или несколько из следующих символов:
‘i’: сопоставление без учета регистра.
‘c’: с учетом регистра и диакритических знаков.
‘n’: точка (.) соответствует символу перехода строки. По умолчанию точка не соответствует символу новой строки.
‘m’: рассматривает исходную строку как несколько строк.
‘x’: игнорирует символы пробелов. По умолчанию, символы пробелов совпадают сами с собой. Если вы пропустите флаги, то:
По умолчанию учитываются регистр и ударения.
Точка (.) не соответствует символу перехода строки.
Исходная строка рассматривается как одна линия.
Example
SELECT REGEXP_COUNT('a'||CHR(10)||'d', 'a.d') FROM DUAL; regexp_count -------------- 0 (1 row) SELECT REGEXP_COUNT('a'||CHR(10)||'d', 'a.d', 1, 'm') FROM DUAL; regexp_count -------------- 0 (1 row) SELECT REGEXP_COUNT('a'||CHR(10)||'d', 'a.d', 1, 'n') FROM DUAL; regexp_count -------------- 1 (1 row) SELECT REGEXP_COUNT('a'||CHR(10)||'d', '^d$', 1, 'm') FROM DUAL; regexp_count -------------- 1 (1 row)
F.29.34.2.9. REGEXP_INSTR #
Description
Возвращает начальную или конечную позицию в строке, где было найдено совпадение для шаблона.
Общие правила
REGEXP_INSTR возвращает целое число, указывающее начальную или конечную позицию найденной подстроки, в зависимости от значения аргумента return_opt. Если совпадение не найдено, то функция возвращает 0.
Поиск начинается с указанной начальной позиции startPos в string, по умолчанию начинается с начала string.
startPos - это положительное целое число, отрицательные значения для поиска с конца string не допускаются.
вхождение - это положительное целое число, указывающее на какое вхождение шаблона в строке следует искать. По умолчанию это 1, что означает первое вхождение шаблона в строку.
return_opt позволяет вам указать, что должно быть возвращено в отношении события:
0, возвращается позиция первого символа вхождения. Это значение по умолчанию.
Возвращается позиция символа, следующего за вхождением.
флаги - это символьное выражение, которое позволяет изменить стандартное поведение сопоставления функции. Смотрите REGEXP_COUNT для подробной информации.
Для шаблона с захватывающей группой, группа - это положительное целое число, указывающее, какая захватывающая группа в шаблоне должна быть возвращена функцией. Захватывающие группы могут быть вложенными, они пронумерованы в порядке, в котором их левые скобки появляются в шаблоне. Если группа равна нулю, то возвращается позиция всей подстроки, которая соответствует шаблону. Если значение группы превышает количество захватывающих групп в шаблоне, функция возвращает ноль. Значение группы равное null возвращает NULL. Значение по умолчанию для группы - ноль.
Example
SELECT REGEXP_INSTR('1234567890', '(123)(4(56)(78))') FROM DUAL; regexp_instr -------------- 1 (1 row) SELECT REGEXP_INSTR('1234567890', '(4(56)(78))', 3) FROM DUAL; regexp_instr -------------- 4 (1 row) SELECT REGEXP_INSTR('123 123456 1234567, 1234567 1234567 12', '[^ ]+', 1, 6) FROM DUAL; regexp_instr -------------- 37 (1 row) SELECT REGEXP_INSTR('199 Oretax Prayers, Riffles Stream, CA', '[S|R|P][[:alpha:]]{6}', 3, 2, 1) FROM DUAL; regexp_instr -------------- 28 (1 row)
F.29.34.2.10. REGEXP_LIKE #
Description
Условие в операторе WHERE запроса, заставляющее запрос возвращать строки, соответствующие заданному шаблону.
Общие правила
REGEXP_LIKE аналогичен условию LIKE, за исключением того, что он выполняет сопоставление с регулярными выражениями, вместо простого сопоставления шаблонов, выполняемого LIKE.
Возвращает булево значение, true, когда шаблон совпадает в строке, false в противном случае.
флаги - это символьное выражение, которое позволяет изменить стандартное поведение сопоставления функции. Смотрите REGEXP_COUNT для подробной информации.
Example
SELECT REGEXP_LIKE('a'||CHR(10)||'d', 'a.d', 'm') FROM DUAL; regexp_like ------------- f (1 row) SELECT REGEXP_LIKE('a'||CHR(10)||'d', 'a.d', 'n') FROM DUAL; regexp_like ------------- t (1 row)
F.29.34.2.11. REGEXP_SUBSTR #
Description
Возвращает строку, которая соответствует шаблону, указанному в вызове функции.
Общие правила
REGEXP_SUBSTR возвращает подстроку, соответствующую результату сопоставления шаблона POSIX регулярного выражения со строкой. Если совпадение не найдено, то функция возвращает NULL.
Поиск начинается с указанной начальной позиции startPos в string, по умолчанию начинается с начала string.
startPos - это положительное целое число, отрицательные значения для поиска с конца string не допускаются.
вхождение - это положительное целое число, указывающее на какое вхождение шаблона в строке следует искать. По умолчанию это 1, что означает первое вхождение шаблона в строку.
флаги - это символьное выражение, которое позволяет изменить стандартное поведение сопоставления функции. Смотрите REGEXP_COUNT для подробной информации.
Для шаблона с захватывающей группой, группа - это положительное целое число, указывающее, какая захватывающая группа в шаблоне должна быть возвращена функцией. Захватывающие группы могут быть вложенными, они пронумерованы в порядке, в котором их левые скобки появляются в шаблоне. Если группа равна нулю, то возвращается позиция всей подстроки, которая соответствует шаблону. Если значение группы превышает количество захватывающих групп в шаблоне, функция возвращает NULL. Значение группы равное null возвращает NULL. Значение по умолчанию для группы равно нулю.
Example
SELECT REGEXP_SUBSTR('number of your street, zipcode town, FR', ',[^,]+') FROM DUAL; regexp_substr ---------------- , zipcode town (1 row) SELECT regexp_substr('number of your street, zipcode town, FR', ',[^,]+', 24) FROM DUAL; regexp_substr --------------- , FR (1 row) SELECT regexp_substr('number of your street, zipcode town, FR', ',[^,]+', 1, 2) FROM DUAL; regexp_substr --------------- , FR (1 row) SELECT regexp_substr('1234567890 1234567890', '(123)(4(56)(78))', 1, 1, 'i', 0) FROM DUAL; regexp_substr --------------- 12345678 (1 row)
F.29.34.2.12. REGEXP_REPLACE #
Description
Возвращает строку, которая соответствует шаблону, указанному в вызове функции.
Общие правила
REGEXP_REPLACE возвращает измененную версию исходной строки, где вхождения POSIX регулярного выражения, найденные в исходной строке, заменяются на указанную строку замены. Если совпадение не найдено или запрашиваемое вхождение превышает количество совпадений, то возвращается неизменная исходная строка.
Поиск и замена начинаются с указанной начальной позиции startPos в string, по умолчанию начинается с начала string.
startPos - это положительное целое число, отрицательные значения для поиска с конца string не допускаются.
вхождение - это положительное целое число, указывающее, какое вхождение шаблона в строке следует искать и заменять. Значение по умолчанию - 0, что означает все вхождения шаблона в строке.
флаги - это символьное выражение, которое позволяет изменить стандартное поведение сопоставления функции. Смотрите REGEXP_COUNT для подробной информации.
Example
SELECT regexp_replace('512.123.4567 612.123.4567', '([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})', '(\1) \2-\3') FROM DUAL; regexp_replace ------------------------------- (512) 123-4567 (612) 123-4567 (1 row) SELECT oracle.REGEXP_REPLACE('number your street, zipcode town, FR', '( ){2,}', ' ', 9); regexp_replace ---------------------------------------- number your street, zipcode town, FR (1 row) SELECT oracle.REGEXP_REPLACE('number your street, zipcode town, FR', '( ){2,}', ' ', 9, 2); regexp_replace --------------------------------------------- number your street, zipcode town, FR (1 row)
F.29.34.2.13. RPAD #
Description
Дополняет строку до указанной длины последовательностью символов справа.
Syntax
Диаграмма F.17. RPAD
![RPAD](images/orafce/RPAD.gif)
Общие правила
RPAD возвращает результат после многократного дополнения конца строки str символами дополнения paddingStr до тех пор, пока строка не достигнет длины len.
Если строка имеет тип CHAR, символы заполнения добавляются к строке без удаления пробелов в конце.
В результирующей строке символы полной ширины распознаются как имеющие длину 2, а символы полуширины - как имеющие длину 1. Если символ полной ширины не может быть включен в результирующую строку, потому что доступно место только для одного символа полуширины, строка дополняется однобайтовым пробелом.
Тип возвращаемого значения - TEXT.
Note
Приведенная выше спецификация RPAD использует orafce, при этом поведение отличается от поведения RPAD в Tantor SE. Параметр search_path должен быть изменен, чтобы он соответствовал спецификации orafce.
Information
Общие правила для RPAD в Tantor SE следующие:
Если строка имеет тип CHAR, то удаляются пробелы в конце и затем к строке добавляются символы заполнения.
Длина результата - это количество символов.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Строковые функции и операторы» в документации Tantor SE для получения информации о RPAD.
Example
В следующем примере возвращается 10-символьная строка, которая была сформирована путем дополнения строки "abc" символом "a" справа.
SELECT RPAD('abc',10,'a') FROM DUAL; rpad ------------ abcaaaaaaa (1 row)
F.29.34.2.14. RTRIM #
Description
Удаляет указанные символы с конца строки.
Syntax
Диаграмма F.18. RTRIM
![RTRIM](images/orafce/RTRIM.gif)
Общие правила
RTRIM возвращает строку с удаленными из конца строки trimChars символами из строки str.
Если указано несколько символов для обрезки, удаляются все символы, соответствующие символам обрезки. Если trimChars прне указан, удаляются все завершающие полуширинные пробелы.
Тип возвращаемого значения - TEXT.
Note
Приведенная выше спецификация RTRIM использует orafce для своего поведения, которое отличается от поведения RTRIM в Tantor SE. Параметр search_path должен быть изменен, чтобы его поведение соответствовало спецификации orafce.
Information
Общее правило для RTRIM в Tantor SE следующее:
Если строка имеет тип CHAR, то сначала удаляются пробелы в конце строки, а затем удаляются символы обрезки.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Строковые функции и операторы» в документации Tantor SE для получения информации о RTRIM.
Example
В следующем примере возвращается строка, из которой удалено "ab" с конца "aabcab".
SELECT RTRIM('aabcab','ab') FROM DUAL; rtrim ------- aabc (1 row)
F.29.34.2.15. SUBSTR #
Description
Извлекает часть строки, используя символы для указания позиции и длины.
Syntax
Диаграмма F.19. SUBSTR
![SUBSTR](images/orafce/SUBSTR.gif)
Общие правила
SUBSTR извлекает и возвращает подстроку строки str, начиная с позиции startPos, для числа символов len.
Когда startPos положительно, это будет числом символов от начала строки.
Когда startPos равно 0, он будет рассматриваться как 1.
Когда startPos отрицательный, это будет количество символов от конца строки.
Когда len не указан, возвращаются все символы до конца строки. NULL возвращается, когда len меньше 1.
Для startPos и len, укажите целое число или тип NUMERIC. Если указаны числа, включающие десятичные знаки, они округляются до целых чисел.
Тип возвращаемого значения - TEXT.
Note
Существует два типа SUBSTR. Один ведет себя как описано выше, и один, который ведет себя так же, как SUBSTRING. Параметр search_path должен быть изменен, чтобы он вел себя так же, как указано в описании выше.
Если изменение не было реализовано, SUBSTR такой же как SUBSTRING.
Information
Общие правила для SUBSTRING следующие:
Начальная позиция будет с начала строки, независимо от того, положительная ли начальная позиция, 0, или отрицательная.
Когда len не указан, возвращаются все символы до конца строки.
Возвращается пустая строка, если не извлекается ни одна строка или len меньше 1.
See
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Строковые функции и операторы» в документации Tantor SE для получения информации о SUBSTRING.
Example
В следующем примере извлекается часть строки "ABCDEFG".
SELECT SUBSTR('ABCDEFG',3,4) "Substring" FROM DUAL; Substring ----------- CDEF (1 row) SELECT SUBSTR('ABCDEFG',-5,4) "Substring" FROM DUAL; Substring ----------- CDEF (1 row)
F.29.34.2.16. SUBSTRB #
Description
Извлекает часть строки, используя байты для указания позиции и длины.
Syntax
Диаграмма F.20. SUBSTRB
![SUBSTRB](images/orafce/SUBSTRB.gif)
Общие правила
SUBSTRB извлекает и возвращает подстроку строки str, начиная с байтовой позиции startPos, для числа байт len.
Когда startPos равно 0 или отрицательно, извлечение начинается с позиции, найденной путем вычитания 1 из начальной позиции и сдвига на это количество позиций влево.
Когда len не указан, возвращаются все байты до конца строки.
Возвращается пустая строка, если не извлекается ни одна строка или len меньше 1.
Для startPos и len, укажите тип SMALLINT или INTEGER.
Тип возвращаемого значения - VARCHAR2.
Note
Внешняя спецификация SUBSTRB отличается от спецификации SUBSTR, добавленной orafce, что соответствует SUBSTRING из Tantor SE.
Example
В следующем примере извлекается часть строки "aaabbbccc".
SELECT SUBSTRB('aaabbbccc',4,3) FROM DUAL; substrb ----------- bbb (1 row) SELECT SUBSTRB('aaabbbccc',-2,6) FROM DUAL; substrb ----------- aaa (1 row)
F.29.34.3. Функции даты/времени #
Следующие функции даты/времени поддерживаются:
ADD_MONTHS
DBTIMEZONE
LAST_DAY
MONTHS_BETWEEN
NEXT_DAY
ROUND
SESSIONTIMEZONE
SYSDATE
TRUNC
Note
Если тип DATE отображается только в функциях даты/времени, эти функции могут быть использованы как в orafce, так и в Tantor SE.
F.29.34.3.1. ADD_MONTHS #
Description
Добавляет месяцы к дате.
Syntax
Диаграмма F.21. ADD_MONTHS
![ADD_MONTHS](images/orafce/ADD_MONTHS.gif)
Общие правила
ADD_MONTHS возвращает дату плюс месяцы.
Для date, укажите тип DATE.
Для месяцев, укажите тип SMALLINT или INTEGER.
Если указано отрицательное значение для месяцев, количество месяцев вычитается из даты.
Тип возвращаемого значения - DATE.
Note
Если используется тип DATE от orafce, необходимо заранее указать «oracle» для search_path.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Example
Пример ниже показывает результат добавления 3 месяцев к дате 1 мая 2016 года.
SELECT ADD_MONTHS(DATE'2016/05/01',3) FROM DUAL; add_months --------------------- 2016-08-01 00:00:00 (1 row)
F.29.34.3.2. DBTIMEZONE #
Description
Возвращает значение часового пояса базы данных.
Syntax
Диаграмма F.22. DBTIMEZONE
![DBTIMEZONE](images/orafce/DBTIMEZONE.gif)
Общие правила
DBTIMEZONE возвращает значение часового пояса базы данных.
Тип возвращаемого значения - TEXT.
Note
Если используется DBTIMEZONE, необходимо заранее указать «oracle» для search_path.
Часовой пояс базы данных по умолчанию установлен как "GMT". Чтобы изменить часовой пояс, измените параметр "orafce.timezone". Пример использования оператора SET показан ниже.
Пример установки orafce.timezone с использованием оператора SET
SET orafce.timezone = 'Japan';
Настройки orafce.timezone могут быть установлены с использованием любого из методов для установки параметров сервера.
Если SQL-запрос выполняется с установленным orafce.timezone, следующее сообщение может быть отображено, однако, настройки параметров включены, поэтому вы можете это игнорировать.
WARNING: unrecognized configuration parameter "orafce.timezone"
Часовые пояса, которые можно установить в "orafce.timezone", такие же, как для серверного параметра "TimeZone".
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Типы даты/времени» в документации Tantor SE для получения информации о часовом поясе.
Example
В следующем примере возвращается результат DBTIMEZONE.
SELECT DBTIMEZONE() FROM DUAL; dbtimezone ------------ GMT (1 row)
F.29.34.3.3. LAST_DAY #
Description
Возвращает последний день месяца, в который попадает указанная дата.
Syntax
Диаграмма F.23. LAST_DAY
![LAST_DAY](images/orafce/LAST_DAY.gif)
Общие правила
LAST_DAY возвращает последний день месяца, в который попадает указанная дата.
Для date, укажите тип DATE.
Тип возвращаемого значения - DATE.
Note
Если используется тип DATE от orafce, необходимо заранее указать «oracle» для search_path.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Example
В приведенном ниже примере возвращается последняя дата "01 февраля 2016 года".
SELECT LAST_DAY(DATE'2016/02/01') FROM DUAL; last_day --------------------- 2016-02-29 00:00:00 (1 row)
F.29.34.3.4. MONTHS_BETWEEN #
Description
Возвращает количество месяцев между двумя датами.
Syntax
Диаграмма F.24. MONTHS_BETWEEN
![MONTHS_BETWEEN](images/orafce/MONTHS_BETWEEN.gif)
Общие правила
MONTHS_BETWEEN возвращает разницу в количестве месяцев между датой1 и датой2.
Для date1 и date2, укажите тип DATE.
Если date2 раньше, чем date1, возвращаемое значение будет отрицательным.
Если две даты приходятся на один и тот же день, или каждая из двух дат является последним днем месяца, к которому они принадлежат, возвращается целое число. Если дни разные, один месяц считается равным 31 дню, и возвращается значение с разницей в количестве дней, деленной на 31.
Тип возвращаемого значения - NUMERIC.
Note
Если используется тип DATE от orafce, необходимо заранее указать «oracle» для search_path.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Example
В следующем примере возвращается разница между месяцами 15 марта 2016 года и 15 ноября 2015 года.
SELECT MONTHS_BETWEEN(DATE'2016/03/15', DATE'2015/11/15') FROM DUAL; months_between ---------------- 4 (1 row)
F.29.34.3.5. NEXT_DAY #
Description
Возвращает дату первого случая определенного дня недели, который следует за указанной датой.
Syntax
Диаграмма F.25. NEXT_DAY
![NEXT_DAY](images/orafce/NEXT_DAY.gif)
Общие правила
NEXT_DAY возвращает дату, соответствующую первому экземпляру dayOfWk, который следует за date.
Для date, укажите тип DATE.
Укажите числовое значение или строку, указывающую день недели.
Значения, которые можно указать для дня
Пример настройки | Обзор |
---|---|
1 | Можно указать от 1 (воскресенье) до 7 (суббота) |
'Sun', или 'Sunday' | Отображение дня на английском языке |
’*’ | Отображение дня на японском языке |
Тип возвращаемого значения - DATE.
Note
Если используется тип DATE от orafce, необходимо заранее указать «oracle» для search_path.
Возможность использования японского языка для ввода дней предоставляется собственной спецификацией orafce. Японский язык не может использоваться для ввода дней при использовании функций даты/времени, отличных от NEXT_DAY (таких как TO_DATE).
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Example
В приведенном ниже примере возвращается дата первой пятницы после или на дату "1 мая 2016 года".
SELECT NEXT_DAY(DATE'2016/05/01', 'Friday') FROM DUAL; next_day --------------------- 2016-05-06 00:00:00 (1 row)
F.29.34.3.6. ROUND #
Description
Округляет дату.
Syntax
Диаграмма F.26. ROUND
![ROUND](images/orafce/ROUND.gif)
Общие правила
ROUND возвращает дату, округленную до единицы, указанной в формате модели fmt.
Для date, укажите тип DATE или TIMESTAMP.
Укажите модель формата в виде строки.
Значения, которые можно указать для модели формата
Модель форматирования | Единица округления |
---|---|
Y,YY,YYY,YYYY, SYYYY,YEAR,SYEAR | Год |
I,IY,IYY,IYYY | Год (значения, включающие календарные недели, в соответствии со стандартом ISO) |
Q | Квартал |
WW | Неделя (первый день года) |
IW | Неделя (Понедельник этой недели) |
W | Неделя (первый рабочий день, на который приходится первый день месяца) |
DAY,DY,DAY | Неделя (воскресенье той недели) |
MONTH,MON,MM,RM | Месяц |
CC,SCC | Век |
DDD,DD,J | День |
HH,HH12,HH24 | Час |
MI | Минута |
Если десятичные знаки округляются: для года границей для округления является 1 июля; для месяца - это 16 число; а для недели - это четверг.
Если fmt прне указан, дата округляется до дня.
Если для даты указан тип DATE Tantor SE, этот тип DATE будет типом данных возвращаемого значения. Если для даты указан тип TIMESTAMP, тип данных будет TIMESTAMP WITH TIME ZONE, независимо от того, используется ли часовой пояс.
Example
В приведенном ниже примере возвращается результат "20 июня 2016 18:00:00", округленный до воскресенья недели.
SELECT ROUND(TIMESTAMP'2016/06/20 18:00:00','DAY') FROM DUAL; round ------------------------ 2016-06-19 00:00:00+09 (1 row)
F.29.34.3.7. SESSIONTIMEZONE #
Description
Возвращает часовой пояс сессии.
Syntax
Диаграмма F.27. SESSIONTIMEZONE
![SESSIONTIMEZONE](images/orafce/SESSIONTIMEZONE.gif)
Общие правила
SESSIONTIMEZONE возвращает значение часового пояса между сессиями.
Тип возвращаемого значения - TEXT.
Note
Если используется SESSIONTIMEZONE, необходимо заранее указать «oracle» для search_path.
Значение, возвращаемое SESSIONTIMEZONE, становится значением, установленным в параметре сервера "TimeZone".
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Example
В следующем примере возвращается часовой пояс сессии.
SELECT SESSIONTIMEZONE() FROM DUAL; sessiontimezone ----------------- Japan (1 row)
F.29.34.3.8. SYSDATE #
Description
Возвращает системную дату.
Syntax
Диаграмма F.28. SYSDATE
![SYSDATE](images/orafce/SYSDATE.gif)
Общие правила
SYSDATE возвращает системную дату.
Тип возвращаемого значения - это тип DATE от orafce.
Note
Если используется SYSDATE, необходимо заранее указать «oracle» для search_path.
Дата, возвращаемая SYSDATE, зависит от значения часового пояса базы данных orafce.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к "DBTIMEZONE" для получения информации о значениях часового пояса базы данных.
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Типы даты/времени» в документации Tantor SE для получения информации о часовом поясе.
Example
В следующем примере возвращается системная дата.
SELECT SYSDATE() FROM DUAL; sysdate --------------------- 2016-06-22 08:06:51 (1 row)
F.29.34.3.9. TRUNC #
Description
Обрезает дату.
Syntax
Диаграмма F.29. TRUNC
![TRUNC](images/orafce/TRUNC.gif)
Общие правила
TRUNC возвращает дату, усеченную до единицы, указанной в формате модели fmt.
Для date, укажите тип DATE или TIMESTAMP.
Укажите модель формата в виде строки. Значения, которые могут быть указаны, такие же, как для ROUND.
Если fmt прне указан, дата обрезается по дням.
Если для даты указан тип DATE Tantor SE, этот тип DATE будет типом данных возвращаемого значения. Если для даты указан тип TIMESTAMP, тип данных будет TIMESTAMP WITH TIME ZONE, независимо от того, используется ли часовой пояс.
See
Обратитесь к "ROUND" для получения информации о значениях, которые могут быть указаны для модели формата.
Example
В приведенном ниже примере возвращается результат "10 августа 2016 15:30:00", усеченный по дню.
SELECT TRUNC(TIMESTAMP'2016/08/10 15:30:00','DDD') FROM DUAL; trunc ------------------------ 2016-08-10 00:00:00+09 (1 row)
F.29.34.4. Функции форматирования типов данных #
Поддерживаются следующие функции форматирования типов данных:
TO_CHAR
TO_DATE
TO_MULTI_BYTE
TO_NUMBER
TO_SINGLE_BYTE
F.29.34.4.1. TO_CHAR #
Description
Преобразует значение в строку.
Syntax
Диаграмма F.30. TO_CHAR
![TO_CHAR](images/orafce/TO_CHAR.gif)
Общие правила
TO_CHAR преобразует указанное число или дату/время в строку.
Для num, укажите числовой тип данных.
Для date, укажите тип DATE или TIMESTAMP. Также вы должны заранее установить формат даты/времени для переменной orafce.nls_date_format. Пример настройки с использованием оператора SET показан ниже. Пример настройки orafce.nls_date_format с использованием оператора SET
SET orafce.nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
Тип возвращаемого значения - TEXT.
Note
Если используется TO_CHAR для указания значений даты/времени, необходимо заранее указать "oracle" для search_path.
Настройки orafce.nls_date_format могут быть установлены с использованием любого из методов для установки параметров сервера.
Если установлен orafce.nls_date_format, при выполнении SQL-запроса может отображаться следующее сообщение, однако настройки параметров активированы, поэтому вы можете это игнорировать.
WARNING: unrecognized configuration parameter "orafce.nls_date_format"
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу «Администрирование сервера» > «Конфигурация сервера» > «Установка параметров» в документации Tantor SE для получения информации о том, как установить параметры сервера.
Example
В следующем примере числовое значение «123.45» возвращается как строка.
SELECT TO_CHAR(123.45) FROM DUAL; to_char --------- 123.45 (1 row)
F.29.34.4.2. TO_DATE #
Description
Преобразует строку в дату в соответствии с указанным форматом.
Syntax
Диаграмма F.31. TO_DATE
![TO_DATE](images/orafce/TO_DATE.gif)
Общие правила
TO_DATE преобразует строку str в дату в соответствии с указанным форматом fmt.
Укажите строку, указывающую дату/время.
Укажите требуемый формат даты/времени. Если он не указан, используется формат, указанный в переменной oracle.nls_date_format. Если переменная oracle.nls_date_format не была установлена, используется существующая интерпретация ввода даты/времени. Пример установки с помощью оператора SET показан ниже.
Пример установки orafce.nls_date_format с использованием оператора SET
SET orafce.nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
Тип возвращаемого значения - TIMESTAMP.
Note
Вышеуказанная спецификация TO_DATE использует orafce, при этом поведение отличается от поведения TO_DATE в Tantor SE. Параметр search_path должен быть изменен, чтобы он соответствовал спецификации orafce.
Настройки orafce.nls_date_format могут быть установлены с использованием любого из методов для установки параметров сервера.
Если установлен orafce.nls_date_format, при выполнении SQL-запроса может отображаться следующее сообщение, однако настройки параметров активированы, поэтому вы можете это игнорировать.
WARNING: unrecognized configuration parameter "orafce.nls_date_format"
Information
Общее правило для TO_DATE для указания формата типа данных Tantor SE следующее:
Тип возвращаемого значения - это тип DATE Tantor SE.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
Обратитесь к разделу "Язык SQL" > "Функции и операторы" > "Функции форматирования типов данных" в документации Tantor SE для получения информации о TO_DATE в Tantor SE.
Обратитесь к разделу «Администрирование сервера» > «Конфигурация сервера» > «Установка параметров» в документации Tantor SE для получения информации о том, как установить параметры сервера.
Обратитесь к разделу «Поддержка даты/времени» > «Интерпретация ввода даты/времени» в документации Tantor SE для получения информации об интерпретации существующего ввода даты/времени.
Example
В следующем примере строка «2016/12/31» преобразуется в дату и возвращается.
SELECT TO_DATE('2016/12/31','YYYY/MM/DD') FROM DUAL; to_date --------------------- 2016-12-31 00:00:00 (1 row)
F.29.34.4.3. TO_MULTI_BYTE #
Description
Преобразует строку с одним байтом в строку с несколькими байтами.
Syntax
Диаграмма F.32. TO_MULTI_BYTE
![TO_MULTI_BYTE](images/orafce/TO_MULTI_BYTE.gif)
Общие правила
TO_MULTI_BYTE преобразует символы половинной ширины в строке str в символы полной ширины и возвращает преобразованную строку.
Могут быть преобразованы только полуширинные буквенно-цифровые символы, пробелы и символы.
Тип возвращаемого значения - TEXT.
Example
В следующем примере "abc123" преобразуется в символы полной ширины и возвращается.
SELECT TO_MULTI_BYTE('abc123') FROM DUAL; to_multi_byte --------------- ****** (1 row)
"******" это многобайтовый "abc123".
F.29.34.4.4. TO_NUMBER #
Description
Преобразует значение в число в соответствии с указанным форматом.
Syntax
Диаграмма F.33. TO_NUMBER
![TO_NUMBER](images/orafce/TO_NUMBER.gif)
Общие правила
TO_NUMBER преобразует указанное значение в числовое значение в соответствии с указанным форматом fmt.
Для num, укажите числовой тип данных.
Для str, укажите строку, указывающую числовое значение. Числовые значения должны состоять только из преобразуемых символов.
Укажите требуемый числовой формат данных. Указанное числовое значение обрабатывается как есть в качестве выражения типа данных.
Тип возвращаемого значения - NUMERIC.
See
Обратитесь к разделу «Язык SQL» > «Функции и операторы» > «Функции форматирования типов данных» в документации Tantor SE для получения информации о форматах числовых значений.
Example
В следующем примере числовой литерал "-130.5" преобразуется в числовое значение и возвращается.
SELECT TO_NUMBER(-130.5) FROM DUAL; to_number ----------- -130.5 (1 row)
F.29.34.4.5. TO_SINGLE_BYTE #
Description
Преобразует строку многобайтовых символов в строку однобайтовых символов.
Syntax
Диаграмма F.34. TO_SINGLE_BYTE
![TO_SINGLE_BYTE](images/orafce/TO_SINGLE_BYTE.gif)
Общие правила
TO_SINGLE_BYTE преобразует символы полной ширины в строке str в символы полуширины и возвращает преобразованную строку.
Только символы полной ширины, пробелы и символы, которые могут быть отображены в половинной ширине, могут быть преобразованы.
Тип возвращаемого значения - TEXT.
Example
В следующем примере "******" преобразуется в символы половинной ширины и возвращается. "******" - это многобайтовое "xyz999".
SELECT TO_SINGLE_BYTE('******') FROM DUAL; to_single_byte ---------------- xyz999 (1 row)
F.29.34.5. Условные выражения #
Следующие функции для выполнения сравнений поддерживаются:
DECODE
GREATEST
LEAST
LNNVL
NANVL
NVL
NVL2
F.29.34.5.1. DECODE #
Description
Сравнивает значения и, если они совпадают, возвращает соответствующее значение.
Syntax
Диаграмма F.35. DECODE
![DECODE](images/orafce/DECODE.gif)
Общие правила
DECODE сравнивает значения выражения value, подлежащего преобразованию, и искомые значения по одному. Если значения совпадают, возвращается соответствующее результату значение. Если ни одно из значений не совпадает, возвращается значение по умолчанию, если оно было указано. Возвращается значение NULL, если значение по умолчанию не было указано.
Если одно и то же значение поиска указывается более одного раза, то возвращаемым результатом будет значение, указанное для первого вхождения значения поиска.
Следующие типы данных могут быть использованы в результатах значений и в значении по умолчанию:
CHAR
VARCHAR
VARCHAR2
NCHAR
NCHAR VARYING
NVARCHAR2
TEXT
INTEGER
BIGINT
NUMERIC
DATE
TIME WITHOUT TIME ZONE
TIMESTAMP WITHOUT TIME ZONE
TIMESTAMP WITH TIME ZONE
Должен быть указан один и тот же тип данных для преобразуемых значений и значений поиска. Однако обратите внимание, что можно указать и разные типы данных, если в значении поиска указан литерал, и выражение значения, подлежащее преобразованию, содержит типы данных, которые могут быть преобразованы.
Если результаты и значения по умолчанию являются литералами, типы данных для этих значений будут показаны ниже:
Если все значения являются строковыми литералами, все они станут типами символов.
Если имеется один или несколько числовых литералов, все они станут числовыми типами.
Если имеется одно или несколько прямых преобразований в типы datetime/time, все они станут типами datetime/time.
Если результаты и значение по умолчанию содержат смесь литералов и не-литералов, литералы будут преобразованы в типы данных не-литералов.
Для всех результатов и для значения по умолчанию должен быть указан один и тот же тип данных. Однако, можно указать различные типы данных, если тип данных любого из результатов или значения по умолчанию может быть преобразован - эти типы данных перечислены ниже:
Комбинации типов данных, которые могут быть преобразованы с помощью DECODE (сводка)
Другие значения результата или значение по умолчанию | ||||
---|---|---|---|---|
Числовой тип | Символьный тип | Тип даты/времени | ||
Результат (любой) | Числовой тип | Y | N | N |
Символьный тип | N | Y | N | |
Тип даты/времени | N | N | S(*1) |
Y: Может быть преобразован
S: Некоторые типы данных могут быть преобразованы
N: Невозможно конвертировать
*1: Типы данных, которые могут быть преобразованы для типов даты/времени, перечислены ниже:
Результат и значение по умолчанию типы данных даты/времени, которые могут быть преобразованы с помощью DECODE
Другие значения результата или значение по умолчанию | |||||
---|---|---|---|---|---|
DATE |
TIME |
TIMESTAMP |
TIMESTAMP | ||
Результат (любой) | DATE | Y | N | Y | Y |
TIME | N | Y | N | N | |
TIMESTAMP | Y | N | Y | Y | |
TIMESTAMP | Y | N | Y | Y |
Y: Может быть преобразован
N: Невозможно конвертировать
Тип данных возвращаемого значения будет типом данных в результате или значении по умолчанию, которое является самым длинным и имеет наибольшую точность.
Example
В следующем примере значение col3 в таблице t1 сравнивается и преобразуется в другое значение. Если значение col3 совпадает с искомым значением 1, возвращается значение будет "один". Если значение col3 не совпадает ни с одним из искомых значений 1, 2 или 3, возвращается значение по умолчанию "другое число".
SELECT col1, DECODE(col3, 1, 'one', 2, 'two', 3, 'three', 'other number') "num-word" FROM t1; col1 | num-word ------+---------- 1001 | one 1002 | two 1003 | three (3 rows)
F.29.34.5.2. GREATEST и LEAST #
Description
Функции GREATEST и LEAST выбирают наибольшее или наименьшее значение из списка любого количества выражений. Все выражения должны быть преобразуемы в общий тип данных, который будет типом результата.
Syntax
GREATEST(value [, ...]) LEAST(value [, ...])
Общие правила
Эти две функции ведут себя так же, как и в Tantor SE, за исключением того, что вместо возвращения NULL только когда все параметры NULL, они возвращают NULL, когда один из параметров NULL, как в Oracle.
Example
В следующем примере, col1 и col3 из таблицы t1 возвращаются, когда значение col3 составляет 2000 или меньше, или равно null.
SELECT GREATEST ('C', 'F', 'E') greatest ---------- F (1 row)
\pset null ### SELECT LEAST ('C', NULL, 'E') greatest ---------- ### (1 row)
F.29.34.5.3. LNNVL #
Description
Определяет, является ли значение TRUE или FALSE для указанного условия.
Syntax
Диаграмма F.36. LNNVL
![LNNVL](images/orafce/LNNVL.gif)
Общие правила
LNNVL определяет, является ли значение TRUE или FALSE для указанного условия. Если результат условия является FALSE или NULL, возвращается TRUE. Если результат условия является TRUE, возвращается FALSE.
Выражение для возврата TRUE или FALSE указывается в условии.
Тип возвращаемого значения - BOOLEAN.
Example
В следующем примере, col1 и col3 из таблицы t1 возвращаются, когда значение col3 составляет 2000 или меньше, или равно null.
SELECT col1,col3 FROM t1 WHERE LNNVL( col3 > 2000 ); col1 | col3 ------+------ 1001 | 1000 1002 | 2000 2002 | (3 row)
F.29.34.5.4. NANVL #
Description
Возвращает заменяющее значение, когда значение не является числом (NaN).
Syntax
Диаграмма F.37. NANVL
![NANVL](images/orafce/NANVL.gif)
Общие правила
NANVL возвращает заменяющее значение, когда указанное значение не является числом (NaN). Заменяющее значение может быть либо числом, либо строкой, которую можно преобразовать в число.
Для expr и substituteNum указывается числовой тип данных. Если expr и substituteNum имеют разные типы данных, они будут преобразованы в тип данных с большей длиной или точностью, и именно этот тип данных будет возвращен.
Для substituteNum, вы также можете указать строку, обозначающую числовое значение.
Тип данных, используемый для возвращаемого значения, если строка указана в качестве заменяющего значения, будет таким же, как тип данных expr.
Example
В следующем примере возвращается значение "0", если значение col1 в таблице t1 является значением NaN.
SELECT col1, NANVL(col3,0) FROM t1; col1 | nanvl ------+------- 2001 | 0 (1 row)
F.29.34.5.5. NVL #
Description
Возвращает заменяющее значение, когда значение является NULL.
Syntax
Диаграмма F.38. NVL
![NVL](images/orafce/NVL.gif)
Общие правила
NVL возвращает заменяющее значение, когда указанное значение равно NULL. Когда expr1 равно NULL, возвращается expr2. Когда expr1 не равно NULL, возвращается expr1.
Укажите одинаковые типы данных для expr1 и expr2. Однако, если константа указана в expr2, и тип данных также может быть преобразован expr1, можно указать разные типы данных. Когда это происходит, преобразование с помощью expr2 выполняется для соответствия типу данных в expr1, поэтому значение expr2, возвращаемое при значении NULL в expr1, будет значением, преобразованным в тип данных expr1. Это не требуется для типов (numeric, int) и (bigint, int).
Example
В следующем примере возвращается значение "IS NULL", если значение col1 в таблице t1 является значением NULL.
SELECT col2, NVL(col1,'IS NULL') "nvl" FROM t1; col2 | nvl ------+--------- aaa | IS NULL (1 row)
F.29.34.5.6. NVL2 #
Description
Возвращает заменяющее значение на основе того, является ли значение NULL или не NULL.
Syntax
Диаграмма F.39. NVL2
![NVL2](images/orafce/NVL2.gif)
Общие правила
NVL2 возвращает заменяющее значение на основе того, является ли указанное значение NULL или не NULL. Когда expr равно NULL, возвращается substitute2. Когда это не NULL, возвращается substitute1.
Укажите одинаковые типы данных для expr, substitute1 и substitute2. Однако, если в substitute1 или substitute2 указан литерал, и тип данных также может быть преобразован с помощью expr, можно указать разные типы данных. Когда это происходит, substitute1 или substitute2 преобразуется, чтобы соответствовать типу данных в expr, поэтому значение substitute2, возвращаемое при значении NULL в expr, будет значением, преобразованным к типу данных expr.
Example
В следующем примере, если значение в столбце col1 в таблице t1 является NULL, возвращается "IS NULL", а если не NULL, возвращается "IS NOT NULL".
SELECT col2, NVL2(col1,'IS NOT NULL','IS NULL') FROM t1; col2 | nvl2 ------+--------- aaa | IS NULL bbb | IS NOT NULL (2 row)
F.29.34.6. Агрегатные функции #
Поддерживаются следующие агрегатные функции:
LISTAGG
MEDIAN
F.29.34.6.1. LISTAGG #
Description
Возвращает объединенный, разделенный список строковых значений.
Syntax
Диаграмма F.40. LISTAGG
![LISTAGG](images/orafce/LISTAGG.gif)
Общие правила
LISTAGG конкатенирует и разделяет набор строковых значений и возвращает результат.
Для разделителя, укажите строку. Если разделитель не указан, возвращается список строк без разделителя.
Тип возвращаемого значения - TEXT.
Example
В следующем примере возвращается результат со значениями столбца col2 в таблице t1, разделенными символом ‘:’.
SELECT LISTAGG(col2,':') FROM t1; listagg ------------------- AAAAA:BBBBB:CCCCC (1 row)
F.29.34.6.2. MEDIAN #
Description
Вычисляет медиану набора чисел.
Syntax
Диаграмма F.41. MEDIAN
![MEDIAN](images/orafce/MEDIAN.gif)
Общие правила
MEDIAN возвращает медиану набора чисел.
Числа должны быть числового типа данных.
Тип возвращаемого значения будет REAL, если числа имеют тип REAL, или DOUBLE PRECISION, если указан любой другой тип.
Example
В следующем примере возвращается медиана столбца col3 в таблице t1.
SELECT MEDIAN(col3) FROM t1; median -------- 2000 (1 row)
F.29.34.7. Функции, возвращающие внутреннюю информацию #
Поддерживаются следующие функции, возвращающие внутреннюю информацию:
DUMP
F.29.34.7.1. DUMP #
Description
Возвращает внутреннюю информацию значения.
Syntax
Диаграмма F.42. DUMP
![DUMP](images/orafce/DUMP.gif)
Общие правила
DUMP возвращает внутреннюю информацию о значениях, указанных в выражениях, в отображаемом формате, который соответствует формату вывода.
Внутренний код (Typ) типа данных, длина данных (Len) и внутреннее представление данных выводятся в качестве внутренней информации.
Любой тип данных может быть указан для выражений.
Формат отображения (основание n) внутреннего представления данных указывается для формата вывода. Могут быть указаны основания 8, 10 и 16. Если они не указаны, по умолчанию используется 10.
Тип возвращаемого значения - VARCHAR.
Note
Информация, выводимая DUMP, будет полной внутренней информацией. Следовательно, значения могут изменяться из-за обновлений продукта и так далее.
Example
В следующем примере возвращается внутренняя информация столбца col1 в таблице t1.
SELECT col1, DUMP(col1) FROM t1; col1 | dump ------+------------------------------------ 1001 | Typ=25 Len=8: 32,0,0,0,49,48,48,49 1002 | Typ=25 Len=8: 32,0,0,0,49,48,48,50 1003 | Typ=25 Len=8: 32,0,0,0,49,48,48,51 (3 row)
F.29.34.7.2. Оператор Даты и Времени #
Следующие операторы datetime поддерживаются для типа DATE в orafce.
Оператор даты и времени
Операция | Пример | Результат |
---|---|---|
+ | DATE’2016/01/01’ + 10 | 2016-01-11 00:00:00 |
- | DATE’2016/03/20’ - 35 | 2016-02-14 00:00:00 |
- | DATE’2016/09/01’ - DATE’2015/12/31’ | 245 |
Note
Если вы используете операторы datetime для типа DATE в orafce, необходимо заранее указать «oracle» для search_path.
See
Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.
F.29.35. Глава 6 Справочник по пакетам #
"Пакет" - это группа функций, объединенных схемами, которые имеют единую функциональность и используются путем вызова из PL/pgSQL.
Поддерживаются следующие пакеты:
DBMS_ALERT
DBMS_ASSERT
DBMS_OUTPUT
DBMS_PIPE
DBMS_RANDOM
DBMS_UTILITY
UTL_FILE
Для вызова различных функций из PL/pgSQL используйте оператор PERFORM или оператор SELECT, используя имя пакета для уточнения имени функции. См пояснения по каждой из функций пакета для получения информации о формате вызова.
F.29.35.1. DBMS_ALERT #
Overview
Пакет DBMS_ALERT отправляет оповещения из сессии PL/pgSQL в несколько других сессий PL/pgSQL.
Этот пакет может быть использован при обработке 1:N, например, при отправке уведомлений об оповещениях из данной сессии PL/pgSQL в другую сессию PL/pgSQL одновременно.
Features
Функция | Описание |
---|---|
REGISTER | Регистрирует указанное предупреждение. |
REMOVE | Удаляет указанное предупреждение. |
REMOVEALL | Удаляет все предупреждения из сессии. |
SIGNAL | Уведомляет об оповещениях. |
WAITANY | Ожидает уведомления о любых оповещениях, на которые зарегистрирована сессия. |
WAITONE | Ожидает уведомления о конкретном оповещении, на которые зарегистрирована сессия. |
Syntax
Диаграмма F.43. DBMS_ALERT
![DBMS_ALERT](images/orafce/DBMS_ALERT.gif)
F.29.35.1.1. Описание функций #
Этот раздел объясняет каждую функцию DBMS_ALERT.
REGISTER
REGISTER регистрирует указанное предупреждение для сессии. Зарегистрировав предупреждения для сессии, можно получать уведомления SIGNAL.
Укажите название предупреждения.
Оповещения чувствительны к регистру.
В рамках одной сессии можно зарегистрировать несколько оповещений. Если регистрируются несколько оповещений, вызовите REGISTER для каждого оповещения.
Example
PERFORM DBMS_ALERT.REGISTER('sample_alert');
REMOVE
REMOVE удаляет указанное предупреждение из сессии.
Укажите название предупреждения.
Оповещения чувствительны к регистру.
Сообщение, оставленное предупреждением, будет удалено.
Example
PERFORM DBMS_ALERT.REMOVE('sample_alert');
REMOVEALL
REMOVEALL удаляет все оповещения, зарегистрированные в рамках сессии.
Все сообщения, оставленные оповещениями, будут удалены.
Example
PERFORM DBMS_ALERT.REMOVEALL();
SIGNAL
SIGNAL отправляет уведомление о сообщении для указанного предупреждения.
Укажите имя предупреждения, для которого отправляются уведомления о сообщениях.
Оповещения чувствительны к регистру.
В сообщении укажите предупреждающее сообщение для уведомлений.
Уведомления о сообщениях не завершены на этапе, когда выполняется SIGNAL. Уведомления о сообщениях отправляются при подтверждении транзакции. Уведомления о сообщениях отбрасываются, если откат выполняется после выполнения SIGNAL.
Если уведомления о сообщениях отправляются для одного и того же предупреждения из нескольких сессий, сообщения будут накапливаться без удаления.
Example
PERFORM DBMS_ALERT.SIGNAL('ALERT001','message001');
Note
Если SIGNAL постоянно активен и накопленные сообщения превышают определенное количество, может быть выведена ошибка недостаточной памяти. Если памяти становится недостаточно, вызовите AITANY или WAITONE для получения предупреждения и уменьшения накопленных сообщений.
WAITANY
WAITANY ждет уведомления о любых зарегистрированных предупреждениях для сессии.
Укажите максимальное время ожидания timeout в секундах для ожидания оповещения.
Используйте оператор SELECT для получения уведомленной информации, которая хранится в столбцах name, message и status.
Столбец name хранит имена предупреждений. Тип данных name - TEXT.
Столбец message хранит сообщения уведомленных предупреждений. Тип данных message - TEXT.
Столбец status хранит код состояния, возвращаемый операцией: 0-произошло предупреждение; 1-произошло превышение времени ожидания. Тип данных status - INTEGER.
Example
DECLARE alert_name TEXT := 'sample_alert'; alert_message TEXT; alert_status INTEGER; BEGIN SELECT name,message,status INTO alert_name,alert_message,alert_status FROM DBMS_ALERT.WAITANY(60);
WAITONE
WAITONE ожидает уведомления о указанном предупреждении.
Укажите имя предупреждения, которое следует ожидать.
Оповещения чувствительны к регистру.
Укажите максимальное время ожидания timeout в секундах для ожидания предупреждения.
Используйте оператор SELECT для получения уведомленной информации, которая хранится в столбцах message и status.
Столбец message хранит сообщения уведомленных предупреждений. Тип данных message - TEXT.
Столбец status хранит код состояния, возвращаемый операцией: 0-произошло предупреждение; 1-произошло превышение времени ожидания. Тип данных status - INTEGER.
Example
DECLARE alert_message TEXT; alert_status INTEGER; BEGIN SELECT message,status INTO alert_message,alert_status FROM DBMS_ALERT.WAITONE('sample_alert', 60);
F.29.35.1.2. Пример использования #
Ниже представлен пример использования потока обработки DBMS_ALERT.
Поток DBMS_ALERT
Диаграмма F.44. DBMS_ALERT_flow
![DBMS_ALERT_flow](images/orafce/DBMS_ALERT_flow.gif)
Note
Цель уведомлений о сообщениях с помощью SIGNAL - это сессии, для которых REGISTER выполняется в момент выполнения SIGNAL.
На стороне получателя всегда убедитесь, что используется REMOVE или REMOVEALL для удаления предупреждений, как только они больше не нужны. Если сессия закрывается без удаления предупреждений, то может стать невозможным получить SIGNAL для предупреждений с тем же именем в другой сессии.
DBMS_ALERT и DBMS_PIPE используют одну и ту же среду памяти. Следовательно, когда обнаруживается недостаточная память для DBMS_PIPE, возможно, что недостаточная память будет обнаружена и для DBMS_ALERT.
Пример использования
Отправляющая сторона
CREATE FUNCTION send_dbms_alert_exe() RETURNS VOID AS $$ BEGIN PERFORM DBMS_ALERT.SIGNAL('sample_alert','SIGNAL ALERT'); END; $$ LANGUAGE plpgsql; SELECT send_dbms_alert_exe(); DROP FUNCTION send_dbms_alert_exe();
Принимающая сторона
CREATE FUNCTION receive_dbms_alert_exe() RETURNS VOID AS $$ DECLARE alert_name TEXT := 'sample_alert'; alert_message TEXT; alert_status INTEGER; BEGIN PERFORM DBMS_ALERT.REGISTER(alert_name); SELECT message,status INTO alert_message,alert_status FROM DBMS_ALERT.WAITONE(alert_name,300); RAISE NOTICE 'Message : %', alert_message; RAISE NOTICE 'Status : %', alert_status; PERFORM DBMS_ALERT.REMOVE(alert_name); END; $$ LANGUAGE plpgsql; SELECT receive_dbms_alert_exe(); DROP FUNCTION receive_dbms_alert_exe();
F.29.35.2. DBMS_ASSERT #
Overview
Выполняет проверку свойств входных значений в PL/pgSQL.
Features
Функция | Описание |
---|---|
ENQUOTE_LITERAL | Возвращает указанную строку, заключенную в апострофы. |
ENQUOTE_NAME | Возвращает указанную строку, в двойных кавычках. |
NOOP | Возвращает указанную строку как есть. |
OBJECT_NAME | Проверяет, является ли указанная строка определенным идентификатором. |
QUALIFIED_SQL_NAME | Проверяет, соответствует ли указанная строка подходящему формату в качестве идентификатора. |
SCHEMA_NAME | Проверяет, является ли указанная строка определенной схемой. |
SIMPLE_SQL_NAME | Проверяет, соответствует ли указанная строка формату одного идентификатора. |
Syntax
Диаграмма F.45. DBMS_ASSERT
![DBMS_ASSERT](images/orafce/DBMS_ASSERT.gif)
F.29.35.2.1. Описание функций #
Этот раздел объясняет каждую функцию DBMS_ASSERT.
ENQUOTE_LITERAL
ENQUOTE_LITERAL возвращает указанную строку, заключенную в апострофы.
Укажите строку, заключенную в апострофы.
Тип возвращаемого значения - VARCHAR.
Example
DECLARE q_literal VARCHAR(256); BEGIN q_literal := DBMS_ASSERT.ENQUOTE_LITERAL('literal_word');
ENQUOTE_NAME
ENQUOTE_NAME возвращает указанную строку, заключенную в двойные кавычки.
Укажите строку, заключенную в двойные кавычки.
Для преобразования в нижний регистр, укажите TRUE или FALSE. Укажите TRUE для преобразования символов строки в верхнем регистре в нижний регистр. Если указано FALSE, преобразование в нижний регистр не будет производиться. По умолчанию установлено TRUE.
Если все символы в строке в нижнем регистре, они не будут заключены в двойные кавычки.
Тип возвращаемого значения - VARCHAR.
See
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Логический тип» в документации Tantor SE для получения информации о логических значениях (TRUE/FALSE).
Example
DECLARE dq_literal VARCHAR(256); BEGIN dq_literal := DBMS_ASSERT.ENQUOTE_NAME('TBL001');
NOOP
NOOP возвращает указанную строку как есть.
Укажите строку.
Тип возвращаемого значения - VARCHAR.
Example
DECLARE literal VARCHAR(256); BEGIN literal := DBMS_ASSERT.NOOP('NOOP_WORD');
OBJECT_NAME
OBJECT_NAME проверяет, является ли указанная строка определенным идентификатором.
Укажите идентификатор для проверки. Если идентификатор был определен, будет возвращен указанный идентификатор. В противном случае, произойдет следующая ошибка.
ERROR: invalid object name
Тип возвращаемого значения - VARCHAR.
Example
DECLARE object_name VARCHAR(256); BEGIN object_name := DBMS_ASSERT.OBJECT_NAME('SCM001.TBL001');
QUALIFIED_SQL_NAME
QUALIFIED_SQL_NAME проверяет, соответствует ли указанная строка подходящему формату в качестве идентификатора.
Укажите идентификатор для проверки. Если строка может быть использована в качестве идентификатора, указанный идентификатор будет возвращен. В противном случае произойдет следующая ошибка.
ERROR: string is not qualified SQL name
Тип возвращаемого значения - VARCHAR.
See
Обратитесь к разделу «Язык SQL» > «Лексическая структура» > «Идентификаторы и ключевые слова» в документации Tantor SE для получения информации о форматах, которые могут быть использованы в качестве идентификаторов.
Example
DECLARE object_name VARCHAR(256); BEGIN object_name := DBMS_ASSERT.QUALIFIED_SQL_NAME('SCM002.TBL001');
SCHEMA_NAME
SCHEMA_NAME проверяет, является ли указанная строка определенной схемой.
Укажите имя схемы для проверки. Если схема была определена, будет возвращено указанное имя схемы. В противном случае произойдет следующая ошибка.
ERROR: invalid schema name
Тип возвращаемого значения - VARCHAR.
Example
DECLARE schema_name VARCHAR(256); BEGIN schema_name := DBMS_ASSERT.SCHEMA_NAME('SCM001');
SIMPLE_SQL_NAME
SIMPLE_SQL_NAME проверяет, соответствует ли указанная строка подходящему формату в качестве одного идентификатора.
Укажите идентификатор для проверки. Если указанная строка может быть использована в качестве идентификатора, указанный идентификатор будет возвращен. В противном случае произойдет следующая ошибка.
ERROR: string is not qualified SQL name
Тип возвращаемого значения - VARCHAR.
See
Обратитесь к разделу «Язык SQL» > «Лексическая структура» > «Идентификаторы и ключевые слова» в документации Tantor SE для получения информации о форматах, которые могут быть использованы в качестве идентификаторов. Обратите внимание, что если указан идентификатор с использованием символов полной ширины, произойдет ошибка. Если включены символы полной ширины, укажите идентификатор в кавычках.
Example
DECLARE simple_name VARCHAR(256); BEGIN simple_name := DBMS_ASSERT.SIMPLE_SQL_NAME('COL01');
F.29.35.2.2. Пример использования #
Пример использования DBMS_ASSERT показан ниже. ~~~ CREATE FUNCTION dbms_assert_exe() RETURNS VOID AS
DECLAREwschemaVARCHAR(20) := ′public′; wtableVARCHAR(20) := ′T1′; wobjectVARCHAR(40); BEGINPERFORMDBMSASSERT.NOOP(wschema); PERFORMDBMSASSERT.SIMPLESQLNAME(wtable); PERFORMDBMSASSERT.SCHEMANAME(wschema); wobject := wschema||′.′||wtable; PERFORMDBMSASSERT.QUALIFIEDSQLNAME(wobject); PERFORMDBMSASSERT.OBJECTNAME(wobject); RAISENOTICE′OBJECT : RAISENOTICE′TABLENAME : END;
LANGUAGE plpgsql; SELECT dbms_assert_exe(); DROP FUNCTION dbms_assert_exe(); ~~~
F.29.35.3. DBMS_OUTPUT #
Overview
Отправляет сообщения клиентам, таким как psql, из PL/pgSQL.
Features
Функция | Описание |
---|---|
ENABLE | Включает функции этого пакета. |
DISABLE | Отключает функции этого пакета. |
SERVEROUTPUT | Контролирует, отправляются ли сообщения. |
PUT | Отправляет сообщения. |
PUT_LINE | Отправляет сообщения с добавлением символа перехода строки. |
NEW_LINE | Отправляет символ перехода строки. |
GET_LINE | Извлекает строку из буфера сообщений. |
GET_LINES | Извлекает несколько строк из буфера сообщений. |
Syntax
Диаграмма F.46. DBMS_OUTPUT
![DBMS_OUTPUT](images/orafce/DBMS_OUTPUT.gif)
F.29.35.3.1. Описание #
Этот раздел объясняет каждую функцию DBMS_OUTPUT.
ENABLE
ENABLE включает использование PUT, PUT_LINE, NEW_LINE, GET_LINE и GET_LINES.
При многократном выполнении ENABLE последнее указанное значение является размером буфера (в байтах). Укажите размер буфера от 2000 до 1000000.
Значение размера буфера по умолчанию составляет 20000. Если указано значение NULL для размера буфера, будет использовано значение 1000000.
Если ENABLE не был выполнен, PUT, PUT_LINE, NEW_LINE, GET_LINE и GET_LINES игнорируются, даже если они были выполнены.
Example
PERFORM DBMS_OUTPUT.ENABLE(20000);
DISABLE
DISABLE отключает использование PUT, PUT_LINE, NEW_LINE, GET_LINE и GET_LINES.
Оставшаяся информация буфера удаляется.
Example
PERFORM DBMS_OUTPUT.DISABLE();
SERVEROUTPUT
SERVEROUTPUT управляет отправкой сообщений.
Укажите TRUE или FALSE для sendMsgs.
Если указано TRUE, то при выполнении PUT, PUT_LINE или NEW_LINE, сообщение отправляется клиенту, такому как psql, и не сохраняется в буфере.
Если указано FALSE, при выполнении PUT, PUT_LINE или NEW_LINE, сообщение сохраняется в буфере и не отправляется клиенту, такому как psql.
See
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Логический тип» в документации Tantor SE для получения информации о логических значениях (TRUE/FALSE).
Example
PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE);
PUT
PUT устанавливает сообщение для отправки.
Строка - это сообщение, которое будет отправлено.
Когда для SERVEROUTPUT указано TRUE, сообщения отправляются клиентам, таким как psql.
Когда для SERVEROUTPUT указано FALSE, сообщения сохраняются в буфере.
PUT не добавляет символ перехода строки. Чтобы добавить символ перехода строки, выполните NEW_LINE.
Если отправляется строка, превышающая размер буфера, указанный в ENABLE, происходит ошибка.
Example
PERFORM DBMS_OUTPUT.PUT('abc');
PUT_LINE
PUT_LINE устанавливает сообщение для отправки с добавлением символа перехода строки.
Строка - это сообщение, которое будет отправлено.
Когда для SERVEROUTPUT указано TRUE, сообщения отправляются клиентам, таким как psql.
Когда для SERVEROUTPUT указано FALSE, сообщения сохраняются в буфере.
Если отправляется строка, превышающая размер буфера, указанный в ENABLE, происходит ошибка.
Example
PERFORM DBMS_OUTPUT.PUT_LINE('abc');
NEW_LINE
NEW_LINE добавляет символ перехода строки к сообщению, созданному с помощью PUT.
Когда для SERVEROUTPUT указано TRUE, сообщения отправляются клиентам, таким как psql.
Когда для SERVEROUTPUT указано FALSE, сообщения сохраняются в буфере.
Example
PERFORM DBMS_OUTPUT.NEW_LINE();
GET_LINE
GET_LINE извлекает строку из буфера сообщений.
Используйте оператор SELECT для получения строки, полученной в результате операции, и возвращенного статусного кода, которые хранятся в столбцах line и status.
Столбец line хранит строку, извлеченную из буфера. Тип данных line - TEXT.
Столбец status хранит код состояния, возвращаемый операцией: 0 - успешно завершено; 1 - не удалось, потому что в буфере больше нет строк. Тип данных status - INTEGER.
Если выполняются GET_LINE или GET_LINES, а затем выполняются PUT, PUT_LINE или PUT_LINES, пока сообщения, которые еще не были извлечены из буфера, все еще существуют, то сообщения, не извлеченные из буфера, будут отброшены.
Example
DECLARE buff1 VARCHAR(20); stts1 INTEGER; BEGIN SELECT line,status INTO buff1,stts1 FROM DBMS_OUTPUT.GET_LINE();
GET_LINES
GET_LINES извлекает несколько строк из буфера сообщений.
Укажите количество строк для извлечения из буфера.
Используйте оператор SELECT для получения извлеченных строк и числа извлеченных строк, которые хранятся в столбцах lines и numlines.
Столбец lines хранит строки, извлеченные из буфера. Тип данных lines - TEXT.
Столбец numlines хранит количество строк, полученных из буфера. Если это число меньше, чем количество запрошенных строк, то в буфере больше нет строк. Тип данных numlines - INTEGER.
Если выполняются GET_LINE или GET_LINES, а затем выполняются PUT, PUT_LINE или NEW_LINE, в то время как сообщения, которые еще не были извлечены из буфера, все еще существуют, то сообщения, не извлеченные из буфера, будут отброшены.
Example
DECLARE buff VARCHAR(20)[10]; stts INTEGER := 10; BEGIN SELECT lines, numlines INTO buff,stts FROM DBMS_OUTPUT.GET_LINES(stts);
F.29.35.3.2. Пример использования #
Пример использования DBMS_OUTPUT показан ниже.
CREATE FUNCTION dbms_output_exe() RETURNS VOID AS $$ DECLARE buff1 VARCHAR(20); buff2 VARCHAR(20); stts1 INTEGER; stts2 INTEGER; BEGIN PERFORM DBMS_OUTPUT.DISABLE(); PERFORM DBMS_OUTPUT.ENABLE(); PERFORM DBMS_OUTPUT.SERVEROUTPUT(FALSE); PERFORM DBMS_OUTPUT.PUT('DBMS_OUTPUT TEST 1'); PERFORM DBMS_OUTPUT.NEW_LINE(); PERFORM DBMS_OUTPUT.PUT_LINE('DBMS_OUTPUT TEST 2'); SELECT line,status INTO buff1,stts1 FROM DBMS_OUTPUT.GET_LINE(); SELECT line,status INTO buff2,stts2 FROM DBMS_OUTPUT.GET_LINE(); PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); PERFORM DBMS_OUTPUT.PUT_LINE(buff1); PERFORM DBMS_OUTPUT.PUT_LINE(buff2); END; $$ LANGUAGE plpgsql; SELECT dbms_output_exe(); DROP FUNCTION dbms_output_exe();
F.29.35.4. DBMS_PIPE #
Overview
Осуществляет общение между сессиями, которые выполняют PL/pgSQL.
Этот пакет может быть использован для 1:1 общения, например, когда данные обмениваются между сессиями, выполняющими PL/pgSQL.
Существуют явные и неявные каналы, и более того, для явных каналов вы можете выбрать общедоступные каналы и частные каналы. Характеристики каждого типа следующие:
Типы каналов
Тип | Характеристики |
---|---|
Явный канал | - CREATE_PIPE используется для явного создания канала. - При создании канала, вы можете выбрать между общедоступным и приватным каналом. - Необходимо использовать REMOVE_PIPE для явного удаления канала. |
Неявный канал | - Создается автоматически при использовании SEND_MESSAGE и RECEIVE_MESSAGE. - Созданный канал становится общедоступным. - Когда сообщения получаются с помощью RECEIVE_MESSAGE, если в канале не осталось дополнительных сообщений, канал будет автоматически удален. |
Общедоступный канал | - Может быть создан как явный канал или неявный канал. - Может также использоваться другими пользователями, а не только создателем. |
Приватный канал | - Может быть создан только как явный канал. - Может быть использован только его создателем. |
Note
До 50 каналов может быть использовано одновременно одним экземпляром.
Если каналы часто создаются и удаляются повторно, используйте общедоступные каналы. Если вы создаете частный канал, внутренняя информация (создатель частного канала) сохраняется даже после удаления канала. Таким образом, повторное создание и удаление каналов может в конечном итоге привести к исчерпанию памяти.
Если тайм-аут происходит без получения сообщения при создании неявного канала с помощью RECEIVE_MESSAGE, канал не будет удален.
Features
Функция | Описание |
---|---|
CREATE_PIPE | Создает общедоступный или приватный канал. |
NEXT_ITEM_TYPE | Определяет тип данных следующего элемента в локальном буфере и возвращает этот тип. |
PACK_MESSAGE | Устанавливает сообщение в локальном буфере. |
PURGE | Очищает содержимое указанного канала. |
RECEIVE_MESSAGE | Устанавливает полученное сообщение в локальном буфере. |
REMOVE_PIPE | Удаляет указанный канал. |
RESET_BUFFER | Сбрасывает установленную позицию локального буфера. |
SEND_MESSAGE | Отправляет содержимое локального буфера. |
UNIQUE_SESSION_NAME | Возвращает уникальное имя сессии. |
UNPACK_MESSAGE_BYTEA | Получает сообщение в локальном буфере типа BYTEA. |
UNPACK_MESSAGE_DATE | Получает сообщение в локальном буфере типа DATE. |
UNPACK_MESSAGE_NUMBER | Получает сообщение в локальном буфере типа NUMERIC. |
UNPACK_MESSAGE_RECORD | Получает сообщение в локальном буфере типа RECORD. |
UNPACK_MESSAGE_TEXT | Получает сообщение в локальном буфере типа TEXT. |
UNPACK_MESSAGE_TIMESTAMP | Получает сообщение в локальном буфере типа TIMESTAMP. |
Syntax
Диаграмма F.47. DBMS_PIPE
![DBMS_PIPE](images/orafce/DBMS_PIPE.gif)
F.29.35.4.1. Описание функций #
Этот раздел объясняет каждую функцию DBMS_PIPE.
CREATE_PIPE
CREATE_PIPE явно создает среду pipe для обмена данными.
Укажите имя создаваемого канала.
Имена каналов чувствительны к регистру.
Укажите максимальное количество сообщений, которые могут быть отправлены или получены. Если прне указано, будет использоваться 0 (невозможно отправить сообщения). Укажите от 1 до 32767.
Укажите TRUE или FALSE для private. Если указано TRUE, будет создан приватный канал. Если указано FALSE, будет создан публичный канал. По умолчанию установлено FALSE.
Произойдет ошибка, если канал с таким именем уже был создан.
See
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Логический тип» в документации Tantor SE для получения информации о логических значениях (TRUE/FALSE).
Example
PERFORM DBMS_PIPE.CREATE_PIPE('P01', 100, FALSE);
NEXT_ITEM_TYPE
NEXT_ITEM_TYPE возвращает следующий тип данных в локальном буфере.
Тип возвращаемого значения - INTEGER. Возвращается одно из следующих значений:
Значения, возвращаемые NEXT_ITEM_TYPE
Возвращаемое значение | Тип данных |
---|---|
9 | Тип NUMERIC |
11 | Тип TEXT |
12 | Тип DATE |
13 | Тип TIMESTAMP |
23 | Тип BYTEA |
24 | Тип RECORD |
0 | Нет данных в буфере |
Example
DECLARE i_iType INTEGER; BEGIN i_iType := DBMS_PIPE.NEXT_ITEM_TYPE();
PACK_MESSAGE
PACK_MESSAGE устанавливает указанное сообщение в локальном буфере.
Укажите данные, которые будут установлены в локальном буфере. Могут быть использованы следующие типы данных:
Тип символа (*1)
Тип целого числа (*2)
Тип NUMERIC
тип DATE
Тип TIMESTAMP (*3)
Тип BYTEA
Тип RECORD
*1: Тип символа внутренне преобразуется в тип TEXT.
*2: Тип integer внутренне преобразуется в тип NUMERIC.
*3: Тип TIMESTAMP внутренне преобразуется в тип TIMESTAMP WITH TIME ZONE.
Каждый раз при вызове PACK_MESSAGE, новое сообщение добавляется в локальный буфер.
Размер локального буфера составляет примерно 8 КБ. Однако, каждое сообщение имеет издержки, поэтому общий размер, который может быть сохранен, на самом деле меньше 8 КБ. Чтобы очистить локальный буфер, отправьте сообщение (SEND_MESSAGE), или сбросьте буфер (RESET_BUFFER) до его исходного состояния.
Example
PERFORM DBMS_PIPE.PACK_MESSAGE('Message Test001');
PURGE
PURGE удаляет сообщения в канале.
Укажите имя канала, из которого должны быть удалены сообщения.
Имена каналов чувствительны к регистру.
Example
PERFORM DBMS_PIPE.PURGE('P01');
Note
Когда выполняется PURGE, локальный буфер используется для удаления сообщений в канале. Следовательно, если в канале остаются какие-либо сообщения, локальный буфер будет перезаписан PURGE.
RECEIVE_MESSAGE
RECEIVE_MESSAGE получает сообщения, которые существуют в указанном канале, и устанавливает эти сообщения в локальном буфере.
Сообщения получаются в тех единицах, в которых они отправляются в канал SEND_MESSAGE. Полученные сообщения удаляются из канала после установки в локальном буфере.
Укажите имя канала, для которого должны быть получены сообщения.
Имена каналов чувствительны к регистру.
Укажите максимальное время ожидания timeout в секундах для ожидания сообщения. Если прне указано, по умолчанию устанавливается 31536000 секунд (1 год).
Тип возвращаемого значения - INTEGER. Если сообщение успешно получено, возвращается 0. Если происходит тайм-аут, возвращается 1.
Example
DECLARE i_Ret INTEGER; BEGIN i_Ret := DBMS_PIPE.RECEIVE_MESSAGE('P01', 60);
REMOVE_PIPE
REMOVE_PIPE удаляет указанный канал.
Укажите имя канала, который должен быть удален.
Имена каналов чувствительны к регистру.
Example
PERFORM DBMS_PIPE.REMOVE_PIPE('P01');
RESET_BUFFER
RESET_BUFFER сбрасывает установленную позицию локального буфера. Любые ненужные данные, оставшиеся в локальном буфере, могут быть отброшены с помощью этой операции.
Example
PERFORM DBMS_PIPE.RESET_BUFFER();
SEND_MESSAGE
SEND_MESSAGE отправляет данные, хранящиеся в локальном буфере, в указанный канал.
Укажите имя канала, в который должны быть отправлены данные.
Имена каналов чувствительны к регистру.
Укажите максимальное время ожидания timeout в секундах для отправки данных, хранящихся в локальном буфере. Если прне указано, по умолчанию устанавливается 31536000 секунд (1 год).
Укажите максимальное количество сообщений, которые могут быть отправлены или получены. Если параметр прне указан, используется максимальное количество сообщений, установленное в CREATE_PIPE. Если параметр прне указан в неявном канале, количество сообщений будет неограниченным. Укажите от 1 до 32767.
Если максимальное количество сообщений указано в обоих SEND_MESSAGE и CREATE_PIPE, будет использовано большее из значений.
Тип возвращаемого значения - INTEGER. Если сообщение успешно получено, возвращается 0. Если происходит тайм-аут, возвращается 1.
Example
DECLARE i_Ret INTEGER; BEGIN i_Ret := DBMS_PIPE.SEND_MESSAGE('P01', 10, 20);
Note
Произойдет тайм-аут во время отправки, если достигнуто максимальное количество сообщений, или если отправляемое сообщение слишком большое. Если произошел тайм-аут, используйте RECEIVE_MESSAGE для получения любых сообщений, которые находятся в канале.
UNIQUE_SESSION_NAME
UNIQUE_SESSION_NAME возвращает имя, которое является уникальным среди всех сессий. Это имя может быть использовано в качестве имени канала.
Многократные вызовы из одной и той же сессии всегда возвращают одно и то же имя.
Тип возвращаемого значения - VARCHAR. Возвращает строку длиной до 30 символов.
Example
DECLARE p_Name VARCHAR(30); BEGIN p_Name := DBMS_PIPE.UNIQUE_SESSION_NAME();
UNPACK_MESSAGE_BYTEA
NPACK_MESSAGE_BYTEA получает сообщения типа BTYEA в локальном буфере.
Сообщения получаются в единице, установленной в локальном буфере с помощью PACK_MESSAGE. Полученные сообщения удаляются из локального буфера.
Тип возвращаемого значения - BYTEA.
Если в локальном буфере нет сообщений, возвращается значение NULL.
Для типа данных необходимо согласовать с типом данных, установленным PACK_MESSAGE. Если тип данных отличается, произойдет следующая ошибка.
ERROR: datatype mismatch DETAIL: unpack unexpected type: xx
Example
DECLARE g_Bytea BYTEA; BEGIN g_Bytea := DBMS_PIPE.UNPACK_MESSAGE_BYTEA();
UNPACK_MESSAGE_DATE
UNPACK_MESSAGE_DATE получает сообщения типа DATE в локальном буфере.
Сообщения получаются в единице, установленной в локальном буфере с помощью PACK_MESSAGE. Полученные сообщения удаляются из локального буфера.
Тип возвращаемого значения - DATE.
Если в локальном буфере нет сообщений, возвращается значение NULL.
Для типа данных необходимо согласовать с типом данных, установленным PACK_MESSAGE. Если тип данных отличается, произойдет следующая ошибка.
ERROR: datatype mismatch DETAIL: unpack unexpected type: xx
Example
DECLARE g_Date DATE; BEGIN g_Date := DBMS_PIPE.UNPACK_MESSAGE_DATE();
Note
Если схема "oracle" установлена в search_path, будет использоваться тип DATE от orafce, поэтому для получения данных используйте UNPACK_MESSAGE_TIMESTAMP. UNPACK_MESSAGE_DATE - это интерфейс для типа DATE в Tantor SE.
UNPACK_MESSAGE_NUMBER
UNPACK_MESSAGE_NUMBER получает сообщения типа NUMERIC в локальном буфере.
Сообщения получаются в единице, установленной в локальном буфере с помощью PACK_MESSAGE. Полученные сообщения удаляются из локального буфера.
Тип возвращаемого значения - NUMERIC.
Если в локальном буфере нет сообщений, возвращается значение NULL.
Для типа данных необходимо согласовать с типом данных, установленным PACK_MESSAGE. Если тип данных отличается, произойдет следующая ошибка.
ERROR: datatype mismatch DETAIL: unpack unexpected type: xx
Example
DECLARE g_Number NUMERIC; BEGIN g_Number := DBMS_PIPE.UNPACK_MESSAGE_NUMBER();
UNPACK_MESSAGE_RECORD
UNPACK_MESSAGE_RECORD получает сообщения типа RECORD в локальном буфере.
Сообщения получаются в единице, установленной в локальном буфере с помощью PACK_MESSAGE. Полученные сообщения удаляются из локального буфера.
Тип возвращаемого значения - RECORD.
Если в локальном буфере нет сообщений, возвращается значение NULL.
Для типа данных необходимо согласовать с типом данных, установленным PACK_MESSAGE. Если тип данных отличается, произойдет следующая ошибка.
ERROR: datatype mismatch DETAIL: unpack unexpected type: xx
Example
DECLARE msg1 TEXT; status NUMERIC; BEGIN SELECT col1, col2 INTO msg1, status FROM DBMS_PIPE.UNPACK_MESSAGE_RECORD();
UNPACK_MESSAGE_TEXT
UNPACK_MESSAGE_TEXT получает сообщения типа TEXT в локальном буфере.
Сообщения получаются в единице, установленной в локальном буфере с помощью PACK_MESSAGE. Полученные сообщения удаляются из локального буфера.
Тип возвращаемого значения - TEXT.
Если в локальном буфере нет сообщений, возвращается значение NULL.
Для типа данных необходимо согласовать с типом данных, установленным PACK_MESSAGE. Если тип данных отличается, произойдет следующая ошибка.
ERROR: datatype mismatch DETAIL: unpack unexpected type: xx
Example
DECLARE g_Text TEXT; BEGIN g_Text := DBMS_PIPE.UNPACK_MESSAGE_TEXT();
UNPACK_MESSAGE_TIMESTAMP
UNPACK_MESSAGE_TIMESTAMP получает сообщения типа TIMESTAMP WITH TIME ZONE в локальном буфере.
Сообщения получаются в единице, установленной в локальном буфере с помощью PACK_MESSAGE. Полученные сообщения удаляются из локального буфера.
Тип возвращаемого значения - TIMESTAMP WITH TIME ZONE.
Если в локальном буфере нет сообщений, возвращается значение NULL.
Для типа данных необходимо согласовать с типом данных, установленным PACK_MESSAGE. Если тип данных отличается, произойдет следующая ошибка.
ERROR: datatype mismatch DETAIL: unpack unexpected type: xx
Example
DECLARE g_Timestamptz TIMESTAMP WITH TIME ZONE; BEGIN g_Timestamptz := DBMS_PIPE.UNPACK_MESSAGE_TIMESTAMP();
F.29.35.4.2. Пример использования #
Ниже представлен пример использования потока обработки DBMS_PIPE.
Поток DBMS_PIPE
Диаграмма F.48. DBMS_PIPE_flow
![DBMS_PIPE_flow](images/orafce/DBMS_PIPE_flow.gif)
Note
При использовании CREATE_PIPE для явного создания канала, обязательно используйте REMOVE_PIPE для удаления канала. Если канал не удален явно, после создания, он останется до остановки экземпляра.
На диаграмме потока, CREATE_PIPE и REMOVE_PIPE описаны на стороне получателя, однако, эти действия могут быть выполнены на стороне отправителя. Для поддержания последовательности, рекомендуется создавать и удалять каналы с одной стороны.
Произойдет ошибка для CREATE_PIPE, если канал с таким именем уже существует. Неявно созданные каналы также являются целью для SEND_MESSAGE и RECEIVE_MESSAGE, поэтому при выполнении CREATE_PIPE, убедитесь, что SEND_MESSAGE и RECEIVE_MESSAGE не вызываются заранее.
DBMS_ALERT и DBMS_PIPE используют одну и ту же среду памяти. Следовательно, когда обнаруживается недостаточная память для DBMS_ALERT, возможно, что недостаточная память будет обнаружена и для DBMS_PIPE.
Information
Информацию о используемых каналах можно просмотреть в представлении DBMS_PIPE.DB_PIPES.
SELECT * from dbms_pipe.db_pipes; name | items | size | limit | private | owner ------+-------+------+-------+---------+------- P01 | 1 | 18 | 100 | f | (1 row)
Пример использования
Отправляющая сторона
CREATE FUNCTION send_dbms_pipe_exe(IN pipe_mess text) RETURNS void AS $$ DECLARE pipe_name text := 'sample_pipe'; pipe_time timestamp := current_timestamp; pipe_stat int; BEGIN PERFORM DBMS_PIPE.RESET_BUFFER(); PERFORM DBMS_PIPE.PACK_MESSAGE(pipe_mess); PERFORM DBMS_PIPE.PACK_MESSAGE(pipe_time); pipe_stat := DBMS_PIPE.SEND_MESSAGE(pipe_name); RAISE NOTICE 'PIPE_NAME: % SEND Return Value =%', pipe_name, pipe_stat; END; $$ LANGUAGE plpgsql; SELECT send_dbms_pipe_exe('Sample Message.'); DROP FUNCTION send_dbms_pipe_exe(text);
Принимающая сторона
CREATE FUNCTION receive_dbms_pipe_exe() RETURNS void AS $$ DECLARE pipe_name text := 'sample_pipe'; pipe_text text; pipe_nume numeric; pipe_date date; pipe_time timestamp with time zone; pipe_byte bytea; pipe_reco record; pipe_item int; pipe_stat int; BEGIN pipe_stat := DBMS_PIPE.RECEIVE_MESSAGE(pipe_name,300); RAISE NOTICE 'Return Value = %', pipe_stat; LOOP pipe_item := DBMS_PIPE.NEXT_ITEM_TYPE(); RAISE NOTICE 'Next Item : %', pipe_item; IF (pipe_item = 9) THEN pipe_nume := DBMS_PIPE.UNPACK_MESSAGE_NUMBER(); RAISE NOTICE 'Get Message : %' ,pipe_nume; ELSIF (pipe_item =11) THEN pipe_text := DBMS_PIPE.UNPACK_MESSAGE_TEXT(); RAISE NOTICE 'Get Message : %' ,pipe_text; ELSIF (pipe_item = 12) THEN pipe_date := DBMS_PIPE.UNPACK_MESSAGE_DATE(); RAISE NOTICE 'Get Message : %' ,pipe_date; ELSIF (pipe_item = 13) THEN pipe_time := DBMS_PIPE.UNPACK_MESSAGE_TIMESTAMP(); RAISE NOTICE 'Get Message : %' ,pipe_time; ELSIF (pipe_item = 23) THEN pipe_byte := DBMS_PIPE.UNPACK_MESSAGE_BYTEA(); RAISE NOTICE 'Get Message : %' ,pipe_byte; ELSIF (pipe_item = 24) THEN pipe_reco := DBMS_PIPE.UNPACK_MESSAGE_RECORD(); RAISE NOTICE 'Get Message : %' ,pipe_reco; ELSE EXIT; END IF; END LOOP; PERFORM DBMS_PIPE.REMOVE_PIPE(pipe_name); END; $$ LANGUAGE plpgsql; SELECT receive_dbms_pipe_exe(); DROP FUNCTION receive_dbms_pipe_exe();
F.29.35.5. DBMS_RANDOM #
Overview
Генерирует случайные числа в PL/pgSQL.
Features
Функция | Описание |
---|---|
INITIALIZE | Инициирует генерацию случайных чисел. |
NORMAL | Возвращает нормально распределенное случайное число. |
RANDOM | Генерирует случайное число. |
SEED | Сбрасывает начальное значение. |
STRING | Генерирует случайную строку. |
TERMINATE | Завершает генерацию случайных чисел. |
VALUE | Генерирует случайное десятичное число между 0 и 1, или между указанными значениями. |
Syntax
Диаграмма F.49. DBMS_RANDOM
![DBMS_RANDOM](images/orafce/DBMS_RANDOM.gif)
F.29.35.5.1. Описание функций #
Этот раздел объясняет каждую функцию DBMS_RANDOM.
INITIALIZE
INITIALIZE инициализирует генерацию случайных чисел с использованием указанного начального значения.
Для seedVal, укажите тип SMALLINT или INTEGER.
Example
PERFORM DBMS_RANDOM.INITIALIZE(999);
NORMAL
NORMAL генерирует и возвращает случайное число, распределенное нормально.
Тип возвращаемого значения - DOUBLE PRECISION.
Example
DECLARE d_RunNum DOUBLE PRECISION; BEGIN d_RunNum := DBMS_RANDOM.NORMAL();
RANDOM
RANDOM генерирует и возвращает случайное число.
Тип возвращаемого значения - INTEGER.
Example
DECLARE d_RunInt INTEGER; BEGIN d_RunInt := DBMS_RANDOM.RANDOM();
SEED
SEED инициализирует генерацию случайного числа с использованием указанного начального значения или начальной строки.
Для seedVal, укажите тип SMALLINT или INTEGER.
Любая строка может быть указана для начальной строки.
Example
PERFORM DBMS_RANDOM.SEED('123');
STRING
STRING генерирует и возвращает случайную строку в соответствии с указанным форматом отображения и длиной строки.
Для формата отображения fmt, укажите любое из следующих значений. Ошибка произойдет, если указано любое другое значение.
Значения, которые можно указать для формата отображения
Значение настройки | Сгенерированная строка |
---|---|
‘u’, ‘U’ | Только заглавные буквы |
‘l’, ‘L’ | Только строчные буквы |
‘a’, ‘A’ | Сочетание заглавных и строчных букв |
‘x’, ‘X’ | Заглавные буквы и цифры |
‘p’, ‘P’ | Любой отображаемый символ |
Укажите длину строки, которую нужно сгенерировать. Укажите тип SMALLINT или INTEGER.
Тип возвращаемого значения - TEXT.
Example
DECLARE d_RunStr TEXT; BEGIN d_RunStr := DBMS_RANDOM.STRING('a', 20);
TERMINATE
Вызовите TERMINATE для прекращения генерации случайных чисел.
Information
TERMINATE ничего не делает, но был включен для совместимости с базами данных Oracle.
Example
PERFORM DBMS_RANDOM.TERMINATE();
VALUE
VALUE генерирует и возвращает случайное число в указанном диапазоне.
Для min и max, укажите числовой тип данных. Генерируется случайное число между минимальным и максимальным значением включительно.
Если минимальное и максимальное значения не указаны, будет сгенерировано случайное десятичное число между 0 и 1.
Тип возвращаемого значения - DOUBLE PRECISION.
Example
DECLARE d_RunDbl DOUBLE PRECISION; BEGIN d_RunDbl := DBMS_RANDOM.VALUE();
F.29.35.5.2. Пример использования #
Пример использования DBMS_RANDOM показан ниже.
CREATE FUNCTION dbms_random_exe() RETURNS VOID AS $$ DECLARE w_rkey VARCHAR(10) := 'rnd111'; i_rkey INTEGER := 97310; BEGIN PERFORM DBMS_RANDOM.INITIALIZE(i_rkey); RAISE NOTICE 'RANDOM -> NORMAL : %', DBMS_RANDOM.NORMAL(); RAISE NOTICE 'RANDOM -> RANDOM : %', DBMS_RANDOM.RANDOM(); RAISE NOTICE 'RANDOM -> STRING : %', DBMS_RANDOM.STRING('a',10); RAISE NOTICE 'RANDOM -> VALUE : %', DBMS_RANDOM.VALUE(); PERFORM DBMS_RANDOM.SEED(w_rkey); RAISE NOTICE 'RANDOM -> NORMAL : %', DBMS_RANDOM.NORMAL(); RAISE NOTICE 'RANDOM -> RANDOM : %', DBMS_RANDOM.RANDOM(); RAISE NOTICE 'RANDOM -> STRING : %', DBMS_RANDOM.STRING('p',10); RAISE NOTICE 'RANDOM -> VALUE : %', DBMS_RANDOM.VALUE(1,100); PERFORM DBMS_RANDOM.TERMINATE(); END; $$ LANGUAGE plpgsql; SELECT dbms_random_exe(); DROP FUNCTION dbms_random_exe();
F.29.35.6. DBMS_UTILITY #
Overview
Предоставляет утилиты PL/pgSQL.
Features
Функция | Описание |
---|---|
FORMAT_CALL_STACK | Возвращает текущий стек вызовов. |
GET_TIME | Возвращает количество сотых долей секунды, прошедших с момента времени в прошлом. |
Syntax
Диаграмма F.50. DBMS_UTILITY
![DBMS_UTILITY](images/orafce/DBMS_UTILITY.gif)
F.29.35.6.1. Описание функций #
Этот раздел объясняет каждую функцию DBMS_UTILITY.
FORMAT_CALL_STACK
FORMAT_CALL_STACK возвращает текущий стек вызовов PL/pgSQL.
Для формата отображения fmt укажите любое из следующих значений. Ошибка произойдет, если указано любое другое значение.
Значения, которые можно указать для формата отображения
Значение настройки | Отображаемое содержимое |
---|---|
‘o’ | Стандартное отображение стека вызовов (с заголовком) |
‘s’ | Стандартное отображение стека вызовов (без заголовка) |
‘p’ | Отображение стека вызовов через запятую (без заголовка) |
Если формат отображения не указан, будет использован формат отображения «o».
Тип возвращаемого значения - TEXT.
Example
DECLARE s_StackTrace TEXT BEGIN s_StackTrace := DBMS_UTILITY.FORMAT_CALL_STACK();
Note
Если для языка сообщений указана локаль, отличная от английской, результат стека вызовов может быть получен некорректно. Для правильного получения результата стека вызовов укажите английский в качестве языка сообщений.
F.29.35.6.2. Пример использования #
Пример использования DBMS_UTILITY показан ниже.
CREATE FUNCTION dbms_utility1_exe() RETURNS VOID AS $$ DECLARE s_StackTrace TEXT; BEGIN s_StackTrace := DBMS_UTILITY.FORMAT_CALL_STACK(); RAISE NOTICE '%', s_StackTrace; END; $$ LANGUAGE plpgsql; CREATE FUNCTION dbms_utility2_exe() RETURNS VOID AS $$ BEGIN PERFORM dbms_utility1_exe(); END; $$ LANGUAGE plpgsql; SELECT dbms_utility2_exe(); DROP FUNCTION dbms_utility2_exe(); DROP FUNCTION dbms_utility1_exe();
GET_TIME
GET_TIME возвращает текущее время в сотых долях секунды от некоторого момента времени в прошлом. Эта функция используется для определения прошедшего времени.
Example
DO $$ DECLARE start_time integer; end_time integer; BEGIN start_time := DBMS_UTILITY.GET_TIME; PERFORM pg_sleep(10); end_time := DBMS_UTILITY.GET_TIME; RAISE NOTICE 'Execution time: % seconds', (end_time - start_time)/100; END $$;
Note
Функция вызывается дважды, вначале некоторого процедурного кода и в конце. Затем первое (ранее) число вычитается из второго (позднего) числа, чтобы определить прошедшее время. Должно быть разделено на 100, чтобы сообщить количество прошедших секунд.
F.29.35.7. UTL_FILE #
Overview
Текстовые файлы могут быть записаны и прочитаны с использованием PL/pgSQL.
Для выполнения этих операций с файлами, каталог для цели операции должен быть зарегистрирован в таблице UTL_FILE.UTL_FILE_DIR заранее. Используйте оператор INSERT от имени администратора базы данных или пользователя, у которого есть привилегии на INSERT, чтобы зарегистрировать каталог. Кроме того, если каталог больше не нужен, удалите его из той же таблицы. Обратитесь к разделу "Регистрация и удаление каталогов" за информацией о том, как зарегистрировать и удалить каталог.
Объявите обработчик файла, описанный ниже, следующим образом в PL/pgSQL:
DECLARE f UTL_FILE.FILE_TYPE;
Features
Функция | Описание |
---|---|
FCLOSE | Закрывает файл. |
FCLOSE_ALL | Закрывает все файлы, открытые в сессии. |
FCOPY | Копирует целый файл или его непрерывную часть. |
FFLUSH | Очищает буфер. |
FGETATTR | Получает атрибуты файла. |
FOPEN | Открывает файл. |
FREMOVE | Удаляет файл. |
FRENAME | Переименовывает файл. |
GET_LINE | Читает строку из текстового файла. |
IS_OPEN | Проверяет, открыт ли файл. |
NEW_LINE | Записывает символы перехода строки. |
PUT | Записывает строку. |
PUT_LINE | Добавляет символ перехода строки к строке и записывает строку. |
PUTF | Записывает отформатированную строку. |
Syntax
Диаграмма F.51. UTL_FILE
![UTL_FILE](images/orafce/UTL_FILE.gif)
F.29.35.7.1. Регистрация и удаление каталогов #
Регистрация каталога
1 . Проверьте, зарегистрирован ли уже каталог (если это так, то шаг 2 не требуется).
SELECT * FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/pgsql';
2 . Зарегистрируйте каталог.
INSERT INTO UTL_FILE.UTL_FILE_DIR VALUES('/home/pgsql');
Удаление каталога
DELETE FROM UTL_FILE.UTL_FILE_DIR WHERE dir='/home/pgsql';
F.29.35.7.2. Описание #
Этот раздел объясняет каждую функцию UTL_FILE.
FCLOSE
FCLOSE закрывает открытый файл.
Укажите открытый дескриптор файла.
Возвращаемое значение - это значение NULL.
Example
f := UTL_FILE.FCLOSE(f);
FCLOSE_ALL
FCLOSE_ALL закрывает все файлы, открытые в сессии.
Файлы, закрытые с помощью FCLOSE_ALL, больше не могут быть прочитаны или записаны.
Example
PERFORM UTL_FILE.FCLOSE_ALL();
FCOPY
FCOPY копирует целый файл или его непрерывную часть. Весь файл копируется, если startLine и endLine не указаны.
Укажите расположение каталога исходного файла.
Укажите исходный файл.
Укажите каталог, в котором будет создан файл назначения.
Укажите имя файла назначения.
Укажите номер строки, с которой начать копирование. Укажите значение больше 0. Если не указано, используется 1.
Укажите номер строки, на которой следует прекратить копирование. Если он не указан, используется последний номер строки файла.
Example
PERFORM UTL_FILE.FCOPY('/home/pgsql', 'regress_pgsql.txt', '/home/pgsql', 'regress_pgsql2.txt');
FFLUSH
FFLUSH принудительно записывает данные буфера в файл.
Укажите открытый дескриптор файла.
Example
PERFORM UTL_FILE.FFLUSH(f);
FGETATTR
FGETATTR получает атрибуты файла: существование файла, размер файла и информацию о размере блока файла.
Укажите каталог, в котором находится файл.
Укажите соответствующее имя файла.
Используйте оператор SELECT для получения атрибутов файла, которые хранятся в столбцах fexists, file_length и blocksize.
Столбец fexists хранит булево значение (TRUE/FALSE). Если файл существует, fexists устанавливается в TRUE. Если файл не существует, fexists устанавливается в FALSE. Тип данных fexists - BOOLEAN.
Колонка file_length хранит длину файла в байтах. Если файл не существует, file_length равен NULL. Тип данных file_length - INTEGER.
Столбец blocksize хранит размер блока файла в байтах. Если файл не существует, blocksize равен NULL. Тип данных blocksize - INTEGER.
Example
SELECT fexists, file_length, blocksize INTO file_flag, file_len, size FROM UTL_FILE.FGETATTR('/home/pgsql', 'regress_pgsql.txt');
FOPEN
FOPEN открывает файл.
Укажите каталог, в котором находится файл.
Укажите имя файла.
Укажите режим открытия файла:
r: Чтение
w: Записать
a: Добавить
Укажите максимальную длину строки (в байтах), которую можно обработать за одну операцию. Если прне указано, по умолчанию используется 1024. Укажите значение от 1 до 32767.
До 50 файлов за сессию могут быть открыты одновременно.
Example
f := UTL_FILE.FOPEN('/home/pgsql','regress_pgsql.txt','r',1024);
FREMOVE
FREMOVE удаляет файл.
Укажите каталог, в котором находится файл.
Укажите имя файла.
Example
PERFORM UTL_FILE.FREMOVE('/home/pgsql', 'regress_pgsql.txt');
FRENAME
FRENAME переименовывает файл.
Укажите расположение каталога исходного файла.
Укажите исходный файл для переименования.
Укажите каталог, в котором будет создан переименованный файл.
Укажите новое имя файла.
Укажите, нужно ли перезаписывать файл, если файл с таким же именем и в том же месте, что и переименованный файл, уже существует. Если указано TRUE, существующий файл будет перезаписан. Если указано FALSE, возникнет ошибка. Если параметр не указан, устанавливается значение FALSE.
See
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Логический тип» в документации Tantor SE для получения информации о логических значениях (TRUE/FALSE).
Example
PERFORM UTL_FILE.FRENAME('/home/pgsql', 'regress_pgsql.txt', '/home/pgsql', 'regress_pgsql2.txt', TRUE);
GET_LINE
GET_LINE считывает строку из файла.
Укажите дескриптор файла, возвращаемый функцией FOPEN, используя режим чтения (r).
Укажите количество байтов для чтения из файла. Если не указано, будет использована максимальная длина строки, указанная при FOPEN.
Возвращаемое значение - это буфер, в который записывается считанная строка из файла.
Символы новой строки не загружаются в буфер.
Если загружается пустая строка, возвращается пустая строка.
Укажите максимальную длину (в байтах) данных для чтения. Укажите значение от 1 до 32767. Если не указано, устанавливается максимальная длина строки, указанная в FOPEN. Если максимальная длина строки не указана в FOPEN, устанавливается значение 1024.
Если длина строки превышает указанное количество байт для чтения, остаток строки считывается при следующем вызове.
Исключение NO_DATA_FOUND возникнет при попытке чтения за последней строкой.
Example
buff := UTL_FILE.GET_LINE(f);
IS_OPEN
IS_OPEN проверяет, открыт ли файл.
Укажите дескриптор файла.
Значение, возвращаемое, имеет тип BOOLEAN. TRUE представляет открытое состояние, а FALSE представляет закрытое состояние.
See
Обратитесь к разделу «Язык SQL» > «Типы данных» > «Логический тип» в документации Tantor SE для получения информации о логических значениях (TRUE/FALSE).
Example
IF UTL_FILE.IS_OPEN(f) THEN PERFORM UTL_FILE.FCLOSE(f); END IF;
NEW_LINE
NEW_LINE записывает один или несколько символов перехода строки.
Укажите открытый дескриптор файла.
Укажите количество символов перехода строки, которые будут записаны в файл. Если прне указано, используется “1”.
Example
PERFORM UTL_FILE.NEW_LINE(f, 2);
PUT
PUT записывает строку в файл.
Укажите дескриптор файла, который был открыт с помощью FOPEN с использованием w (запись) или a (добавление).
Укажите строку, которая будет записана в файл.
Максимальная длина (в байтах) строки, которая будет записана, является максимальной длиной строки, указанной при FOPEN.
PUT не добавляет символ перехода строки. Чтобы добавить символ перехода строки, выполните NEW_LINE.
Example
PERFORM UTL_FILE.PUT(f, 'ABC');
PUT_LINE
PUT_LINE добавляет символ перехода строки к строке и записывает эту строку.
Укажите дескриптор файла, который был открыт с помощью FOPEN w (запись) или a (добавление).
Укажите, нужно ли принудительно записывать в файл. Если указано TRUE, запись в файл будет выполнена принудительно. Если указано FALSE, запись в файл будет выполнена асинхронно. Если параметр не указан, будет установлено значение FALSE.
Максимальная длина строки (в байтах) - это максимальная длина строки, указанная при FOPEN.
Example
PERFORM UTL_FILE.PUT_LINE(f, 'ABC', TRUE);
PUTF
PUTF записывает отформатированную строку.
Укажите дескриптор файла, который был открыт с помощью FOPEN w (запись) или a (добавление).
Укажите формат, который является строкой, включающей форматирующие символы и %s.
В формате кода вставлен символ перехода строки.
Укажите такое же количество входных значений, как и %s в формате. Можно указать до пяти входных значений. %s в формате заменяются соответствующими входными символами. Если входное значение, соответствующее %s, не указано, оно заменяется пустой строкой.
Example
PERFORM UTL_FILE.PUTF(f, '[1=%s, 2=%s, 3=%s, 4=%s, 5=%s]\n', '1', '2', '3', '4', '5');
F.29.35.7.3. Пример использования #
Процедура использования UTL_FILE и пример использования приведены ниже.
1 . Подготовка
Перед началом новой работы, использующей UTL_FILE, зарегистрируйте каталог в таблице UTL_FILE.UTL_FILE_DIR.
Обратитесь к разделу "Регистрация и удаление каталогов" для получения информации по регистрации каталога.
2 . Выполнение задания
Выполните задание, использующее UTL_FILE. Пример показан ниже.
CREATE OR REPLACE FUNCTION gen_file(mydir TEXT, infile TEXT, outfile TEXT, copyfile TEXT) RETURNS void AS $$ DECLARE v1 VARCHAR(32767); inf UTL_FILE.FILE_TYPE; otf UTL_FILE.FILE_TYPE; BEGIN inf := UTL_FILE.FOPEN(mydir, infile,'r',256); otf := UTL_FILE.FOPEN(mydir, outfile,'w'); v1 := UTL_FILE.GET_LINE(inf,256); PERFORM UTL_FILE.PUT_LINE(otf,v1,TRUE); v1 := UTL_FILE.GET_LINE(inf,256); PERFORM UTL_FILE.PUTF(otf,'%s\n',v1); v1 := UTL_FILE.GET_LINE(inf, 256); PERFORM UTL_FILE.PUT(otf,v1); PERFORM UTL_FILE.NEW_LINE(otf); PERFORM UTL_FILE.FFLUSH(otf); inf := UTL_FILE.FCLOSE(inf); otf := UTL_FILE.FCLOSE(otf); PERFORM UTL_FILE.FCOPY(mydir, outfile, mydir, copyfile, 2, 3); PERFORM UTL_FILE.FRENAME(mydir, outfile, mydir, 'rename.txt'); END; $$ LANGUAGE plpgsql; SELECT gen_file('/home/pgsql', 'input.txt', 'output.txt', 'copyfile.txt');
3 . Постобработка
Если вы удаляете задание, которое использует UTL_FILE, удалите информацию о каталоге из таблицы UTL_FILE.UTL_FILE_DIR. Убедитесь, что информация о каталоге не используется другим заданием перед удалением.
Обратитесь к разделу «Регистрация и удаление каталогов» за информацией о том, как удалить каталог.
F.29.36. Глава 7 Поведение транзакций #
Большинство аспектов поведения транзакции точно такие же, однако нижеприведенное отличается.
F.29.36.1. Обработка ошибки оператора. #
create table t (a int primary key, b int); begin; insert into t values(1,1); insert into t values(1, 1); commit;
Oracle: коммит возможен. После этого будет 1 строка в t.
Tantor SE: коммит транзакции не завершен, т.к. 2-я вставка не прошла. поэтому t имеет 0 строк.
F.29.36.2. DML с подзапросом #
Случай 1:
create table dml(a int, b int); insert into dml values(1, 1), (2,2); -- session 1: begin; delete from dml where a in (select min(a) from dml); --session 2: delete from dml where a in (select min(a) from dml); -- session 1: commit;
В Oracle: 1 строка удалена в сессии 2. Поэтому 0 строк в dml в конце.
В PG: 0 строк удалено в sess 2, поэтому 1 строка в dml в конце.
Вероятно, Oracle обнаруживает, что min(a) изменился и откатывает/повторно выполняет оператор.
Та же причина может вызвать и следующее отличие.
create table su (a int, b int); insert into su values(1, 1); - session 1: begin; update su set b = 2 where b = 1; - sess 2: select * from su where a in (select a from su where b = 1) for update; - sess 1: commit;
В Oracle выбирается 0 строк. В Tantor SE выбирается 1 строка (1, 2).
Наилучшей практикой было бы никогда не использовать подзапросы в DML и SELECT ... FOR UPDATE. Даже в Oracle поведение также непоследовательно. В Oracle между версиями 11.2.0.1 и 11.2.0.3 поведение, вероятно, такое же, как в Postgres, но в других версиях нет.
Цель этого документа
Этот документ объясняет действия, необходимые для миграции базы данных Oracle в Tantor SE и включает пояснения по миграции.
Целевая аудитория
Это руководство предназначено для лиц, занимающихся миграцией базы данных Oracle в Tantor SE. Предполагается, что читатель обладает общими знаниями по следующим вопросам:
Tantor SE
База данных Oracle
SQL
Linux
F.29.37. Миграция: Глава 1 Предварительная настройка перед миграцией #
В этой главе объясняются настройки среды, которые должны быть сконфигурированы перед миграцией базы данных Oracle.
Note
В данном руководстве по миграции исходной базой данных для миграции является Oracle, а целевой - Tantor SE. Предполагается использование версий, перечисленных ниже.
Oracle Database 12c
PostgreSQL 9.5
После миграции проверьте работу и подтвердите успешность миграции данных, проверив, получен ли предполагаемый результат.
F.29.37.1. Установка параметра сервера #
Этот раздел описывает параметр сервера, необходимый для сопоставления поведения Tantor SE с поведением базы данных Oracle. Установите параметр в Tantor SE.conf, чтобы база данных всегда работала одинаково для всех клиентов.
Следующая таблица показывает параметры сервера, объясненные здесь.
Параметр сервера | Описание |
---|---|
search_path | Определяет последовательность, в которой производится поиск схем. |
Note
Настройку параметра сервера не рекомендуется менять. Изменяйте настройку только по мере необходимости.
Пояснения в главе 2 и следующие заметки предполагают, что параметр сервера был настроен.
F.29.37.1.1. search_path #
Функции, добавленные с помощью orafce, которые обеспечивают совместимость с базой данных Oracle, определяются как пользовательские функции в схеме "public", которая создается по умолчанию при создании кластера баз данных. Это позволяет всем пользователям использовать эти функции без необходимости настройки каких-либо конкретных параметров. Поэтому, при использовании параметра search_path для указания пути поиска схемы, необходимо включить "public".
Некоторые типы данных и функции, добавленные orafce, реализованы с различными внешними спецификациями в Tantor SE и orafce. По умолчанию, внешние спецификации Tantor SE имеют приоритет.
Для реализации этих типов данных и функций в соответствии с внешними спецификациями orafce, укажите «oracle» и «pg_catalog» в параметре search_path Tantor SE.conf. Необходимо разместить «oracle» перед «pg_catalog».
Перед (по умолчанию)
search_path = '"$user", public'
После
search_path = '"$user", public, oracle, pg_catalog'
See
Обратитесь к документации Orafce для получения информации о функциях, реализованных с различными внешними спецификациями в Tantor SE и orafce.
F.29.37.2. Примеры баз данных #
В этом разделе приведены примеры базы данных управления инвентаризацией для конкретного розничного магазина и базы данных управления персоналом для конкретной компании. Объяснения операций с данными, представленные в этом руководстве, основаны на этих примерах баз данных.
F.29.37.2.1. Управление запасами базы данных #
F.29.37.2.1.1. Содержание Определений Базы Данных #
Эта база данных управляет запасами в розничном магазине. Она состоит из следующих трех таблиц:
inventory_table
Эта таблица содержит информацию о продуктах, с которыми работают, и их количестве на складе.
ordering_table
Эта таблица содержит информацию о продуктах, поставляемых каждым поставщиком, их заказных количествах и ценах закупки.
company_table
Эта таблица содержит название компании, номер телефона и адрес каждого поставщика.
inventory_table
Таблица инвентаря состоит из следующих четырех столбцов:
i_number (номер продукта)
Код, присвоенный продукту
i_name (категория)
Категория продукта
i_quantity (количество на складе)
Количество товара на складе
i_warehouse (номер склада)
Код склада, где хранится продукт
Содержимое таблицы с товарным запасом отображается в «inventory_table».
ordering_table (таблица заказов)
Таблица заказов состоит из следующих пяти столбцов:
o_code (supplier)
Код компании поставщика
o_number (поставляемый продукт)
Код, присвоенный продукту
o_price (цена покупки)
Цена покупки продукта
o_quantity (количество для заказа)
Количество заказанных продуктов
o_order_date (order date)
Дата заказа продукта
Содержимое таблицы сортировки отображается в «ordering_table».
таблица_компаний (таблица компаний)
Таблица company состоит из следующих четырех столбцов:
c_code (код компании)
Код, присвоенный компании
c_name (название компании)
Название компании
c_telephone (номер телефона)
Номер телефона компании
c_address (address)
Адрес компании
Содержимое таблицы компании отображается в «company_table».
При использовании имен таблиц и имен столбцов, описанных выше, в этом руководстве, например, в примерах SQL-запросов, если не указано иное, подразумеваются таблицы и столбцы, перечисленные в «Содержимое базы данных управления товарными запасами». Обратите внимание, что данные, показанные в этой таблице, являются вымышленными.
Содержимое базы данных управления товарными запасами
inventory_table
i_number (номер продукта) | i_name (категория) | i_quantity (количество на складе) | i_warehouse (номер склада) |
---|---|---|---|
SMALLINT PRIMARY KEY | VARCHAR(20) NOT NULL | INTEGER | SMALLINT |
110 | телевизор | 85 | 2 |
111 | телевизор | 90 | 2 |
123 | холодильник | 60 | 1 |
124 | холодильник | 75 | 1 |
140 | CD-плеер | 120 | 2 |
212 | телевизор | 0 | 2 |
215 | видео-плеер | 5 | 2 |
226 | холодильник | 8 | 1 |
227 | холодильник | 15 | 1 |
240 | проигрыватель CD | 25 | 2 |
243 | CD-плеер | 14 | 2 |
351 | cd-плеер | 2500 | 2 |
ordering_table
o_code (поставщик) | o_number (поставляемый продукт) | o_price (цена закупки) | o_quantity (количество) | o_order_date (дата заказа) |
---|---|---|---|---|
SMALLINT NOT NULL | SMALLINT NOT NULL | INTEGER | SMALLINT | DATE |
61 | 123 | 48000 | 60 | 42557 |
61 | 124 | 64000 | 40 | 42557 |
61 | 140 | 8000 | 80 | 42557 |
61 | 215 | 240000 | 10 | 42557 |
61 | 240 | 80000 | 20 | 42557 |
62 | 110 | 37500 | 120 | 42557 |
62 | 226 | 112500 | 20 | 42557 |
62 | 351 | 375 | 800 | 42557 |
63 | 111 | 57400 | 80 | 42557 |
63 | 212 | 205000 | 30 | 42557 |
63 | 215 | 246000 | 10 | 42557 |
71 | 140 | 7800 | 50 | 42557 |
71 | 351 | 390 | 600 | 42557 |
72 | 140 | 7000 | 70 | 42557 |
72 | 215 | 210000 | 10 | 42557 |
72 | 226 | 105000 | 20 | 42557 |
72 | 243 | 84000 | 10 | 42557 |
72 | 351 | 350 | 1000 | 42557 |
74 | 110 | 39000 | 120 | 42557 |
74 | 111 | 54000 | 120 | 42557 |
74 | 226 | 117000 | 20 | 42557 |
74 | 227 | 140400 | 10 | 42557 |
74 | 351 | 390 | 700 | 42557 |
company_table
c_code (код компании) | c_name (название компании) | c_telephone (номер телефона) | c_address (адрес) |
---|---|---|---|
SMALLINT NOT NULL | VARCHAR(20) NOT NULL | VARCHAR(12) | VARCHAR(50) |
61 | Adam Electric | 111-777-4444 | 7-8-9, Shin-Kamata, Oda Ward, Tokyo |
62 | Idea Corporation | 222-888-5555 | 1-2-3, Asahi Ward, Obama City, Kanagawa |
63 | Fullmoon Industry | 333-999-6666 | 1-1-1, Osaki, Urawa Town, Saitama |
71 | Stream Electric | 444-111-7777 | 4-5-6, Akasakadai, Sakaida City, Osaka |
72 | Tornado Industry | 555-222-8888 | 2-3-7, Higashi-Yodogawa, Nada Town, Osaka |
74 | First Corporation | 666-333-9999 | 4-16-16, Naka City, Kyoto |
F.29.37.2.1.2. Отношение между таблицами #
"Отношение между таблицами" показывает, как таблицы связаны друг с другом. Таблица с товарными запасами и таблица заказов связаны посредством номера продукта и поставляемого продукта. Таблица заказов и таблица компании связаны посредством поставщика и кода компании. Например, продукт, идентифицированный номером продукта "123" в таблице с товарными запасами, имеет категорию "холодильник" и количество в инвентаре "60", и хранится на складе, идентифицированном кодом "1". Затем, строка, содержащая поставляемый продукт "123" в таблице заказов, показывает, что закупочная цена продукта составляет "48000", а количество заказов - "60". Кроме того, код компании поставщика можно подтвердить как "61", и строка, содержащая код компании "61" в таблице компании, показывает название, телефонный номер и адрес компании, поставляющей продукт.
Отношение между таблицами
Диаграмма F.52. REL1
![REL1](images/orafce/Inventory_Management_Database.gif)
F.29.37.2.1.3. Примеры определений базы данных #
Следующий пример показывает определения таблиц для базы данных управления запасами.
CREATE TABLE inventory_table ( i_number SMALLINT PRIMARY KEY, i_name VARCHAR(20) NOT NULL, i_quantity INTEGER, i_warehouse SMALLINT ); CREATE TABLE ordering_table ( o_code SMALLINT NOT NULL, o_number SMALLINT NOT NULL, o_price INTEGER, o_quantity SMALLINT, o_order_date DATE ); CREATE TABLE company_table ( c_code SMALLINT NOT NULL, c_name VARCHAR(20) NOT NULL, c_telephone VARCHAR(12), c_address VARCHAR(50) ); INSERT INTO inventory_table VALUES (110, 'television', 85, 2); INSERT INTO inventory_table VALUES (111, 'television', 90, 2); INSERT INTO inventory_table VALUES (123, 'refrigerator', 60, 1); INSERT INTO inventory_table VALUES (124, 'refrigerator', 75, 1); INSERT INTO inventory_table VALUES (140, 'cd player', 120, 2); INSERT INTO inventory_table VALUES (212, 'television', 0, 2); INSERT INTO inventory_table VALUES (215, 'video', 5, 2); INSERT INTO inventory_table VALUES (226, 'refrigerator', 8, 1); INSERT INTO inventory_table VALUES (227, 'refrigerator', 15, 1); INSERT INTO inventory_table VALUES (240, 'cd player', 25, 2); INSERT INTO inventory_table VALUES (243, 'cd player', 14, 2); INSERT INTO inventory_table VALUES (351, 'cd', 2500, 2); INSERT INTO ordering_table VALUES (61, 123, 48000, 60, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (61, 124, 64000, 40, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (61, 140, 8000, 80, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (61, 215, 240000, 10, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (61, 240, 80000, 20, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (62, 110, 37500, 120, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (62, 226, 112500, 20, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (62, 351, 375, 800, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (63, 111, 57400, 80, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (63, 212, 205000, 30, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (63, 215, 246000, 10, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (71, 140, 7800, 50, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (71, 351, 390, 600, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (72, 140, 7000, 70, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (72, 215, 210000, 10, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (72, 226, 105000, 20, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (72, 243, 84000, 10, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (72, 351, 350, 1000, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (74, 110, 39000, 120, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (74, 111, 54000, 120, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (74, 226, 117000, 20, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (74, 227, 140400, 10, DATE'2016-07-06'); INSERT INTO ordering_table VALUES (74, 351, 390, 700, DATE'2016-07-06'); INSERT INTO company_table VALUES (61, 'Adam Electric', '111-777-4444', '7-8-9, Shin-Kamata, Oda Ward, Tokyo'); INSERT INTO company_table VALUES (62, 'Idea Corporation', '222-888-5555', '1-2-3, Asahi Ward, Obama City, Kanagawa'); INSERT INTO company_table VALUES (63, 'Fullmoon Industry', '333-999-6666', '1-1-1, Osaki, Urawa Town, Saitama'); INSERT INTO company_table VALUES (71, 'Stream Electric', '444-111-7777', '4-5-6, Akasakadai, Sakaida City, Osaka'); INSERT INTO company_table VALUES (72, 'Tornado Industry', '555-222-8888', '2-3-7, Higashi-Yodogawa, Nada Town, Osaka'); INSERT INTO company_table VALUES (74, 'First Corporation', '666-333-9999', '4-16-16, Naka City, Kyoto');
F.29.37.2.2. База данных управления персоналом #
F.29.37.2.2.1. Содержание Определений Базы Данных #
Эта база данных управляет персоналом компании. Она состоит из следующих двух таблиц:
таблица_сотрудников (таблица сотрудников)
Эта таблица содержит имя, должность, возраст и руководителя каждого сотрудника.
attendance_table (таблица управления посещаемостью)
Эта таблица содержит время посещения каждого сотрудника.
staff_table
Таблица staff состоит из следующих пяти столбцов:
staff_id (идентификационный номер сотрудника)
Код, назначенный сотруднику
name (имя сотрудника)
Имя сотрудника
работа (должность)
Должность сотрудника
возраст (age)
Возраст сотрудника
manager_id (идентификационный номер сотрудника-менеджера)
Код, назначенный руководителю сотрудника
Содержимое таблицы персонала отображается в "staff_table".
attendance_table
Таблица управления посещаемостью состоит из следующих трех столбцов:
staff_id (идентификационный номер сотрудника)
Код, назначенный сотруднику
work_flag (флаг посещаемости)
Флаг, указывающий, присутствует ли сотрудник или отсутствует
attendance_time (время посещения)
Рабочие часы начала и окончания работы сотрудника
Содержимое таблицы управления посещаемостью отображается в «attendance_table».
При использовании имен таблиц и имен столбцов, описанных выше, в этом руководстве, например, в примерах SQL-запросов, если не указано иное, подразумеваются таблицы и столбцы, перечисленные в «Содержимое базы данных по управлению персоналом». Обратите внимание, что данные, показанные в этой таблице, являются вымышленными.
Содержимое базы данных по управлению персоналом
staff_table
staff_id (номер ID сотрудника) | name (имя сотрудника) | job (должность) | age (возраст) | manager_id (код менеджера) |
---|---|---|---|---|
CHAR(4) | VARCHAR(20) | VARCHAR(30) | INTEGER | CHAR(4) |
1001 | tokyo taro | president | 68 | <NULL> |
2001 | oosaka jiro | менеджер по продажам | 48 | 1001 |
3001 | hyogo akihiko | сотрудник отдела продаж | 28 | 2001 |
3002 | mie megumi | сотрудник отдела продаж | 31 | 2001 |
3003 | hirosima taro | сотрудник отдела продаж | 36 | 2001 |
3004 | nagano motoko | сотрудник отдела продаж | 40 | 2001 |
3005 | akita taro | сотрудник отдела продаж | 25 | 2001 |
2002 | hukuoka saburo | главный бухгалтер | 52 | 1001 |
4001 | nagasaki rokuro | сотрудник бухгалтерии | 39 | 2002 |
2003 | kyoto hanako | менеджер по общим вопросам | 43 | 1001 |
5001 | okayama reiko | сотрудник отдела по общим вопросам | 33 | 2003 |
5002 | kagawa shiro | сотрудник отдела по общим вопросам | 27 | 2003 |
5003 | okinawa takao | сотрудник отдела по общим вопросам | 30 | 2003 |
5004 | miyagi kenta | <NULL> | 23 | 2003 |
5005 | aichi yui | ’’(null) | 23 | 2003 |
attendance_table
staff_id (код сотрудника) | work_flag (флаг посещаемости) | attendance_time (время посещения) |
---|---|---|
CHAR(4) | CHAR(1) | TIMESTAMP WITH TIME ZONE |
1001 | i | 2016-07-06 08:00:00+09 |
3001 | i | 2016-07-06 08:30:00+09 |
1001 | o | 2016-07-06 17:30:00+09 |
3001 | o | 2016-07-06 18:00:00+09 |
F.29.37.2.2.2. Отношение между таблицами #
"Отношение между таблицами" показывает, как таблицы связаны друг с другом. Таблица персонала и таблица управления посещаемостью связаны посредством номера идентификации персонала.
Отношение между таблицами
Диаграмма F.53. REL2
![REL2](images/orafce/Staff_Management_Database.gif)
F.29.37.2.2.3. Примеры определений базы данных #
Следующий пример показывает определения таблиц для базы данных управления персоналом.
CREATE TABLE staff_table ( staff_id CHAR(4), name VARCHAR(20), job VARCHAR(30), age INTEGER, manager_id CHAR(4) ); CREATE TABLE attendance_table ( staff_id CHAR(4), work_flag CHAR(1), attendance_time TIMESTAMP WITH TIME ZONE ); INSERT INTO staff_table VALUES ('1001', 'tokyo taro', 'president', 68, NULL); INSERT INTO staff_table VALUES ('2001', 'oosaka jiro', 'sales manager', 48, '1001'); INSERT INTO staff_table VALUES ('3001', 'hyogo akihiko', 'sales member', 28, '2001'); INSERT INTO staff_table VALUES ('3002', 'mie megumi', 'sales member', 31, '2001'); INSERT INTO staff_table VALUES ('3003', 'hirosima taro', 'sales member', 36, '2001'); INSERT INTO staff_table VALUES ('3004', 'nagano motoko', 'sales member', 40, '2001'); INSERT INTO staff_table VALUES ('3005', 'akita taro', 'sales member', 25, '2001'); INSERT INTO staff_table VALUES ('2002', 'hukuoka saburo', 'accounting manager', 52, '1001'); INSERT INTO staff_table VALUES ('4001', 'nagasaki rokuro', 'accounting member', 39, '2002'); INSERT INTO staff_table VALUES ('2003', 'kyoto hanako', 'general affairs manager', 43, '1001'); INSERT INTO staff_table VALUES ('5001', 'okayama reiko', 'general affairs member', 33, '2003'); INSERT INTO staff_table VALUES ('5002', 'kagawa shiro', 'general affairs member', 27, '2003'); INSERT INTO staff_table VALUES ('5003', 'okinawa takao', 'general affairs member', 30, '2003'); INSERT INTO staff_table VALUES ('5004', 'miyagi kenta', NULL, 23, '2003'); INSERT INTO staff_table VALUES ('5005', 'aichi yui', '', 23, '2003'); INSERT INTO attendance_table VALUES ('1001', 'i', TIMESTAMP WITH TIME ZONE'2016-07-06 08:00:00+09:00'); INSERT INTO attendance_table VALUES ('3001', 'i', TIMESTAMP WITH TIME ZONE'2016-07-06 08:30:00+09:00'); INSERT INTO attendance_table VALUES ('1001', 'o', TIMESTAMP WITH TIME ZONE'2016-07-06 17:30:00+09:00'); INSERT INTO attendance_table VALUES ('3001', 'o', TIMESTAMP WITH TIME ZONE'2016-07-06 18:00:00+09:00');
F.29.38. Миграция: Глава 2 Миграция синтаксических элементов #
Эта глава объясняет, как перенести элементы синтаксиса SQL.
F.29.38.1. Основные элементы #
Этот раздел объясняет основные элементы синтаксиса SQL.
F.29.38.1.1. TIMESTAMP Literal #
Description
Литерал с префиксом TIMESTAMP рассматривается как данные типа TIMESTAMP.
Функциональные различия
База данных Oracle
TIMESTAMP префикс может обозначать литерал часового пояса.
Tantor SE
Префикс TIMESTAMP WITH TIME ZONE обозначает литерал временной зоны. Если префикс только TIMESTAMP, значение временной зоны отбрасывается. Никакого предупреждения, ошибки или другого уведомления не выводится.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово TIMESTAMP и определите, где оно используется в качестве префикса литерала.
Если для литерала указан часовой пояс, измените префикс на TIMESTAMP WITH TIME ZONE.
Пример миграции
Приведенный ниже пример показывает, как перенести литерал TIMESTAMP с часовым поясом.
База данных Oracle | Tantor SE |
---|---|
INSERT INTO attendance_table VALUES( '1001', 'i', TIMESTAMP'2016-05-20 12:30:00 +09:00' ); |
INSERT INTO attendance_table VALUES( '1001', 'i', TIMESTAMP WITH TIME ZONE'2016-05-20 12:30:00 +09:00' ); |
F.29.38.1.2. Альтернативный знак кавычек #
Description
Использование альтернативной кавычки позволяет использовать разделитель для текстовой строки.
Функциональные различия
База данных Oracle
Используются альтернативные кавычки q’x и x’. Буква x представляет альтернативный символ.
Tantor SE
Альтернативные кавычки q и q используются.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово q’ или Q’ и определите, где используются альтернативные кавычки.
Удалите альтернативные символы и апострофы, где использованы альтернативные кавычки, и заключите строки в q. Символ между двумя символами $ можно опустить или может быть указана любая строка.
Пример миграции
Приведенный ниже пример показывает, как перенести альтернативную кавычку.
База данных Oracle | Tantor SE |
---|---|
SELECT q'[Adam Electric company's address]' FROM DUAL; |
SELECT $q$Adam Electric company's address$q$ FROM DUAL; |
See
Обратитесь к разделу «Язык SQL» > «Лексическая структура» > «Строковые константы в кавычках-долларах» в документации Tantor SE для получения информации о других символах-кавычках.
F.29.38.2. Типы данных #
Этот раздел объясняет типы данных.
F.29.38.2.1. Перенос типов данных #
В таблице ниже перечислены типы данных Tantor SE, которые соответствуют типам данных базы данных Oracle.
Соответствие типов данных
Character
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
| Specifies the number of bytes or number of characters. | YR |
символ | Only the number of characters can be specified. |
| MR |
text |
До 1 ГБ (текст) | |
| Specifies the number of bytes or number of characters. | YR |
символьная переменная | Only the number of characters can be specified. |
LONG | MR | текст | До 1 ГБ | |
M | Большой объект | |||
| YR |
nchar | This data type is internally used as a character type. | |
NCHAR VARYING | YR |
nchar varying | This data type is internally used as a character varying type | |
| MR |
text |
До 1 ГБ (текст) | |
NVARCHAR2 | YR | nvarchar2 |
Последовательность сортировки не поддерживается. | |
MR |
nchar varying | This data type is internally used as a character varying type. | ||
VARCHAR2 | Specifies the number of bytes or number of characters. | YR | varchar2 |
Можно указать только количество байтов. |
MR | символьная строка | Можно указать только количество символов. |
Numeric
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
BINARY_DOUBLE | M | double precision | ||
BINARY_FLOAT | M | real | ||
DOUBLE PRECISION | Y | double precision | ||
FLOAT | Y | float | ||
INT INTEGER | Y | int integer | ||
NUMBER DEC DECIMAL NUMERIC | Определяет числа, округленные в соответствии с определением масштаба. | MR | smallint integer bigint numeric | Целые числа от -32,768 до +32,767 (smallint) Целые числа от -2,147,483,648 до +2,147,483,647 (integer) Целые числа от -9,223,372,036,854,775,808 до +9,223,372,036,854,775,807(bigint) |
REAL | Y | real | ||
SMALLINT | Y | smallint |
Дата и время
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
INTERVAL DAY TO SECOND | Y | с начала дня до секунды | ||
INTERVAL YEAR TO MONTH | Y | с начала года по текущий месяц | ||
TIMESTAMP | Y | timestamp | ||
TIMESTAMP WITH LOCAL TIME ZONE | M | timestamp with time zone | ||
TIMESTAMP WITH TIME ZONE | Д | метка времени с часовым поясом | ||
DATE | Y | дата (orafce) | Время может быть сохранено в дополнение к дате. Параметр search_path должен быть указан. | |
ГОД | дата (PostgreSQL) | Сохраняется только дата. | ||
M | timestamp |
Binary
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
BFILE | MR | bytea Большой объект | До 1 ГБ (bytea) До 4 ТБ (Большой объект) | |
BLOB BINARY LARGE OBJECT | MR | bytea Большой объект | До 1 ГБ (bytea) До 4 ТБ (Большой объект) | |
LONG RAW | MR | bytea Большой объект | До 1 ГБ (bytea) До 4 ТБ (Большой объект) | |
RAW | M | bytea | ||
ROWID | M | oid | ||
UROWID | N |
Other
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
ЛЮБЫЕДАННЫЕ | N | |||
ЛЮБОЙНАБОРДАННЫХДАННЫХ | N | |||
ANYTYPE | N | |||
DBUriType | N | |||
HTTPUriType | N | |||
MLSLABEL | N | |||
ORDAudio | N | |||
ORDDicom | N | |||
ORDDoc | N | |||
ORDImage | N | |||
ORDVideo | N | |||
REF тип данных | N | |||
SDO_GEOMETRY | N | |||
SDO_GEORASTER | N | |||
SDO_TOPO_GEOMETRY | N | |||
SI_AverageColor | N | |||
SI_Color | N | |||
SI_ColorHistogram | N | |||
SI_FeatureList | N | |||
SI_PositionalColor | N | |||
SI_StillImage | N | |||
SI_Texture | N | |||
Пакет URIFactory | N | |||
ТипURI | N | |||
VARRAY | M | Тип массива | ||
XDBUriType | N | |||
XMLType | M | Тип XML | ||
Тип объекта | N | |||
Вложенная таблица | N |
Y: Тип данных может быть перенесен без изменений
M: Измененный тип данных может быть перенесен
N: Не может быть перенесено
YR: Тип данных может быть перенесен как есть с ограничениями
MR: Измененный тип данных может быть перенесен с ограничениями
F.29.38.2.2. Примеры миграции типов данных #
F.29.38.2.2.1. Примеры миграции общих типов данных #
Описание миграции
Обратитесь к разделу "Соответствие типов данных" и измените типы данных базы данных Oracle на типы данных Tantor SE.
Пример миграции
База данных Oracle | Tantor SE |
---|---|
CREATE TABLE t1( col1 SMALLINT, col2 VARCHAR2(10), col3 NVARCHAR2(10), col4 DATE, col5 NUMBER(10), col6 RAW(2000), col7 BLOB ); |
CREATE TABLE t1( col1 SMALLINT, col2 VARCHAR(10), col3 NCHAR VARYING(10), col4 TIMESTAMP, col5 INTEGER, col6 BYTEA, col7 BYTEA ); |
F.29.38.2.2.2. Тип ЧИСЛО #
Функциональные различия
База данных Oracle
Отрицательное значение может быть указано в масштабе NUMBER.
Любое значение, указанное в масштабе за пределами количества значимых цифр, округляется.
Tantor SE
Отрицательное значение не может быть указано в масштабе типа NUMERIC.
Любое значение, указанное в масштабе за пределами числа значащих цифр, отбрасывается.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Измените масштабы DECIMAL на 0 и добавьте количество измененных цифр к точности.
Создайте функцию, которая использует функцию ROUND для округления столбца, который был изменен на шаге (1) выше.
Создайте триггер, который выполняет функцию, созданную в Шаге (2) выше, при выполнении операторов INSERT и UPDATE.
Пример миграции
Приведенный ниже пример показывает, как выполнить миграцию типа NUMBER.
База данных Oracle | Tantor SE |
---|---|
CREATE TABLE t1( col1 SMALLINT, col2 NUMBER(10,-2) ); INSERT INTO t1 VALUES( 11, 1234567890 ); SELECT * FROM t1; |
CREATE TABLE t1( col1 SMALLINT, col2 NUMERIC(12,0) ); CREATE FUNCTION f1() RETURNS TRIGGER AS $$ BEGIN NEW.col2 := ROUND(NEW.col2,-2); RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER g1 BEFORE INSERT OR UPDATE ON t1 FOR EACH ROW EXECUTE PROCEDURE f1(); INSERT INTO t1 VALUES( 11, 1234567890 ); SELECT * FROM t1; |
F.29.38.3. Pseudocolumns #
Этот раздел объясняет псевдоколонки.
F.29.38.3.1. CURRVAL #
Description
CURRVAL возвращает значение, ближайшее к значению, полученному с помощью NEXTVAL из последовательности в текущей сессии.
Функциональные различия
База данных Oracle
Имя последовательности указывается как sequenceName.CURRVAL.
Tantor SE
Имя последовательности указывается как CURRVAL('sequenceName').
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова CURRVAL и определение его использования.
Измените спецификацию имени последовательности, поместив ее после CURRVAL и заключив в скобки и апострофы.
Пример миграции
Приведенный ниже пример показывает, как выполнить миграцию CURRVAL.
База данных Oracle | Tantor SE |
---|---|
SELECT seq1.CURRVAL FROM DUAL; |
SELECT CURRVAL('seq1') FROM DUAL; |
F.29.38.3.2. NEXTVAL #
Description
NEXTVAL возвращает следующий номер в последовательности.
Функциональные различия
База данных Oracle
Имя последовательности указывается как sequenceName.NEXTVAL.
Tantor SE
Имя последовательности указывается как NEXTVAL('sequenceName').
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова NEXTVAL и определение его использования.
Измените спецификацию имени последовательности, поместив ее после NEXTVAL и заключив в скобки и апострофы.
Пример миграции
Приведенный ниже пример показывает, как выполнить миграцию NEXTVAL.
База данных Oracle | Tantor SE |
---|---|
SELECT seq1.NEXTVAL FROM DUAL; |
SELECT NEXTVAL('seq1') FROM DUAL; |
F.29.38.3.3. ROWID #
Description
ROWID получает информацию для уникальной идентификации данных.
Функциональные различия
База данных Oracle
ROWID создается автоматически при создании таблицы.
Tantor SE
ROWID не может быть использован. Вместо этого используйте OID. Однако, при создании таблицы необходимо указать WITH OIDS.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Укажите WITH OIDS в конце оператора CREATE TABLE.
Измените элемент извлечения ROWID в операторе SELECT на OID.
Пример миграции
База данных Oracle | Tantor SE |
---|---|
CREATE TABLE t1( col1 INTEGER ); INSERT INTO t1 VALUES( 11 ); SELECT ROWID, col1 FROM t1; |
CREATE TABLE t1( col1 INTEGER ) WITH OIDS; INSERT INTO t1 VALUES( 11 ); SELECT OID, col1 FROM t1; |
F.29.38.3.4. ROWNUM #
Description
ROWNUM получает номер текущей строки.
F.29.38.3.4.1. Получение номера строки #
Функциональные различия
База данных Oracle
ROWNUM получает номер текущей строки.
Tantor SE
ROWNUM не может быть использован. Вместо этого используйте ROW_NUMBER() OVER().
Процедура миграции
Используя функцию ROW_NUMBER() вместо ROWNUM, выполните миграцию так, чтобы получить текущий номер. Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова ROWNUM и определение его использования.
Измените ROWNUM на ROW_NUMBER() OVER().
Пример миграции
Приведенный ниже пример показывает миграцию, когда получен номер строки.
База данных Oracle | Tantor SE |
---|---|
SELECT ROWNUM, i_number, i_name FROM inventory_table; |
SELECT ROW_NUMBER() OVER(), i_number, i_name FROM inventory_table; |
Note
Этот пример миграции не может быть использован с оператором UPDATE.
F.29.38.3.4.2. Сортировка записей и получение первых N записей #
Функциональные различия
База данных Oracle
Если в подзапросе, содержащем предложение ORDER BY, указано в предложении FROM, и в предложении WHERE определено условие ROWNUM, записи сортируются, а затем получаются первые N записей.
Tantor SE
ROWNUM не может быть использован. Вместо этого используйте оператор LIMIT, отсортируйте записи и получите первые N записей.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова ROWNUM и определение его использования.
Если в подзапросе предложения FROM указано предложение ORDER BY и результаты фильтруются в соответствии с условием ROWNUM в предложении WHERE, рассматривайте эту часть как SQL-запрос, который сортирует записи и затем получает первые N записей.
Переместите имя таблицы и предложение ORDER BY из подзапроса в оператор SELECT выше и удалите подзапрос.
В предложении LIMIT установите то же самое число, что и условие ROWNUM в предложении WHERE, и удалите условие ROWNUM из предложения WHERE.
Пример миграции
Приведенный ниже пример показывает миграцию, когда записи сортируются, а затем получаются первые N записей.
База данных Oracle | Tantor SE |
---|---|
SELECT i_number, i_name FROM ( SELECT * FROM inventory_table ORDER BY i_number DESC ) WHERE ROWNUM < 5; |
SELECT i_number, i_name FROM inventory_table ORDER BY i_number DESC LIMIT 4; |
F.29.38.4. Обработка NULL и строк нулевой длины #
В этом разделе объясняется, как обрабатываются NULL и строки нулевой длины.
Базы данных Oracle обрабатывают строки нулевой длины как NULL. В отличие от этого, Tantor SE рассматривает строки нулевой длины и NULL как два разных значения.
Таблица ниже перечисляет преимущества и недостатки использования строк нулевой длины и NULL при выполнении миграции.
Преимущества и недостатки сохранения или миграции нулевых строк базы данных Oracle
Нулевые строки базы данных Oracle | Преимущества | Недостатки |
---|---|---|
Рассматриваются как строки нулевой длины без переноса в NULL | Конкатенация строк (||) может использоваться как есть. | Целевые данные имеют меньше совпадений, чем с IS NULL. Условные выражения должны быть изменены. |
Мигрировано в NULL | IS NULL может быть использован как есть. | Результат конкатенации строк (||) является NULL. Конкатенацию строк необходимо изменить. |
Следующие разделы объясняют, как вносить изменения, если используются пустые строки и значения NULL вместе.
F.29.38.4.1. Условия поиска (предикат IS NULL) #
Функциональные различия
База данных Oracle
Даже строки нулевой длины удовлетворяют условию IS NULL.
Tantor SE
Строки нулевой длины не удовлетворяют условию IS NULL.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово IS NULL и определите, где используется поиск NULL.
Измените части, найденные поисковым запросом IS NULL, на IS NULL ИЛИ strName = ’’.
Пример миграции
Приведенный ниже пример показывает миграцию при выполнении поиска нулевой длины строк и значений NULL.
База данных Oracle | Tantor SE |
---|---|
SELECT * FROM staff_table WHERE job IS NULL; |
SELECT * FROM staff_table WHERE job IS NULL OR job = ''; |
Приведенный ниже пример показывает миграцию при выполнении поиска значений, отличных от строк нулевой длины и значений NULL.
База данных Oracle | Tantor SE |
---|---|
SELECT * FROM staff_table WHERE job IS NOT NULL; |
SELECT * FROM staff_table WHERE job IS NOT NULL AND job != ''; |
F.29.38.4.2. Условия поиска (Сравнительный предикат) #
Функциональные различия
База данных Oracle
Нулевые строки рассматриваются как NULL, поэтому они не соответствуют условиям поиска.
Tantor SE
Нулевые строки не рассматриваются как NULL, поэтому они могут соответствовать условиям поиска.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Найти имя столбца, в котором хранится строка нулевой длины, и определить, где используется сравнение строк.
Добавьте AND columnName != ’’ к условию поиска.
Пример миграции
Приведенный ниже пример показывает миграцию, когда нулевая строка сравнения указывается в качестве условия поиска.
База данных Oracle | Tantor SE |
---|---|
SELECT * FROM staff_table WHERE job < 'A00'; |
SELECT * FROM staff_table WHERE job < 'A00' AND job != ''; |
F.29.38.4.3. Конкатенация строк (||) #
Функциональные различия
База данных Oracle
Конкатенация с NULL возвращает строки, отличные от NULL.
Tantor SE
Конкатенация с NULL возвращает NULL.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова || и определение мест, где используется конкатенация строк.
Если значения, которые нужно объединить, могут стать NULL, используйте функцию NVL для возвращения строки нулевой длины вместо NULL.
Пример миграции
Приведенный ниже пример показывает миграцию, когда в базах данных Oracle возвращается значение NULL при конкатенации строк (||).
База данных Oracle | Tantor SE |
---|---|
SELECT 'NAME:' || name FROM staff_table; |
SELECT 'NAME:' || NVL( name, '' ) FROM staff_table; |
F.29.39. Миграция: Глава 3 Миграция функций #
Эта глава объясняет, как перенести SQL-функции.
F.29.39.1. CONVERT #
Description
CONVERT преобразует строку из одного набора символов в другой.
Функциональные различия
База данных Oracle
Строка преобразуется из набора символов, указанного в третьем аргументе, в набор символов, указанный во втором аргументе.
Tantor SE
Строка преобразуется из набора символов, указанного во втором аргументе, в набор символов, указанный в третьем аргументе.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово CONVERT и определите, где оно используется.
Переключите второй и третий аргументы.
Измените наборы символов во втором и третьем аргументах на имена, которые действительны в системе кодирования Tantor SE.
Пример миграции
Пример ниже показывает миграцию, когда строки изменяются на набор символов целевой базы данных.
База данных Oracle | Tantor SE |
---|---|
SELECT CONVERT( 'abc', 'JA16EUC', 'AL32UTF8' ) FROM DUAL; |
SELECT CONVERT( CAST( 'abc' AS BYTEA ), 'UTF8', 'EUC_JP' ) FROM DUAL; |
F.29.39.2. EMPTY_BLOB #
Description
EMPTY_BLOB инициализирует области типа BLOB и создает пустые данные.
Функциональные различия
База данных Oracle
Инициализируются области типа BLOB и создаются пустые данные.
Tantor SE
EMPTY_BLOB не может быть использован. Вместо этого используйте строку нулевой длины для инициализации.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово EMPTY_BLOB() и определите, где оно используется.
Измените EMPTY_BLOB() на строку нулевой длины ''.
Пример миграции
Пример ниже показывает миграцию при вставке пустых данных в столбец BLOB.
База данных Oracle | Tantor SE |
---|---|
CREATE TABLE t1( col1 INTEGER, col2 BLOB ); INSERT INTO t1 VALUES( 11, EMPTY_BLOB() ); |
CREATE TABLE t1( col1 INTEGER, col2 BYTEA ); INSERT INTO t1 VALUES( 11, '' ); |
Пример ниже показывает миграцию, когда данные в столбце BLOB обновляются до пустого значения.
База данных Oracle | Tantor SE |
---|---|
UPDATE t1 SET col2 = EMPTY_BLOB() WHERE col1 = 11; |
UPDATE t1 SET col2 = '' WHERE col1 = 11; |
F.29.39.3. LEAD #
Description
LEAD получает значение указанной в аргументах колонки из записи, которая находится ниже через указанное число строк.
Функциональные различия
База данных Oracle
NULL значение в столбце, указанном в аргументах, может быть исключено из расчета.
Tantor SE
NULL значение в столбце, указанном в аргументах, не может быть исключено из расчета.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова LEAD и определение его использования.
Если указано предложение IGNORE NULLS, проверьте следующие значения для создания подзапроса, исключающего значения NULL:
Аргументы функции LEAD (перед IGNORE NULLS)
Таблицы, на которые влияет IGNORE NULLS
Столбцы, на которые влияет IGNORE NULLS
Столбцы, которые нужно отсортировать
Измените таблицу в предложении FROM на подзапрос, чтобы соответствовать формату, показанному ниже.
Замените LEAD в выборке на MAX. Укажите LEAD_IGNLS в аргументах MAX, и PARTITION BY CNT в предложении OVER.
FROM ( SELECT columnBeingUsed, CASE WHEN ignoreNullsTargetColumn IS NOT NULL THEN LEAD( leadFunctionArguments ) OVER( PARTITION BY NVL2( ignoreNullsTargetColumn, '0', '1' ) ORDER BY sortTargetColumn ) END AS LEAD_IGNLS, COUNT( ignoreNullsTargetColumn ) OVER( ORDER BY sortTargetColumn ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) AS CNT FROM ignoreNullsTargetTable ) AS T1;
Пример миграции
Пример ниже показывает миграцию, когда значения NULL не включены в расчет значений столбцов.
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id, name, job, LEAD( job, 1 ) IGNORE NULLS OVER( ORDER BY staff_id DESC) AS "LEAD_IGNORE_NULLS" FROM staff_table ORDER BY staff_id DESC; |
SELECT staff_id, name, job, MAX( LEAD_IGNLS ) OVER( PARTITION BY CNT ) AS "LEAD_IGNORE_NULLS" FROM ( SELECT staff_id, name, job, CASE WHEN job IS NOT NULL THEN LEAD( job, 1 ) OVER( PARTITION BY NVL2( job, '0', '1' ) ORDER BY staff_id DESC) END AS LEAD_IGNLS, COUNT( job ) OVER( ORDER BY staff_id DESC ROWS BETWEEN 1 FOLLOWING AND UNBOUNDED FOLLOWING ) AS CNT FROM staff_table ) AS T1 ORDER BY staff_id DESC; |
Information
Если не указано предложение IGNORE NULLS или указано предложение RESPECT NULLS, NULL включается в расчет, поэтому операция такая же, как функция LEAD в Tantor SE. Следовательно, если предложение IGNORE NULLS не указано, никаких изменений делать не нужно. Если указано предложение RESPECT NULLS, удалите предложение RESPECT NULLS.
Пример ниже показывает миграцию, когда RESPECT NULLS указан в базе данных Oracle.
Пример миграции LEAD (когда указано RESPECT NULLS)
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id, name, job, LEAD( job, 1 ) RESPECT NULLS OVER( ORDER BY staff_id DESC ) AS "LEAD_RESPECT_NULLS" FROM staff_table ORDER BY staff_id DESC; |
SELECT staff_id, name, job, LEAD( job, 1 ) OVER( ORDER BY staff_id DESC ) AS "LEAD_RESPECT_NULLS" FROM staff_table ORDER BY staff_id DESC; |
F.29.39.4. RAWTOHEX #
Description
RAWTOHEX преобразует данные типа RAW в шестнадцатеричное строковое значение.
Функциональные различия
База данных Oracle
Данные типа RAW преобразуются в шестнадцатеричное строковое значение.
Tantor SE
RAWTOHEX не может быть использован. Вместо этого используйте ENCODE для преобразования бинарных типов данных, соответствующих типу RAW.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово RAWTOHEX и определите, где оно используется.
Измените RAWTOHEX на ENCODE и укажите HEX во втором аргументе.
Пример миграции
Пример ниже показывает миграцию, когда типы данных RAW преобразуются в шестнадцатеричные строковые значения.
База данных Oracle | Tantor SE |
---|---|
SELECT RAWTOHEX ( 'ABC' ) FROM DUAL; |
SELECT ENCODE ( 'ABC', 'HEX' ) FROM DUAL; |
Information
Функция RAWTOHEX, которая используется в PL/SQL для принятия строки в качестве аргумента, сначала должна быть преобразована в бинарный тип данных с использованием DECODE, а затем используется ENCODE для преобразования значения в строку.
Пример ниже показывает миграцию RAWTOHEX, когда она используется в PL/SQL для принятия строки в качестве аргумента.
Пример миграции ROWTOHEX (при передаче строки в качестве аргумента в PL/SQL)
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE HEX_TEXT VARCHAR2( 100 ); BEGIN HEX_TEXT := RAWTOHEX( '414243' ); DBMS_OUTPUT.PUT_LINE( HEX_TEXT ); END; / |
DO $$ DECLARE HEX_TEXT TEXT; BEGIN HEX_TEXT := ENCODE( DECODE( '414243', 'HEX' ), 'HEX' ); PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM DBMS_OUTPUT.PUT_LINE( HEX_TEXT ); END; $$ LANGUAGE plpgsql; |
F.29.39.5. REGEXP_REPLACE #
Description
REGEXP_REPLACE использует регулярное выражение для замены строки.
Функциональные различия
База данных Oracle
Все строки, соответствующие шаблону регулярного выражения, заменяются.
Tantor SE
Первая строка, которая соответствует регулярному выражению заменяется.
Процедура миграции
Функция REGEXP_REPLACE Tantor SE может вернуть тот же результат, если строка опций указана в четвертом аргументе. Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово REGEXP_REPLACE и определите, где оно используется.
Укажите аргумент ‘g’ в четвертом аргументе REGEXP_REPLACE.
Пример миграции
Пример ниже показывает миграцию, когда шаблон регулярного выражения используется для преобразования строки.
База данных Oracle | Tantor SE |
---|---|
SELECT REGEXP_REPLACE( '2016', '[0-2]', '*' ) AS "REGEXP_REPLACE" FROM DUAL; |
SELECT REGEXP_REPLACE( '2016', '[0-2]', '*', 'g' ) AS "REGEXP_REPLACE" FROM DUAL; |
F.29.39.6. TO_TIMESTAMP #
Description
TO_TIMESTAMP преобразует строковое значение в тип данных TIMESTAMP.
Функциональные различия
База данных Oracle
Можно указать язык, который будет использоваться для возврата значений месяца и дня недели.
Tantor SE
Язык, который будет использоваться для возврата значений месяца и дня недели, указать невозможно.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово TO_TIMESTAMP и определите, где оно используется.
Если третий аргумент TO_TIMESTAMP указан, удалите его.
Если строка в первом аргументе содержит строку национальных символов, она заменяется ключевым словом datetime, поддерживаемым Tantor SE.
Пример миграции
Пример ниже показывает миграцию, когда строковое значение преобразуется в тип данных TIMESTAMP. Одна строка указывает месяц на японском языке с использованием национального символа, поэтому он заменяется на ключевое слово даты 'JULY'.
База данных Oracle | Tantor SE |
---|---|
SELECT TO_TIMESTAMP('2016/**/21 14:15:30', 'YYYY/MONTH/DD HH24:MI:SS', 'NLS_DATE_LANGUAGE = Japanese') FROM DUAL; |
SELECT TO_TIMESTAMP('2016/JULY/21 14:15:30', 'YYYY/MONTH/DD HH24:MI:SS') FROM DUAL; |
**: Июль на японском
F.29.40. Миграция: Глава 4 Миграция SQL-запросов #
Эта глава объясняет, как перенести SQL-запросы.
F.29.40.1. Секции #
В этом разделе приведены примеры миграции секций.
F.29.40.1.1. Секционированные таблицы #
Description
Разделы разделяют таблицы и индексы на более мелкие единицы для управления.
Следующий пример показывает преобразование секции базы данных Oracle в дочерние таблицы в Tantor SE. Все примеры миграции, представленные здесь, основаны на этой таблице.
Пример таблиц, созданных путем секционирования inventory_table
i_number (код продукта) | i_name (категория) | i_quantity (количество на складе) | i_warehouse (код склада) |
---|---|---|---|
SMALLINT PRIMARY KEY | VARCHAR(20) NOT NULL | INTEGER | SMALLINT |
123 | холодильник | 60 | 1 |
124 | холодильник | 75 | 1 |
226 | холодильник | 8 | 1 |
227 | холодильник | 15 | 1 |
110 | телевизор | 85 | 2 |
111 | телевизор | 90 | 2 |
140 | CD-плеер | 120 | 2 |
212 | телевизор | 0 | 2 |
215 | Видео-плеер | 5 | 2 |
240 | CD-плеер | 25 | 2 |
243 | CD-плеер | 14 | 2 |
351 | Cd | 2500 | 2 |
Функциональные различия
База данных Oracle
Можно создавать таблицы-разделы.
Tantor SE
Невозможно создать секционированную таблицу.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово PARTITION и определите, где используется CREATE TABLE для создания секции.
Удалите часть PARTITION и следующие строки из оператора CREATE TABLE и создайте таблицу.
Создайте дочернюю таблицу, которая наследует таблицу, определенную в шаге 1, и добавьте ограничения таблицы к разделенной таблице для определения ограничений секционирования.
Определите триггер или правило, чтобы данные, вставленные в таблицу, были присвоены соответствующей дочерней таблице.
Пример миграции
Приведенный ниже пример показывает миграцию, когда создаются разделы в таблице inventory_table.
База данных Oracle | Tantor SE |
---|---|
CREATE TABLE inventory_table( i_number SMALLINT PRIMARY KEY, i_name VARCHAR2(20) NOT NULL, i_quantity INTEGER, i_warehouse SMALLINT ) PARTITION BY LIST ( i_warehouse ) ( PARTITION inventory_table_1 VALUES (1), PARTITION inventory_table_2 VALUES (2) ); |
CREATE TABLE inventory_table( i_number SMALLINT PRIMARY KEY, i_name VARCHAR(20) NOT NULL, i_quantity INTEGER, i_warehouse SMALLINT ); CREATE TABLE inventory_table_1 (CHECK ( i_warehouse = 1 )) INHERITS( inventory_table ); CREATE TABLE inventory_table_2 (CHECK ( i_warehouse = 2 )) INHERITS( inventory_table ); ------------------------------------------------- CREATE FUNCTION TABLE_INSERT_TRIGGER() RETURNS TRIGGER AS $$ BEGIN IF ( NEW.i_warehouse = 1 ) THEN INSERT INTO inventory_table_1 VALUES( NEW.*); ELSIF ( NEW.i_warehouse = 2 ) THEN INSERT INTO inventory_table_2 VALUES( NEW.*); ELSE RAISE EXCEPTION 'Data out of range. Fix the TABLE_INSERT_TRIGGER() function!'; END IF; RETURN NULL; END; $$ LANGUAGE plpgsql; ------------------------------------------------- CREATE TRIGGER TABLE_INSERT_TRIGGER BEFORE INSERT ON inventory_table FOR EACH ROW EXECUTE PROCEDURE TABLE_INSERT_TRIGGER(); |
F.29.40.1.2. ПРЕДЛОЖЕНИЕ PARTITION В ОПЕРАТОРЕ SELECT #
Прежде чем можно будет мигрировать предложение PARTITION в SELECT-запросе, секция базы данных Oracle должен быть преобразован в дочерние таблицы для Tantor SE.
Description
Предложение PARTITION обрабатывает только некоторые разделы таблицы (таблицы-разделы), указанные в предложении FROM, как цели запроса.
F.29.40.1.3. Запросы, где указано предложение PARTITION #
Функциональные различия
База данных Oracle
Можно указать часть A PARTITION.
Tantor SE
Нельзя указать предложение PARTITION.
Процедура миграции
Нельзя указать предложение PARTITION, поэтому измените целевую таблицу на дочернюю, чтобы получить тот же результат. Используйте следующую процедуру для выполнения миграции. Последовательность миграции зависит от того, указана ли предложение FOR.
Ищите ключевое слово PARTITION и определите, где оно указано в операторе SELECT.
Измените имя таблицы, указанное в предложении FROM, на имя дочерней таблицы, соответствующей секции, указанной в предложении PARTITION.
Удалите часть PARTITION.
Пример миграции
Приведенный ниже пример показывает миграцию запроса, который использует PARTITION.
База данных Oracle | Tantor SE |
---|---|
SELECT * FROM inventory_table PARTITION( inventory_table_1); |
SELECT * FROM inventory_table_1; |
F.29.40.1.4. 4.1.2. Запросы, когда FOR указан в предложении PARTITION #
Функциональные различия
База данных Oracle
FOR может быть указано в предложении PARTITION.
Tantor SE
Нельзя указать предложение PARTITION.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово PARTITION и определите, где оно указано в операторе SELECT.
Переместите значение, указанное в предложении PARTITION, в предложение WHERE и замените его условным выражением, которое сравнивает значение с именем столбца, записанным в определении секции.
Удалите часть PARTITION.
Пример миграции
Приведенный ниже пример показывает миграцию, когда используется PARTITION FOR для выполнения запроса.
База данных Oracle | Tantor SE |
---|---|
SELECT * FROM inventory_table PARTITION FOR (2); |
SELECT * FROM inventory_table WHERE i_warehouse = 2; |
F.29.40.2. SELECT Statements #
Этот раздел объясняет операторы SELECT.
F.29.40.2.1. UNIQUE #
Description
UNIQUE удаляет дублирующиеся строки из выбранного списка и отображает результат.
Функциональные различия
База данных Oracle
UNIQUE может быть указано в выборке.
Tantor SE
UNIQUE не может быть указано в выборке. Вместо этого укажите DISTINCT.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова UNIQUE и определение, где оно указано в выборке оператора SELECT.
Измените UNIQUE в операторе SELECT на DISTINCT.
Пример миграции
Приведенный ниже пример показывает миграцию, когда UNIQUE указан в выборке.
База данных Oracle | Tantor SE |
---|---|
SELECT UNIQUE i_name FROM inventory_table; |
SELECT DISTINCT i_name FROM inventory_table; |
F.29.40.2.2. Подзапросы #
Description
Подзапрос определяет подзапрос SELECT в основном SQL-запросе.
Функциональные различия
База данных Oracle
Подзапрос, указанный в операторе FROM, может быть выполнен даже без указания псевдонима для него.
Tantor SE
Подзапрос, указанный в операторе FROM, не может быть выполнен, если для него не указан псевдоним.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово SELECT и определите, где используется подзапрос.
Если подзапрос указан в предложении FROM и для него не указан псевдоним, укажите псевдоним.
Пример миграции
Приведенный ниже пример показывает миграцию, когда выполняется оператор SELECT, использующий подзапрос.
База данных Oracle | Tantor SE |
---|---|
SELECT * FROM ( SELECT * FROM inventory_table WHERE i_name = 'television' ) WHERE i_quantity > 0; |
SELECT * FROM ( SELECT * FROM inventory_table WHERE i_name = 'television' ) AS foo WHERE i_quantity > 0; |
F.29.40.2.3. Иерархические запросы #
Description
Если таблица содержит данные, которые могут ассоциировать свои собственные записи, иерархический запрос отображает результат ассоциации этих записей.
F.29.40.2.3.1. Выполнение иерархических запросов #
Функциональные различия
База данных Oracle
Иерархические запросы могут быть использованы.
Tantor SE
Иерархические запросы нельзя использовать.
Процедура миграции
Иерархические запросы не могут быть использованы, поэтому укажите рекурсивный запрос, который использует предложение WITH, чтобы получить тот же результат. Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова CONNECT и определение, где используется иерархический запрос.
Проверьте следующее:
Целевая таблица иерархического запроса
Используемый столбец
Условные выражения указаны в разделе CONNECT BY
Замените иерархический запрос с использованием синтаксиса предложения WITH, чтобы соответствовать показанному ниже формату.
Измените имя таблицы, указанное в предложении FROM, на имя запроса в предложении WITH и удалите предложение CONNECT BY.
WITH RECURSIVE queryName( columnUsed ) AS ( SELECT columnUsed FROM targetTableOfHierarchicalQuery UNION ALL SELECT columnUsed(qualified by n) FROM targetTableOfHierarchicalQuery n, queryName w WHERE conditionalExprOfConnectByClause(use w to qualify part qualified by PRIOR) )
Пример миграции
Приведенный ниже пример показывает миграцию при выполнении иерархического запроса.
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id, name, manager_id FROM staff_table CONNECT BY PRIOR staff_id = manager_id; |
WITH RECURSIVE staff_table_w( staff_id, name, manager_id ) AS ( SELECT staff_id, name, manager_id FROM staff_table UNION ALL SELECT n.staff_id, n.name, n.manager_id FROM staff_table n, staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id, name, manager_id FROM staff_table_w; |
F.29.40.2.3.2. Иерархический запрос с начальной строкой #
Функциональные различия
База данных Oracle
В запросе с иерархическими данными можно указать предложение START WITH для установки условий начальной строки.
Tantor SE
Нельзя указать START WITH в предложении.
Процедура миграции
В рекурсивном запросе, использующем предложение WITH, установите условие, которое ссылается на само себя, чтобы получить одинаковый результат. Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
Если указано предложение START WITH, переместите указанное условное выражение в предложение WHERE первого подзапроса, указанного в предложении WITH.
Удалите предложение START WITH.
Пример миграции
Приведенный ниже пример показывает миграцию, когда начальная строка указывается с использованием иерархического запроса.
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id, name, manager_id FROM staff_table START WITH staff_id = '1001' CONNECT BY PRIOR staff_id = manager_id; |
WITH RECURSIVE staff_table_w( staff_id, name, manager_id ) AS ( SELECT staff_id, name, manager_id FROM staff_table WHERE staff_id = '1001' UNION ALL SELECT n.staff_id, n.name, n.manager_id FROM staff_table n, staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id, name, manager_id FROM staff_table_w; |
F.29.40.2.3.3. Иерархический запрос, отображающий иерархическую позицию каждой строки #
Функциональные различия
База данных Oracle
Указание псевдоколонки LEVEL в выборке запроса иерархического запроса отображает иерархическую позицию каждой строки.
Tantor SE
Уровень псевдоколонки A не может быть указан.
Процедура миграции
В рекурсивном запросе, который использует предложение WITH, создайте столбец результата, эквивалентный псевдостолбцу LEVEL, как результат запроса предложения WITH, чтобы возвращался тот же результат. Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
Добавьте LEVEL в список столбцов результата запроса предложения WITH.
Укажите следующие значения в качестве списка выбора подзапроса на позиции, соответствующей столбцу LEVEL:
Укажите 1 в первом запросе.
Укажите LEVEL + 1 в следующем запросе. (LEVEL - это столбец рекурсивной таблицы).
Используя запрос, замените часть, где используется псевдоколонка LEVEL, на LEVEL (идентификатор в кавычках).
Следующий пример показывает формат преобразования, содержащий псевдоколонку LEVEL.
WITH RECURSIVE queryName( columnUsed, "LEVEL" ) AS ( SELECT columnUsed, 1 FROM targetTableOfHierarchicalQuery UNION ALL SELECT columnUsed(qualified by n), w."LEVEL" + 1 FROM targetTableOfHierarchicalQuery n, queryName w WHERE conditionalExprOfConnectByClause(use w to qualify part qualified by PRIOR) )
Пример миграции
Приведенный ниже пример показывает миграцию, когда иерархический запрос используется для отображения иерархической позиции каждой строки.
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id, name, manager_id, LEVEL FROM staff_table START WITH staff_id = '1001' CONNECT BY PRIOR staff_id = manager_id; |
WITH RECURSIVE staff_table_w( staff_id, name, manager_id, "LEVEL" ) AS ( SELECT staff_id, name, manager_id, 1 FROM staff_table WHERE staff_id = '1001' UNION ALL SELECT n.staff_id, n.name, n.manager_id, w."LEVEL" + 1 FROM staff_table n, staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id, name, manager_id, "LEVEL" FROM staff_table_w; |
F.29.40.2.3.4. Иерархический запрос, отображающий иерархическую структуру #
Функциональные различия
База данных Oracle
Указание SYS_CONNECT_BY_PATH в выборке иерархического запроса отображает иерархическую структуру.
Tantor SE
SYS_CONNECT_BY_PATH не может быть указан.
Процедура миграции
В рекурсивном запросе, который использует предложение WITH, создайте арифметическое выражение, которое также использует рекурсивный запрос из предложения WITH, чтобы получить тот же результат. Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
Добавьте PATH в список столбцов результата запроса предложения WITH.
Укажите следующие значения для списка выбора подзапроса, соответствующего столбцу PATH. Приведенный здесь пример объясняет миграцию, когда в качестве разделителя указана косая черта (/).
В первом запросе укажите путь к значениям столбцов от корня до узла.
Укажите m.PATH || ‘/’ || n.columnName в следующем запросе. (PATH - это рекурсивная колонка таблицы.)
Используя запрос, замените часть, где используется PATH, на PATH.
Следующий пример показывает формат преобразования, содержащий PATH.
WITH RECURSIVE queryName( columnUsed, PATH ) AS ( SELECT columnUsed, '/' || columnName FROM targetTableOfHierarchicalQuery UNION ALL SELECT columnUsed(qualified by n), w.PATH || '/' || n.columnName FROM targetTableOfHierarchicalQuery n, queryName w WHERE conditionalExprOfConnectByClause )
Для conditionalExprOfConnectByClause используйте w для квалификации части, квалифицированной PRIOR.
Пример миграции
Приведенный ниже пример показывает миграцию, когда отображается иерархическая структура.
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id,name,manager_id, SYS_CONNECT_BY_PATH(name,'/') AS PATH FROM staff_table START WITH staff_id = '1001' CONNECT BY PRIOR staff_id = manager_id; |
WITH RECURSIVE staff_table_w( staff_id, name, manager_id, PATH) AS ( SELECT staff_id,name,manager_id, '/' || name FROM staff_table WHERE staff_id = '1001' UNION ALL SELECT n.staff_id, n.name, n.manager_id, w.PATH || '/' || n.name FROM staff_table n,staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id,name,manager_id, PATH FROM staff_table_w; |
F.29.40.2.3.5. Иерархические запросы, сортирующие каждый уровень иерархии #
Функциональные различия
База данных Oracle
Указание предложения ORDER SIBLINGS BY в иерархическом запросе позволяет сортировать каждый уровень иерархии.
Tantor SE
Нельзя указать предложение ORDER SIBLINGS BY.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
В синтаксисе, использующем рекурсивный запрос (предложение WITH), добавьте poskey в список столбцов результата запроса предложения WITH.
Укажите ROW_NUMBER() в позиции, соответствующей столбцу poskey. В предложении OVER укажите предложение ORDER BY, которое указывает столбец из предложения ORDER SIBLINGS BY.
Добавьте siblings_pos в список столбцов результата запроса WITH.
Укажите следующие значения в качестве списка выбора подзапроса на позиции, соответствующей столбцу siblings_pos:
Укажите ARRAY[poskey] в первом запросе.
Укажите конкатенацию siblings_pos и poskey в следующем запросе.
Используя запрос, укажите siblings_pos в предложении ORDER BY для выполнения сортировки.
Следующий пример показывает формат преобразования, содержащий сортировку каждого уровня иерархии.
WITH RECURSIVE queryNameForPoskey( columnUsed, poskey ) AS ( SELECT columnUsed, ROW_NUMBER() OVER( ORDER BY columnNameSpecifiedInOrderSiblingsByClause ) FROM targetTableOfHierarchicalQuery ), WITH RECURSIVE queryName( columnUsed, siblings_pos ) AS ( SELECT columnUsed, ARRAY[poskey] FROM queryNameForPoskey UNION ALL SELECT columnUsed(qualified by n), w.siblings_pos || n.poskey FROM queryNameForPoskey n, queryName w WHERE conditionalExprOfConnectByClause(use w to qualify part qualified by PRIOR ) )
Пример миграции
Приведенный ниже пример показывает миграцию, когда иерархический запрос используется для выполнения сортировки на каждом уровне иерархии.
База данных Oracle | Tantor SE |
---|---|
SELECT staff_id, name, manager_id FROM staff_table START WITH staff_id = '1001' CONNECT BY PRIOR staff_id = manager_id ORDER SIBLINGS BY name; |
WITH RECURSIVE staff_table_pos ( staff_id, name, manager_id, poskey ) AS ( SELECT staff_id, name, manager_id, ROW_NUMBER() OVER( ORDER BY name ) FROM staff_table ), staff_table_w ( staff_id, name, manager_id, siblings_pos ) AS ( SELECT staff_id, name, manager_id, ARRAY[poskey] FROM staff_table_pos WHERE staff_id = '1001' UNION ALL SELECT n.staff_id, n.name, n.manager_id, w.siblings_pos || n.poskey FROM staff_table_pos n, staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id, name, manager_id FROM staff_table_w ORDER BY siblings_pos; |
F.29.40.2.3.6. Иерархический запрос, отображающий данные от корня #
Функциональные различия
База данных Oracle
Указание CONNECT_BY_ROOT в выборке иерархического запроса отображает данные из корня.
PostgreSQL
CONNECT_BY_ROOT не может быть указан.
Процедура миграции
В рекурсивном запросе, который использует предложение WITH, добавьте столбец root, который также использует рекурсивный запрос предложения WITH, чтобы получить тот же результат. Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
Добавить корневую колонку в список колонок результирующего запроса предложения WITH.
В первом запросе укажите имя корневой колонки для значений колонок от корня до узла.
Укажите m.rootName в следующем запросе. (rootName - это корневой столбец.)
Следующий пример показывает формат преобразования, содержащий rootName.
WITH RECURSIVE queryName( columnUsed, rootName ) AS ( SELECT columnUsed, columnName FROM targetTableOfHierarchicalQuery UNION ALL SELECT columnUsed(qualified by n), w.rootName FROM targetTableOfHierarchicalQuery n, queryName w WHERE conditionalExprOfConnectByClause )
Для conditionalExprOfConnectByClause используйте w для квалификации части, квалифицированной PRIOR.
Пример миграции
Приведенный ниже пример показывает миграцию, когда отображаются корневые данные.
База данных Oracle | PostgreSQL |
---|---|
SELECT staff_id, name, CONNECT_BY_ROOT name as "Manager" FROM staff_table START WITH staff_id = '1001' CONNECT BY PRIOR staff_id = manager_id; |
WITH RECURSIVE staff_table_w( staff_id, name, Manager ) AS ( SELECT staff_id, name, name FROM staff_table UNION ALL SELECT n.staff_id, n.name, w.Manager FROM staff_table n, staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id, name, Manager FROM staff_table_w; |
F.29.40.2.3.7. Иерархический запрос определяет листья #
Функциональные различия
База данных Oracle
Указание CONNECT_BY_ISLEAF в списке select иерархического запроса может идентифицировать конечные строки. Это возвращает 1, если текущая строка является конечной. В противном случае возвращает 0.
PostgreSQL
CONNECT_BY_ISLEAF не может быть указан.
Процедура миграции
В рекурсивном запросе, который использует предложение WITH, лист можно проверить с помощью подзапроса, чтобы вернуть тот же результат. Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
Добавьте подзапрос в список столбцов результата запроса с предложением WITH.
Следующий пример показывает формат преобразования, содержащий rootName.
WITH RECURSIVE queryName( columnUsed1, columnUsed2 ) AS ( SELECT columnUsed, columnUsed2 FROM targetTableOfHierarchicalQuery UNION ALL SELECT columnUsed(qualified by n), columnUsed2(qualified by n) FROM targetTableOfHierarchicalQuery n, queryName w WHERE conditionalExprOfConnectByClause ) SELECT *, CASE WHEN EXISTS(select * from queryName p where p.columnUsed1 = e.columnUsed2) THEN 0 ELSE 1 END as is_leaf FROM queryName e;
Для conditionalExprOfConnectByClause используйте w для квалификации части, квалифицированной PRIOR.
Пример миграции
Пример ниже показывает миграцию, когда отображаются конечные данные.
База данных Oracle | PostgreSQL |
---|---|
SELECT staff_id, name, CONNECT_BY_ISLEAF FROM staff_table START WITH staff_id = '1001' CONNECT BY PRIOR staff_id = manager_id; |
WITH RECURSIVE staff_table_w( staff_id, name ) AS ( SELECT staff_id, name FROM staff_table UNION ALL SELECT n.staff_id, n.name FROM staff_table n, staff_table_w w WHERE w.staff_id = n.manager_id ) SELECT staff_id, name, CASE WHEN EXISTS(select 1 from staff_table_w p where p.manager_id = e.staff_id) THEN 0 ELSE 1 END as is_leaf FROM staff_table_w e; |
F.29.40.2.3.8. Возвращает все возможные перестановки иерархии #
Функциональные различия
База данных Oracle
Когда используется CONNECT BY LEVEL без предложения START WITH и оператора PRIOR.
PostgreSQL
CONNECT BY LEVEL не может быть указано.
Процедура миграции
В рекурсивном запросе, который использует WITH, возвращает все возможные иерархические перестановки, можно использовать декартово произведение. Используйте следующую процедуру для выполнения миграции:
Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).
Левый запрос Union ALL не указывает условие фильтрации. Правый запрос является декартовым произведением двух таблиц, и условие фильтрации - это количество рекурсий.
Следующий пример показывает формат преобразования, содержащий rootName.
WITH RECURSIVE queryName( columnUsed1, level ) AS ( SELECT columnUsed, 1 FROM targetTableOfHierarchicalQuery UNION ALL SELECT columnUsed(qualified by n), w.level+1 FROM targetTableOfHierarchicalQuery n, queryName w WHERE w.level+1 < levelNum );
Пример миграции
Пример ниже показывает миграцию, когда возвращаются все возможные иерархические перестановки двух уровней.
База данных Oracle | PostgreSQL |
---|---|
select staff_id, name, level from staff_table connect by level < 3; |
WITH RECURSIVE staff_table_w( staff_id, name level ) AS ( SELECT staff_id, name, 1 FROM staff_table UNION ALL SELECT n.staff_id, n.name, w.level + 1 FROM staff_table n, staff_table_w w WHERE w.level + 1 < 3 ) SELECT staff_id, name, level FROM staff_table_w; |
F.29.40.2.4. MINUS #
Description
MINUS находит разницу между двумя результатами запроса, то есть, он возвращает строки, которые есть в первом наборе результатов, но отсутствуют во втором наборе результатов.
Функциональные различия
База данных Oracle
MINUS предназначен для нахождения разницы между двумя результатами запроса.
Tantor SE
MINUS не может быть указан для поиска разницы между результатами двух запросов. Вместо этого используйте EXCEPT.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово MINUS и определите, где оно используется.
Измените MINUS на EXCEPT.
Пример миграции
Приведенный ниже пример показывает миграцию, когда требуется найти разность множеств результатов запроса.
База данных Oracle | Tantor SE |
---|---|
SELECT i_number, i_name FROM inventory_table WHERE i_warehouse = 2 MINUS SELECT i_number, i_name FROM inventory_table WHERE i_name = 'cd'; |
SELECT i_number, i_name FROM inventory_table WHERE i_warehouse = 2 EXCEPT SELECT i_number, i_name FROM inventory_table WHERE i_name = 'cd'; |
F.29.40.3. Удаление записей #
Этот раздел объясняет операторы DELETE.
F.29.40.3.1. Пропуск ключевого слова FROM #
Функциональные различия
База данных Oracle
Ключевое слово FROM можно опустить в операторе DELETE.
Tantor SE
Ключевое слово FROM не можно опустить в операторе DELETE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DELETE и определение его использования.
Если ключевое слово FROM было не указано в операторе DELETE, добавьте его.
Пример миграции
Приведенный ниже пример показывает миграцию, когда ключевое слово FROM не указано в операторе DELETE.
База данных Oracle | Tantor SE |
---|---|
DELETE inventory_table WHERE i_name = 'cd player'; |
DELETE FROM inventory_table WHERE i_name = 'cd player'; |
F.29.40.4. Операторы MERGE #
Этот раздел объясняет операторы MERGE.
F.29.40.4.1. Выполнение операторов MERGE #
Функциональные различия
База данных Oracle
Можно использовать операторы MERGE.
Tantor SE
Невозможно использовать операторы MERGE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Используйте оператор INSERT для указания ключевого слова INSERT, которое следует за WHEN NOT MATCHED THEN в операторе MERGE.
Используйте оператор SELECT после добавленных строк в шаге 1, чтобы указать оператор SELECT, который следует за оператором USING в операторе MERGE.
Используйте DO UPDATE в предложение ON CONFLICT оператора INSERT, указанной в шаге 1, чтобы указать ключевое слово UPDATE, которое следует за THEN WHEN MATCHED в операторе MERGE.
Пример миграции
Приведенный ниже пример показывает, как выполнить миграцию оператора MERGE.
База данных Oracle | Tantor SE |
---|---|
MERGE INTO new_inventory_table N USING ( SELECT i_number, i_name, i_quantity, i_warehouse FROM inventory_table ) I ON ( N.i_number = I.i_number ) WHEN MATCHED THEN UPDATE SET N.i_quantity = I.i_quantity WHEN NOT MATCHED THEN INSERT ( N.i_number, N.i_name, N.i_quantity, N.i_warehouse ) VALUES ( I.i_number, I.i_name, I.i_quantity, I.i_warehouse ); |
INSERT INTO new_inventory_table AS N ( i_number, i_name, i_quantity, i_warehouse ) SELECT i_number, i_name, i_quantity, i_warehouse FROM inventory_table ON CONFLICT (i_number) DO UPDATE SET i_quantity = excluded.i_quantity; |
Note
В приведенном выше примере миграции должно быть указано определение первичного ключа или уникального ключа в столбце, указанном в предложении ON оператора MERGE. Если используется таблица, для которой определение первичного ключа или уникального ключа не указано в столбце условного выражения, обратитесь к примеру миграции, представленному в разделе "Информация" ниже.
Information
Приведенный ниже пример показывает миграцию, когда первичный ключ или уникальное определение ключа не указано в столбце, указанном в ON-условии оператора MERGE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Используйте оператор SELECT в запросе WITH для указания оператора SELECT, который следует за оператором USING в операторе MERGE.
Используйте оператор UPDATE в запросе WITH для указания ключевого слова UPDATE, которое следует за WHEN MATCHED THEN в операторе MERGE.
Укажите ключевое слово INSERT, которое следует за оператором WHEN NOT MATCHED THEN в операторе MERGE, как оператор INSERT, следующий за запросом WITH.
Укажите NOT IN внутри оператора INSERT, добавленного на шаге 3, в качестве эквивалентного условия для предложения WHEN MATCHED THEN оператора MERGE.
Пример миграции
Приведенный ниже пример показывает миграцию оператора MERGE, в котором не указано определение первичного ключа или уникального ключа.
База данных Oracle | Tantor SE |
---|---|
MERGE INTO new_inventory_table N USING ( SELECT i_number, i_name, i_quantity, i_warehouse FROM inventory_table ) I ON ( N.i_number = I.i_number ) WHEN MATCHED THEN UPDATE SET N.i_quantity = I.i_quantity WHEN NOT MATCHED THEN INSERT ( N.i_number, N.i_name, N.i_quantity, N.i_warehouse ) VALUES ( I.i_number, I.i_name, I.i_quantity, I.i_warehouse ); |
WITH I AS ( SELECT i_number, i_name, i_quantity, i_warehouse FROM inventory_table ), U AS ( UPDATE new_inventory_table AS N SET i_quantity = I.i_quantity FROM inventory_table I WHERE N.i_number = I.i_number RETURNING N.i_number ) INSERT INTO new_inventory_table ( SELECT * FROM I WHERE i_number NOT IN ( SELECT i_number FROM U ) ); |
F.29.40.5. Изменение индексов #
Description
Инструкция ALTER INDEX изменяет определение индекса.
F.29.40.5.1. Перестройка индекса #
Функциональные различия
База данных Oracle
В операторе ALTER INDEX можно указать опцию REBUILD, чтобы перестроить индекс.
Tantor SE
ПРЕДЛОЖЕНИЕ REBUILD не может быть указано в операторе ALTER INDEX. Вместо этого используйте оператор REINDEX.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и INDEX и определение их использования.
Если указано ключевое слово REBUILD, замените оператор ALTER INDEX оператором REINDEX.
Пример миграции
Приведенный ниже пример показывает миграцию при перестроении индекса.
База данных Oracle | Tantor SE |
---|---|
ALTER INDEX idx REBUILD; |
REINDEX INDEX idx; |
F.29.40.5.2. Перестройка индекса, где указано табличное пространство #
Функциональные различия
База данных Oracle
В THEN REBUILD можно указать табличнoe пространствo.
Tantor SE
ПРЕДЛОЖЕНИЕ REBUILD не может быть использовано.
Процедура миграции
Оператор REBUILD для перестройки индекса заменяется оператором REINDEX, но в этом операторе нельзя указать табличное пространство. Поэтому переместите табличное пространство перед выполнением перестройки индекса. Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и INDEX и определение их использования.
Если указаны и REBUILD, и TABLESPACE, замените REBUILD в операторе ALTER INDEX на SET.
Добавьте оператор REINDEX после оператора ALTER INDEX.
Пример миграции
Приведенный ниже пример показывает миграцию, когда для перестройки индекса указано табличное пространство.
База данных Oracle | Tantor SE |
---|---|
ALTER INDEX idx REBUILD TABLESPACE tablespace1; |
ALTER INDEX idx SET TABLESPACE tablespace1; REINDEX INDEX idx; |
F.29.40.5.3. Перестройка индекса с указанием процента свободного пространства #
Функциональные различия
База данных Oracle
PCTFREE может быть указано в предложении REBUILD для определения процента свободного пространства для индекса.
Tantor SE
ПРЕДЛОЖЕНИЕ REBUILD не может быть использовано.
Процедура миграции
Оператор REBUILD для реструктуризации индекса заменяется оператором REINDEX, но в этом операторе нельзя указать процент свободного пространства. Поэтому измените коэффициент использования индекса так, чтобы получить эквивалентный результат. Затем выполните реструктуризацию индекса. Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и INDEX и определение их использования.
Если указаны и ключевое слово REBUILD, и ключевое слово PCTFREE, замените ключевое слово REBUILD на ключевое слово SET и измените PCTFREE на FILLFACTOR. В качестве значения SET используйте 100 - значение, указанное в PCTFREE.
Добавьте оператор REINDEX после оператора ALTER INDEX.
Пример миграции
Приведенный ниже пример показывает миграцию при указании коэффициента заполнения для перестройки индекса.
База данных Oracle | Tantor SE |
---|---|
ALTER INDEX idx REBUILD PCTFREE 10; |
ALTER INDEX idx SET (FILLFACTOR=90); REINDEX INDEX idx; |
F.29.40.6. Изменение сессии Statements #
Description
Оператор ALTER SESSION определяет и изменяет параметры для каждой сессии.
F.29.40.6.1. Закрытие dblink #
Функциональные различия
База данных Oracle
Используется оператор ALTER SESSION для закрытия dblink.
Tantor SE
Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте DBLINK_CLOSE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и SESSION и определение их использования.
Если указано условие CLOSE DATABASE LINK, удалите оператор ALTER SESSION и замените его оператором SELECT, который вызывает DBLINK_CLOSE.
Пример миграции
Приведенный ниже пример показывает миграцию, когда dblink закрыт.
База данных Oracle | Tantor SE |
---|---|
ALTER SESSION CLOSE DATABASE LINK dblink1; |
SELECT DBLINK_CLOSE ( 'dblink1' ); |
F.29.40.6.2. Изменение параметров инициализации #
Функциональные различия
База данных Oracle
Инструкция ALTER SESSION используется для изменения параметров инициализации.
Tantor SE
Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте оператор SET для изменения параметров сервера.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и SESSION и определение их использования.
Замените оператор ALTER SESSION оператором SET. В таблице ниже перечислены соответствующие параметры инициализации и параметры сервера.
Соответствующие параметры инициализации и параметры сервера
Параметр инициализации | Параметры конфигурации во время выполнения Tantor SE |
---|---|
ENABLE_DDL_LOGGING | log_statement |
NLS_CURRENCY | lc_monetary |
NLS_DATE_FORMAT | Стиль даты |
NLS_DATE_LANGUAGE | lc_time |
NLS_TIMESTAMP_FORMAT | lc_time |
NLS_TIMESTAMP_TZ_FORMAT | lc_time |
OPTIMIZER_INDEX_COST_ADJ | cpu_index_tuple_cost seq_page_cost |
Пример миграции
Приведенный ниже пример показывает миграцию, когда изменяются параметры инициализации.
База данных Oracle | Tantor SE |
---|---|
ALTER SESSION SET ENABLE_DDL_LOGGING = TRUE; |
SET log_statement = 'DDL'; |
Note
Значения, которые можно указать для параметров сервера, могут отличаться от значений, которые можно указать для параметров инициализации. Обратитесь к руководству, предоставленному производителем, чтобы узнать значения, которые можно указать.
See
Обратитесь к разделу «Конфигурация сервера» в «Администрировании сервера» в документации Tantor SE для получения информации о параметрах сервера.
F.29.40.6.3. Установка характеристик транзакции #
Функциональные различия
База данных Oracle
Инструкция ALTER SESSION используется для установки характеристик транзакции.
Tantor SE
Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте оператор SET TRANSACTION.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и SESSION и определение их использования.
Если указано SET ISOLATION_LEVEL, замените оператор ALTER SESSION оператором SET TRANSACTION.
Пример миграции
Приведенный ниже пример показывает миграцию при установке характеристик транзакции.
База данных Oracle | Tantor SE |
---|---|
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE; |
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
F.29.40.6.4. Перенос настройки часового пояса #
Функциональные различия
База данных Oracle
Используется оператор ALTER SESSION для установки часового пояса.
Tantor SE
Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте оператор SET.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов ALTER и SESSION и определение их использования.
Если указано SET TIME_ZONE, замените оператор ALTER SESSION на оператор SET.
Пример миграции
Приведенный ниже пример показывает миграцию при установленном часовом поясе.
База данных Oracle | Tantor SE |
---|---|
ALTER SESSION SET TIME_ZONE = '+09:00'; |
SET TimeZone='Japan'; |
Note
Убедитесь, что вы используете полное название часового пояса при указании часового пояса в параметре TimeZone Tantor SE.
F.29.40.7. Операторы GRANT #
Description
Оператор GRANT определяет привилегии доступа.
F.29.40.7.1. Мигрируемость функций оператора GRANT #
Следующая таблица указывает на возможность миграции функций оператора GRANT, предоставляемых базами данных Oracle, в Tantor SE.
Системные привилегии
Возможности оператора GRANT в базах данных Oracle | Возможность миграции | Замечания |
---|---|---|
Предоставление системных привилегий | MR | PUBLIC не может быть указан для получателя. Существуют ограничения на привилегии, которые могут быть перенесены. |
Предоставление роли (role) | YR | PUBLIC не может быть указано для получателя. |
Предоставление всех системных привилегий (ALL PRIVILEGES) | Y | |
Предложение WITH ADMIN OPTION | MR | Только привилегии, которые могут быть переданы с помощью оператора GRANT. |
предложение WITH DELEGATE OPTION | Н |
Привилегии объекта
Возможности оператора GRANT в базах данных Oracle | Возможность миграции | Замечания |
---|---|---|
Предоставление привилегий объекта | YR | Можно указать столбцы. Существуют ограничения на привилегии, которые могут быть перенесены. |
Предоставление всех привилегий объекта (ALL [PRIVILEGES]) | Y | Можно указать столбцы. |
Объект схемы получателя | Y | |
Пользователь-получатель | N | |
Каталог получателя | N | |
Выпуск получателя | N | |
Модель интеллектуального анализа получателя | Н | |
Java исходник получателя | Н | |
Профиль перевода SQL для получателя | N | |
Предложение WITH HIERARCHY OPTION | Н | |
Предложение WITH GRANT OPTION | Y |
Привилегии программного модуля
Возможности оператора GRANT в базах данных Oracle | Возможность миграции | Замечания |
---|---|---|
Предоставление привилегий программного модуля | Н |
Y: Синтаксис может быть перенесен без изменений YR: Синтаксис может быть перенесен без изменений с ограничениями MR: Измененный синтаксис может быть перенесен с ограничениями N: Не может быть перенесен
F.29.40.7.2. Предоставление системных привилегий #
F.29.40.7.2.1. Предоставление привилегий для пользователей операционной системы и ролей #
Функциональные различия
База данных Oracle
Оператор GRANT используется для предоставления привилегий на создание и изменение пользователей и ролей.
Tantor SE
Оператор GRANT не может использоваться для предоставления привилегий на создание и изменение пользователей и ролей. Вместо этого используйте оператор ALTER ROLE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова GRANT и определение его использования.
Если предоставлены привилегии на создание и изменение пользователей и ролей, замените оператор GRANT оператором ALTER ROLE. В таблице ниже перечислены привилегии на миграцию операций пользователей и ролей.
Привилегии пользователя операционной системы и роли, подлежащие миграции
ROLES
Оператор GRANT в базе данных Oracle | Соответствующий оператор ALTER ROLE в Tantor SE |
---|---|
GRANT CREATE ROLE TO roleName GRANT ALTER ANY ROLE TO roleName GRANT DROP ANY ROLE TO roleName GRANT ANY ROLE TO roleName | ALTER ROLE roleName CREATEROLE; |
USERS
Оператор GRANT в базе данных Oracle | Соответствующий оператор ALTER ROLE в Tantor SE |
---|---|
GRANT CREATE USER TO userName GRANT ALTER USER TO userName GRANT DROP USER TO userName | ALTER ROLE userName CREATEUSER |
Пример миграции
Приведенный ниже пример показывает миграцию, когда предоставлены привилегии на создание ролей.
База данных Oracle | Tantor SE |
---|---|
GRANT CREATE ROLE TO role1; |
ALTER ROLE role1 CREATEROLE; |
F.29.40.7.3. Предоставление привилегий для создания объектов #
Функциональные различия
База данных Oracle
Оператор GRANT используется для предоставления привилегий на создание объекта.
Tantor SE
Оператор GRANT используется для предоставления привилегий на создание объектов для схемы или базы данных.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова GRANT и определение его использования.
Если привилегии на создание предоставляются для каждого объекта, замените оператор GRANT оператором GRANT, который предоставляет привилегии на создание для схемы или базы данных. В таблице ниже перечислены привилегии на создание мигрируемых объектов.
Привилегии создания мигрируемых объектов
Объект | Оператор GRANT в базе данных Oracle | Соответствующий оператор ALTER ROLE в Tantor SE |
---|---|---|
МАТЕРИАЛИЗОВАННЫЕ ПРЕДСТАВЛЕНИЯ | GRANT CREATE MATERIALIZED VIEW TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
ОПЕРАТОРЫ | GRANT CREATE OPERATOR TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
ПРОЦЕДУРЫ | GRANT CREATE PROCEDURE TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
ПОСЛЕДОВАТЕЛЬНОСТИ | GRANT CREATE SEQUENCE TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
СЕССИИ | GRANT CREATE SESSION TO userName | GRANT CONNECT ON DATABASE databaseName TO userName |
ТАБЛИЦЫ | GRANT CREATE TABLE TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
ТРИГГЕРЫ | GRANT CREATE TRIGGER TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
ТИПЫ | GRANT CREATE TYPE TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
ПРЕДСТАВЛЕНИЯ | GRANT CREATE VIEW TO userName | GRANT CREATE ON SCHEMA schemaName TO userName |
Пример миграции
Приведенный ниже пример показывает миграцию, когда предоставлены привилегии на создание таблицы.
База данных Oracle | Tantor SE |
---|---|
GRANT CREATE TABLE TO user1; |
GRANT CREATE ON SCHEMA scm1 TO user1; |
F.29.40.7.3.1. Предоставление ролей (с установкой пароля) #
Функциональные различия
База данных Oracle
Когда используется оператор GRANT для назначения пользователя роли, пароль может быть установлен одновременно.
Tantor SE
Когда используется оператор GRANT для назначения пользователя роли, пароль не может быть установлен одновременно.
Процедура миграции
Чтобы установить пароль, вы должны указать отдельный оператор CREATE USER или ALTER USER и установить пароль в этом операторе. Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова GRANT и определение его использования.
Если указано предложение IDENTIFIED BY, проверьте, существует ли целевой пользователь.
Если пользователь существует, используйте оператор ALTER USER для изменения пароля. Если пользователь не существует, используйте оператор CREATE USER для создания нового пользователя и установки пароля.
Удалите предложение, относящееся к предоставлению пароля, из оператора GRANT.
Пример миграции
Приведенный ниже пример показывает миграцию, когда роль role1 предоставляется пользователю user1.
База данных Oracle | Tantor SE |
---|---|
GRANT role1 TO user1 IDENTIFIED BY PASSWORD; |
CREATE USER user1 PASSWORD 'PASSWORD'; GRANT role1 TO user1; |
F.29.40.7.4. Предоставление привилегий на объекты #
В синтаксисе операторов GRANT нет различий в отношении привилегий объектов, которые могут быть перенесены из базы данных Oracle. Однако некоторые привилегии объектов не могут быть использованы в Tantor SE, поэтому они должны быть изменены на поддерживаемые привилегии объектов.
В таблице ниже перечислены привилегии объектов, которые могут быть перенесены из базы данных Oracle в Tantor SE.
Привилегии мигрируемых объектов
Привилегии материализованного представления
Название привилегии объекта | Требуется изменение | Замечания |
---|---|---|
READ | Да | Изменить на SELECT. |
SELECT | Нет | Если в операторе SELECT используется предложение FOR UPDATE, также требуются привилегии UPDATE. |
Привилегии оператора
Название привилегии объекта | Требуется изменение | Замечания |
---|---|---|
EXECUTE | Да | В Tantor SE, привилегии EXECUTE должны быть предоставлены функции, которая реализует операторы. |
Привилегии процедур, функций и пакетов
Название привилегии объекта | Требуется изменение | Замечания |
---|---|---|
EXECUTE | Да | Ключевое слово FUNCTION должно быть добавлено перед именем функции. |
Привилегии последовательности
Название привилегии объекта | Требуется изменение | Замечания |
---|---|---|
SELECT | Да | Изменить на USAGE. Ключевое слово SEQUENCE должно быть добавлено перед именем последовательности. |
Привилегии таблицы
Название привилегии объекта | Требуется изменение | Замечания |
---|---|---|
DELETE | Нет | |
INSERT | Нет | |
READ | Да | Изменить на SELECT. |
REFERENCES | Нет | |
SELECT | Нет | Если в операторе SELECT используется предложение FOR UPDATE, также требуются привилегии UPDATE. |
UPDATE | Нет |
Привилегии просмотра
Название привилегии объекта | Требуется изменение | Замечания |
---|---|---|
DELETE | Нет | |
INSERT | Нет | |
READ | Да | Изменить на SELECT. |
REFERENCES | Нет | |
SELECT | Нет | Если в операторе SELECT используется предложение FOR UPDATE, также требуются привилегии UPDATE. |
UPDATE | Нет |
F.29.41. Миграция: Глава 5 Миграция PL/SQL #
В этой главе объясняется, как осуществить миграцию базы данных Oracle PL/SQL. Обратите внимание, что в этом документе под PL/SQL подразумевается язык, который будет мигрирован в Tantor SE PL/pgSQL.
F.29.41.1. Примечания по миграции с PL/SQL на PL/pgSQL #
В этом разделе приведены заметки о миграции из PL/SQL в PL/pgSQL.
F.29.41.1.1. Управление транзакциями #
PL/pgSQL не позволяет управлять транзакциями внутри процесса. Завершите процедуру, когда транзакция завершается в базе данных Oracle и выполните оператор управления транзакциями из приложения.
F.29.41.2. Основные элементы #
В этом разделе объясняется, как осуществить миграцию базовых элементов PL/SQL.
F.29.41.2.1. Перенос типов данных #
В таблице ниже перечислены типы данных Tantor SE, которые соответствуют уникальным типам данных PL/SQL.
Соответствие типов данных с PL/SQL
Character
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
STRING | Можно указать количество байтов или количество символов. | MR | varchar | Можно указать только количество символов. |
Numeric
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
BINARY_INTEGER | M | целое число | ||
ЕСТЕСТВЕННЫЙ | M | целое число | ||
NATURALN | Тип с ограничениями NOT NULL | MR | целое число | Установите ограничения "not null" для объявлений переменных. |
PLS_INTEGER | M | целое число | ||
ПОЛОЖИТЕЛЬНЫЙ | M | целое число | ||
POSITIVEN | Тип с ограничениями NOT NULL | MR | целое число | Установите ограничения "not null" для объявлений переменных. |
SIGNTYPE | M | smallint | ||
SIMPLE_DOUBLE | Тип с ограничениями NOT NULL | MR | двойная точность | Установите ограничения "not null" для объявлений переменных. |
SIMPLE_FLOAT | Тип с ограничениями NOT NULL | MR | real | Установите ограничения "not null" для объявлений переменных. |
SIMPLE_INTEGER | Тип с ограничениями NOT NULL | MR | integer | Установите ограничения "not null" для объявлений переменных. |
Дата и время
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
DSINTERVAL_UNCONSTRAINED | N | |||
TIME_TZ_UNCONSTRAINED | N | |||
TIME_UNCONSTRAINED | N | |||
TIMESTAMP_LTZ_UNCONSTRAINED | N | |||
TIMESTAMP_TZ_UNCONSTRAINED | N | |||
TIMESTAMP_UNCONSTRAINED | N | |||
YMINTERVAL_UNCONSTRAINED | N |
Other
Тип данных базы данных Oracle | Примечания | Возможность миграции | Tantor SE Тип данных | Примечания |
---|---|---|---|---|
ЛОГИЧЕСКИЙ | Да | boolean | ||
RECORD | M | Комплексный тип | ||
REF CURSOR (переменная курсора) | M | тип refcursor | ||
Подтип с ограничениями | N | |||
Подтип, который использует базовый тип внутри той же семьи типов данных | N | |||
Неограниченный подтип | N |
Y: Тип данных может быть перенесен без изменений
M: Измененный тип данных может быть перенесен
N: Не может быть перенесено
MR: Измененный тип данных может быть перенесен с ограничениями
See
Обратитесь к разделу "Типы данных" для получения информации о переносе типов данных, отличных от уникальных типов данных PL/SQL.
F.29.41.2.2. Элементы, связанные с ошибками #
Этот раздел объясняет элементы, связанные с ошибками PL/SQL.
F.29.41.2.2.1. Предопределенные исключения #
Description
Предопределенное исключение - это ошибка, определенная заранее в базе данных Oracle.
Функциональные различия
База данных Oracle
Можно использовать предопределенные исключения.
Tantor SE
Предопределенные исключения использовать нельзя. Вместо этого используйте коды ошибок Tantor SE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Определите, где используются предопределенные исключения.
Используя таблицу ниже замените значения предопределенных исключений на коды ошибок Tantor SE.
Предопределенное исключение (База данных Oracle) | Возможность миграции | Соответствующий код ошибки Tantor SE |
---|---|---|
ACCESS_INTO_NULL | N | Не генерируется |
CASE_NOT_FOUND | Y | case_not_found |
COLLECTION_IS_NULL | N | Не генерируется |
CURSOR_ALREADY_OPEN | Y | duplicate_cursor |
DUP_VAL_ON_INDEX | Y | unique_violation |
INVALID_CURSOR | Y | invalid_cursor_name |
INVALID_NUMBER | Y | invalid_text_representation |
LOGIN_DENIED | Y | invalid_authorization_specification invalid_password |
NO_DATA_FOUND | Y | no_data_found |
NO_DATA_NEEDED | N | Не генерируется |
NOT_LOGGED_ON | N | Не генерируется |
PROGRAM_ERROR | Y | internal_error |
ROWTYPE_MISMATCH | Н | Не генерируется |
SELF_IS_NULL | N | Не генерируется |
STORAGE_ERROR | Y | out_of_memory |
SUBSCRIPT_BEYOND_COUNT | N | Не генерируется |
SUBSCRIPT_OUTSIDE_LIMIT | N | Не генерируется |
SYS_INVALID_ROWID | N | Не генерируется |
TIMEOUT_ON_RESOURCE | N | Не генерируется |
TOO_MANY_ROWS | Y | too_many_rows |
VALUE_ERROR | Y | null_value_not_allowed invalid_text_representation string_data_right_truncation invalid_parameter_value |
ZERO_DIVIDE | Y | division_by_zero |
Y: Может быть перенесено
N: Не может быть перенесено
Пример миграции
Пример ниже показывает, как осуществить миграцию исключения VALUE_ERROR. Обратите внимание, что в примере миграции используется OR для группировки кодов ошибок, так что VALUE_ERROR соответствует нескольким кодам ошибок Tantor SE.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE variety VARCHAR2(20) := 'television'; company VARCHAR2(20) := 'Fullmoon Industry'; name VARCHAR2(30); BEGIN name := ( variety || 'from' || company ); EXCEPTION WHEN VALUE_ERROR THEN DBMS_OUTPUT.PUT_LINE ( 'ERR: Category length is out of range.' ); END; / |
DO $$ DECLARE variety VARCHAR(20) := 'television'; company VARCHAR(20) := 'Fullmoon Industry'; name VARCHAR(30); BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); name := ( variety || 'from' || company ); EXCEPTION WHEN null_value_not_allowed OR invalid_text_representation OR string_data_right_truncation OR invalid_parameter_value THEN PERFORM DBMS_OUTPUT.PUT_LINE ( 'ERR: Category length is out of range.' ); END; $$ ; |
F.29.41.2.2.2. SQLCODE #
Description
SQLCODE возвращает код ошибки ошибки.
Функциональные различия
База данных Oracle
SQLCODE может быть указан для получения кода ошибки.
Tantor SE
SQLCODE не может быть указан для получения кода ошибки.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова SQLCODE и определение его использования.
Измените участок, который вызывает SQLCODE на SQLSTATE.
Пример миграции
Приведенный ниже пример показывает миграцию, когда код ошибки отображается.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE v_i_number SMALLINT := 401; v_i_name VARCHAR2(30) := 'Blu-ray and DVD recorder'; v_i_quantity INTEGER := 10; v_i_warehouse SMALLINT := 2; BEGIN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE( 'ERR:' || SQLCODE || ': Failure of INSERT.' ); END; / |
DO $$ DECLARE v_i_number SMALLINT := 401; v_i_name VARCHAR(30) := 'Blu-ray and DVD recorder'; v_i_quantity INTEGER := 10; v_i_warehouse SMALLINT := 2; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); EXCEPTION WHEN OTHERS THEN PERFORM DBMS_OUTPUT.PUT_LINE( 'ERR:' || SQLSTATE || ': Failure of INSERT.' ); END; $$ ; |
Note
Базы данных Oracle и Tantor SE имеют разные коды ошибок, поэтому наборы значений SQLCODE и SQLSTATE различны. Обратитесь к “Приложению А. Коды ошибок Tantor SE” в документации Tantor SE для получения информации о кодах ошибок, которые должны быть определены в Tantor SE.
F.29.41.2.2.3. ОБЪЯВЛЕНИЯ ИСКЛЮЧЕНИЙ #
Description
Объявление EXCEPTION определяет ошибку.
Функциональные различия
База данных Oracle
Определения ИСКЛЮЧЕНИЯ могут использоваться для определения ошибок.
Tantor SE
ОБЪЯВЛЕНИЯ ИСКЛЮЧЕНИЯ не могут быть использованы.
Процедура миграции
EXCEPTION объявления не могут быть использованы, поэтому укажите номер ошибки в операторе RAISE, чтобы достичь эквивалентной операции. Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова EXCEPTION, определение места использования объявления EXCEPTION и проверка имени ошибки.
Ищите ключевое слово RAISE и определите, где используется ошибка, созданная с помощью объявления EXCEPTION.
Удалите имя ошибки из оператора RAISE и вместо этого укажите код ошибки, используя ERRCODE в блоке USING.
Измените часть предложения EXCEPTION, где используется имя ошибки, чтобы записать ошибку на SQLSTATE 'errCodeSpecifiedInStep3'.
Удалите объявление EXCEPTION.
Пример миграции
Приведенный ниже пример показывает миграцию, когда генерируется пользовательская ошибка.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE v_i_number SMALLINT := 200; v_i_name VARCHAR2(20) := 'television'; v_i_quantity INTEGER := 10; v_i_warehouse SMALLINT := 3; warehouse_num_err EXCEPTION; BEGIN IF ( v_i_warehouse = 1 ) OR ( v_i_warehouse = 2 ) THEN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); ELSE RAISE warehouse_num_err; END IF; EXCEPTION WHEN warehouse_num_err THEN DBMS_OUTPUT.PUT_LINE( 'ERR: Warehouse number is out of range.' ); END; / |
SET SERVEROUTPUT ON; DECLARE v_i_number SMALLINT := 200; v_i_name VARCHAR2(20) := 'television'; v_i_quantity INTEGER := 10; v_i_warehouse SMALLINT := 3; BEGIN IF ( v_i_warehouse = 1 ) OR ( v_i_warehouse = 2 ) THEN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); ELSE RAISE USING ERRCODE = '20001'; END IF; EXCEPTION WHEN SQLSTATE '20001' THEN DBMS_OUTPUT.PUT_LINE( 'ERR: Warehouse number is out of range.' ); END; / |
F.29.41.2.2.4. PRAGMA EXCEPTION_INIT и RAISE_APPLICATION_ERROR #
Description
Прагма EXCEPTION_INIT связывает пользовательское имя ошибки с кодом ошибки базы данных Oracle. RAISE_APPLICATION_ERROR использует пользовательский код ошибки и сообщение об ошибке для генерации ошибки.
Функциональные различия
База данных Oracle
EXCEPTION_INIT pragmas and RAISE_APPLICATION_ERROR statements can be used.
Tantor SE
Использование директив EXCEPTION_INIT и RAISE_APPLICATION_ERROR недопустимо.
Процедура миграции
EXCEPTION_INIT pragmas and RAISE_APPLICATION_ERROR statements cannot be used, so specify an error message and error code in a RAISE statement to achieve equivalent operation. Use the following procedure to perform migration:
Поиск ключевых слов EXCEPTION и PRAGMA, и проверка на наличие директивы EXCEPTION_INIT pragma и указанной ошибки и кода ошибки.
Поиск ключевого слова RAISE_APPLICATION_ERROR и проверка, где используется ошибка.
Замените сообщение об ошибке и код ошибки, вызываемые с помощью RAISE_APPLICATION_ERROR, на синтаксис, использующий предложение USING в RAISE.
Измените часть предложения EXCEPTION, где используется определенное пользователем имя ошибки, чтобы записать ошибку на SQLSTATE 'errCodeSpecifiedInStep3'. Чтобы отобразить сообщение об ошибке и код ошибки в предложении EXCEPTION, используйте SQLERRM и SQLSTATE.
Удалите объявление и директиву EXCEPTION INIT.
Пример миграции
Приведенный ниже пример показывает миграцию, когда используются директива EXCEPTION INIT и оператор RAISE APPLICATION ERROR.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE v_i_number SMALLINT := 200; v_i_name VARCHAR2(30) := ' liquid crystal?television'; v_i_quantity INTEGER := 10; v_i_warehouse SMALLINT := 3; invalid_length EXCEPTION; PRAGMA EXCEPTION_INIT ( invalid_length, -20001 ); BEGIN IF ( LENGTH( v_i_name ) <= 20 ) THEN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); ELSE RAISE_APPLICATION_ERROR( -20001, 'ERR: i_name is invalid length.' ); END IF; EXCEPTION WHEN invalid_length THEN DBMS_OUTPUT.PUT_LINE( TO_CHAR(SQLERRM(-20001)) ); END; / |
DO $$ DECLARE v_i_number SMALLINT := 200; v_i_name VARCHAR(30) := ' liquid crystal television'; v_i_quantity INTEGER := 10; v_i_warehouse SMALLINT := 3; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); IF ( LENGTH( v_i_name ) <= 20 ) THEN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); ELSE RAISE 'ERR: i_name is invalid length.' USING ERRCODE = '20001'; END IF; EXCEPTION WHEN SQLSTATE '20001' THEN PERFORM DBMS_OUTPUT.PUT_LINE( SQLSTATE || ':' || SQLERRM ); END; $$ ; |
Note
SQLERRM, предоставленный Tantor SE, не может указать код ошибки в своем аргументе.
F.29.41.2.2.5. WHENEVER #
Description
WHENEVER SQLERROR предопределяет обработку, которая будет выполняться при возникновении ошибки в операторе SQL или PL/SQL. WHENEVER OSERROR предопределяет обработку, которая будет выполняться при возникновении ошибки операционной системы.
Функциональные различия
База данных Oracle
WHENEVER может быть использовано для предварительного определения обработки, которая будет выполняться при возникновении ошибки.
Tantor SE
WHENEVER не может быть использовано.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова WHENEVER и определение его использования.
Замените синтаксис {WHENEVER SQLERROR EXIT FAILURE} или {WHENEVER OSERROR EXIT FAILURE} на {ON_ERROR_STOP ON}.
Пример миграции
Приведенный ниже пример показывает миграцию, когда активный сценарий, столкнувшийся с ошибкой, останавливается.
База данных Oracle | Tantor SE |
---|---|
WHENEVER SQLERROR EXIT FAILURE DECLARE v_i_number SMALLINT := 401; v_i_name VARCHAR2(30) := 'liquid crystal television'; v_i_quantity INTEGER := 100; v_i_warehouse SMALLINT := 2; BEGIN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); END; / |
\set ON_ERROR_STOP ON DO $$ DECLARE v_i_number SMALLINT := 401; v_i_name VARCHAR(30) := 'liquid crystal television'; v_i_quantity INTEGER := 100; v_i_warehouse SMALLINT := 2; BEGIN INSERT INTO inventory_table VALUES ( v_i_number, v_i_name, v_i_quantity, v_i_warehouse ); END; $$ ; |
Note
WHENEVER SQLERROR и WHENEVER OSERROR являются функциями SQL*Plus. Перенесите их в функцию psql в Tantor SE.
Из значений, которые можно указать в WHENEVER, только EXIT FAILURE и CONTINUE NONE могут быть перенесены. Если указано CONTINUE NONE, замените его на ON_ERROR_ROLLBACK ON.
F.29.41.2.3. Элементы, связанные с курсорами #
Этот раздел объясняет элементы, связанные с курсорами PL/SQL.
F.29.41.2.3.1. %FOUND #
Description
%FOUND предоставляет информацию о том, затронул ли SQL-оператор одну или несколько строк.
Функциональные различия
База данных Oracle
%FOUND можно использовать.%
Tantor SE
%FOUND не может быть использовано. Вместо этого используйте FOUND.
Процедура миграции
Используйте следующую процедуру для выполнения миграции с использованием FOUND:
Когда есть один неявный или явный курсор
Поиск ключевого слова %FOUND и определение его использования.
Измените часть, которая вызывает cursorName%FOUND, на FOUND.
Когда есть несколько явных курсоров
Поиск ключевого слова %FOUND и определение его использования.
Используя DECLARE, объявите такое же количество переменных BOOLEAN, как и явных курсоров.
Сразу после каждого оператора FETCH сохраните значение, полученное из FOUND, в переменной, объявленной во втором шаге.
Замените часть, которая вызывает cursorName%FOUND, на переменную, используемую в шаге 3.
Пример миграции
The example below shows migration when update of a row by an implicit cursor is checked.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; BEGIN UPDATE inventory_table SET i_warehouse = 3 WHERE i_name = 'television'; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE ( 'Updated!' ); ELSE DBMS_OUTPUT.PUT_LINE ( 'Not Updated!' ); END IF; END; / |
DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); UPDATE inventory_table SET i_warehouse = 3 WHERE i_name = 'television'; IF FOUND THEN PERFORM DBMS_OUTPUT.PUT_LINE( 'Updated!' ); ELSE PERFORM DBMS_OUTPUT.PUT_LINE( 'Not updated!' ); END IF; END; $$ ; |
Note
Запросы, в которых определяется, что %FOUND равно NULL, не могут быть перенесены. Если SQL вообще не выполнялся, то значение FOUND устанавливается в FALSE, что является тем же возвращаемым значением, что и при отсутствии изменений в строках.
F.29.41.2.3.2. %NOTFOUND #
Description
%NOTFOUND предоставляет информацию о том, были ли затронуты какие-либо строки SQL-запросом.
Функциональные различия
База данных Oracle
%NOTFOUND можно использовать.%
Tantor SE
%NOTFOUND не может быть использовано. Вместо этого используйте NOT FOUND.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Когда есть один неявный или явный курсор
Поиск ключевого слова %NOTFOUND и определение его использования.
Измените часть, которая вызывает cursorName%NOTFOUND на NOT FOUND.
Когда есть несколько явных курсоров
Поиск ключевого слова %NOTFOUND и определение его использования.
Используя DECLARE, объявите такое же количество переменных BOOLEAN, как и явных курсоров.
Сразу после каждого оператора FETCH сохраните значение, полученное из FOUND, в переменной, объявленной во втором шаге.
Замените часть, которая вызывает cursorName%NOTFOUND, с отрицанием переменной, используемой в шаге 3.
Пример миграции
Приведенный ниже пример показывает миграцию, когда используются несколько явных курсоров для повторного выполнения FETCH до тех пор, пока в одной из таблиц не останется больше строк.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE CURSOR cur1 IS SELECT i_number, i_name FROM inventory_table WHERE i_name = 'television'; CURSOR cur2 IS SELECT i_number, i_name FROM inventory_table WHERE i_name = 'cd player'; v1_i_number inventory_table.i_number%TYPE; v2_i_number inventory_table.i_number%TYPE; v1_i_name inventory_table.i_name%TYPE; v2_i_name inventory_table.i_name%TYPE; BEGIN OPEN cur1; OPEN cur2; LOOP FETCH cur1 into v1_i_number, v1_i_name; FETCH cur2 into v2_i_number, v2_i_name; EXIT WHEN ( cur1%NOTFOUND ) OR ( cur2%NOTFOUND ); DBMS_OUTPUT.PUT_LINE( 'No.' || v1_i_number || ': ' || v1_i_name ); DBMS_OUTPUT.PUT_LINE( 'No.' || v2_i_number || ': ' || v2_i_name ); END LOOP; CLOSE cur1; CLOSE cur2; END; / |
DO $$ DECLARE cur1 CURSOR FOR SELECT i_number, i_name FROM inventory_table WHERE i_name = 'television'; cur2 CURSOR FOR SELECT i_number, i_name FROM inventory_table WHERE i_name = 'cd player'; v1_i_number inventory_table.i_number%TYPE; v2_i_number inventory_table.i_number%TYPE; v1_i_name inventory_table.i_name%TYPE; v2_i_name inventory_table.i_name%TYPE; flg1 BOOLEAN; flg2 BOOLEAN; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); OPEN cur1; OPEN cur2; LOOP FETCH cur1 into v1_i_number, v1_i_name; flg1 := FOUND; FETCH cur2 into v2_i_number, v2_i_name; flg2 := FOUND; EXIT WHEN ( NOT flg1 ) OR ( NOT flg2 ); PERFORM DBMS_OUTPUT.PUT_LINE( 'No.' || v1_i_number || ': ' || v1_i_name ); PERFORM DBMS_OUTPUT.PUT_LINE( 'No.' || v2_i_number || ': ' || v2_i_name ); END LOOP; CLOSE cur1; CLOSE cur2; END; $$ ; |
Note
Запросы, в которых определяется, что %NOTFOUND равно NULL, не могут быть перенесены. Если SQL вообще не выполнялся, то FOUND устанавливается в FALSE, что является тем же значением возврата, что и при отсутствии изменений в строках.
F.29.41.2.3.3. %ROWCOUNT #
Description
%ROWCOUNT указывает количество обработанных строк в SQL-запросе.
Функциональные различия
База данных Oracle
%ROWCOUNT можно использовать.
Tantor SE
%ROWCOUNT не может быть использован. Вместо него используйте ROW_COUNT.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово %ROWCOUNT и определите, где оно используется.
Объявите переменную, которая будет хранить значение, полученное с помощью ROW_COUNT.
Используйте GET DIAGNOSTICS непосредственно перед %ROWCOUNT, указанным в шаге 1. Он получает ROW_COUNT и сохраняет его значение в переменной, объявленной в шаге 2.
Замените часть, которая вызывает %ROWCOUNT, на переменную, используемую в шаге 3.
Пример миграции
Приведенный ниже пример показывает миграцию, когда получено количество удаленных строк.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; BEGIN DELETE FROM inventory_table WHERE i_name = 'television'; DBMS_OUTPUT.PUT_LINE ( TO_CHAR( SQL%ROWCOUNT ) || 'rows deleted!' ); END; / |
DO $$ DECLARE row_num INTEGER; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); DELETE FROM inventory_table WHERE i_name = 'television'; GET DIAGNOSTICS row_num := ROW_COUNT; PERFORM DBMS_OUTPUT.PUT_LINE( TO_CHAR( row_num ) || 'rows deleted!' ); END; $$ ; |
Note
Запросы, в которых определяется, что %ROWCOUNT равно NULL, не могут быть перенесены. Если SQL вообще не выполнялся, устанавливается значение 0.
F.29.41.2.3.4. REF CURSOR #
Description
REF CURSOR - это тип данных, который представляет курсор в базах данных Oracle.
Функциональные различия
База данных Oracle
Можно определить переменные типа REF CURSOR.
Tantor SE
REF CURSOR тип переменных не может быть определен. Вместо этого используйте переменные типа refcursor.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова REF CURSOR и определение его использования.
Удалите определение типа REF CURSOR и часть, где объявляется переменная курсора с использованием этого типа.
Измените спецификацию так, чтобы переменная курсора была объявлена с использованием типа refcursor.
Пример миграции
Приведенный ниже пример показывает миграцию, когда переменная курсора используется для извлечения строки.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE TYPE curtype IS REF CURSOR; cur curtype; v_inventory inventory_table%ROWTYPE; BEGIN OPEN cur FOR SELECT * FROM inventory_table WHERE i_warehouse = 2; DBMS_OUTPUT.PUT_LINE( 'In warehouse no.2 is :' ); LOOP FETCH cur into v_inventory; EXIT WHEN cur%NOTFOUND; DBMS_OUTPUT.PUT_LINE( 'No.' || v_inventory.i_number || ': ' || v_inventory.i_name || '(' || v_inventory.i_quantity || ')' ); END LOOP; CLOSE cur; END; / |
DO $$ DECLARE cur refcursor; v_inventory inventory_table%ROWTYPE; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); OPEN cur FOR SELECT * FROM inventory_table WHERE i_warehouse = 2; PERFORM DBMS_OUTPUT.PUT_LINE( 'In warehouse no.2 is :' ); LOOP FETCH cur into v_inventory; EXIT WHEN NOT FOUND; PERFORM DBMS_OUTPUT.PUT_LINE( 'No.' || v_inventory.i_number || ': ' || v_inventory.i_name || '(' || v_inventory.i_quantity || ')' ); END LOOP; CLOSE cur; END; $$ ; |
Note
Предложение RETURN (определяет тип возвращаемого курсора сам по себе) не может быть указано в типе refcursor, предоставленном Tantor SE.
F.29.41.2.3.5. FORALL #
Description
FORALL использует изменяющееся значение предложения VALUES или WHERE для выполнения одной команды несколько раз.
Функциональные различия
База данных Oracle
Можно использовать операторы FORALL.
Tantor SE
FORALL statements cannot be used.
Процедура миграции
FORALL statements cannot be used, so replace them with FOR statements so that the same result is returned. Use the following procedure to perform migration:
Поиск ключевого слова FORALL и определение его использования.
Храните элементы, используемые командами внутри FORALL, в переменных типа массива. Кроме того, удалите определения массивов базы данных Oracle.
Замените операторы FORALL операторами FOR - LOOP.
Замените участки, которые ссылается на массив в базе данных Oracle, на ссылку на переменную типа массив, определенную в шаге 2. Изменения, внесенные в пример миграции, и детали изменений следующие:
Начало цикла: Измените i_numL.FIRST на 1.
Конец цикла: Замените i_numL.LAST на ARRAY_LENGTH.
Ссылка на элементы массива: Измените i_numL(i) на i_numL[i].
Пример миграции
Приведенный ниже пример показывает миграцию, когда используется FORALL для выполнения INSERT.
База данных Oracle | Tantor SE |
---|---|
DECLARE TYPE NumList IS TABLE OF SMALLINT; i_numL NumList := NumList( 151, 152, 153, 154, 155 ); BEGIN FORALL i IN i_numL.FIRST .. i_numL.LAST INSERT INTO inventory_table VALUES ( i_numL(i), 'television', 10, 2 ); END; / |
DO $$ DECLARE i_numL SMALLINT ARRAY := '{ 151, 152, 153, 154, 155 }'; BEGIN FOR i IN 1..ARRAY_LENGTH( i_numL, 1 ) LOOP INSERT INTO inventory_table VALUES ( i_numL[i], 'television', 10, 2 ); END LOOP; END; $$ ; |
F.29.41.3. Перенос функций #
Этот раздел объясняет, как перенести функции PL/SQL.
Description
Хранимая функция - это пользовательская функция, которая возвращает значение.
F.29.41.3.1. Определение функций #
Функциональные различия
База данных Oracle
Предложение RETURN внутри прототипа функции указывается как RETURN.
DECLARE не нужно указывать как часть определения переменной, используемой внутри функции.
Tantor SE
Используйте RETURNS для указания предложения RETURN в прототипе функции.
DECLARE должен быть указан как определение переменной, которая будет использоваться в функции.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и FUNCTION и определите, где создаются пользовательские функции.
Если в аргументе указан квалификатор IN или OUT, переместите его в начало параметров.
Измените RETURN в прототипе функции на RETURNS.
Измените предложение AS на AS $$. (Если ключевое слово IS, измените его на AS).
Если переменная определена, добавьте ключевое слово DECLARE после $$.
Удалите конечный слэш (/) и укажите $$ и предложение LANGUAGE.
Пример миграции
Приведенный ниже пример показывает миграцию, когда используется CREATE FUNCTION для определения функции.
База данных Oracle | Tantor SE |
---|---|
CREATE FUNCTION PROFIT_FUNC( selling IN INTEGER, sales_num IN INTEGER, cost IN INTEGER ) RETURN INTEGER AS profit INTEGER; BEGIN profit := ( ( selling * sales_num ) - cost ); RETURN profit; END; / |
CREATE FUNCTION PROFIT_FUNC( IN selling INTEGER, IN sales_num INTEGER, IN cost INTEGER ) RETURNS INTEGER AS $$ DECLARE profit INTEGER; BEGIN profit := ( ( selling * sales_num ) - cost ); RETURN profit; END; $$ LANGUAGE plpgsql; |
F.29.41.4. Перенос процедур #
Этот раздел объясняет, как перенести процедуры PL/SQL.
Description
Хранимая процедура - это одиночная процедура, в которую были сгруппированы несколько процессов.
F.29.41.4.1. Определение процедур #
Функциональные различия
База данных Oracle
Процедуры могут быть созданы.
Tantor SE
Процедуры не могут быть созданы.
Процедура миграции
Процедуры не могут быть созданы в Tantor SE. Поэтому замените их функциями. Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и PROCEDURE и определите, где определена процедура.
Замените оператор CREATE PROCEDURE оператором CREATE FUNCTION.
Измените предложение AS на RETURNS VOID AS $$. (Если ключевое слово IS, измените его на AS).
Если переменная определена, добавьте ключевое слово DECLARE после $$.
Удалите конечный слэш (/) и укажите $$ и предложение LANGUAGE.
Note
Если в аргументах указаны ключевые слова OUT или INOUT, должен использоваться другой метод миграции. Обратитесь к разделу "Определение процедур, возвращающих значение".
Пример миграции
Приведенный ниже пример показывает миграцию, когда определена процедура.
База данных Oracle | Tantor SE |
---|---|
CREATE PROCEDURE UPD_QUANTITY ( upd_number SMALLINT, upd_quantity INTEGER ) AS BEGIN UPDATE inventory_table SET i_quantity = upd_quantity WHERE i_number = upd_number; END; / ------------------------------------------------- DECLARE v_i_number SMALLINT := 110; v_i_quantity INTEGER := 100; BEGIN upd_quantity( v_i_number, v_i_quantity ); END; / |
CREATE FUNCTION UPD_QUANTITY ( upd_number SMALLINT, upd_quantity INTEGER ) RETURNS VOID AS $$ BEGIN UPDATE inventory_table SET i_quantity = upd_quantity WHERE i_number = upd_number; END; $$ LANGUAGE plpgsql; ------------------------------------------------- DO $$ DECLARE v_i_number SMALLINT := 110; v_i_quantity INTEGER := 100; BEGIN PERFORM upd_quantity( v_i_number, v_i_quantity ); END; $$ ; |
F.29.41.4.2. Вызов процедур #
Функциональные различия
База данных Oracle
Процедуру можно вызывать как оператор.
Tantor SE
Процедуры не могут быть использованы. Вместо этого вызывайте процедуру как функцию, которая не возвращает значение.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Определите, где вызывается каждая процедура.
Укажите PERFORM перед вызовом процедуры.
Пример миграции
Приведенный ниже пример показывает миграцию при вызове процедуры.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; BEGIN DBMS_OUTPUT.PUT_LINE( 'Hello World.' ); END; / |
DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM DBMS_OUTPUT.PUT_LINE( 'Hello World.' ); END; $$ ; |
F.29.41.4.3. Определение процедур, возвращающих значение #
Функциональные различия
База данных Oracle
Можно создавать процедуры, которые возвращают значение.
Tantor SE
Процедуры, возвращающие значение, не могут быть созданы.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и PROCEDURE и определите, где определена процедура.
Подтвердите, что в аргументах указаны ключевые слова OUT или INOUT.
Замените оператор CREATE PROCEDURE оператором CREATE FUNCTION.
Если в аргументах указаны ключевые слова IN, OUT или INOUT, переместите их в начало аргументов.
Измените предложение AS на AS $$. (Если ключевое слово IS, измените его на AS).
Если переменная определена, добавьте ключевое слово DECLARE после $$.
Удалите конечный слэш (/) и укажите $$ и предложение LANGUAGE.
Если вызывается функция, вызывайте ее без указания аргументов в параметре OUT и сохраняйте возвращаемое значение в переменной. Если есть несколько параметров OUT, используйте оператор SELECT INTO.
Пример миграции
Приведенный ниже пример показывает миграцию, когда параметр OUT оператора CREATE PROCEDURE используется для определения процедуры, которая возвращает значение.
База данных Oracle | Tantor SE |
---|---|
CREATE PROCEDURE remove_row ( del_name VARCHAR2, del_row OUT INTEGER ) AS BEGIN DELETE FROM inventory_table WHERE i_name = del_name; del_row := SQL%ROWCOUNT; END; / ------------------------------------------------- SET SERVEROUTPUT ON; DECLARE rtn_row INTEGER; v_i_name VARCHAR2(20) := 'television'; BEGIN remove_row( v_i_name, rtn_row ); DBMS_OUTPUT.PUT_LINE( TO_CHAR( rtn_row ) || 'rows deleted!' ); END; / |
CREATE FUNCTION remove_row ( del_name VARCHAR, OUT del_row INTEGER ) AS $$ BEGIN DELETE FROM inventory_table WHERE i_name = del_name; GET DIAGNOSTICS del_row := ROW_COUNT; END; $$ LANGUAGE plpgsql; ------------------------------------------------- DO $$ DECLARE rtn_row INTEGER; v_i_name VARCHAR(20) := 'television'; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); rtn_row := remove_row( v_i_name ); PERFORM DBMS_OUTPUT.PUT_LINE( TO_CHAR( rtn_row ) || 'rows deleted!' ); END; $$ ; |
See
Обратитесь к разделу "Определение вложенных процедур" для примеров миграции части вызова, которая использует оператор SELECT INTO.
F.29.41.4.4. Определение вложенных процедур #
Функциональные различия
База данных Oracle
Можно определить вложенные процедуры.
Tantor SE
Вложенные процедуры не могут быть определены.
Процедура миграции
Процедуры должны быть заменены функциями, но функции не могут быть вложены в Tantor SE. Поэтому определите и вызовите функции отдельно. Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и PROCEDURE и определите, где определена процедура.
Если оператор PROCEDURE определен в блоке DECLARE, считайте его вложенной процедурой.
Проверьте переменные, которые используются как процедурой, так и вложенной процедурой.
Замените вложенную процедуру (от PROCEDURE procedureName до END procedureName;) на оператор CREATE FUNCTION. Укажите переменные, найденные на шаге 3, в аргументе INOUT оператора CREATE FUNCTION.
Замените часть, которая вызывает вложенную процедуру, на оператор SELECT INTO. Укажите общие переменные, найденные на шаге 3, как в переменных, используемых для вызова функции, так и в переменных, используемых для принятия предложения INTO.
Пример миграции
Приведенный ниже пример показывает миграцию, когда используются вложенные процедуры и переменная разделяется между процедурой и ее вызывающей частью.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; DECLARE sales_num INTEGER; stock_num INTEGER; v_i_quantity INTEGER; PROCEDURE quantity_check ( sales INTEGER, stock INTEGER ) IS quantity_err EXCEPTION; BEGIN v_i_quantity := ( stock - sales ); IF ( v_i_quantity < 0 ) THEN RAISE quantity_err; END IF; EXCEPTION WHEN quantity_err THEN DBMS_OUTPUT.PUT_LINE( 'ERR: i_quantity is negative value.' ); END quantity_check; BEGIN sales_num := 80; stock_num := 100; quantity_check( sales_num, stock_num ); DBMS_OUTPUT.PUT_LINE( 'i_quantity: ' || v_i_quantity ); sales_num := 100; stock_num := 80; quantity_check( sales_num, stock_num ); DBMS_OUTPUT.PUT_LINE( 'i_quantity: ' || v_i_quantity ); END; / |
CREATE FUNCTION quantity_check( sales INTEGER, stock INTEGER, INOUT quantity INTEGER ) AS $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); quantity := ( stock - sales ); IF ( quantity < 0 ) THEN RAISE USING ERRCODE = '20001'; END IF; EXCEPTION WHEN SQLSTATE '20001' THEN PERFORM DBMS_OUTPUT.PUT_LINE( 'ERR: i_quantity is negative value.' ); END; $$ LANGUAGE plpgsql; ------------------------------------------------- DO $$ DECLARE sales_num INTEGER; stock_num INTEGER; v_i_quantity INTEGER; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); sales_num := 80; stock_num := 100; SELECT quantity INTO v_i_quantity FROM quantity_check( sales_num, stock_num, v_i_quantity ); PERFORM DBMS_OUTPUT.PUT_LINE( 'i_quantity: ' || v_i_quantity ); sales_num := 100; stock_num := 80; SELECT quantity INTO v_i_quantity FROM quantity_check( sales_num, stock_num, v_i_quantity ); PERFORM DBMS_OUTPUT.PUT_LINE( 'i_quantity: ' || v_i_quantity ); END; $$ ; |
F.29.41.4.5. Определение анонимных блоков кода #
Description
Анонимный блок кода создает и выполняет временную функцию в рамках процедурного языка.
Функциональные различия
База данных Oracle
Анонимные блоки кода, заключенные в (DECLARE) BEGIN и END, могут быть выполнены.
Tantor SE
Блоки PL/pgSQL ((DECLARE) от BEGIN до END), которые заключены в DO
могут
быть выполнены.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова DECLARE и BEGIN и определите, где определен анонимный блок кода.
Укажите DO $$ в начале анонимного блока кода.
Удалите конечный слэш (/) и укажите $$.
Пример миграции
Приведенный ниже пример показывает миграцию, когда определен анонимный блок кода.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; BEGIN DBMS_OUTPUT.PUT_LINE( 'Hello World.' ); END; / |
DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM DBMS_OUTPUT.PUT_LINE( 'Hello World.' ); END; $$ ; |
F.29.41.5. Перенос пакетов #
Этот раздел объясняет, как перенести пакеты PL/SQL.
Description
Пакет определяет и содержит процедуры и функции как единую группу связей в базе данных.
Функциональные различия
База данных Oracle
Пакеты могут быть созданы.
Tantor SE
Пакеты не могут быть созданы.
Пакеты не могут быть созданы в Tantor SE, поэтому определите схему с тем же именем, что и пакет, и определите функции, которые имеют отношение в схеме, чтобы они рассматривались как единая группа. В следующих разделах объясняется процедура миграции для каждой функции, которую нужно определить в пакете.
F.29.41.5.1. Определение функций внутри пакета #
Функциональные различия
База данных Oracle
Функции могут быть созданы внутри пакета.
Tantor SE
Пакет сам по себе не может быть создан.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и PACKAGE и определите, где они определены.
Определите схему с тем же именем, что и пакет.
Если в операторе CREATE PACKAGE BODY указан оператор FUNCTION, определите в схеме, созданной на шаге 2, функции, определенные в пакете.
Пример миграции
Приведенный ниже пример показывает миграцию, когда пакет определен и функции создаются внутри этого пакета.
База данных Oracle | Tantor SE |
---|---|
CREATE PACKAGE smpl_pkg AS FUNCTION remove_row( rm_i_name VARCHAR2 ) RETURN INTEGER; END smpl_pkg; / CREATE PACKAGE BODY smpl_pkg AS FUNCTION remove_row( rm_i_name VARCHAR2 ) RETURN INTEGER IS rtn_row INTEGER; BEGIN DELETE FROM inventory_table WHERE i_name = rm_i_name; RETURN(SQL%ROWCOUNT); END; END smpl_pkg; / |
CREATE SCHEMA smpl_scm; CREATE FUNCTION smpl_scm.remove_row( rm_i_name VARCHAR ) RETURNS INTEGER AS $$ DECLARE rtn_row INTEGER; BEGIN DELETE FROM inventory_table WHERE i_name = rm_i_name; GET DIAGNOSTICS rtn_row := ROW_COUNT; RETURN rtn_row; END; $$ LANGUAGE plpgsql; |
See
Обратитесь к разделу "Определение функций" для получения информации о миграции операторов FUNCTION внутри пакета.
F.29.41.5.2. Определение процедур внутри пакета #
Функциональные различия
База данных Oracle
Процедуры могут быть созданы внутри пакета.
Tantor SE
Пакет сам по себе не может быть создан.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и PACKAGE и определите, где они определены.
Определите схему с тем же именем, что и пакет.
Если в операторе CREATE PACKAGE BODY указан оператор PROCEDURE, перенесите процедуры, определенные в пакете, в функции и определите их в схеме, созданной на шаге 2.
Пример миграции
Приведенный ниже пример показывает миграцию, когда пакет определен и процедуры создаются внутри этого пакета.
База данных Oracle | Tantor SE |
---|---|
CREATE PACKAGE smpl_pkg AS PROCEDURE increase_row( add_i_num SMALLINT, add_i_name VARCHAR2, add_i_quantity INTEGER, add_i_warehouse SMALLINT ); END smpl_pkg; / CREATE PACKAGE BODY smpl_pkg AS PROCEDURE increase_row( add_i_num SMALLINT, add_i_name VARCHAR2, add_i_quantity INTEGER, add_i_warehouse SMALLINT ) IS BEGIN INSERT INTO inventory_table VALUES ( add_i_num, add_i_name, add_i_quantity, add_i_warehouse ); END; END smpl_pkg; / |
CREATE SCHEMA smpl_scm; CREATE FUNCTION smpl_scm.increase_row( add_i_num SMALLINT, add_i_name VARCHAR, add_i_quantity INTEGER, add_i_warehouse SMALLINT ) RETURNS VOID AS $$ BEGIN INSERT INTO inventory_table VALUES ( add_i_num, add_i_name, add_i_quantity, add_i_warehouse ); END; $$ LANGUAGE plpgsql; |
See
Обратитесь к разделу "Определение процедур" за информацией о миграции операторов PROCEDURE внутри пакета.
F.29.41.5.3. Обмен переменными внутри пакета #
Функциональные различия
База данных Oracle
Переменные могут быть общими внутри пакета.
Tantor SE
Пакет не может быть создан, поэтому переменные не могут быть общими.
Процедура миграции
Используйте временную таблицу вместо переменных внутри пакета. Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова CREATE и PACKAGE и определите, где они определены.
Проверка наличия переменных, определенных непосредственно в пакете.
Создайте временную таблицу, которая определяет переменные, проверяемые в шаге 2, в столбце.
Вставьте одну запись во временную таблицу, созданную на шаге 3. (Установите значение, указанное внутри пакета, в качестве начального значения).
Замените соответствующие части, которые ссылается на переменную и установите переменную с помощью SQL-запросов.
Для ссылки на переменную используйте оператор SELECT INTO, чтобы сохранить значение в переменной, а затем ссылаться на него. (Переменная для ссылки на переменную должна быть определена отдельно).
Чтобы обновить переменную, используйте оператор UPDATE и обновите целевой столбец.
Пример миграции
Приведенный ниже пример показывает миграцию, когда определен пакет и переменные внутри пакета являются общими.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON; CREATE PACKAGE row_pkg AS PROCEDURE set_item( item INTEGER ); i_item INTEGER; END row_pkg; / CREATE PACKAGE BODY row_pkg AS PROCEDURE set_item( item INTEGER ) IS BEGIN i_item := item; END; END row_pkg; / ------------------------------------------------- SET SERVEROUTPUT ON; BEGIN row_pkg.set_item( 1000 ); DBMS_OUTPUT.PUT_LINE( 'ITEM :' || row_pkg.i_item ); row_pkg.set_item(2000); DBMS_OUTPUT.PUT_LINE( 'ITEM :' || row_pkg.i_item ); END; / |
CREATE SCHEMA row_pkg; CREATE FUNCTION row_pkg.set_item( item INTEGER ) RETURNS VOID AS $$ BEGIN UPDATE row_pkg_variables SET i_item = item; END; $$ LANGUAGE plpgsql; ------------------------------------------------- CREATE TEMP TABLE row_pkg_variables ( i_item INTEGER ); INSERT INTO row_pkg_variables VALUES (0); DO $$ DECLARE g_item INTEGER; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM row_pkg.set_item( 1000 ); SELECT i_item INTO g_item FROM row_pkg_variables; PERFORM DBMS_OUTPUT.PUT_LINE( 'ITEM :' || g_item ); PERFORM row_pkg.set_item(2000); SELECT i_item INTO g_item FROM row_pkg_variables; PERFORM DBMS_OUTPUT.PUT_LINE( 'ITEM :' || g_item ); END; $$ ; |
F.29.42. Миграция: Глава 6 Примечания по использованию orafce #
Эта глава содержит заметки об использовании функций совместимости с базой данных Oracle, добавленных с помощью orafce.
F.29.42.1. Типы данных #
В этом разделе объясняется, как перенести типы данных, добавленные с помощью orafce.
F.29.42.1.1. Примечания о VARCHAR2 #
Этот раздел содержит заметки о типе данных VARCHAR2.
F.29.42.1.1.1. Указание максимального числа байтов и максимального числа символов #
Функциональные различия
База данных Oracle
Указание ключевого слова BYTE или CHAR после размера позволяет указать размер в терминах максимального количества байтов или максимального количества символов.
Tantor SE
Ключевое слово BYTE или CHAR не может быть установлено после размера.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово VARCHAR2 и проверьте, указано ли ключевое слово BYTE или CHAR после размера.
Если указано ключевое слово BYTE, удалите его.
Если указано ключевое слово CHAR, удалите его и преобразуйте тип данных в VARCHAR.
Пример миграции
Приведенный ниже пример показывает миграцию, когда указывается максимальное количество байтов или максимальное количество символов для типа VARCHAR2.
База данных Oracle | Tantor SE |
---|---|
CREATE TABLE t1( col1 VARCHAR2(5 BYTE), col2 VARCHAR2(5 CHAR) ); |
CREATE TABLE t1( col1 VARCHAR2(5), col2 VARCHAR(5) ); |
Note
Тип VARCHAR2 не поддерживает последовательности сортировки. Поэтому возникает следующая ошибка, когда требуется последовательность сортировки, подобная той, которая используется в предложении ORDER BY. В данное время, следующая ПОДСКАЗКА (HINT) предложит использовать предложение COLLATE, однако, поскольку последовательности сортировки не поддерживаются, невозможно использовать это предложение.
ERROR: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly.
Если отображается ошибка, показанная выше, явно приведите столбец к типу VARCHAR или TEXT.
F.29.42.2. Функции #
В этом разделе объясняется, как перенести функции, добавленные с помощью orafce.
F.29.42.2.1. INSTRB #
Description
INSTRB ищет подстроку в строке и возвращает начальную позицию (в байтах) первого появления подстроки. ##### 6.2.1.1 Получение начальной позиции подстроки (в байтах) Функциональные различия
База данных Oracle
INSTRB ищет подстроку в строке и возвращает начальную позицию (в байтах) подстроки.
Tantor SE
Нет функции INSTRB. Вместо нее используйте STRPOSB. STRPOSB уникальна для orafce.
Процедура миграции
Используйте следующую процедуру для миграции на STRPOSB:
Ищите ключевое слово INSTRB и определите, где оно используется.
Подтвердите, что аргументы до второго аргумента указаны.
Измените INSTRB на STRPOSB.
Пример миграции
Приведенный ниже пример показывает миграцию при поиске определенной подстроки в строке и возвращении начальной позиции подстроки в байтах.
База данных Oracle | Tantor SE |
---|---|
SELECT c_code, INSTRB( c_address, ',' ) FROM company_table; |
SELECT c_code, STRPOSB( c_address, ',' ) FROM company_table; |
Note
Если третий аргумент указан в INSTRB, см. пример преобразования, показанный ниже. Если указан четвертый аргумент, миграция невозможна.
Information
Общие правила для STRPOSB следующие:
Description
INSTRB возвращает начальную позицию (в байтах) подстроки внутри строки.
Формат спецификации
Диаграмма F.54. STRPOSB
![STRPOSB](images/orafce/STRPOSB.gif)
Общие правила
STRPOSB ищет строку str2 в строке str1 и возвращает позицию начала, которую он находит в байтах.
Если str2 не найден, возвращается 0.
Тип возвращаемого значения - INTEGER.
F.29.42.2.1.1. Получение начальной позиции подстроки из указанной начальной позиции поиска (в байтах) #
Функциональные различия
База данных Oracle
Позиция начала поиска указывается в третьем аргументе INSTRB.
Tantor SE
Начальная позиция поиска не может быть указана с помощью STRPOSB.
Процедура миграции
Начальная позиция поиска не может быть указана, поэтому обрезайте строку поиска до начальной позиции, чтобы получить тот же результат. Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова INSTRB и определение его использования.
Подтвердите, что указаны аргументы до третьего аргумента и что указано положительное число.
Окружите строку, указанную в первом аргументе, с помощью SUBSTRB и укажите значение, указанное в третьем аргументе INSTRB, в качестве второго аргумента SUBSTRB.
Измените INSTRB на STRPOSB и удалите значение, указанное в третьем аргументе.
Оберните функцию в простое выражение CASE для оценки результата функции, измененной на шаге 4.
Определите селектор так, чтобы при результате 0 возвращался 0.
Если результат не равен 0, укажите ту же функцию, что и на шаге 4, и добавьте значение, полученное путем вычитания 1 из значения, указанного во втором аргументе SUBSTRB.
Пример миграции
Приведенный ниже пример показывает миграцию, когда указывается начальная позиция поиска, а затем находится начальная позиция строки в байтах.
База данных Oracle | Tantor SE |
---|---|
SELECT c_code, INSTRB( c_address, '-', 10 ) FROM company_table; |
SELECT c_code, CASE STRPOSB( SUBSTRB( c_address, 10 ),'-') WHEN 0 THEN 0 ELSE STRPOSB( SUBSTRB( c_address, 10 ), '-' ) + 9 END FROM company_table; |
F.29.42.2.2. INSTRC, INSTR2 и INSTR4 #
Description
INSTRC, INSTR2 и INSTR4 возвращают начальную позицию подстроки в строке с использованием соответствующей кодировки.
Функциональные различия
База данных Oracle
INSTRC, INSTR2 и INSTR4 используют соответствующую кодировку для поиска подстроки в строке с указанной позиции и затем возвращают начальную позицию подстроки.
Tantor SE
Функций INSTRC, INSTR2 и INSTR4 не существует. Только кодировка Unicode используется в Tantor SE.
Процедура миграции
Используйте следующую процедуру для миграции на INSTR:
Ищите ключевые слова INSTRC, INSTR2 и INSTR4 и определите, где они используются.
Измените эти ключевые слова на INSTR.
Пример миграции
Приведенный ниже пример показывает миграцию с INSTRC, INSTR2 и INSTR4.
База данных Oracle | Tantor SE |
---|---|
SELECT c_name, INSTRC( c_name, 'Corp', 2, 1 ) FROM company_table; SELECT c_name, INSTR2( c_name, 'Corp', 2, 1 ) FROM company_table; SELECT c_name, INSTR4( c_name, 'Corp', 2, 1 ) FROM company_table; |
SELECT c_name, INSTR( c_name, 'Corp', 2, 1 ) FROM company_table; |
F.29.42.2.3. LENGTHC, LENGTH2 и LENGTH4 #
Description
LENGTHC, LENGTH2 и LENGTH4 используют соответствующую кодировку для возврата длины указанной строки.
Функциональные различия
База данных Oracle
LENGTHC, LENGTH2 и LENGTH4 используют соответствующую кодировку для возврата длины указанной строки.
Tantor SE
Функций LENGTHC, LENGTH2 и LENGTH4 не существует. Только кодировка Unicode используется в Tantor SE.
Процедура миграции
Используйте следующую процедуру для миграции на LENGTH:
Поиск ключевых слов LENGTHC, LENGTH2 и LENGTH4 и определение их использования.
Измените эти ключевые слова на LENGTH.
Пример миграции
Приведенный ниже пример показывает миграцию с LENGTHC, LENGTH2 и LENGTH4.
База данных Oracle | Tantor SE |
---|---|
SELECT name, LENGTHC( name ) FROM staff_table WHERE job = 'sales member'; SELECT name, LENGTH2( name ) FROM staff_table WHERE job = 'sales member'; SELECT name, LENGTH4( name ) FROM staff_table WHERE job = 'sales member'; |
SELECT name, LENGTH( name ) FROM staff_table WHERE job = 'sales member'; |
F.29.42.2.4. LISTAGG #
Description
LISTAGG возвращает объединенный, разделенный список строковых значений.
F.29.42.2.4.1. Указание последовательности соединения для списка #
Функциональные различия
База данных Oracle
Последовательность соединения для списка указывается с помощью WITHIN GROUP(ORDER BY).
Tantor SE
WITHIN GROUP(ORDER BY) не может быть использовано. Вместо этого, последовательность соединения может быть указана с использованием ORDER BY непосредственно после значения.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова LISTAGG и подтверждение его использования.
Переместите предложение ORDER BY внутри функции WITHIN GROUP(ORDER BY) непосредственно после значения функции LISTAGG, а затем удалите WITHIN GROUP().
Пример миграции
Приведенный ниже пример показывает миграцию последовательности соединения указанных значений.
База данных Oracle | Tantor SE |
---|---|
SELECT manager_id, LISTAGG( name, ', ' ) WITHIN GROUP( ORDER BY staff_id ) FROM staff_table GROUP BY manager_id; |
SELECT manager_id, LISTAGG( name, ', ' ORDER BY staff_id ) FROM staff_table GROUP BY manager_id; |
F.29.42.2.4.2. Указание последовательности соединения для списка в группе (Оконные функции) #
Функциональные различия
База данных Oracle
Последовательность соединения для списка на группу указывается с помощью WITHIN GROUP(ORDER BY) OVER(PARTITION BY).
Tantor SE
Последовательность соединения для списка на группу не может быть указана.
Процедура миграции
Последовательность соединения для списка на группу не может быть указана, поэтому отсортируйте данные в последовательность, в которой они будут объединены, а затем объедините их. Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова LISTAGG и OVER и определите, где используется предложение OVER в LISTAGG.
Преобразуйте таблицу в предложении FROM в подзапрос и переместите предложение ORDER BY WITHIN GROUP(ORDER BY) в подзапрос.
Удалить WITHIN GROUP (ORDER BY).
Пример миграции
Приведенный ниже пример показывает миграцию, когда указана последовательность соединения для списка на группу.
База данных Oracle | Tantor SE |
---|---|
SELECT name, manager_id, LISTAGG( name, ', ' ) WITHIN GROUP( ORDER BY staff_id ) OVER( PARTITION BY manager_id ) FROM staff_table; |
SELECT name, manager_id, LISTAGG( name, ', ' ) OVER( PARTITION BY manager_id ) FROM ( SELECT * FROM staff_table ORDER BY staff_id ) st_tbl; |
F.29.42.2.5. NLSSORT #
Description
NLSSORT возвращает двоичное значение, которое обозначает лексический порядок локали (COLLATE).
F.29.42.2.5.1. Сортировка по указанной локали #
Функциональные различия
База данных Oracle
Локаль указывается с помощью NLS_SORT=locale.
Задаваемые локали предоставляются базой данных Oracle.
Tantor SE
Локаль указывается с помощью locale.
Задаваемые локали зависят от операционной системы.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова NLSSORT и определение его использования.
Удалите NLS_SORT= и измените локаль на локаль, используемую операционной системой, соответствующую указанной последовательности сортировки.
Пример миграции
Пример ниже показывает миграцию, когда указанная локаль используется для сортировки. Обратите внимание, что пример локали в Tantor SE будет значением, указанным для Linux.
База данных Oracle | Tantor SE |
---|---|
SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'NLS_SORT = xDanish' ); SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'NLS_SORT = JAPANESE_M' ); |
SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'danish' ); SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'ja_JP.UTF8' ); |
F.29.42.2.5.2. Сортировка по набору символов #
Функциональные различия
База данных Oracle
NLS_SORT=BINARY указывается в локализационной спецификации для сортировки по набору символов.
Tantor SE
C указывается в спецификации локали для сортировки по набору символов.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова NLSSORT и определение его использования.
Если для локали указано NLS_SORT=BINARY, измените его на C.
Пример миграции
Приведенный ниже пример показывает миграцию, когда набор символов используется для сортировки.
База данных Oracle | Tantor SE |
---|---|
SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'NLS_SORT = BINARY' ); |
SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'C' ); |
F.29.42.2.5.3. Сортировка без учета регистра #
Функциональные различия
База данных Oracle
Указание _CI в конце локали устанавливает регистронезависимую сортировку.
Tantor SE
_CI не может быть указано в конце локали.
Процедура миграции
Нет функций, которые выполняют сортировку без учета регистра, поэтому перед началом сортировки приведите все символы к верхнему или нижнему регистру, чтобы получить одинаковый результат. Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова NLSSORT и определение его использования.
Если в конце указанной локали указано _CI, поместите столбец сортировки внутри скобок функции LOWER (или UPPER).
Пример миграции
Приведенный ниже пример показывает миграцию при использовании регистронезависимой сортировки.
База данных Oracle | Tantor SE |
---|---|
SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( c_name, 'NLS_SORT = JAPANESE_M_CI' ); |
SELECT c_code, c_name FROM company_table ORDER BY NLSSORT( LOWER( c_name ), 'ja_JP.UTF8' ); |
F.29.42.2.6. SUBSTRC, SUBSTR2 и SUBSTR4 #
Description
SUBSTRC, SUBSTR2 и SUBSTR4 извлекают часть строки в символьной единице соответствующей кодировки.
Функциональные различия
База данных Oracle
SUBSTRC, SUBSTR2 и SUBSTR4 извлекают часть строки в символьной единице соответствующей кодировке.
Tantor SE
Функций SUBSTRC, SUBSTR2 и SUBSTR4 не существует. Используется только кодировка Unicode в Tantor SE.
Процедура миграции
Используйте следующую процедуру для миграции на SUBSTR:
Ищите ключевые слова SUBSTRC, SUBSTR2 и SUBSTR4 и определите, где они используются.
Измените эти ключевые слова на SUBSTR.
Пример миграции
Приведенный ниже пример показывает миграцию, когда часть строки извлекается в символьной единице соответствующей кодировки.
База данных Oracle | Tantor SE |
---|---|
SELECT SUBSTRC( c_telephone, 5, 8 ) FROM company_table; SELECT SUBSTR2( c_telephone, 5, 8 ) FROM company_table; SELECT SUBSTR4( c_telephone, 5, 8 ) FROM company_table; |
SELECT SUBSTR( c_telephone, 5, 8 ) FROM company_table; |
F.29.42.2.7. SUBSTRB #
Description
SUBSTRB извлекает часть строки в байтах.
F.29.42.2.7.1. Указание нуля в качестве начальной позиции #
Функциональные различия
База данных Oracle
Если в качестве начальной позиции указано 0, то извлекается часть строки, начиная с первого байта.
Tantor SE
Если в качестве начальной позиции указано 0, извлечение начинается с позиции, найденной путем вычитания 1 из начальной позиции и сдвига на это количество позиций влево.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова SUBSTRB и определение его использования.
Если в качестве начальной позиции указано 0, измените ее на 1.
Пример миграции
Приведенный ниже пример показывает миграцию, когда 0 указывается в качестве начальной позиции для SUBSTRB.
База данных Oracle | Tantor SE |
---|---|
SELECT SUBSTRB( c_telephone, 0, 7 ) || '-xxxx' FROM company_table; |
SELECT SUBSTRB( c_telephone, 1, 7 ) || '-xxxx' FROM company_table; |
F.29.42.2.7.2. Указание отрицательного значения в качестве начальной позиции #
Функциональные различия
База данных Oracle
Если указано отрицательное значение в качестве начальной позиции, извлечение начинается с позиции, найденной путем подсчета на это число байт после конца строки.
Tantor SE
Если указано отрицательное значение в качестве начальной позиции, извлечение начинается с позиции, найденной путем вычитания 1 из начальной позиции и сдвига на это количество позиций влево.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова SUBSTRB и определение его использования.
Если указано отрицательное значение в качестве начальной позиции, добавьте (OCTET_LENGTH(первыйАргументФункцииSubstrb)+1) перед отрицательным значением параметра начальной позиции.
Пример миграции
Приведенный ниже пример показывает миграцию, когда отрицательное значение указывается в качестве начальной позиции для SUBSTRB.
База данных Oracle | Tantor SE |
---|---|
SELECT 'xxx-' || SUBSTRB( c_telephone, -8, 3 ) || '-xxxx' FROM company_table; |
SELECT 'xxx-' || SUBSTRB( c_telephone, ( OCTET_LENGTH( c_telephone ) +1 ) -8, 3 ) || '-xxxx' FROM company_table; |
F.29.42.2.7.3. Указание значения меньше единицы в качестве длины строки #
Функциональные различия
База данных Oracle
Если указано значение меньше 1 в качестве длины строки, возвращается NULL.
Tantor SE
Если длина строки равна 0, возвращается нулевой символ. Отрицательное значение не может быть указано в качестве длины строки.
Процедура миграции
Используйте следующую процедуру для выполнения миграции. Обратите внимание, что последний шаг зависит от того, ожидается ли NULL или нулевой символ в качестве возвращаемого значения.
Когда ожидается NULL в качестве возвращаемого значения
Ищите ключевое слово SUBSTRB и определите, где оно используется.
Подтвердите, что в параметре длины строки указано значение меньше 1.
Измените длину строки на NULL.
Когда ожидается нулевой символ в качестве возвращаемого значения
Ищите ключевое слово SUBSTRB и определите, где оно используется.
Подтвердите, что в параметре длины строки указано значение меньше 1.
Если указано значение меньше 0 в качестве длины строки, измените его на 0.
Пример миграции
Приведенный ниже пример показывает миграцию, когда значение меньше 1 указывается в качестве длины строки в SUBSTRB. В этом примере ожидается возвращение значения NULL.
База данных Oracle | Tantor SE |
---|---|
SELECT SUBSTRB( c_telephone, 1, -1 ) FROM company_table; |
SELECT SUBSTRB( c_telephone, 1, NULL ) FROM company_table; |
F.29.42.2.8. TO_CHAR и TO_DATE #
Description
TO_CHAR и TO_DATE преобразуют указанное значение в соответствии с форматом.
F.29.42.2.8.1. Когда указана только часть формата даты и времени TO_DATE #
Функциональные различия
База данных Oracle
Если указана только часть формата даты и времени TO_DATE, прне указанная часть устанавливается автоматически, с годом, установленным на текущий год, месяцем, установленным на текущий месяц, днем, установленным на 1, и часом, минутой и секундой, установленными на 0.
Tantor SE
Если указана только часть формата даты и времени TO_DATE, прне указанная часть устанавливается автоматически, с годом, месяцем и днем, установленными в 1, а часом, минутой и секундой - в 0.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово TO_DATE и убедитесь, что год или месяц не указаны в формате даты и времени.
Используйте DATE_TRUNC для определения года. Если год не указан, уточните SYSDATE, чтобы получить текущий год.
Умножьте результат функции DATE_PART на один месяц, указанный в типе INTERVAL, чтобы найти месяц. Если месяц не указан, укажите SYSDATE, чтобы получить текущий месяц.
Добавьте результаты, найденные в шагах 2 и 3.
Пример миграции
Приведенный ниже пример показывает миграцию, когда указана только часть формата даты и времени TO_DATE.
База данных Oracle | Tantor SE |
---|---|
SELECT TO_DATE( '04', 'MM' ) FROM DUAL; SELECT TO_DATE( '2000', 'YYYY' ) FROM DUAL; |
SELECT DATE_TRUNC( 'YEAR', SYSDATE() ) + ( DATE_PART( 'MONTH', TO_DATE( '04', 'MM' ) ) - 1 ) * INTERVAL '1 MONTH' FROM DUAL; SELECT DATE_TRUNC( 'YEAR', TO_DATE( '2000', 'YYYY' ) ) + ( DATE_PART( 'MONTH', SYSDATE() ) - 1 ) * INTERVAL '1 MONTH' FROM DUAL; |
F.29.42.2.8.2. Пропуск формата типа данных #
Функциональные различия
База данных Oracle
Если формат типа данных (формат даты и времени) прне указан в TO_DATE или TO_CHAR, значения преобразуются в соответствии с NLS_DATE_FORMAT. Операторы типа ALTER SESSION, можно использовать для изменения NLS_DATE_FORMAT.
Tantor SE
Если формат типа данных (формат даты и времени) прне указан в TO_DATE или TO_CHAR, значения преобразуются в соответствии с oracle.nls_date_format. Операторы, такие как SET, могут быть использованы для изменения oracle.nls_date_format.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова TO_DATE и TO_CHAR и проверьте, где прне указан формат типа данных (формат даты и времени).
Проверьте настройки параметра NLS_DATE_FORMAT.
В oracle.nls_date_format укажите формат даты и времени, указанный в параметре NLS_DATE_FORMAT.
Пример миграции
Приведенный ниже пример показывает миграцию, когда формат даты указывается в операторе ALTER SESSION.
База данных Oracle | Tantor SE |
---|---|
ALTER SESSION SET NLS_DATE_FORMAT = "yyyy/mm/dd hh24:mi:ss"; SELECT o_code, TO_CHAR( SYSDATE ) FROM ordering_table; |
SET orafce.nls_date_format = 'yyyy/mm/dd hh24:mi:ss'; SELECT o_code, TO_CHAR( SYSDATE() ) FROM ordering_table; |
See
Область поддерживаемых форматов даты и времени различается в базах данных Oracle и Tantor SE. Обратитесь к разделу "Форматы" для получения информации об отличиях в поддерживаемых форматах даты и времени.
F.29.42.2.8.3. Установка локали формата типа данных (Установка третьего аргумента) #
Функциональные различия
База данных Oracle
Третий аргумент (настройка формата локали для типа данных) может быть указан.
Tantor SE
Третий аргумент (настройка формата локали для типа данных) не может быть указан.
Процедура миграции
Локаль не может быть указана в формате типа данных, поэтому измените параметры сервера так, чтобы был получен тот же результат. Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова TO_CHAR и TO_DATE и определите, где они используются.
Если указан третий аргумент, используйте оператор SET для указания соответствующего параметра сервера, чтобы сопоставить локаль формата строки, которую нужно преобразовать. Таблица ниже показывает соответствие между параметрами для установки локали формата данных и параметрами сервера.
Удалите третий аргумент, указанный в TO_CHAR и TO_DATE.
Соответствие между параметрами для установки формата типа данных локали и параметрами сервера
Формат типа данных | Параметр для установки локали формата типа данных (база данных Oracle) | Параметр сервера (Tantor SE) |
---|---|---|
Формат числа | NLS_NUMERIC_CHARACTERS | LC_NUMERIC (*1) |
Формат числа | NLS_CURRENCY | LC_MONETARY (*1) |
Формат числа | NLS_ISO_CURRENCY | - (Не может быть мигрирован, потому что нет соответствующего параметра) |
Формат даты и времени | NLS_DATE_LANGUAGE | LC_TIME (*2)(*3)(*4) |
*1: В базах данных Oracle соответствующая строка указывается напрямую, но в Tantor SE указывается локаль. Устанавливаемая строка - это значение, предопределенное для каждой локали.
*2: Когда требуется найти строку, зависящую от указанной локали, перед форматом даты необходимо добавить префикс TM. Если префикс TM не указан, будет возвращена строка на английском языке.
*3: Когда требуется найти строку, зависящую от японского или другого набора символов, необходимо указать строку, включая кодировку. (Пример: SET LC_TIME=‘ja_JP.UTF-8’)
*4: Миграция возможна только при использовании TO_CHAR для поиска строки из даты. Если используется TO_DATE, невозможно использовать локализованную строку в качестве входных данных.
Пример миграции
Приведенный ниже пример показывает миграцию, когда формат типа данных локали установлен (в третьем аргументе).
База данных Oracle | Tantor SE |
---|---|
SELECT o_code, TO_CHAR( o_price * o_quantity / 1.2, 'l999g999g999d00', 'NLS_NUMERIC_CHARACTERS = '',.'' NLS_CURRENCY = ''EUR'' ' ) "MONEY" FROM ordering_table; |
SET LC_MONETARY='de_DE'; SET LC_NUMERIC='de_DE'; SELECT o_code, TO_CHAR( o_price * o_quantity / 1.2, 'l999g999g999d00' ) "MONEY" FROM ordering_table; |
Information
Если формат типа данных соответствует локали клиента, просто удалите третий аргумент TO_CHAR.
See
Значения, которые можно указать в параметрах сервера, зависят от локали операционной системы на клиенте. Обратитесь к документации Tantor SE для получения подробной информации.
F.29.42.2.9. Функции, требующие скобок #
Некоторые функции, добавленные orafce, не имеют аргументов. При вызове этих функций необходимо добавить скобки. Ниже приведен список функций, к которым необходимо добавить скобки. Функции, требующие скобки:
SYSDATE
SESSIONTIMEZONE
DBTIMEZONE
Пример миграции
Приведенный ниже пример показывает миграцию, когда вызывается функция без аргументов.
База данных Oracle | Tantor SE |
---|---|
SELECT SYSDATE FROM DUAL; |
SELECT SYSDATE() FROM DUAL; |
F.29.42.3. Стандартные пакеты #
В этом разделе объясняется, как перенести стандартные пакеты, добавленные с помощью orafce.
F.29.42.3.1. DBMS_ALERT #
Description
Пакет DBMS_ALERT отправляет оповещения из сессии выполнения PL/pgSQL в несколько других сессий выполнения PL/pgSQL.
F.29.42.3.1.1. Установить значение DBMS_ALERT.REGISTER #
Функциональные различия
База данных Oracle
Второй аргумент DBMS_ALERT.REGISTER может быть указан. Второй аргумент определяет, следует ли выполнить очистку используемого канала.
По умолчанию установлено значение TRUE, что вызывает выполнение очистки.
Tantor SE
Второй аргумент не может быть указан.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DBMS_ALERT.REGISTER и определение его использования.
Если указан второй аргумент, удалите его.
Пример миграции
Приведенный ниже пример показывает миграцию, когда в DBMS_ALERT.REGISTER указан второй аргумент.
База данных Oracle | Tantor SE |
---|---|
DBMS_ALERT.REGISTER( 'SAMPLEALERT', TRUE ); |
PERFORM DBMS_ALERT.REGISTER( 'SAMPLEALERT' ); |
F.29.42.3.1.2. Регистрозависимость имен предупреждений #
Функциональные различия
База данных Oracle
Имена предупреждений не чувствительны к регистру.
Tantor SE
Имена предупреждений чувствительны к регистру.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов DBMS_ALERT.REGISTER, DBMS_ALERT.SIGNAL, DBMS_ALERT.WAITONE и DBMS_ALERT.REMOVE и определение их использования.
Если имена предупреждений написаны в разных регистрах (заглавные и строчные буквы), измените их на одинаковый регистр.
Пример миграции
Приведенный ниже пример показывает миграцию, когда есть имя предупреждения в верхнем регистре и имя предупреждения в нижнем регистре. В этом примере имена предупреждений выровнены в верхнем регистре.
База данных Oracle | Tantor SE |
---|---|
DBMS_ALERT.REGISTER( 'SAMPLEALERT', TRUE ); ~ DBMS_ALERT.SIGNAL( 'samplealert', 'TEST MESSAGE 1' ); |
PERFORM DBMS_ALERT.REGISTER( 'SAMPLEALERT' ); ~ PERFORM DBMS_ALERT.SIGNAL( 'SAMPLEALERT', 'TEST MESSAGE 1' ); |
F.29.42.3.1.3. Другие заметки по использованию DBMS_ALERT #
Этот раздел объясняет функциональные различия, которые следует учитывать при использовании DBMS_ALERT. Обратите внимание, что функциональные различия не могут быть перенесены при использовании PL/pgSQL. Рассмотрите, например, изменение логики приложения.
Выполнение DBMS_ALERT.SIGNAL из нескольких сессий PL/pgSQL #
Функциональные различия
База данных Oracle
DBMS_ALERT.SIGNAL сериализуется в соответствии с последовательностью выполнения.
Таким образом, когда DBMS_ALERT.SIGNAL отправляется из нескольких сессий выполнения PL/SQL на тот же сигнал,
каждый DBMS_ALERT.SIGNAL остается в состоянии ожидания до тех пор, пока предыдущий DBMS_ALERT.SIGNAL не будет подтвержден.
Tantor SE
DBMS_ALERT.SIGNAL не сериализуется в соответствии с последовательностью выполнения.
Таким образом, даже если предыдущий DBMS_ALERT.SIGNAL еще не подтвержден,
следующий DBMS_ALERT.SIGNAL не переходит в состояние ожидания, и сигнал, который подтверждается первым, сообщается.
Сообщение получено, когда оповещение передано несколько раз #
Функциональные различия
База данных Oracle
Если между моментом выполнения процедур DBMS_ALERT.SIGNAL и выполнением DBMS_ALERT.WAITANY/WAITONE выполняется несколько процедур DBMS_ALERT.SIGNAL, то будет получено сообщение от последней выполненной процедуры DBMS_ALERT.SIGNAL. Все предыдущие сообщения будут отброшены.
Tantor SE
Если между моментом выполнения процедур DBMS_ALERT.SIGNAL и выполнением DBMS_ALERT.WAITANY/WAITONE выполняется несколько процедур DBMS_ALERT.SIGNAL, то будет получено сообщение от первой выполненной процедуры DBMS_ALERT.SIGNAL. Последующие сообщения не отбрасываются, а сохраняются.
Note
Если предупреждения с одинаковым именем используются в нескольких сессиях, убедитесь, что все сообщения предупреждений получены или удалите предупреждения из сессий PL/pgSQL, используя DBMS_ALERT.REMOVE/REMOVEALL в том месте, где предупреждения больше не нужны. Если предупреждения остаются при закрытии сессии, другие сессии могут больше не быть в состоянии правильно получать предупреждения.
F.29.42.3.1.4. Пример миграции DBMS_ALERT #
Приведенный ниже пример показывает миграцию на PL/pgSQL при использовании DBMS_ALERT.
База данных Oracle | Tantor SE |
---|---|
(Receiving side) BEGIN DBMS_ALERT.REGISTER( 'SAMPLEALERT', TRUE ); END; / ------------------------------------------------- (Sending side) BEGIN DBMS_ALERT.SIGNAL( 'samplealert', 'TEST MESSAGE 1' ); COMMIT; DBMS_ALERT.SIGNAL( 'samplealert', 'TEST MESSAGE 2' ); COMMIT; END; / ------------------------------------------------- (Receiving side) SET SERVEROUTPUT ON DECLARE alname VARCHAR2(100) := 'SAMPLEALERT'; almess VARCHAR2(1000); alst NUMBER; BEGIN DBMS_ALERT.WAITONE( alname, almess, alst, 60 ); DBMS_OUTPUT.PUT_LINE( alname ); DBMS_OUTPUT.PUT_LINE( almess ); DBMS_OUTPUT.PUT_LINE( 'alst =' || alst ); DBMS_ALERT.REMOVE( alname ); END; / |
(Receiving side) DO $$ BEGIN PERFORM DBMS_ALERT.REGISTER( 'SAMPLEALERT' ); END; $$ ; ------------------------------------------------- (Sending side) DO $$ BEGIN PERFORM DBMS_ALERT.SIGNAL( 'SAMPLEALERT', 'TEST MESSAGE 1' ); PERFORM DBMS_ALERT.SIGNAL( 'SAMPLEALERT', 'TEST MESSAGE 2' ); END; $$ ; ------------------------------------------------- (Receiving side) DO $$ DECLARE alname VARCHAR2(100) := 'SAMPLEALERT'; almess VARCHAR2(1000); alst int; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); SELECT message, status INTO almess, alst FROM DBMS_ALERT.WAITONE( alname, 60 ); PERFORM DBMS_OUTPUT.PUT_LINE( alname ); PERFORM DBMS_OUTPUT.PUT_LINE( almess ); PERFORM DBMS_OUTPUT.PUT_LINE( 'alst =' || alst ); PERFORM DBMS_ALERT.REMOVE( alname ); END; $$ ; |
F.29.42.3.2. DBMS_ASSERT #
Description
Пакет DBMS_ASSERT проверяет и нормализует элементы синтаксиса SQL.
F.29.42.3.2.1. DBMS_ASSERT.ENQUOTE_LITERAL #
Функциональные различия
База данных Oracle
Если строка в аргументе уже заключена в апострофы, она не заключается в апострофы снова.
Tantor SE
Даже если строка в аргументе уже заключена в апострофы, она снова заключается в апострофы.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DBMS_ASSERT.ENQUOTE_LITERAL и определение его использования.
В условиях оператора IF используйте LEFT и RIGHT для проверки ведущих и завершающих символов.
Если каждый результат не соответствует одной кавычке (E’’), используйте ENQUOTE_LITERAL для его замены.
Пример миграции
Приведенный ниже пример показывает миграцию, когда строка заключена в апострофы.
База данных Oracle | Tantor SE |
---|---|
DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_LITERAL( en_lit ) ); |
IF ( LEFT( en_lit, 1 ) = E'\x27' AND RIGHT( en_lit, 1 ) = E'\x27' ) THEN PERFORM DBMS_OUTPUT.PUT_LINE( en_lit ); ELSE PERFORM DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_LITERAL( en_lit ) ); END IF; |
Note
Tantor SE не проверяет апострофы.
F.29.42.3.2.2. DBMS_ASSERT.ENQUOTE_NAME #
Функциональные различия
База данных Oracle
Если строка в первом аргументе уже заключена в двойные кавычки, она не заключается в двойные кавычки еще раз.
Кроме того, независимо от наличия второго аргумента, строка, заключенная в двойные кавычки, не преобразуется из строчных в заглавных буквы.
Tantor SE
Даже если строка в первом аргументе уже заключена в двойные кавычки, она снова заключается в двойные кавычки.
Однако, строка первого аргумента, которая полностью состоит из строчных букв, не заключается в двойные кавычки.
Кроме того, если второй аргумент установлен в TRUE или по умолчанию, он преобразуется из заглавных в строчные, даже если он заключен в двойные кавычки.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DBMS_ASSERT.ENQUOTE_NAME и определение его использования.
В условиях оператора IF используйте LEFT и RIGHT для проверки ведущих и завершающих символов.
Если каждый результат не соответствует двойной кавычке (E’’), используйте ENQUOTE_NAME для его замены.
Пример миграции
Приведенный ниже пример показывает миграцию, когда строка заключена в двойные кавычки.
База данных Oracle | Tantor SE |
---|---|
DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_NAME( en_nam ) ); |
IF ( LEFT( en_nam, 1 ) = E'\x22' AND RIGHT( en_nam, 1 ) = E'\x22' ) THEN PERFORM DBMS_OUTPUT.PUT_LINE( en_nam ); ELSE PERFORM DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_NAME( en_nam ) ); END IF; |
F.29.42.3.2.3. DBMS_ASSERT.SIMPLE_SQL_NAME #
Функциональные различия
База данных Oracle
Если в начале или конце строки в аргументе присутствует пробел, пробел удаляется перед вычислением строки.
Tantor SE
Если в начале или в конце строки в аргументе содержится пробел, то строка оценивается как есть, что вызывает ошибку.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DBMS_ASSERT.SIMPLE_SQL_NAME и определение его использования.
Если в начале или конце строки в аргументе содержится пробел, используйте TRIM для удаления пробела, непосредственно предшествующего или следующего за строкой аргумента.
Пример миграции
Приведенный ниже пример показывает миграцию, когда ведущая или завершающая позиция строки в аргументе содержит пробел.
База данных Oracle | Tantor SE |
---|---|
DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.SIMPLE_SQL_NAME( si_nam ) ); |
PERFORM DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.SIMPLE_SQL_NAME( TRIM( both from si_nam ) ) ); |
See
Строки, проверяемые DBMS_ASSERT.SIMPLE_SQL_NAME, соответствуют идентификаторам среди элементов SQL. Обратитесь к разделу «Язык SQL» > «Лексическая структура» > «Идентификаторы и ключевые слова» в документации Tantor SE для получения информации о значениях, которые могут использоваться в качестве идентификаторов в Tantor SE.
F.29.42.3.2.4. DBMS_ASSERT.SQL_OBJECT_NAME #
Функциональные различия
База данных Oracle
DBMS_ASSERT.SQL_OBJECT_NAME exists.
Tantor SE
DBMS_ASSERT.SQL_OBJECT_NAME не существует. Вместо этого используйте DBMS_ASSERT.OBJECT_NAME.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DBMS_ASSERT.SQL_OBJECT_NAME и определение его использования.
Измените DBMS_ASSERT.SQL_OBJECT_NAME на DBMS_ASSERT.OBJECT_NAME.
Пример миграции
Приведенный ниже пример показывает миграцию, когда входное значение проверяется как квалифицированный SQL идентификатор существующего SQL объекта.
База данных Oracle | Tantor SE |
---|---|
SELECT DBMS_ASSERT.SQL_OBJECT_NAME( 'inventory_table' ) INTO table_name FROM DUAL; |
SELECT DBMS_ASSERT.OBJECT_NAME( 'inventory_table' ) INTO table_name FROM DUAL; |
F.29.42.3.2.5. Пример миграции DBMS_ASSERT #
Приведенный ниже пример показывает миграцию на PL/pgSQL при использовании DBMS_ASSERT.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON DECLARE en_lit VARCHAR2(50) := '''ENQUOTE_LITERAL'''; en_nam VARCHAR2(50) := '"enquote_name"'; si_nam VARCHAR2(50) := ' SIMPLE_SQL_NAME '; table_name VARCHAR2(20); BEGIN DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_LITERAL( en_lit )); DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_NAME( en_nam )); DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.SIMPLE_SQL_NAME( si_nam )); SELECT DBMS_ASSERT.SQL_OBJECT_NAME( 'inventory_table' ) INTO table_name FROM DUAL; DBMS_OUTPUT.PUT_LINE( 'Object is : ' || table_name ); END; / |
DO $$ DECLARE en_lit VARCHAR2(50) := '''ENQUOTE_LITERAL'''; en_nam VARCHAR2(50) := '"enquote_name"'; si_nam VARCHAR2(50) := ' SIMPLE_SQL_NAME '; table_name VARCHAR2(20); BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); IF ( LEFT( en_lit, 1 ) = E'\x27' AND RIGHT( en_lit, 1 ) = E'\x27' ) THEN PERFORM DBMS_OUTPUT.PUT_LINE( en_lit ); ELSE PERFORM DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_LITERAL( en_lit )); END IF; IF ( LEFT( en_nam, 1 ) = E'\x22' AND RIGHT( en_nam, 1 ) = E'\x22' ) THEN PERFORM DBMS_OUTPUT.PUT_LINE( en_nam ); ELSE PERFORM DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.ENQUOTE_NAME( en_nam ) ); END IF; PERFORM DBMS_OUTPUT.PUT_LINE( DBMS_ASSERT.SIMPLE_SQL_NAME( TRIM( both from si_nam ) ) ); SELECT DBMS_ASSERT.OBJECT_NAME( 'inventory_table' ) INTO table_name FROM DUAL; PERFORM DBMS_OUTPUT.PUT_LINE( 'Object is : ' || table_name ); END; $$ ; |
F.29.42.3.3. DBMS_OUTPUT #
Description
Пакет DBMS_OUTPUT отправляет сообщения из PL/pgSQL клиентам, таким как psql.
F.29.42.3.3.1. Различия во времени вывода сразу после изменения DBMS_OUTPUT.SERVEROUTPUT с OFF на ON #
Функциональные различия
База данных Oracle
Сообщения, хранящиеся в буфере, когда SERVEROUTPUT выключен, отображаются после выполнения первого SQL-запроса или анонимного PL/SQL-кода, когда SERVEROUTPUT переключается в режим ВКЛ.
Tantor SE
Сообщения, хранящиеся в буфере, когда SERVEROUTPUT равно FALSE, не отображаются даже после выполнения первого SQL-запроса или анонимного блока после изменения SERVEROUTPUT на TRUE. Необходимо выполнить DBMS_OUT.NEW_LINE.
Процедура миграции
Используйте следующую процедуру для выполнения миграции: 1. Ищите ключевое слово SERVEROUTPUT и определите место, где оно меняется с OFF на ON. 2. Измените код так, чтобы DBMS_OUT.NEW_LINE выполнялась непосредственно после оператора SQL или анонимного блока, который выполняется после изменения оператора SERVEROUTPUT на ON.
Пример миграции
Приведенный ниже пример показывает миграцию, когда изменяется статус SERVEROUTPUT.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT OFF; ... SET SERVEROUTPUT ON; SELECT * FROM dual; |
DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( FALSE ); END; $$ ; ... SELECT * FROM dual; DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM DBMS_OUTPUT.NEW_LINE(); END; $$ ; |
F.29.42.3.3.2. Другие заметки по использованию DBMS_OUTPUT #
Этот раздел объясняет функциональные различия, которые следует учитывать при использовании DBMS_OUTPUT. Обратите внимание, что функциональные различия не могут быть перенесены при миграции PL/pgSQL. Рассмотрите, например, изменение логики приложения.
Различия в моменте вывода DBMS_OUTPUT.PUT_LINE и DBMS_OUTPUT.NEW_LINE #
Функциональные различия
База данных Oracle
Когда SERVEROUTPUT включен, выводы DBMS_OUTPUT.PUT_LINE и DBMS_OUTPUT.NEW_LINE отображаются вместе после завершения процедуры.
Эти выводы сохраняются в буфере сервера во время выполнения процедуры.
Tantor SE
Когда SERVEROUTPUT равно TRUE, выводы от выполнения DBMS_OUTPUT.PUT_LINE и DBMS_OUTPUT.NEW_LINE отправляются клиенту и отображаются немедленно.
Они не хранятся в буфере сервера.
F.29.42.3.3.3. Пример миграции DBMS_OUTPUT #
Приведенный ниже пример показывает миграцию на PL/pgSQL при использовании DBMS_OUTPUT.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT OFF; BEGIN DBMS_OUTPUT.ENABLE( NULL ); DBMS_OUTPUT.PUT_LINE( '1:Hello World' ); END; / SET SERVEROUTPUT ON SELECT * FROM dual; |
DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( FALSE ); PERFORM DBMS_OUTPUT.ENABLE( NULL ); PERFORM DBMS_OUTPUT.PUT_LINE( '1:Hello World' ); END; $$ ; SELECT * FROM dual; DO $$ BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM DBMS_OUTPUT.NEW_LINE(); END; $$ ; |
F.29.42.3.4. DBMS_PIPE #
Description
Пакет DBMS_PIPE обеспечивает одно-к-одному взаимодействию между сессиями PL/pgSQL.
F.29.42.3.4.1. Различия с определением DBMS_PIPE.CREATE_PIPE #
Функциональные различия
База данных Oracle
Второй аргумент указывает максимальный размер канала в байтах. По умолчанию это 8192 байта.
Третий аргумент определяет тип канала. По умолчанию это TRUE (частный канал).
Tantor SE
Второй аргумент указывает максимальное количество сообщений, которое может содержать канал. Значение по умолчанию - 0. Диапазон задаваемых числовых значений составляет от 1 до 32767.
Третий аргумент указывает тип канала. Значение по умолчанию - FALSE (общедоступный канал).
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова DBMS_PIPE.CREATE_PIPE и определение его использования.
Измените код так, чтобы максимальное количество сообщений было указано во втором аргументе.
Если третий аргумент не указан и требуется создать частный канал, укажите TRUE в третьем аргументе.
Note
Предпочтительно создавайте открытый канал (по умолчанию) в качестве типа канала. Если вы создаете приватный канал, внутренняя информация (создатель приватного канала) останется даже после удаления канала. Таким образом, повторное создание и удаление каналов может в конечном итоге привести к исчерпанию памяти.
Пример миграции
Приведенный ниже пример показывает миграцию DBMS_PIPE.CREATE_PIPE.
База данных Oracle | Tantor SE |
---|---|
DBMS_PIPE.CREATE_PIPE( 'pipename', 2000, TRUE ); |
DBMS_PIPE.CREATE_PIPE( 'pipename', 50, TRUE ); |
F.29.42.3.4.2. Возвращаемые значения функций DBMS_PIPE.CREATE_PIPE и DBMS_PIPE.REMOVE_PIPE #
Функциональные различия
База данных Oracle
DBMS_PIPE.CREATE_PIPE и DBMS_PIPE.REMOVE_PIPE оба возвращают значения.
Tantor SE
DBMS_PIPE.CREATE_PIPE и DBMS_PIPE.REMOVE_PIPE оба не возвращают значения.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова DBMS_PIPE.CREATE_PIPE и DBMS_PIPE.REMOVE_PIPE и определите, где они используются.
Измените код так, чтобы обработка вызова, идентифицированная в шаге 1, вызывалась с помощью ключевого слова PERFORM.
Если используются возвращаемые значения, замените целевую обработку на 0.
Пример миграции
Приведенный ниже пример показывает миграцию DBMS_PIPE.CREATE_PIPE.
База данных Oracle | Tantor SE |
---|---|
st := DBMS_PIPE.CREATE_PIPE( pipename, 2000 ); DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); |
PERFORM DBMS_PIPE.CREATE_PIPE( pipename, 50 ); st := 0; PERFORM DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); |
F.29.42.3.4.3. Создание того же имени канала с помощью DBMS_PIPE.CREATE_PIPE #
Функциональные различия
База данных Oracle
Если уже существует и может быть использован канал с таким же именем, DBMS_PIPE.CREATE_PIPE возвращает нормальное значение.
Tantor SE
Если канал с таким же именем уже существует, DBMS_PIPE.CREATE_PIPE возвращает ошибку.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевого слова CREATE_PIPE и определение его использования.
Если может быть канал с тем же именем, используйте оператор PERFORM, показанный ниже, чтобы проверить, существует ли такой же канал.
Если NOT FOUND возвращает TRUE, значит, нет канала с таким же именем, поэтому выполните CREATE_PIPE.
PERFORM 1 FROM DBMS_PIPE.DB_PIPES WHERE NAME = nameOfPipeToBeCreated
Пример миграции
Приведенный ниже пример показывает миграцию CREATE_PIPE, когда может существовать канал с тем же именем.
База данных Oracle | Tantor SE |
---|---|
DECLARE pipename VARCHAR2(1000) := 'TESTPIPE01'; BEGIN DBMS_OUTPUT.PUT_LINE( 'Return = '|| DBMS_PIPE.CREATE_PIPE( pipename, 2000, TRUE ) ); END; / |
DO $$ DECLARE pipename VARCHAR2(1000) := 'TESTPIPE01'; BEGIN PERFORM 1 FROM DBMS_PIPE.DB_PIPES WHERE NAME = pipename; IF ( NOT FOUND ) THEN PERFORM DBMS_PIPE.CREATE_PIPE( pipename, 50, TRUE ); END IF; END; $$ ; |
F.29.42.3.4.4. Возвращаемые значения DBMS_PIPE.NEXT_ITEM_TYPE #
Функциональные различия
База данных Oracle
DBMS_PIPE.NEXT_ITEM_TYPE возвращает следующие значения:
0: Следующего элемента нет.
6: Тип NUMBER
9: Тип VARCHAR2
11: Тип ROWID
12: Тип DATE
23: Тип RAW
Tantor SE
DBMS_PIPE.NEXT_ITEM_TYPE возвращает следующие значения:
0: Следующего элемента нет.
9: Тип NUMERIC
11: Тип TEXT
12: Тип DATE
13: Тип TIMESTAMP
23: Тип BYTEA
24: Тип RECORD
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово NEXT_ITEM_TYPE и определите переменную, хранящую возвращаемое значение NEXT_ITEM_TYPE.
Если определено возвращаемое значение NEXT_ITEM_TYPE, измените его на значение в Tantor SE в соответствии с таблицей ниже.
Соответствие возвращаемых значений DBMS_PIPE.NEXT_ITEM_TYPE
База данных Oracle | Tantor SE |
---|---|
Тип NUMBER | Тип NUMERIC |
Тип VARCHAR2 | Тип TEXT |
Тип ROWID | |
Тип DATE | |
Тип DATE | Тип TIMESTAMP |
Тип RAW | Тип BYTEA |
Тип RECORD |
Пример миграции
Приведенный ниже пример показывает миграцию при обработке, когда процесс ветвится в зависимости от возвращаемого значения DBMS_PIPE.NEXT_ITEM_TYPE.
База данных Oracle | Tantor SE |
---|---|
item := DBMS_PIPE.NEXT_ITEM_TYPE; IF ( item = 6 ) THEN -- NUMBER type ~ ELSIF ( item = 9 ) THEN -- VARCHAR2 type ~ ELSIF ( item = 12 ) THEN -- DATE type ~ |
item := DBMS_PIPE.NEXT_ITEM_TYPE(); IF ( item = 9 ) THEN -- NUMERIC type ~ ELSIF ( item =11 ) THEN -- TEXT type ~ ELSIF ( item = 13 ) THEN -- TIMESTAMP type ~ |
F.29.42.3.4.5. Типы данных, которые могут быть использованы в DBMS_PIPE.PACK_MESSAGE и UNPACK_MESSAGE #
Функциональные различия
База данных Oracle
Типы данных, которые могут быть использованы, включают VARCHAR2, NCHAR, NUMBER, DATE, RAW и ROWID.
Когда используются RAW или ROWID, тип данных должен быть указан после UNPACK_MESSAGE.
Tantor SE
Типы данных, которые могут быть использованы, включают TEXT, NUMERIC, INTEGER (Примечание), BIGINT (Примечание), DATE, TIMESTAMP, BYTEA и RECORD.
Все типы данных требуют указания типа данных и пустых скобок после UNPACK_MESSAGE.
Note
Типы данных INTEGER и BIGINT могут использоваться только с PACK_MESSAGE.
Типы INTEGER и BIGINT внутренне преобразуются в тип NUMERIC. Поэтому используйте UNPACK_MESSAGE_NUMBER для получения сообщения.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово UNPACK_MESSAGE и определите, где используется UNPACK_MESSAGE.
Измените переменную, указанную в аргументе, на выражение присваивания, указанное слева, отдельно указывайте каждый тип данных после UNPACK_MESSAGE, и удалите переменную из скобок.
Пример миграции
Приведенный ниже пример показывает миграцию, когда сообщение отправляется и получается.
База данных Oracle | Tantor SE |
---|---|
DBMS_PIPE.UNPACK_MESSAGE( testnum ); |
testnum := DBMS_PIPE.UNPACK_MESSAGE_NUMBER(); |
F.29.42.3.4.6. Чувствительность к регистру DBMS_PIPE.RECEIVE_MESSAGE и SEND_MESSAGE #
Функциональные различия
База данных Oracle
Имена каналов регистронезависимы.
Tantor SE
Имена каналов чувствительны к регистру.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевые слова RECEIVE_MESSAGE и SEND_MESSAGE и проверьте имена каналов.
Если в именах каналов присутствуют символы в разных регистрах (заглавные и строчные), измените их на одинаковый регистр.
Пример миграции
Приведенный ниже пример показывает миграцию, когда для имен каналов используются заглавные и строчные символы.
База данных Oracle | Tantor SE |
---|---|
(Sending side) st := DBMS_PIPE.SEND_MESSAGE( 'TESTPIPE01', 10, 8192 ); (Receiving side) st := DBMS_PIPE.RECEIVE_MESSAGE( 'testpipe01' ); |
(Sending side) st := DBMS_PIPE.SEND_MESSAGE( 'TESTPIPE01', 10, 100 ); (Receiving side) st := DBMS_PIPE.RECEIVE_MESSAGE( 'TESTPIPE01' ); |
Note
Возвращаемые значения функций DBMS_PIPE.RECEIVE_MESSAGE и DBMS_PIPE.SEND_MESSAGE отличаются, как показано ниже.
База данных Oracle
Возвращаются пять значений, как следует:
0: Успешно завершено.
1: Произошел тайм-аут.
2: Запись в канале слишком велика для буфера.
3: Операция прервана.
ORA-23322: У пользователя нет привилегий для чтения данных из канала.
Tantor SE
Есть два возвращаемых значения:
0: Успешно завершено.
1: Произошел тайм-аут.
F.29.42.3.4.7. Различия в функционале DBMS_PIPE.SEND_MESSAGE #
Функциональные различия
База данных Oracle
Третий аргумент указывает максимальный размер канала в байтах. По умолчанию это 8192 байта.
Tantor SE
Третий аргумент указывает максимальное количество сообщений, которое может содержать канал.
Диапазон задаваемых числовых значений составляет от 1 до 32767.
Обратите внимание, что если максимальное количество сообщений не указано для неявного канала, то число сообщений не ограничено.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово SEND_MESSAGE и определите, где указано максимальное количество байтов.
Замените максимальное количество байтов на максимальное количество сообщений.
Пример миграции
Приведенный ниже пример показывает миграцию, когда указан максимальный размер канала.
База данных Oracle | Tantor SE |
---|---|
DBMS_PIPE.SEND_MESSAGE( 'testPIPE', 10, 200 ); |
DBMS_PIPE.SEND_MESSAGE( 'testPIPE', 10, 10 ); |
F.29.42.4. Пример миграции DBMS_PIPE #
Пример ниже показывает миграцию при однонаправленном обмене данными между сессиями PL/pgSQL.
База данных Oracle | Tantor SE |
---|---|
(Sending side) SET SERVEROUTPUT ON; DECLARE testnum NUMBER := 111; testvchar2 VARCHAR2(100) := 'Test Message'; testdate DATE := SYSDATE; testraw RAW(100) := '0101010101'; st INT; pipename VARCHAR2(1000) := 'TESTPIPE01'; BEGIN st := DBMS_PIPE.CREATE_PIPE( pipename, 2000 ); DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); DBMS_PIPE.PACK_MESSAGE( testnum ); DBMS_PIPE.PACK_MESSAGE( testvchar2 ); DBMS_PIPE.PACK_MESSAGE( testdate ); DBMS_PIPE.PACK_MESSAGE_RAW( testraw ); st := DBMS_PIPE.SEND_MESSAGE( 'TESTPIPE01', 10, 200 ); DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); END; / ------------------------------------------------- (Receiving side) SET SERVEROUTPUT ON; DECLARE testnum NUMBER; testvchar2 VARCHAR2(100); testdate DATE; testraw RAW(100); item NUMBER; st INT; BEGIN st := DBMS_PIPE.RECEIVE_MESSAGE( 'testpipe01' ); DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); LOOP item := DBMS_PIPE.NEXT_ITEM_TYPE; DBMS_OUTPUT.PUT_LINE( 'Next Item : ' || item ); IF ( item = 6 ) THEN DBMS_PIPE.UNPACK_MESSAGE( testnum ); DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testnum ); ELSIF ( item = 9 ) THEN DBMS_PIPE.UNPACK_MESSAGE( testvchar2 ); DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testvchar2 ); ELSIF ( item = 12 ) THEN DBMS_PIPE.UNPACK_MESSAGE( testdate ); DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testdate ); ELSIF ( item = 23 ) THEN DBMS_PIPE.UNPACK_MESSAGE_RAW( testraw ); DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testraw ); ELSE EXIT; END IF; END LOOP; st := DBMS_PIPE.REMOVE_PIPE( 'testpipe01' ); DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); END; / |
(Sending side) DO $$ DECLARE testnum NUMERIC := 111; testtext VARCHAR2(100) := 'Test Message'; testtime TIMESTAMP := current_timestamp; testbytea BYTEA := '0101010101'; st INT; pipename VARCHAR2(1000) := 'TESTPIPE01'; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); PERFORM 1 FROM DBMS_PIPE.DB_PIPES WHERE NAME = pipename; IF ( NOT FOUND ) THEN PERFORM DBMS_PIPE.CREATE_PIPE( pipename,50 ); st := 0; PERFORM DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); END IF; PERFORM DBMS_PIPE.PACK_MESSAGE( testnum ); PERFORM DBMS_PIPE.PACK_MESSAGE( testtext ); PERFORM DBMS_PIPE.PACK_MESSAGE( testtime ); PERFORM DBMS_PIPE.PACK_MESSAGE( testbytea ); st := DBMS_PIPE.SEND_MESSAGE( 'TESTPIPE01', 10, 10 ); PERFORM DBMS_OUTPUT.PUT_LINE( 'Return Value =' || st ); END; $$ ; ------------------------------------------------- (Receiving side) DO $$ DECLARE testnum NUMERIC; testtext VARCHAR2(100); testtime TIMESTAMP; testbytea BYTEA; item INT; st INT; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT( TRUE ); st := DBMS_PIPE.RECEIVE_MESSAGE( 'TESTPIPE01' ); PERFORM DBMS_OUTPUT.PUT_LINE( 'Return Value ='|| st ); LOOP item := DBMS_PIPE.NEXT_ITEM_TYPE(); PERFORM DBMS_OUTPUT.PUT_LINE( 'Next Item : ' || item ); IF ( item = 9 ) THEN testnum := DBMS_PIPE.UNPACK_MESSAGE_NUMBER(); PERFORM DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testnum ); ELSIF ( item =11 ) THEN testtext := DBMS_PIPE.UNPACK_MESSAGE_TEXT(); PERFORM DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testtext ); ELSIF ( item = 13 ) THEN testtime := DBMS_PIPE.UNPACK_MESSAGE_TIMESTAMP(); PERFORM DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testtime ); ELSIF ( item = 23 ) THEN testbytea := DBMS_PIPE.UNPACK_MESSAGE_BYTEA(); testtext := CAST( testbytea AS varchar2(100) ); PERFORM DBMS_OUTPUT.PUT_LINE( 'Get Message : ' || testtext ); ELSE EXIT; END IF; END LOOP; PERFORM DBMS_PIPE.REMOVE_PIPE( 'TESTPIPE01' ); st := 0; PERFORM DBMS_OUTPUT.PUT_LINE( 'Return Value ='|| st ); END; $$ ; |
F.29.42.4.1. UTL_FILE #
Description
Пакет UTL_FILE позволяет PL/pgSQL читать и записывать текстовые файлы.
F.29.42.4.1.1. Добавление новой строки при закрытии файла #
Функциональные различия
База данных Oracle
Если данные, в которых не указан символ перехода строки, остаются в буфере, после вывода данных добавляется символ перехода строки, а затем файл закрывается.
Tantor SE
Если данные, в которых не указан символ перехода строки, остаются в буфере, то данные выводятся, а затем файл закрывается. Символ перехода строки не добавляется.
Процедура миграции
Используйте следующую процедуру для выполнения миграции:
Поиск ключевых слов UTL_FILE.FCLOSE и UTL_FILE.FCLOSE_ALL и определение их использования.
Если UTL_FILE.PUT выполняется и не указывается символ перехода строки во время записи перед закрытием файла, измените код так, чтобы перед закрытием файла выполнялась команда UTL_FILE.NEW_LINE.
Пример миграции
Приведенный ниже пример показывает миграцию, когда файл, не заканчивающийся символом перехода строки, закрывается.
База данных Oracle | Tantor SE |
---|---|
UTL_FILE.PUT(v_handle, buff); UTL_FILE.FCLOSE(v_handle); |
PERFORM UTL_FILE.PUT(v_handle, buff); PERFORM UTL_FILE.NEW_LINE(v_handle, 1); s_handle := UTL_FILE.FCLOSE(v_handle); |
F.29.42.4.1.2. Обработка исключений UTL_FILE #
Функциональные различия
База данных Oracle
Есть определения исключений для пакета UTL_FILE. Они могут быть использованы для определения исключений в блоке EXCEPTION.
Tantor SE
В пакете UTL_FILE нет определений исключений.
Процедура миграции
Для пакета UTL_FILE не определены исключения, поэтому, если они используются для определения исключений в предложении EXCEPTION, замените их на коды ошибок Tantor SE. Используйте следующую процедуру для выполнения миграции:
Ищите ключевое слово UTL_FILE и проверьте, указано ли исключение в целевом PL/SQL.
Если используется исключение UTL_FILE, замените его на код ошибки Tantor SE в соответствии с таблицей ниже.
Соответствие исключений UTL_FILE
Определение исключения UTL_FILE (База данных Oracle) | Возможность миграции | Соответствующий код ошибки Tantor SE |
---|---|---|
INVALID_PATH | Y | RAISE_EXCEPTION |
INVALID_MODE | Y | RAISE_EXCEPTION |
INVALID_FILEHANDLE | Y | RAISE_EXCEPTION |
INVALID_OPERATION | Y | RAISE_EXCEPTION |
READ_ERROR | Н | Не генерируется |
WRITE_ERROR | Y | RAISE_EXCEPTION |
INTERNAL_ERROR | Y | INTERNAL_ERROR |
CHARSETMISMATCH | N | Не генерируется |
FILE_OPEN | N | Не генерируется |
INVALID_MAXLINESIZE | Y | RAISE_EXCEPTION |
INVALID_FILENAME | Y | INVALID PARAMETER NULL VALUE NOT ALLOWED (имя файла NULL) |
ACCESS_DENIED | Y | RAISE_EXCEPTION |
INVALID_OFFSET | N | Не генерируется |
DELETE_FAILED | N | Не генерируется |
RENAME_FAILED | Y | RAISE_EXCEPTION |
Y: Может быть перенесено
N: Не может быть перенесено
Пример миграции
Приведенный ниже пример показывает миграцию, когда во время обработки исключения UTL_FILE отображается сообщение об ошибке.
База данных Oracle | Tantor SE |
---|---|
EXCEPTION WHEN UTL_FILE.INVALID_FILEHANDLE THEN v_errmsg := SQLERRM; DBMS_OUTPUT.PUT_LINE(v_errmsg); END; |
EXCEPTION WHEN RAISE_EXCEPTION THEN v_errmsg := SQLERRM; PERFORM DBMS_OUTPUT.PUT_LINE(v_errmsg); END; |
F.29.42.4.1.3. Другие заметки по использованию UTL_FILE #
Этот раздел объясняет функциональные различия, которые следует учитывать при использовании UTL_FILE. Обратите внимание, что функциональные различия не могут быть перенесены при использовании функций PL/pgSQL. Рассмотрите, например, изменение логики приложения.
Различия в открытом режиме UTL_FILE.FOPEN #
Функциональные различия
База данных Oracle
Можно указать режим открытия rb (чтение байта), wb (запись байта) или ab (добавление байта).
Tantor SE
Режимы открытия rb (чтение байта), wb (запись байта) и ab (добавление байта) нельзя указать для OPEN_MODE.
Различия в UTL_FILE.IS_OPEN #
Функциональные различия
База данных Oracle
Выполнение UTL_FILE.IS_OPEN после UTL_FILE.FCLOSE_ALL возвращает TRUE.
Tantor SE
Выполнение UTL_FILE.IS_OPEN после UTL_FILE.FCLOSE_ALL возвращает FALSE.
Время записи с помощью UTL_FILE.FFLUSH #
Функциональные различия
База данных Oracle
Буферизованные данные до символа перехода строки записываются.
Tantor SE
Все буферизованные данные записываются.
F.29.42.4.1.4. Пример миграции UTL_FILE #
Приведенный ниже пример показывает миграцию на PL/pgSQL при использовании UTL_FILE.
База данных Oracle | Tantor SE |
---|---|
SET SERVEROUTPUT ON DECLARE v_handle UTL_FILE.FILE_TYPE; v_dirname VARCHAR2(250); v_filename VARCHAR2(250); v_output VARCHAR2(250); v_getmsg VARCHAR2(250); v_errmsg VARCHAR2(1000); v_opcheck BOOLEAN; BEGIN v_dirname := '/home/oracle'; v_filename := 'sample.txt'; v_output := 'HELLO WORLD!'; v_handle := UTL_FILE.FOPEN(v_dirname, v_filename, 'w', 256); UTL_FILE.PUT_LINE(v_handle, v_output); UTL_FILE.FFLUSH(v_handle); UTL_FILE.PUT(v_handle, v_output); UTL_FILE.FCLOSE(v_handle); v_handle := UTL_FILE.FOPEN(v_dirname, v_filename, 'r', 256); UTL_FILE.GET_LINE(v_handle, v_getmsg); DBMS_OUTPUT.PUT_LINE( 'GET_MESSAGE : ' || v_getmsg); UTL_FILE.FCLOSE_ALL; v_opcheck := UTL_FILE.IS_OPEN(v_handle); DBMS_OUTPUT.PUT_LINE(CASE WHEN v_opcheck IS NULL THEN 'UNKNOWN' WHEN v_opcheck THEN 'TRUE' WHEN NOT v_opcheck THEN 'FALSE' END); BEGIN UTL_FILE.PUT_LINE(v_handle, v_output); EXCEPTION WHEN UTL_FILE.INVALID_FILEHANDLE THEN v_errmsg := SQLERRM; DBMS_OUTPUT.PUT_LINE(v_errmsg); END; EXCEPTION WHEN OTHERS THEN UTL_FILE.FCLOSE_ALL; v_errmsg := SQLERRM; DBMS_OUTPUT.PUT_LINE(v_errmsg); END; / |
DO $$ DECLARE v_handle UTL_FILE.FILE_TYPE; v_dirname VARCHAR2(250); v_filename VARCHAR2(250); v_output VARCHAR2(250); v_getmsg VARCHAR2(250); v_errmsg VARCHAR2(1000); v_opcheck BOOLEAN; BEGIN PERFORM DBMS_OUTPUT.SERVEROUTPUT(TRUE); PERFORM DBMS_OUTPUT.ENABLE(NULL); v_dirname := '/home/pgsql'; v_filename := 'sample.txt'; v_output := 'HELLO WORLD!'; v_handle := UTL_FILE.FOPEN(v_dirname, v_filename, 'w', 256); PERFORM UTL_FILE.PUT_LINE(v_handle, v_output); PERFORM UTL_FILE.PUT(v_handle, v_output); PERFORM UTL_FILE.FFLUSH(v_handle); PERFORM UTL_FILE.NEW_LINE(v_handle, 1); v_handle := UTL_FILE.FCLOSE(v_handle); v_handle := UTL_FILE.FOPEN(v_dirname, v_filename, 'r', 256); v_getmsg := UTL_FILE.GET_LINE(v_handle); PERFORM DBMS_OUTPUT.PUT_LINE( 'GET_MESSAGE : ' || v_getmsg); PERFORM UTL_FILE.FCLOSE_ALL(); v_opcheck := UTL_FILE.IS_OPEN(v_handle); PERFORM DBMS_OUTPUT.PUT_LINE(CASE WHEN v_opcheck IS NULL THEN 'UNKNOWN' WHEN v_opcheck THEN 'TRUE' WHEN NOT v_opcheck THEN 'FALSE' END); BEGIN PERFORM UTL_FILE.PUT_LINE(v_handle, v_output); EXCEPTION WHEN RAISE_EXCEPTION THEN v_errmsg := SQLERRM; PERFORM DBMS_OUTPUT.PUT_LINE(v_errmsg); END; EXCEPTION WHEN OTHERS THEN PERFORM UTL_FILE.FCLOSE_ALL(); v_errmsg := SQLERRM; PERFORM DBMS_OUTPUT.PUT_LINE(v_errmsg); END; $$ ; |
F.29.43. Приложение А Соответствие с базами данных Oracle #
В этом приложении приведены пояснения по соответствию между базами данных Tantor SE и Oracle.
F.29.43.1. A.1 Подсказки предложений #
Description
План выполнения, указанный для запроса, может быть контролируемым для каждого SQL-операторы с помощью подсказок, без внесения изменений в настройки всего сервера.
F.29.43.1.1. A.1.1 Соответствие подсказок предложений #
Таблица ниже перечисляет подсказки pg_hint_plan, которые соответствуют подсказкам базы данных Oracle.
Соответствие между подсказками базы данных Oracle и pg_hint_plan
Подсказка (База данных Oracle) | Подсказка (Tantor SE) |
---|---|
Подсказка FIRST_ROWS | Rows |
Подсказка FULL | Seqscan |
Подсказка INDEX | IndexScan |
Подсказка LEADING | Leading |
Подсказка NO_INDEX | NoIndexScan |
Подсказка NO_USE_HASH | NoHashJoin |
Подсказка NO_USE_MERGE | NoMergeJoin |
Подсказка NO_USE_NL | NoNestLoop |
Подсказка ORDERED | Leading |
Подсказка USE_HASH | HashJoin |
Подсказка USE_MERGE | MergeJoin |
Подсказка USE_NL | NestLoop |
Note
Оптимизатор работает по-разному для каждой базы данных. Поэтому подсказки, которые перенесены без изменений, могут не иметь того же эффекта после переноса. Убедитесь в правильности работы после переноса.
Пример миграции
Приведенный ниже пример показывает миграцию подсказки (индексная подсказка).
База данных Oracle | Tantor SE |
---|---|
SELECT /*+INDEX(inventory_table idx1)*/ * FROM inventory_table WHERE i_number = 110; |
SELECT /*+IndexScan(inventory_table idx1)*/ * FROM inventory_table WHERE i_number = 110; |
Примечание: Строка idx1 - это имя индекса, определенное для столбца i_number таблицы inventory_table.
Note
Подсказка pg_hint_plan, которая является расширенной функцией Tantor SE, не может быть использована для указания имени столбца или установки блока запросов перед указанием имени таблицы.
F.29.43.2. A.2 Динамические представления производительности #
Description
Динамические представления производительности - это представления, которые могут ссылаться на информацию, в основном связанную с производительностью базы данных.
F.29.43.2.1. A.2.1 Альтернативы для динамических представлений производительности #
Tantor SE не содержит динамических представлений производительности. Рассмотрите возможность использования системных каталогов Tantor SE или представлений статистики вместо них.
Таблица ниже перечисляет альтернативные системные каталоги и представления статистики, которые соответствуют динамическим представлениям производительности.
Альтернативы для динамических представлений производительности
Динамическое представление производительности (База данных Oracle) | Системный каталог или представление статистики (Tantor SE) |
---|---|
VACCESS|pglocks||VACTIVE_SERVICES | pg_stat_activity |
VARCHIVEDLOG|pgstatarchiver||VCLIENT_STATS | pg_stat_activity |
VCONTEXT|pgsettings||VDATABASE | pg_database |
VEMXUSAGESTATS|pgstatuserfunctions||VENABLEDPRIVS | pg_authid |
VENQUEUELOCK|pglocks||VFILESTAT | pg_statio_all_tables |
VFIXEDTABLE|pgviews||VFIXED_VIEW_DEFINITION | pg_views |
VGESBLOCKINGENQUEUE|pglocks||VGLOBAL_BLOCKED_LOCKS | pg_locks |
VGLOBALTRANSACTION|pglocks||VLOCK | pg_locks |
VLOCKEDOBJECT|pglocks||VMVREFRESH | pg_matviews |
VMYSTAT|pgstatalltablesorotherview||VNLS_PARAMETERS | pg_settings |
VNLSVALIDVALUES|pgproc < br > pgtsconfig < br > pgcollation < br > pgtype||VOBJECT_PRIVILEGE | pg_default_acl |
VOBJECTUSAGE|pgstatallindexes||VOPEN_CURSOR | pg_cursors |
VOPTION|pgsettings||VPARAMETER | pg_settings |
VPARAMETER2|pgsettings||VPROCESS | pg_stat_activity |
VPWFILEUSERS|pgusers||VREPLPROP | pg_replication_origin pg_replication_origin_status |
VSESSION|pgstatactivity||VSESSTAT | pg_stat_all_tables or other view |
VSQLFNMETADATA|pgproc, pgaggrgate||VSYSTEM_PARAMETER | pg_settings |
VSYSTEMPARAMETER2|pgsettings||VTABLESPACE | pg_tablespace |
VTEMPSTAT|pgstatdatabase||VTIMEZONE_NAMES | pg_timezone_names |
VTRANSACTION|pglocks||VTRANSACTION_ENQUEUE | pg_locks |
Note
Не всю информацию о динамических представлениях производительности можно получить из системных каталогов и представлений статистики. Каждый пользователь должен определить, может ли полученная информация быть использована.
F.29.43.3. A.3 Форматы #
Description
Указание форматов в функциях форматирования типов данных позволяет преобразовывать числовые и даты и время типов данных в отформатированные строки и преобразовывать отформатированные строки в конкретные типы данных.
F.29.43.3.1. A.3.1 Соответствие формата чисел #
Таблица ниже указывает, какие форматы чисел базы данных Oracle доступны в Tantor SE.
Соответствие форматов чисел
Формат числа | TO_CHAR | TO_NUMBER | Примечания |
---|---|---|---|
, (запятая) | Y | Y | |
. (точка) | Y | Y | |
$ | YR | YR | Если знак доллара ($) указан в любой позиции, отличной от первого символа числового формата, переместите его в начало числового формата. |
0 | Y | Y | |
9 | Y | Y | |
B | Y | Y | |
C | N | N | |
D | Y | Y | |
EEEE | Y | Y | |
G | Y | Y | |
L | Y | Y | |
MI | Y | Y | |
PR | Y | Y | |
RN | Y | - | |
Rn | Y | - | |
S | Y | Y | |
TM | N | - | |
U | Н | Н | |
V | Y | - | |
X | N | N | |
X | N | N |
Y: Доступно
YR: Доступно с ограничениями
N: Не может быть перенесено
-: Не требуется миграция (поскольку это недоступно в базах данных Oracle)
F.29.43.3.2. A.3.2 Соответствие формата даты и времени #
Таблица ниже указывает, какие форматы даты и времени базы данных Oracle доступны в Tantor SE.
Соответствие форматов даты и времени
Формат даты и времени | TO_CHAR | TO_DATE | TO_TIMESTAMP | Примечания |
---|---|---|---|---|
- / , . ; : “text” | Y | Y | Y | |
AD | Y | Y | Y | |
A.D. | Y | Y | Y | |
AM | Y | Y | Y | |
A.M. | Y | Y | Y | |
BC | Y | Y | Y | |
B.C. | Y | Y | Y | |
CC | Y | - | - | |
SCC | Y | - | - | |
D | Y | Y | Y | |
DAY | Y | Y | Y | |
DD | Y | Y | Y | |
DDD | Y | YR | YR | Год также должен быть указан. (Этот формат используется вместе с другими форматами, такими как YYYY.) |
DL | N | N | N | |
DS | N | N | N | |
DY | Y | Y | Y | |
E | N | N | N | |
EE | N | N | N | |
FF1 до FF9 | MR | - | MR | Изменить на MS. Однако, количество цифр ограничено тремя символами. |
FM | YR | YR | YR | Применяется только к формату, указанному сразу после FM. |
FX | Y | Y | Y | |
HH | Y | Y | Y | |
HH12 | Y | Y | Y | |
HH24 | Y | Y | Y | |
IW | Y | - | - | |
IYYY | Y | - | - | |
IYY | Y | - | - | |
IY | Y | - | - | |
I | Y | - | - | |
J | Y | Y | Y | |
MI | Y | Y | Y | |
MM | Y | Y | Y | |
MON | Y | Y | Y | |
MONTH | Y | Y | Y | |
PM | Y | Y | Y | |
P.M. | Y | Y | Y | |
Q | Y | - | - | |
RM | Y | Y | Y | |
RR | Y | Y | Y | |
RRRR | Y | Y | Y | |
SS | Y | Y | Y | |
SSSSS | M | M | M | Изменить на SSSS. |
TS | N | N | N | |
TZD | M | - | - | Изменить на TZ. |
TZH | N | - | - | |
TZM | N | - | - | |
TZR | M | - | - | Изменить на TZ. |
WW | Y | Y | Y | |
W | Y | Y | Y | |
X | Y | - | Y | |
Y,YYY | Y | Y | Y | |
YEAR | N | - | - | |
SYEAR | N | - | - | |
YYYY | Y | Y | Y | |
SYYYY | N | N | N | |
YYY | Y | Y | Y | |
YY | Y | Y | Y | |
Y | Y | Y | Y |
Y: Доступно
M: Может быть перенесено
N: Не может быть перенесено
YR: Доступно с ограничениями
MR: Может быть перенесено с ограничениями
-: Не требуется миграция (поскольку это недоступно в базах данных Oracle)