F.29. Документация Orafce#

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. package dbms_sql
F.29.12. Package 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. Поддержка VARCHAR2 и NVARCHAR2
F.29.24. Триггеры
F.29.25. Эмулированные представления
F.29.26. Лицензия
F.29.27. Участники
F.29.28. Orafce - функции и пакеты совместимости Oracle
F.29.29. Глава 1 Обзор
F.29.30. Глава 2 Примечания по использованию orafce
F.29.31. Глава 3 Типы данных
F.29.32. Глава 4 Запросы
F.29.33. Глава 5 Справочник по функциям SQL
F.29.34. Глава 6 Справочник по пакетам
F.29.35. Глава 7 Поведение транзакций
F.29.36. Миграция: Глава 1 Предварительная настройка перед миграцией
F.29.37. Миграция: Глава 2 Миграция синтаксических элементов
F.29.38. Миграция: Глава 3 Миграция функций
F.29.39. Миграция: Глава 4 Миграция SQL-запросов
F.29.40. Миграция: Глава 5 Миграция PL/SQL
F.29.41. Миграция: Глава 6 Примечания по использованию orafce
F.29.42. Приложение А Соответствие с базами данных Oracle

F.29.1. О модуле Orafce

Версия: 4.9.0

GitHub

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 не требуется таблица 'dual' Oracle, но поскольку она активно используется пользователями Oracle, она была добавлена в orafce.

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. package 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. Package 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) - возвращает остаток от деления одного числа на другое

Возможно, потребуется установить 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 поддерживает только семантику символов.

F.29.23. Поддержка 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.24. Триггеры

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.25. Эмулированные представления

  • 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.26. Лицензия

Этот модуль выпущен под лицензией BSD.

F.29.27. Участники

Проект был основан в 2008 году Павлом Стехуле .

Другие участники:

  • 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.28. Orafce - функции и пакеты совместимости Oracle

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

F.29.29. Глава 1 Обзор

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

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

F.29.29.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.30. Глава 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.31. Глава 3 Типы данных

Поддерживаются следующие типы данных:

  • VARCHAR2

  • NVARCHAR2

  • DATE

F.29.31.1. VARCHAR2

Syntax

Диаграмма F.1. VARCHAR2

VARCHAR2

Укажите тип 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.31.2. NVARCHAR2

Syntax

Диаграмма F.2. NVARCHAR2

NVARCHAR2

Укажите тип 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.31.3. DATE

Syntax

Диаграмма F.3. DATE

DATE

Укажите тип 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.32. Глава 4 Запросы

Поддерживаются следующие запросы:

  • Таблица DUAL

F.29.32.1. Таблица DUAL

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

Example

В следующем примере возвращается текущая системная дата.

SELECT  CURRENT_DATE  "date" FROM DUAL;
    date
------------
 2013-05-14
(1 row)

F.29.33. Глава 5 Справочник по функциям SQL

F.29.33.1. Математические функции

Поддерживаются следующие математические функции:

  • BITAND

  • COSH

  • SINH

  • TANH

F.29.33.1.1. BITAND

Description

Выполняет побитовую операцию AND.

Syntax

Диаграмма F.4. BITAND

BITAND

Общие правила

  • BITAND выполняет операцию AND над каждым битом двух целых чисел и возвращает результат.

  • Укажите значения типа целого числа.

  • Тип возвращаемого значения - BIGINT.

Example

В следующем примере возвращается результат операции AND над числовыми литералами 5 и 3.

SELECT BITAND(5,3) FROM DUAL;
 bitand
-------
      1
(1 row)
F.29.33.1.2. COSH

Description

Вычисляет гиперболический косинус числа.

Syntax

Диаграмма F.5. COSH

COSH

Общие правила

  • COSH возвращает гиперболический косинус указанного числа.

  • Число должно быть числовым типом данных.

  • Тип возвращаемого значения - DOUBLE PRECISION.

Example

В следующем примере возвращается гиперболический косинус числового литерала 2.236.

SELECT COSH(2.236) FROM DUAL;
      cosh
-----------------
4.7313591000247
(1 row)
F.29.33.1.3. SINH

Description

Вычисляет гиперболический синус числа.

Syntax

Диаграмма F.6. SINH

SINH

Общие правила

  • SINH возвращает гиперболический синус указанного числа.

  • Число должно быть числовым типом данных.

  • Тип возвращаемого значения - DOUBLE PRECISION.

Example

В следующем примере возвращается гиперболический синус числового литерала 1.414.

SELECT SINH(1.414) FROM DUAL;
      sinh
-----------------
1.93460168824956
(1 row)
F.29.33.1.4. TANH

Description

Вычисляет гиперболический тангенс числа.

Syntax

Диаграмма F.7. TANH

TANH

Общие правила

  • TANH возвращает гиперболический тангенс указанного числа.

  • Число должно быть числовым типом данных.

  • Тип возвращаемого значения - DOUBLE PRECISION.

Example

В следующем примере возвращается гиперболический тангенс числового литерала 3.

SELECT TANH(3) FROM DUAL;
      tanh
-----------------
0.995054753686731
(1 row)

F.29.33.2. Функции строки

Поддерживаются следующие строковые функции:

  • BTRIM

  • INSTR

  • LENGTH

  • LENGTHB

  • LPAD

  • LTRIM

  • NLSSORT

  • REGEXP_COUNT

  • REGEXP_INSTR

  • REGEXP_LIKE

  • REGEXP_SUBSTR

  • RPAD

  • RTRIM

  • SUBSTR

  • SUBSTRB

F.29.33.2.1. BTRIM

Description

Удаляет указанные символы с начала и конца строки.

Syntax

Диаграмма F.8. BTRIM

BTRIM

Общие правила

  • 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.33.2.2. INSTR

Description

Возвращает позицию подстроки в строке.

Syntax

Диаграмма F.9. INSTR

INSTR

Общие правила

  • 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.33.2.3. LENGTH

Description

Возвращает длину строки в числе символов.

Syntax

Диаграмма F.10. LENGTH

LENGTH

Общие правила

  • 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.33.2.4. LENGTHB

Description

Возвращает длину строки в числе байтов.

Syntax

Диаграмма F.11. LENGTHB

LENGTHB

Общие правила

  • 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.33.2.5. LPAD

Description

Заполняет строку слева до указанной длины последовательностью символов.

Syntax

Диаграмма F.12. LPAD

LPAD

Общие правила

  • 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.33.2.6. LTRIM

Description

Удаляет указанные символы с начала строки.

Syntax

Диаграмма F.13. LTRIM

LTRIM

Общие правила

  • 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.33.2.7. NLSSORT

Description

Возвращает байтовую строку, обозначающую лексический порядок локали (COLLATE).

Syntax

Диаграмма F.14. NLSSORT

NLSSORT

Общие правила

  • 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.33.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.33.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.33.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.33.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.33.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.33.2.13. RPAD

Description

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

Syntax

Диаграмма F.15. RPAD

RPAD

Общие правила

  • 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.33.2.14. RTRIM

Description

Удаляет указанные символы с конца строки.

Syntax

Диаграмма F.16. RTRIM

RTRIM

Общие правила

  • 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.33.2.15. SUBSTR

Description

Извлекает часть строки, используя символы для указания позиции и длины.

Syntax

Диаграмма F.17. SUBSTR

SUBSTR

Общие правила

  • 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.33.2.16. SUBSTRB

Description

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

Syntax

Диаграмма F.18. SUBSTRB

SUBSTRB

Общие правила

  • 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.33.3. Функции даты/времени

Следующие функции даты/времени поддерживаются:

  • ADD_MONTHS

  • DBTIMEZONE

  • LAST_DAY

  • MONTHS_BETWEEN

  • NEXT_DAY

  • ROUND

  • SESSIONTIMEZONE

  • SYSDATE

  • TRUNC

Note

Если тип DATE отображается только в функциях даты/времени, эти функции могут быть использованы как в orafce, так и в Tantor SE.

F.29.33.3.1. ADD_MONTHS

Description

Добавляет месяцы к дате.

Syntax

Диаграмма F.19. ADD_MONTHS

ADD_MONTHS

Общие правила

  • 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.33.3.2. DBTIMEZONE

Description

Возвращает значение часового пояса базы данных.

Syntax

Диаграмма F.20. DBTIMEZONE

DBTIMEZONE

Общие правила

  • 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.33.3.3. LAST_DAY

Description

Возвращает последний день месяца, в который попадает указанная дата.

Syntax

Диаграмма F.21. LAST_DAY

LAST_DAY

Общие правила

  • 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.33.3.4. MONTHS_BETWEEN

Description

Возвращает количество месяцев между двумя датами.

Syntax

Диаграмма F.22. MONTHS_BETWEEN

MONTHS_BETWEEN

Общие правила

  • 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.33.3.5. NEXT_DAY

Description

Возвращает дату первого случая определенного дня недели, который следует за указанной датой.

Syntax

Диаграмма F.23. NEXT_DAY

NEXT_DAY

Общие правила

  • 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.33.3.6. ROUND

Description

Округляет дату.

Syntax

Диаграмма F.24. ROUND

ROUND

Общие правила

  • 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.33.3.7. SESSIONTIMEZONE

Description

Возвращает часовой пояс сессии.

Syntax

Диаграмма F.25. SESSIONTIMEZONE

SESSIONTIMEZONE

Общие правила

  • SESSIONTIMEZONE возвращает значение часового пояса между сессиями.

  • Тип возвращаемого значения - TEXT.

Note

  • Если используется SESSIONTIMEZONE, необходимо заранее указать «oracle» для search_path.

  • Значение, возвращаемое SESSIONTIMEZONE, становится значением, установленным в параметре сервера "TimeZone".

See

Обратитесь к разделу «Примечания по использованию orafce» для получения информации о том, как редактировать search_path.

Example

В следующем примере возвращается часовой пояс сессии.

SELECT SESSIONTIMEZONE() FROM DUAL;
 sessiontimezone
-----------------
 Japan
(1 row)
F.29.33.3.8. SYSDATE

Description

Возвращает системную дату.

Syntax

Диаграмма F.26. SYSDATE

SYSDATE

Общие правила

  • 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.33.3.9. TRUNC

Description

Обрезает дату.

Syntax

Диаграмма F.27. TRUNC

TRUNC

Общие правила

  • 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.33.4. Функции форматирования типов данных

Поддерживаются следующие функции форматирования типов данных:

  • TO_CHAR

  • TO_DATE

  • TO_MULTI_BYTE

  • TO_NUMBER

  • TO_SINGLE_BYTE

F.29.33.4.1. TO_CHAR

Description

Преобразует значение в строку.

Syntax

Диаграмма F.28. TO_CHAR

TO_CHAR

Общие правила

  • 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.33.4.2. TO_DATE

Description

Преобразует строку в дату в соответствии с указанным форматом.

Syntax

Диаграмма F.29. TO_DATE

TO_DATE

Общие правила

  • 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.33.4.3. TO_MULTI_BYTE

Description

Преобразует строку с одним байтом в строку с несколькими байтами.

Syntax

Диаграмма F.30. TO_MULTI_BYTE

TO_MULTI_BYTE

Общие правила

  • TO_MULTI_BYTE преобразует символы половинной ширины в строке str в символы полной ширины и возвращает преобразованную строку.

  • Могут быть преобразованы только полуширинные буквенно-цифровые символы, пробелы и символы.

  • Тип возвращаемого значения - TEXT.

Example

В следующем примере "abc123" преобразуется в символы полной ширины и возвращается.

SELECT TO_MULTI_BYTE('abc123') FROM DUAL;
 to_multi_byte
---------------
   ******   
(1 row)

"******" это многобайтовый "abc123".

F.29.33.4.4. TO_NUMBER

Description

Преобразует значение в число в соответствии с указанным форматом.

Syntax

Диаграмма F.31. TO_NUMBER

TO_NUMBER

Общие правила

  • 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.33.4.5. TO_SINGLE_BYTE

Description

Преобразует строку многобайтовых символов в строку однобайтовых символов.

Syntax

Диаграмма F.32. TO_SINGLE_BYTE

TO_SINGLE_BYTE

Общие правила

  • TO_SINGLE_BYTE преобразует символы полной ширины в строке str в символы полуширины и возвращает преобразованную строку.

  • Только символы полной ширины, пробелы и символы, которые могут быть отображены в половинной ширине, могут быть преобразованы.

  • Тип возвращаемого значения - TEXT.

Example

В следующем примере "******" преобразуется в символы половинной ширины и возвращается. "******" - это многобайтовое "xyz999".

SELECT TO_SINGLE_BYTE('******') FROM DUAL;
 to_single_byte
----------------
 xyz999
(1 row)

F.29.33.5. Условные выражения

Следующие функции для выполнения сравнений поддерживаются:

  • DECODE

  • GREATEST

  • LEAST

  • LNNVL

  • NANVL

  • NVL

  • NVL2

F.29.33.5.1. DECODE

Description

Сравнивает значения и, если они совпадают, возвращает соответствующее значение.

Syntax

Диаграмма F.33. DECODE

DECODE

Общие правила

  • 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
WITHOUT TIME ZONE

TIMESTAMP
WITHOUT TIME ZONE

TIMESTAMP
WITH TIME ZONE

Результат вычисления (любой)

DATE

Y

N

Y

Y

TIME
WITHOUT TIME ZONE

N

Y

N

N

TIMESTAMP
WITHOUT TIME ZONE

Y

N

Y

Y

TIMESTAMP
WITH TIME ZONE

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.33.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.33.5.3. LNNVL

Description

Определяет, является ли значение TRUE или FALSE для указанного условия.

Syntax

Диаграмма F.34. LNNVL

LNNVL

Общие правила

  • 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.33.5.4. NANVL

Description

Возвращает заменяющее значение, когда значение не является числом (NaN).

Syntax

Диаграмма F.35. NANVL

NANVL

Общие правила

  • 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.33.5.5. NVL

Description

Возвращает заменяющее значение, когда значение является NULL.

Syntax

Диаграмма F.36. NVL

NVL

Общие правила

  • 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.33.5.6. NVL2

Description

Возвращает заменяющее значение на основе того, является ли значение NULL или не NULL.

Syntax

Диаграмма F.37. NVL2

NVL2

Общие правила

  • 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.33.6. Агрегатные функции

Поддерживаются следующие агрегатные функции:

  • LISTAGG

  • MEDIAN

F.29.33.6.1. LISTAGG

Description

Возвращает объединенный, разделенный список строковых значений.

Syntax

Диаграмма F.38. LISTAGG

LISTAGG

Общие правила

  • LISTAGG конкатенирует и разделяет набор строковых значений и возвращает результат.

  • Для разделителя, укажите строку. Если разделитель не указан, возвращается список строк без разделителя.

  • Тип возвращаемого значения - TEXT.

Example

В следующем примере возвращается результат со значениями столбца col2 в таблице t1, разделенными символом ‘:’.

SELECT LISTAGG(col2,':') FROM t1;
      listagg
-------------------
 AAAAA:BBBBB:CCCCC
(1 row)
F.29.33.6.2. MEDIAN

Description

Вычисляет медиану набора чисел.

Syntax

Диаграмма F.39. MEDIAN

MEDIAN

Общие правила

  • MEDIAN возвращает медиану набора чисел.

  • Числа должны быть числового типа данных.

  • Тип возвращаемого значения будет REAL, если числа имеют тип REAL, или DOUBLE PRECISION, если указан любой другой тип.

Example

В следующем примере возвращается медиана столбца col3 в таблице t1.

SELECT MEDIAN(col3) FROM t1;
 median
--------
   2000
(1 row)

F.29.33.7. Функции, возвращающие внутреннюю информацию

Поддерживаются следующие функции, возвращающие внутреннюю информацию:

  • DUMP

F.29.33.7.1. DUMP

Description

Возвращает внутреннюю информацию значения.

Syntax

Диаграмма F.40. DUMP

DUMP

Общие правила

  • 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.33.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.34. Глава 6 Справочник по пакетам

"Пакет" - это группа функций, объединенных схемами, которые имеют единую функциональность и используются путем вызова из PL/pgSQL.

Поддерживаются следующие пакеты:

  • DBMS_ALERT

  • DBMS_ASSERT

  • DBMS_OUTPUT

  • DBMS_PIPE

  • DBMS_RANDOM

  • DBMS_UTILITY

  • UTL_FILE

Для вызова различных функций из PL/pgSQL используйте оператор PERFORM или оператор SELECT, используя имя пакета для уточнения имени функции. См пояснения по каждой из функций пакета для получения информации о формате вызова.

F.29.34.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.41. DBMS_ALERT

DBMS_ALERT

F.29.34.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.34.1.2. Пример использования

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

Поток DBMS_ALERT

Диаграмма F.42. DBMS_ALERT_flow

DBMS_ALERT_flow

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.34.2. DBMS_ASSERT

Overview

Выполняет проверку свойств входных значений в PL/pgSQL.

Features

Функция Описание
ENQUOTE_LITERAL Возвращает указанную строку, заключенную в апострофы.
ENQUOTE_NAME Возвращает указанную строку, в двойных кавычках.
NOOP Возвращает указанную строку как есть.
OBJECT_NAME Проверяет, является ли указанная строка определенным идентификатором.
QUALIFIED_SQL_NAME Проверяет, соответствует ли указанная строка подходящему формату в качестве идентификатора.
SCHEMA_NAME Проверяет, является ли указанная строка определенной схемой.
SIMPLE_SQL_NAME Проверяет, соответствует ли указанная строка формату одного идентификатора.

Syntax

Диаграмма F.43. DBMS_ASSERT

DBMS_ASSERT

F.29.34.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.34.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); RAISENOTICEOBJECT : RAISENOTICETABLENAME : END;
LANGUAGE plpgsql; SELECT dbms_assert_exe(); DROP FUNCTION dbms_assert_exe(); ~~~

F.29.34.3. DBMS_OUTPUT

Overview

Отправляет сообщения клиентам, таким как psql, из PL/pgSQL.

Features

Функция Описание
ENABLE Включает функции этого пакета.
DISABLE Отключает функции этого пакета.
SERVEROUTPUT Контролирует, отправляются ли сообщения.
PUT Отправляет сообщения.
PUT_LINE Отправляет сообщения с добавлением символа перехода строки.
NEW_LINE Отправляет символ перехода строки.
GET_LINE Извлекает строку из буфера сообщений.
GET_LINES Извлекает несколько строк из буфера сообщений.

Syntax

Диаграмма F.44. DBMS_OUTPUT

DBMS_OUTPUT

F.29.34.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.34.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.34.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.45. DBMS_PIPE

DBMS_PIPE

F.29.34.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.34.4.2. Пример использования

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

Поток DBMS_PIPE

Диаграмма F.46. DBMS_PIPE_flow

DBMS_PIPE_flow

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.34.5. DBMS_RANDOM

Overview

Генерирует случайные числа в PL/pgSQL.

Features

Функция Описание
INITIALIZE Инициирует генерацию случайных чисел.
NORMAL Возвращает нормально распределенное случайное число.
RANDOM Генерирует случайное число.
SEED Сбрасывает начальное значение.
STRING Генерирует случайную строку.
TERMINATE Завершает генерацию случайных чисел.
VALUE Генерирует случайное десятичное число между 0 и 1, или между указанными значениями.

Syntax

Диаграмма F.47. DBMS_RANDOM

DBMS_RANDOM

F.29.34.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.34.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.34.6. DBMS_UTILITY

Overview

Предоставляет утилиты PL/pgSQL.

Features

Функция Описание
FORMAT_CALL_STACK Возвращает текущий стек вызовов.
GET_TIME Возвращает количество сотых долей секунды, прошедших с момента времени в прошлом.

Syntax

Диаграмма F.48. DBMS_UTILITY

DBMS_UTILITY

F.29.34.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.34.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.34.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.49. UTL_FILE

UTL_FILE

F.29.34.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.34.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.34.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.35. Глава 7 Поведение транзакций

Большинство аспектов поведения транзакции точно такие же, однако нижеприведенное отличается.

F.29.35.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.35.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.36. Миграция: Глава 1 Предварительная настройка перед миграцией

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

Note

  • В данном руководстве по миграции исходной базой данных для миграции является Oracle, а целевой - Tantor SE. Предполагается использование версий, перечисленных ниже.

    • Oracle Database 12c

    • PostgreSQL 9.5

  • После миграции проверьте работу и подтвердите успешность миграции данных, проверив, получен ли предполагаемый результат.

F.29.36.1. Установка параметра сервера

Этот раздел описывает параметр сервера, необходимый для сопоставления поведения Tantor SE с поведением базы данных Oracle. Установите параметр в Tantor SE.conf, чтобы база данных всегда работала одинаково для всех клиентов.

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

Параметр сервера Описание
search_path Определяет последовательность, в которой производится поиск схем.

Note

  • Настройку параметра сервера не рекомендуется менять. Изменяйте настройку только по мере необходимости.

  • Пояснения в главе 2 и следующие заметки предполагают, что параметр сервера был настроен.

F.29.36.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.36.2. Примеры баз данных

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

F.29.36.2.1. Управление запасами базы данных
F.29.36.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-запросов, если не указано иное, подразумеваются таблицы и столбцы, перечисленные в «Содержимое базы данных управления товарными запасами». Обратите внимание, что данные, показанные в этой таблице, являются вымышленными.

Содержимое базы данных управления товарными запасами

  1. 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
  1. 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
  1. 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.36.2.1.2. Отношение между таблицами

"Отношение между таблицами" показывает, как таблицы связаны друг с другом. Таблица с товарными запасами и таблица заказов связаны посредством номера продукта и поставляемого продукта. Таблица заказов и таблица компании связаны посредством поставщика и кода компании. Например, продукт, идентифицированный номером продукта "123" в таблице с товарными запасами, имеет категорию "холодильник" и количество в инвентаре "60", и хранится на складе, идентифицированном кодом "1". Затем, строка, содержащая поставляемый продукт "123" в таблице заказов, показывает, что закупочная цена продукта составляет "48000", а количество заказов - "60". Кроме того, код компании поставщика можно подтвердить как "61", и строка, содержащая код компании "61" в таблице компании, показывает название, телефонный номер и адрес компании, поставляющей продукт.

Отношение между таблицами

Диаграмма F.50. REL1

REL1

F.29.36.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.36.2.2. База данных управления персоналом
F.29.36.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-запросов, если не указано иное, подразумеваются таблицы и столбцы, перечисленные в «Содержимое базы данных по управлению персоналом». Обратите внимание, что данные, показанные в этой таблице, являются вымышленными.

Содержимое базы данных по управлению персоналом

  1. 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
  1. 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.36.2.2.2. Отношение между таблицами

"Отношение между таблицами" показывает, как таблицы связаны друг с другом. Таблица персонала и таблица управления посещаемостью связаны посредством номера идентификации персонала.

Отношение между таблицами

Диаграмма F.51. REL2

REL2

F.29.36.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.37. Миграция: Глава 2 Миграция синтаксических элементов

Эта глава объясняет, как перенести элементы синтаксиса SQL.

F.29.37.1. Основные элементы

Этот раздел объясняет основные элементы синтаксиса SQL.

F.29.37.1.1. TIMESTAMP Literal

Description

Литерал с префиксом TIMESTAMP рассматривается как данные типа TIMESTAMP.

Функциональные различия

  • База данных Oracle

    • TIMESTAMP префикс может обозначать литерал часового пояса.

  • Tantor SE

    • Префикс TIMESTAMP WITH TIME ZONE обозначает литерал временной зоны. Если префикс только TIMESTAMP, значение временной зоны отбрасывается. Никакого предупреждения, ошибки или другого уведомления не выводится.

Процедура миграции

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

  1. Ищите ключевое слово TIMESTAMP и определите, где оно используется в качестве префикса литерала.

  2. Если для литерала указан часовой пояс, измените префикс на 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.37.1.2. Альтернативный знак кавычек

Description

Использование альтернативной кавычки позволяет использовать разделитель для текстовой строки.

Функциональные различия

  • База данных Oracle

    • Используются альтернативные кавычки q’x и x’. Буква x представляет альтернативный символ.

  • Tantor SE

    • Альтернативные кавычки q и q используются.

Процедура миграции

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

  1. Ищите ключевое слово q’ или Q’ и определите, где используются альтернативные кавычки.

  2. Удалите альтернативные символы и апострофы, где использованы альтернативные кавычки, и заключите строки в 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.37.2. Типы данных

Этот раздел объясняет типы данных.

F.29.37.2.1. Перенос типов данных

В таблице ниже перечислены типы данных Tantor SE, которые соответствуют типам данных базы данных Oracle.

Соответствие типов данных

  • Character

Тип данных базы данных Oracle Примечания Возможность миграции Tantor SE Тип данных Примечания
CHAR CHARACTER Определяет количество байтов или количество символов. YR char character Можно указать только количество символов.
CLOB CHAR LARGE OBJECT CHARACTER LARGE OBJECT MR текст Большой объект До 1 ГБ (текст) До 4 TБ (Большой объект)

| CHAR VARYING
CHARACTER VARYING
VARCHAR | Указывает количество байтов или количество символов. | YR | char varying
character varying
varchar | Можно указать только количество символов.

LONG

MR

текст

До 1 ГБ

M

Большой объект

| NCHAR
NATIONAL CHAR
NATIONAL CHARACTER | | YR | nchar
national char
national character | Этот тип данных внутренне используется как тип символа. | | NCHAR VARYING
NATIONAL CHAR VARYING
NATIONAL CHARACTER VARYING | | YR | nchar varying
national char varying
national character varying | Этот тип данных внутренне используется как тип изменяемого символа | | NCLOB
NCHAR LARGE OBJECT
NATIONAL CHARACTER LARGE OBJECT | | MR | текст
Большой объект | До 1 ГБ (текст)
До 4 ТБ (Большой объект)

NVARCHAR2

YR

nvarchar2

Последовательность сортировки не поддерживается.
Этот тип данных добавляется с использованием orafce.

MR

nchar varying
national char varying
national character varying

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

VARCHAR2

Указывает количество байтов или количество символов.

YR

varchar2

Можно указать только количество байтов.
Последовательность сортировки не поддерживается.
Этот тип данных добавляется с использованием orafce.

MR

varchar

Можно указать только количество символов.

  • 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 | | Y | отметка времени со временной зоной |

DATE

Y

дата (orafce)

Время может быть сохранено в дополнение к дате.
Параметр search_path должен быть указан.

YR

date (Tantor SE)

Хранится только дата.

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.37.2.2. Примеры миграции типов данных
F.29.37.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.37.2.2.2. Тип ЧИСЛО

Функциональные различия

  • База данных Oracle

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

  • Tantor SE

    • Отрицательное значение не может быть указано в масштабе типа NUMERIC.
      Любое значение, указанное в масштабе за пределами числа значащих цифр, отбрасывается.

Процедура миграции

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

  1. Измените масштабы DECIMAL на 0 и добавьте количество измененных цифр к точности.

  2. Создайте функцию, которая использует функцию ROUND для округления столбца, который был изменен на шаге (1) выше.

  3. Создайте триггер, который выполняет функцию, созданную в Шаге (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.37.3. Pseudocolumns

Этот раздел объясняет псевдоколонки.

F.29.37.3.1. CURRVAL

Description

CURRVAL возвращает значение, ближайшее к значению, полученному с помощью NEXTVAL из последовательности в текущей сессии.

Функциональные различия

  • База данных Oracle

    • Имя последовательности указывается как sequenceName.CURRVAL.

  • Tantor SE

    • Имя последовательности указывается как CURRVAL('sequenceName').

Процедура миграции

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

  1. Поиск ключевого слова CURRVAL и определение его использования.

  2. Измените спецификацию имени последовательности, поместив ее после CURRVAL и заключив в скобки и апострофы.

Пример миграции

Приведенный ниже пример показывает, как выполнить миграцию CURRVAL.

База данных Oracle Tantor SE
SELECT seq1.CURRVAL FROM DUAL;
SELECT CURRVAL('seq1') FROM DUAL;
F.29.37.3.2. NEXTVAL

Description

NEXTVAL возвращает следующий номер в последовательности.

Функциональные различия

  • База данных Oracle

    • Имя последовательности указывается как sequenceName.NEXTVAL.

  • Tantor SE

    • Имя последовательности указывается как NEXTVAL('sequenceName').

Процедура миграции

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

  1. Поиск ключевого слова NEXTVAL и определение его использования.

  2. Измените спецификацию имени последовательности, поместив ее после NEXTVAL и заключив в скобки и апострофы.

Пример миграции

Приведенный ниже пример показывает, как выполнить миграцию NEXTVAL.

База данных Oracle Tantor SE
SELECT seq1.NEXTVAL FROM DUAL;
SELECT NEXTVAL('seq1') FROM DUAL;
F.29.37.3.3. ROWID

Description

ROWID получает информацию для уникальной идентификации данных.

Функциональные различия

  • База данных Oracle

    • ROWID создается автоматически при создании таблицы.

  • Tantor SE

    • ROWID не может быть использован. Вместо этого используйте OID. Однако, при создании таблицы необходимо указать WITH OIDS.

Процедура миграции

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

  1. Укажите WITH OIDS в конце оператора CREATE TABLE.

  2. Измените элемент извлечения 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.37.3.4. ROWNUM

Description

ROWNUM получает номер текущей строки.

F.29.37.3.4.1. Получение номера строки

Функциональные различия

  • База данных Oracle

    • ROWNUM получает номер текущей строки.

  • Tantor SE

    • ROWNUM не может быть использован. Вместо этого используйте ROW_NUMBER() OVER().

Процедура миграции

Используя функцию ROW_NUMBER() вместо ROWNUM, выполните миграцию так, чтобы получить текущий номер. Используйте следующую процедуру для выполнения миграции:

  1. Поиск ключевого слова ROWNUM и определение его использования.

  2. Измените 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.37.3.4.2. Сортировка записей и получение первых N записей

Функциональные различия

  • База данных Oracle

    • Если в подзапросе, содержащем предложение ORDER BY, указано в предложении FROM, и в предложении WHERE определено условие ROWNUM, записи сортируются, а затем получаются первые N записей.

  • Tantor SE

    • ROWNUM не может быть использован. Вместо этого используйте оператор LIMIT, отсортируйте записи и получите первые N записей.

Процедура миграции

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

  1. Поиск ключевого слова ROWNUM и определение его использования.

  2. Если в подзапросе предложения FROM указано предложение ORDER BY и результаты фильтруются в соответствии с условием ROWNUM в предложении WHERE, рассматривайте эту часть как SQL-запрос, который сортирует записи и затем получает первые N записей.

  3. Переместите имя таблицы и предложение ORDER BY из подзапроса в оператор SELECT выше и удалите подзапрос.

  4. В предложении 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.37.4. Обработка NULL и строк нулевой длины

В этом разделе объясняется, как обрабатываются NULL и строки нулевой длины.

Базы данных Oracle обрабатывают строки нулевой длины как NULL. В отличие от этого, Tantor SE рассматривает строки нулевой длины и NULL как два разных значения.

Таблица ниже перечисляет преимущества и недостатки использования строк нулевой длины и NULL при выполнении миграции.

Преимущества и недостатки сохранения или миграции нулевых строк базы данных Oracle

Нулевые строки базы данных Oracle Преимущества Недостатки
Рассматриваются как строки нулевой длины без переноса в NULL Конкатенация строк (||) может использоваться как есть. Целевые данные имеют меньше совпадений, чем с IS NULL. Условные выражения должны быть изменены.
Мигрировано в NULL IS NULL может быть использован как есть. Результат конкатенации строк (||) является NULL. Конкатенацию строк необходимо изменить.

Следующие разделы объясняют, как вносить изменения, если используются пустые строки и значения NULL вместе.

F.29.37.4.1. Условия поиска (предикат IS NULL)

Функциональные различия

  • База данных Oracle

    • Даже строки нулевой длины удовлетворяют условию IS NULL.

  • Tantor SE

    • Строки нулевой длины не удовлетворяют условию IS NULL.

Процедура миграции

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

  1. Ищите ключевое слово IS NULL и определите, где используется поиск NULL.

  2. Измените части, найденные поисковым запросом 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.37.4.2. Условия поиска (Сравнительный предикат)

Функциональные различия

  • База данных Oracle

    • Нулевые строки рассматриваются как NULL, поэтому они не соответствуют условиям поиска.

  • Tantor SE

    • Нулевые строки не рассматриваются как NULL, поэтому они могут соответствовать условиям поиска.

Процедура миграции

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

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

  2. Добавьте AND columnName != ’’ к условию поиска.

Пример миграции

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

База данных Oracle Tantor SE
SELECT * FROM staff_table 
 WHERE job < 'A00';
SELECT * FROM staff_table 
 WHERE job < 'A00' AND job != '';
F.29.37.4.3. Конкатенация строк (||)

Функциональные различия

  • База данных Oracle

    • Конкатенация с NULL возвращает строки, отличные от NULL.

  • Tantor SE

    • Конкатенация с NULL возвращает NULL.

Процедура миграции

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

  1. Поиск ключевого слова || и определение мест, где используется конкатенация строк.

  2. Если значения, которые нужно объединить, могут стать NULL, используйте функцию NVL для возвращения строки нулевой длины вместо NULL.

Пример миграции

Приведенный ниже пример показывает миграцию, когда в базах данных Oracle возвращается значение NULL при конкатенации строк (||).

База данных Oracle Tantor SE
SELECT 'NAME:' || name 
 FROM staff_table;
 SELECT 'NAME:' || NVL( name, '' ) 
  FROM staff_table;

F.29.38. Миграция: Глава 3 Миграция функций

Эта глава объясняет, как перенести SQL-функции.

F.29.38.1. CONVERT

Description

CONVERT преобразует строку из одного набора символов в другой.

Функциональные различия

  • База данных Oracle

    • Строка преобразуется из набора символов, указанного в третьем аргументе, в набор символов, указанный во втором аргументе.

  • Tantor SE

    • Строка преобразуется из набора символов, указанного во втором аргументе, в набор символов, указанный в третьем аргументе.

Процедура миграции

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

  1. Ищите ключевое слово CONVERT и определите, где оно используется.

  2. Переключите второй и третий аргументы.

  3. Измените наборы символов во втором и третьем аргументах на имена, которые действительны в системе кодирования 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.38.2. EMPTY_BLOB

Description

EMPTY_BLOB инициализирует области типа BLOB и создает пустые данные.

Функциональные различия

  • База данных Oracle

    • Инициализируются области типа BLOB и создаются пустые данные.

  • Tantor SE

    • EMPTY_BLOB не может быть использован. Вместо этого используйте строку нулевой длины для инициализации.

Процедура миграции

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

  1. Ищите ключевое слово EMPTY_BLOB() и определите, где оно используется.

  2. Измените 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.38.3. LEAD

Description

LEAD получает значение указанной в аргументах колонки из записи, которая находится ниже через указанное число строк.

Функциональные различия

  • База данных Oracle

    • NULL значение в столбце, указанном в аргументах, может быть исключено из расчета.

  • Tantor SE

    • NULL значение в столбце, указанном в аргументах, не может быть исключено из расчета.

Процедура миграции

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

  1. Поиск ключевого слова LEAD и определение его использования.

  2. Если указано предложение IGNORE NULLS, проверьте следующие значения для создания подзапроса, исключающего значения NULL:

    • Аргументы функции LEAD (перед IGNORE NULLS)

    • Таблицы, на которые влияет IGNORE NULLS

    • Столбцы, на которые влияет IGNORE NULLS

    • Столбцы, которые нужно отсортировать

  3. Измените таблицу в предложении FROM на подзапрос, чтобы соответствовать формату, показанному ниже.

  4. Замените 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.38.4. RAWTOHEX

Description

RAWTOHEX преобразует данные типа RAW в шестнадцатеричное строковое значение.

Функциональные различия

  • База данных Oracle

    • Данные типа RAW преобразуются в шестнадцатеричное строковое значение.

  • Tantor SE

    • RAWTOHEX не может быть использован. Вместо этого используйте ENCODE для преобразования бинарных типов данных, соответствующих типу RAW.

Процедура миграции

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

  1. Ищите ключевое слово RAWTOHEX и определите, где оно используется.

  2. Измените 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.38.5. REGEXP_REPLACE

Description

REGEXP_REPLACE использует регулярное выражение для замены строки.

Функциональные различия

  • База данных Oracle

    • Все строки, соответствующие шаблону регулярного выражения, заменяются.

  • Tantor SE

    • Первая строка, которая соответствует регулярному выражению заменяется.

Процедура миграции

Функция REGEXP_REPLACE Tantor SE может вернуть тот же результат, если строка опций указана в четвертом аргументе. Используйте следующую процедуру для выполнения миграции:

  1. Ищите ключевое слово REGEXP_REPLACE и определите, где оно используется.

  2. Укажите аргумент ‘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.38.6. TO_TIMESTAMP

Description

TO_TIMESTAMP преобразует строковое значение в тип данных TIMESTAMP.

Функциональные различия

  • База данных Oracle

    • Можно указать язык, который будет использоваться для возврата значений месяца и дня недели.

  • Tantor SE

    • Язык, который будет использоваться для возврата значений месяца и дня недели, указать невозможно.

Процедура миграции

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

  1. Ищите ключевое слово TO_TIMESTAMP и определите, где оно используется.

  2. Если третий аргумент TO_TIMESTAMP указан, удалите его.

  3. Если строка в первом аргументе содержит строку национальных символов, она заменяется ключевым словом 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.39. Миграция: Глава 4 Миграция SQL-запросов

Эта глава объясняет, как перенести SQL-запросы.

F.29.39.1. Разделы

Этот раздел предоставляет примеры миграции разделов.

F.29.39.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

    • Невозможно создать таблицы разделов.

Процедура миграции

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

  1. Ищите ключевое слово PARTITION и определите, где используется CREATE TABLE для создания раздела.

  2. Удалите часть PARTITION и следующие строки из оператора CREATE TABLE и создайте таблицу.

  3. Создайте дочернюю таблицу, которая наследует таблицу, определенную в шаге 1, и добавьте ограничения таблицы к разделенной таблице для определения ограничений разделения.

  4. Определите триггер или правило, чтобы данные, вставленные в таблицу, были присвоены соответствующей дочерней таблице.

Пример миграции

Приведенный ниже пример показывает миграцию, когда создаются разделы в таблице 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.39.1.2. ПРЕДЛОЖЕНИЕ PARTITION В ОПЕРАТОРЕ SELECT

Прежде чем можно будет мигрировать предложение PARTITION в SELECT-запросе, секция базы данных Oracle должен быть преобразован в дочерние таблицы для Tantor SE.

Description

Предложение PARTITION обрабатывает только некоторые разделы таблицы (таблицы-разделы), указанные в предложении FROM, как цели запроса.

F.29.39.1.3. Запросы, где указано предложение PARTITION

Функциональные различия

  • База данных Oracle

    • Можно указать часть A PARTITION.

  • Tantor SE

    • Нельзя указать предложение PARTITION.

Процедура миграции

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

  1. Ищите ключевое слово PARTITION и определите, где оно указано в операторе SELECT.

  2. Измените имя таблицы, указанное в предложении FROM, на имя дочерней таблицы, соответствующей разделу, указанному в предложении PARTITION.

  3. Удалите часть PARTITION.

Пример миграции

Приведенный ниже пример показывает миграцию запроса, который использует PARTITION.

База данных Oracle Tantor SE
SELECT * 
 FROM inventory_table PARTITION( 
 inventory_table_1);
SELECT * 
 FROM inventory_table_1; 
 
F.29.39.1.4. 4.1.2. Запросы, когда FOR указан в предложении PARTITION

Функциональные различия

  • База данных Oracle

    • FOR может быть указано в разделе PARTITION.

  • Tantor SE

    • Нельзя указать предложение PARTITION.

Процедура миграции

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

  1. Ищите ключевое слово PARTITION и определите, где оно указано в операторе SELECT.

  2. Переместите значение, указанное в предложении PARTITION, в предложение WHERE и замените его условным выражением, которое сравнивает значение с именем столбца, записанным в определении раздела.

  3. Удалите часть PARTITION.

Пример миграции

Приведенный ниже пример показывает миграцию, когда используется PARTITION FOR для выполнения запроса.

База данных Oracle Tantor SE
SELECT * 
 FROM inventory_table PARTITION FOR (2);
SELECT * 
 FROM inventory_table WHERE i_warehouse = 2;

F.29.39.2. SELECT Statements

Этот раздел объясняет операторы SELECT.

F.29.39.2.1. UNIQUE

Description

UNIQUE удаляет дублирующиеся строки из выбранного списка и отображает результат.

Функциональные различия

  • База данных Oracle

    • UNIQUE может быть указано в выборке.

  • Tantor SE

    • UNIQUE не может быть указано в выборке. Вместо этого укажите DISTINCT.

Процедура миграции

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

  1. Поиск ключевого слова UNIQUE и определение, где оно указано в выборке оператора SELECT.

  2. Измените UNIQUE в операторе SELECT на DISTINCT.

Пример миграции

Приведенный ниже пример показывает миграцию, когда UNIQUE указан в выборке.

База данных Oracle Tantor SE
SELECT UNIQUE i_name 
FROM inventory_table;
SELECT DISTINCT i_name 
FROM inventory_table;
F.29.39.2.2. Подзапросы

Description

Подзапрос определяет подзапрос SELECT в основном SQL-запросе.

Функциональные различия

  • База данных Oracle

    • Подзапрос, указанный в операторе FROM, может быть выполнен даже без указания псевдонима для него.

  • Tantor SE

    • Подзапрос, указанный в операторе FROM, не может быть выполнен, если для него не указан псевдоним.

Процедура миграции

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

  1. Ищите ключевое слово SELECT и определите, где используется подзапрос.

  2. Если подзапрос указан в предложении 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.39.2.3. Иерархические запросы

Description

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

F.29.39.2.3.1. Выполнение иерархических запросов

Функциональные различия

  • База данных Oracle

    • Иерархические запросы могут быть использованы.

  • Tantor SE

    • Иерархические запросы нельзя использовать.

Процедура миграции

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

  1. Поиск ключевого слова CONNECT и определение, где используется иерархический запрос.

  2. Проверьте следующее:

    • Целевая таблица иерархического запроса

    • Используемый столбец

    • Условные выражения указаны в разделе CONNECT BY

  3. Замените иерархический запрос с использованием синтаксиса предложения WITH, чтобы соответствовать показанному ниже формату.

  4. Измените имя таблицы, указанное в предложении 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.39.2.3.2. Иерархический запрос с начальной строкой

Функциональные различия

  • База данных Oracle

    • В запросе с иерархическими данными можно указать предложение START WITH для установки условий начальной строки.

  • Tantor SE

    • Нельзя указать START WITH в предложении.

Процедура миграции

В рекурсивном запросе, использующем предложение WITH, установите условие, которое ссылается на само себя, чтобы получить одинаковый результат. Используйте следующую процедуру для выполнения миграции:

  1. Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).

  2. Если указано предложение START WITH, переместите указанное условное выражение в предложение WHERE первого подзапроса, указанного в предложении WITH.

  3. Удалите предложение 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.39.2.3.3. Иерархический запрос, отображающий иерархическую позицию каждой строки

Функциональные различия

  • База данных Oracle

    • Указание псевдоколонки LEVEL в выборке запроса иерархического запроса отображает иерархическую позицию каждой строки.

  • Tantor SE

    • Уровень псевдоколонки A не может быть указан.

Процедура миграции

В рекурсивном запросе, который использует предложение WITH, создайте столбец результата, эквивалентный псевдостолбцу LEVEL, как результат запроса предложения WITH, чтобы возвращался тот же результат. Используйте следующую процедуру для выполнения миграции:

  1. Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).

  2. Добавьте LEVEL в список столбцов результата запроса предложения WITH.

  3. Укажите следующие значения в качестве списка выбора подзапроса на позиции, соответствующей столбцу LEVEL:

    • Укажите 1 в первом запросе.

    • Укажите LEVEL + 1 в следующем запросе. (LEVEL - это столбец рекурсивной таблицы).

  4. Используя запрос, замените часть, где используется псевдоколонка 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.39.2.3.4. Иерархический запрос, отображающий иерархическую структуру

Функциональные различия

  • База данных Oracle

    • Указание SYS_CONNECT_BY_PATH в выборке иерархического запроса отображает иерархическую структуру.

  • Tantor SE

    • SYS_CONNECT_BY_PATH не может быть указан.

Процедура миграции

В рекурсивном запросе, который использует предложение WITH, создайте арифметическое выражение, которое также использует рекурсивный запрос из предложения WITH, чтобы получить тот же результат. Используйте следующую процедуру для выполнения миграции:

  1. Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).

  2. Добавьте PATH в список столбцов результата запроса предложения WITH.

  3. Укажите следующие значения для списка выбора подзапроса, соответствующего столбцу PATH. Приведенный здесь пример объясняет миграцию, когда в качестве разделителя указана косая черта (/).

  • В первом запросе укажите путь к значениям столбцов от корня до узла.

  • Укажите m.PATH || ‘/’ || n.columnName в следующем запросе. (PATH - это рекурсивная колонка таблицы.)

  1. Используя запрос, замените часть, где используется 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, 
               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.39.2.3.5. Иерархические запросы, сортирующие каждый уровень иерархии

Функциональные различия

  • База данных Oracle

    • Указание предложения ORDER SIBLINGS BY в иерархическом запросе позволяет сортировать каждый уровень иерархии.

  • Tantor SE

    • Нельзя указать предложение ORDER SIBLINGS BY.

Процедура миграции

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

  1. Замените иерархический запрос синтаксисом, который использует рекурсивный запрос (предложение WITH).

  2. В синтаксисе, использующем рекурсивный запрос (предложение WITH), добавьте poskey в список столбцов результата запроса предложения WITH.

  3. Укажите ROW_NUMBER() в позиции, соответствующей столбцу poskey. В предложении OVER укажите предложение ORDER BY, которое указывает столбец из предложения ORDER SIBLINGS BY.

  4. Добавьте siblings_pos в список столбцов результата запроса WITH.

  5. Укажите следующие значения в качестве списка выбора подзапроса на позиции, соответствующей столбцу siblings_pos:

    • Укажите ARRAY[poskey] в первом запросе.

    • Укажите конкатенацию siblings_pos и poskey в следующем запросе.

  6. Используя запрос, укажите 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.39.2.4. MINUS

Description

MINUS находит разницу между двумя результатами запроса, то есть, он возвращает строки, которые есть в первом наборе результатов, но отсутствуют во втором наборе результатов.

Функциональные различия

  • База данных Oracle

    • MINUS предназначен для нахождения разницы между двумя результатами запроса.

  • Tantor SE

    • MINUS не может быть указан для поиска разницы между результатами двух запросов. Вместо этого используйте EXCEPT.

Процедура миграции

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

  1. Ищите ключевое слово MINUS и определите, где оно используется.

  2. Измените 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.39.3. Удаление записей

Этот раздел объясняет операторы DELETE.

F.29.39.3.1. Пропуск ключевого слова FROM

Функциональные различия

  • База данных Oracle

    • Ключевое слово FROM можно опустить в операторе DELETE.

  • Tantor SE

    • Ключевое слово FROM не можно опустить в операторе DELETE.

Процедура миграции

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

  1. Поиск ключевого слова DELETE и определение его использования.

  2. Если ключевое слово 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.39.4. Операторы MERGE

Этот раздел объясняет операторы MERGE.

F.29.39.4.1. Выполнение операторов MERGE

Функциональные различия

  • База данных Oracle

    • Можно использовать операторы MERGE.

  • Tantor SE

    • Невозможно использовать операторы MERGE.

Процедура миграции

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

  1. Используйте оператор INSERT для указания ключевого слова INSERT, которое следует за WHEN NOT MATCHED THEN в операторе MERGE.

  2. Используйте оператор SELECT после добавленных строк в шаге 1, чтобы указать оператор SELECT, который следует за оператором USING в операторе MERGE.

  3. Используйте 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.

Процедура миграции

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

  1. Используйте оператор SELECT в запросе WITH для указания оператора SELECT, который следует за оператором USING в операторе MERGE.

  2. Используйте оператор UPDATE в запросе WITH для указания ключевого слова UPDATE, которое следует за WHEN MATCHED THEN в операторе MERGE.

  3. Укажите ключевое слово INSERT, которое следует за оператором WHEN NOT MATCHED THEN в операторе MERGE, как оператор INSERT, следующий за запросом WITH.

  4. Укажите 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.39.5. Изменение индексов

Description

Инструкция ALTER INDEX изменяет определение индекса.

F.29.39.5.1. Перестройка индекса

Функциональные различия

  • База данных Oracle

    • В операторе ALTER INDEX можно указать опцию REBUILD, чтобы перестроить индекс.

  • Tantor SE

    • ПРЕДЛОЖЕНИЕ REBUILD не может быть указано в операторе ALTER INDEX. Вместо этого используйте оператор REINDEX.

Процедура миграции

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

  1. Поиск ключевых слов ALTER и INDEX и определение их использования.

  2. Если указано ключевое слово REBUILD, замените оператор ALTER INDEX оператором REINDEX.

Пример миграции

Приведенный ниже пример показывает миграцию при перестроении индекса.

База данных Oracle Tantor SE
ALTER INDEX idx REBUILD;
REINDEX INDEX idx;
F.29.39.5.2. Перестройка индекса, где указано табличное пространство

Функциональные различия

  • База данных Oracle

    • В THEN REBUILD можно указать табличнoe пространствo.

  • Tantor SE

    • ПРЕДЛОЖЕНИЕ REBUILD не может быть использовано.

Процедура миграции

Оператор REBUILD для перестройки индекса заменяется оператором REINDEX, но в этом операторе нельзя указать табличное пространство. Поэтому переместите табличное пространство перед выполнением перестройки индекса. Используйте следующую процедуру для выполнения миграции:

  1. Поиск ключевых слов ALTER и INDEX и определение их использования.

  2. Если указаны и REBUILD, и TABLESPACE, замените REBUILD в операторе ALTER INDEX на SET.

  3. Добавьте оператор REINDEX после оператора ALTER INDEX.

Пример миграции

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

База данных Oracle Tantor SE
ALTER INDEX idx REBUILD TABLESPACE tablespace1;
ALTER INDEX idx SET TABLESPACE tablespace1; 
 REINDEX INDEX idx;
F.29.39.5.3. Перестройка индекса с указанием процента свободного пространства

Функциональные различия

  • База данных Oracle

    • PCTFREE может быть указано в предложении REBUILD для определения процента свободного пространства для индекса.

  • Tantor SE

    • ПРЕДЛОЖЕНИЕ REBUILD не может быть использовано.

Процедура миграции

Оператор REBUILD для реструктуризации индекса заменяется оператором REINDEX, но в этом операторе нельзя указать процент свободного пространства. Поэтому измените коэффициент использования индекса так, чтобы получить эквивалентный результат. Затем выполните реструктуризацию индекса. Используйте следующую процедуру для выполнения миграции:

  1. Поиск ключевых слов ALTER и INDEX и определение их использования.

  2. Если указаны и ключевое слово REBUILD, и ключевое слово PCTFREE, замените ключевое слово REBUILD на ключевое слово SET и измените PCTFREE на FILLFACTOR. В качестве значения SET используйте 100 - значение, указанное в PCTFREE.

  3. Добавьте оператор REINDEX после оператора ALTER INDEX.

Пример миграции

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

База данных Oracle Tantor SE
ALTER INDEX idx REBUILD PCTFREE 10;
ALTER INDEX idx SET (FILLFACTOR=90); 
 REINDEX INDEX idx;

F.29.39.6. Изменение сессии Statements

Description

Оператор ALTER SESSION определяет и изменяет параметры для каждой сессии.

F.29.39.6.2. Изменение параметров инициализации

Функциональные различия

  • База данных Oracle

    • Инструкция ALTER SESSION используется для изменения параметров инициализации.

  • Tantor SE

    • Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте оператор SET для изменения параметров сервера.

Процедура миграции

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

  1. Поиск ключевых слов ALTER и SESSION и определение их использования.

  2. Замените оператор 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.39.6.3. Установка характеристик транзакции

Функциональные различия

  • База данных Oracle

    • Инструкция ALTER SESSION используется для установки характеристик транзакции.

  • Tantor SE

    • Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте оператор SET TRANSACTION.

Процедура миграции

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

  1. Поиск ключевых слов ALTER и SESSION и определение их использования.

  2. Если указано SET ISOLATION_LEVEL, замените оператор ALTER SESSION оператором SET TRANSACTION.

Пример миграции

Приведенный ниже пример показывает миграцию при установке характеристик транзакции.

База данных Oracle Tantor SE
ALTER SESSION SET
 ISOLATION_LEVEL = SERIALIZABLE;
SET TRANSACTION 
 ISOLATION LEVEL SERIALIZABLE;
F.29.39.6.4. Перенос настройки часового пояса

Функциональные различия

  • База данных Oracle

    • Используется оператор ALTER SESSION для установки часового пояса.

  • Tantor SE

    • Операторы ALTER SESSION не могут быть использованы. Вместо этого используйте оператор SET.

Процедура миграции

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

  1. Поиск ключевых слов ALTER и SESSION и определение их использования.

  2. Если указано 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.39.7. Операторы GRANT

Description

Оператор GRANT определяет привилегии доступа.

F.29.39.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.39.7.2. Предоставление системных привилегий
F.29.39.7.2.1. Предоставление привилегий для пользователей операционной системы и ролей

Функциональные различия

  • База данных Oracle

    • Оператор GRANT используется для предоставления привилегий на создание и изменение пользователей и ролей.

  • Tantor SE

    • Оператор GRANT не может использоваться для предоставления привилегий на создание и изменение пользователей и ролей. Вместо этого используйте оператор ALTER ROLE.

Процедура миграции

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

  1. Поиск ключевого слова GRANT и определение его использования.

  2. Если предоставлены привилегии на создание и изменение пользователей и ролей, замените оператор 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.39.7.3. Предоставление привилегий для создания объектов

Функциональные различия

  • База данных Oracle

    • Оператор GRANT используется для предоставления привилегий на создание объекта.

  • Tantor SE

    • Оператор GRANT используется для предоставления привилегий на создание объектов для схемы или базы данных.

Процедура миграции

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

  1. Поиск ключевого слова GRANT и определение его использования.

  2. Если привилегии на создание предоставляются для каждого объекта, замените оператор 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.39.7.3.1. Предоставление ролей (с установкой пароля)

Функциональные различия

  • База данных Oracle

    • Когда используется оператор GRANT для назначения пользователя роли, пароль может быть установлен одновременно.

  • Tantor SE

    • Когда используется оператор GRANT для назначения пользователя роли, пароль не может быть установлен одновременно.

Процедура миграции

Чтобы установить пароль, вы должны указать отдельный оператор CREATE USER или ALTER USER и установить пароль в этом операторе. Используйте следующую процедуру для выполнения миграции:

  1. Поиск ключевого слова GRANT и определение его использования.

  2. Если указано предложение IDENTIFIED BY, проверьте, существует ли целевой пользователь.

  3. Если пользователь существует, используйте оператор ALTER USER для изменения пароля. Если пользователь не существует, используйте оператор CREATE USER для создания нового пользователя и установки пароля.

  4. Удалите предложение, относящееся к предоставлению пароля, из оператора GRANT.

Пример миграции

Приведенный ниже пример показывает миграцию, когда роль role1 предоставляется пользователю user1.

База данных Oracle Tantor SE
GRANT role1 TO user1 IDENTIFIED BY PASSWORD;
 CREATE USER user1 PASSWORD 'PASSWORD'; 
 GRANT role1 TO user1;
F.29.39.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.40. Миграция: Глава 5 Миграция PL/SQL

В этой главе объясняется, как осуществить миграцию базы данных Oracle PL/SQL. Обратите внимание, что в этом документе под PL/SQL подразумевается язык, который будет мигрирован в Tantor SE PL/pgSQL.

F.29.40.1. Примечания по миграции с PL/SQL на PL/pgSQL

В этом разделе приведены заметки о миграции из PL/SQL в PL/pgSQL.

F.29.40.1.1. Управление транзакциями

PL/pgSQL не позволяет управлять транзакциями внутри процесса. Завершите процедуру, когда транзакция завершается в базе данных Oracle и выполните оператор управления транзакциями из приложения.

F.29.40.2. Основные элементы

В этом разделе объясняется, как осуществить миграцию базовых элементов PL/SQL.

F.29.40.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.40.3. Перенос функций

Этот раздел объясняет, как перенести функции PL/SQL.

Description

Хранимая функция - это пользовательская функция, которая возвращает значение.

F.29.40.3.1. Определение функций

Функциональные различия

  • База данных Oracle

    • Предложение RETURN внутри прототипа функции указывается как RETURN.
      DECLARE не нужно указывать как часть определения переменной, используемой внутри функции.

  • Tantor SE

    • Используйте RETURNS для указания предложения RETURN в прототипе функции.
      DECLARE должен быть указан как определение переменной, которая будет использоваться в функции.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и FUNCTION и определите, где создаются пользовательские функции.

  2. Если в аргументе указан квалификатор IN или OUT, переместите его в начало параметров.

  3. Измените RETURN в прототипе функции на RETURNS.

  4. Измените предложение AS на AS $$. (Если ключевое слово IS, измените его на AS).

  5. Если переменная определена, добавьте ключевое слово DECLARE после $$.

  6. Удалите конечный слэш (/) и укажите $$ и предложение 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.40.4. Перенос процедур

Этот раздел объясняет, как перенести процедуры PL/SQL.

Description

Хранимая процедура - это одиночная процедура, в которую были сгруппированы несколько процессов.

F.29.40.4.1. Определение процедур

Функциональные различия

  • База данных Oracle

    • Процедуры могут быть созданы.

  • Tantor SE

    • Процедуры не могут быть созданы.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и PROCEDURE и определите, где определена процедура.

  2. Замените оператор CREATE PROCEDURE оператором CREATE FUNCTION.

  3. Измените предложение AS на RETURNS VOID AS $$. (Если ключевое слово IS, измените его на AS).

  4. Если переменная определена, добавьте ключевое слово DECLARE после $$.

  5. Удалите конечный слэш (/) и укажите $$ и предложение 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.40.4.2. Вызов процедур

Функциональные различия

  • База данных Oracle

    • Процедуру можно вызывать как оператор.

  • Tantor SE

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

Процедура миграции

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

  1. Определите, где вызывается каждая процедура.

  2. Укажите 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.40.4.3. Определение процедур, возвращающих значение

Функциональные различия

  • База данных Oracle

    • Можно создавать процедуры, которые возвращают значение.

  • Tantor SE

    • Процедуры, возвращающие значение, не могут быть созданы.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и PROCEDURE и определите, где определена процедура.

  2. Подтвердите, что в аргументах указаны ключевые слова OUT или INOUT.

  3. Замените оператор CREATE PROCEDURE оператором CREATE FUNCTION.

  4. Если в аргументах указаны ключевые слова IN, OUT или INOUT, переместите их в начало аргументов.

  5. Измените предложение AS на AS $$. (Если ключевое слово IS, измените его на AS).

  6. Если переменная определена, добавьте ключевое слово DECLARE после $$.

  7. Удалите конечный слэш (/) и укажите $$ и предложение LANGUAGE.

  8. Если вызывается функция, вызывайте ее без указания аргументов в параметре 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.40.4.4. Определение вложенных процедур

Функциональные различия

  • База данных Oracle

    • Можно определить вложенные процедуры.

  • Tantor SE

    • Вложенные процедуры не могут быть определены.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и PROCEDURE и определите, где определена процедура.

  2. Если оператор PROCEDURE определен в блоке DECLARE, считайте его вложенной процедурой.

  3. Проверьте переменные, которые используются как процедурой, так и вложенной процедурой.

  4. Замените вложенную процедуру (от PROCEDURE procedureName до END procedureName;) на оператор CREATE FUNCTION. Укажите переменные, найденные на шаге 3, в аргументе INOUT оператора CREATE FUNCTION.

  5. Замените часть, которая вызывает вложенную процедуру, на оператор 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.40.4.5. Определение анонимных блоков кода

Description

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

Функциональные различия

  • База данных Oracle

    • Анонимные блоки кода, заключенные в (DECLARE) BEGIN и END, могут быть выполнены.

  • Tantor SE

    • Блоки PL/pgSQL ((DECLARE) от BEGIN до END), которые заключены в DO
      могут
      быть выполнены.

Процедура миграции

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

  1. Ищите ключевые слова DECLARE и BEGIN и определите, где определен анонимный блок кода.

  2. Укажите DO $$ в начале анонимного блока кода.

  3. Удалите конечный слэш (/) и укажите $$.

Пример миграции

Приведенный ниже пример показывает миграцию, когда определен анонимный блок кода.

База данных 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.40.5. Перенос пакетов

Этот раздел объясняет, как перенести пакеты PL/SQL.

Description

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

Функциональные различия

  • База данных Oracle

    • Пакеты могут быть созданы.

  • Tantor SE

    • Пакеты не могут быть созданы.

Пакеты не могут быть созданы в Tantor SE, поэтому определите схему с тем же именем, что и пакет, и определите функции, которые имеют отношение в схеме, чтобы они рассматривались как единая группа. В следующих разделах объясняется процедура миграции для каждой функции, которую нужно определить в пакете.

F.29.40.5.1. Определение функций внутри пакета

Функциональные различия

  • База данных Oracle

    • Функции могут быть созданы внутри пакета.

  • Tantor SE

    • Пакет сам по себе не может быть создан.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и PACKAGE и определите, где они определены.

  2. Определите схему с тем же именем, что и пакет.

  3. Если в операторе 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.40.5.2. Определение процедур внутри пакета

Функциональные различия

  • База данных Oracle

    • Процедуры могут быть созданы внутри пакета.

  • Tantor SE

    • Пакет сам по себе не может быть создан.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и PACKAGE и определите, где они определены.

  2. Определите схему с тем же именем, что и пакет.

  3. Если в операторе 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.40.5.3. Обмен переменными внутри пакета

Функциональные различия

  • База данных Oracle

    • Переменные могут быть общими внутри пакета.

  • Tantor SE

    • Пакет не может быть создан, поэтому переменные не могут быть общими.

Процедура миграции

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

  1. Ищите ключевые слова CREATE и PACKAGE и определите, где они определены.

  2. Проверка наличия переменных, определенных непосредственно в пакете.

  3. Создайте временную таблицу, которая определяет переменные, проверяемые в шаге 2, в столбце.

  4. Вставьте одну запись во временную таблицу, созданную на шаге 3. (Установите значение, указанное внутри пакета, в качестве начального значения).

  5. Замените соответствующие части, которые ссылается на переменную и установите переменную с помощью 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.41. Миграция: Глава 6 Примечания по использованию orafce

Эта глава содержит заметки об использовании функций совместимости с базой данных Oracle, добавленных с помощью orafce.

F.29.41.1. Типы данных

В этом разделе объясняется, как перенести типы данных, добавленные с помощью orafce.

F.29.41.1.1. Примечания о VARCHAR2

Этот раздел содержит заметки о типе данных VARCHAR2.

F.29.41.1.1.1. Указание максимального числа байтов и максимального числа символов

Функциональные различия

  • База данных Oracle

    • Указание ключевого слова BYTE или CHAR после размера позволяет указать размер в терминах максимального количества байтов или максимального количества символов.

  • Tantor SE

    • Ключевое слово BYTE или CHAR не может быть установлено после размера.

Процедура миграции

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

  1. Ищите ключевое слово VARCHAR2 и проверьте, указано ли ключевое слово BYTE или CHAR после размера.

  2. Если указано ключевое слово BYTE, удалите его.

  3. Если указано ключевое слово 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.41.2. Функции

В этом разделе объясняется, как перенести функции, добавленные с помощью orafce.

F.29.41.2.1. INSTRB

Description

INSTRB ищет подстроку в строке и возвращает начальную позицию (в байтах) первого появления подстроки. ##### 6.2.1.1 Получение начальной позиции подстроки (в байтах) Функциональные различия

  • База данных Oracle

    • INSTRB ищет подстроку в строке и возвращает начальную позицию (в байтах) подстроки.

  • Tantor SE

    • Нет функции INSTRB. Вместо нее используйте STRPOSB. STRPOSB уникальна для orafce.

Процедура миграции

Используйте следующую процедуру для миграции на STRPOSB:

  1. Ищите ключевое слово INSTRB и определите, где оно используется.

  2. Подтвердите, что аргументы до второго аргумента указаны.

  3. Измените 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.52. STRPOSB

STRPOSB

Общие правила

  • STRPOSB ищет строку str2 в строке str1 и возвращает позицию начала, которую он находит в байтах.

  • Если str2 не найден, возвращается 0.

  • Тип возвращаемого значения - INTEGER.

F.29.41.2.1.1. Получение начальной позиции подстроки из указанной начальной позиции поиска (в байтах)

Функциональные различия

  • База данных Oracle

    • Позиция начала поиска указывается в третьем аргументе INSTRB.

  • Tantor SE

    • Начальная позиция поиска не может быть указана с помощью STRPOSB.

Процедура миграции

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

  1. Поиск ключевого слова INSTRB и определение его использования.

  2. Подтвердите, что указаны аргументы до третьего аргумента и что указано положительное число.

  3. Окружите строку, указанную в первом аргументе, с помощью SUBSTRB и укажите значение, указанное в третьем аргументе INSTRB, в качестве второго аргумента SUBSTRB.

  4. Измените INSTRB на STRPOSB и удалите значение, указанное в третьем аргументе.

  5. Оберните функцию в простое выражение 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.41.2.2. INSTRC, INSTR2 и INSTR4

Description

INSTRC, INSTR2 и INSTR4 возвращают начальную позицию подстроки в строке с использованием соответствующей кодировки.

Функциональные различия

  • База данных Oracle

    • INSTRC, INSTR2 и INSTR4 используют соответствующую кодировку для поиска подстроки в строке с указанной позиции и затем возвращают начальную позицию подстроки.

  • Tantor SE

    • Функций INSTRC, INSTR2 и INSTR4 не существует. Только кодировка Unicode используется в Tantor SE.

Процедура миграции

Используйте следующую процедуру для миграции на INSTR:

  1. Ищите ключевые слова INSTRC, INSTR2 и INSTR4 и определите, где они используются.

  2. Измените эти ключевые слова на 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.41.2.3. LENGTHC, LENGTH2 и LENGTH4

Description

LENGTHC, LENGTH2 и LENGTH4 используют соответствующую кодировку для возврата длины указанной строки.

Функциональные различия

  • База данных Oracle

    • LENGTHC, LENGTH2 и LENGTH4 используют соответствующую кодировку для возврата длины указанной строки.

  • Tantor SE

    • Функций LENGTHC, LENGTH2 и LENGTH4 не существует. Только кодировка Unicode используется в Tantor SE.

Процедура миграции

Используйте следующую процедуру для миграции на LENGTH:

  1. Поиск ключевых слов LENGTHC, LENGTH2 и LENGTH4 и определение их использования.

  2. Измените эти ключевые слова на 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.41.2.4. LISTAGG

Description

LISTAGG возвращает объединенный, разделенный список строковых значений.

F.29.41.2.4.1. Указание последовательности соединения для списка

Функциональные различия

  • База данных Oracle

    • Последовательность соединения для списка указывается с помощью WITHIN GROUP(ORDER BY).

  • Tantor SE

    • WITHIN GROUP(ORDER BY) не может быть использовано. Вместо этого, последовательность соединения может быть указана с использованием ORDER BY непосредственно после значения.

Процедура миграции

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

  1. Поиск ключевого слова LISTAGG и подтверждение его использования.

  2. Переместите предложение 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.41.2.4.2. Указание последовательности соединения для списка в группе (Оконные функции)

Функциональные различия

  • База данных Oracle

    • Последовательность соединения для списка на группу указывается с помощью WITHIN GROUP(ORDER BY) OVER(PARTITION BY).

  • Tantor SE

    • Последовательность соединения для списка на группу не может быть указана.

Процедура миграции

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

  1. Ищите ключевые слова LISTAGG и OVER и определите, где используется предложение OVER в LISTAGG.

  2. Преобразуйте таблицу в предложении FROM в подзапрос и переместите предложение ORDER BY WITHIN GROUP(ORDER BY) в подзапрос.

  3. Удалить 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.41.2.5. NLSSORT

Description

NLSSORT возвращает двоичное значение, которое обозначает лексический порядок локали (COLLATE).

F.29.41.2.5.1. Сортировка по указанной локали

Функциональные различия

  • База данных Oracle

    • Локаль указывается с помощью NLS_SORT=locale.
      Задаваемые локали предоставляются базой данных Oracle.

  • Tantor SE

    • Локаль указывается с помощью locale.
      Задаваемые локали зависят от операционной системы.

Процедура миграции

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

  1. Поиск ключевого слова NLSSORT и определение его использования.

  2. Удалите 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.41.2.5.2. Сортировка по набору символов

Функциональные различия

  • База данных Oracle

    • NLS_SORT=BINARY указывается в локализационной спецификации для сортировки по набору символов.

  • Tantor SE

    • C указывается в спецификации локали для сортировки по набору символов.

Процедура миграции

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

  1. Поиск ключевого слова NLSSORT и определение его использования.

  2. Если для локали указано 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.41.2.5.3. Сортировка без учета регистра

Функциональные различия

  • База данных Oracle

    • Указание _CI в конце локали устанавливает регистронезависимую сортировку.

  • Tantor SE

    • _CI не может быть указано в конце локали.

Процедура миграции

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

  1. Поиск ключевого слова NLSSORT и определение его использования.

  2. Если в конце указанной локали указано _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.41.2.6. SUBSTRC, SUBSTR2 и SUBSTR4

Description

SUBSTRC, SUBSTR2 и SUBSTR4 извлекают часть строки в символьной единице соответствующей кодировки.

Функциональные различия

  • База данных Oracle

    • SUBSTRC, SUBSTR2 и SUBSTR4 извлекают часть строки в символьной единице соответствующей кодировке.

  • Tantor SE

    • Функций SUBSTRC, SUBSTR2 и SUBSTR4 не существует. Используется только кодировка Unicode в Tantor SE.

Процедура миграции

Используйте следующую процедуру для миграции на SUBSTR:

  1. Ищите ключевые слова SUBSTRC, SUBSTR2 и SUBSTR4 и определите, где они используются.

  2. Измените эти ключевые слова на 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.41.2.7. SUBSTRB

Description

SUBSTRB извлекает часть строки в байтах.

F.29.41.2.7.1. Указание нуля в качестве начальной позиции

Функциональные различия

  • База данных Oracle

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

  • Tantor SE

    • Если в качестве начальной позиции указано 0, извлечение начинается с позиции, найденной путем вычитания 1 из начальной позиции и сдвига на это количество позиций влево.

Процедура миграции

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

  1. Поиск ключевого слова SUBSTRB и определение его использования.

  2. Если в качестве начальной позиции указано 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.41.2.7.2. Указание отрицательного значения в качестве начальной позиции

Функциональные различия

  • База данных Oracle

    • Если указано отрицательное значение в качестве начальной позиции, извлечение начинается с позиции, найденной путем подсчета на это число байт после конца строки.

  • Tantor SE

    • Если указано отрицательное значение в качестве начальной позиции, извлечение начинается с позиции, найденной путем вычитания 1 из начальной позиции и сдвига на это количество позиций влево.

Процедура миграции

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

  1. Поиск ключевого слова SUBSTRB и определение его использования.

  2. Если указано отрицательное значение в качестве начальной позиции, добавьте (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.41.2.7.3. Указание значения меньше единицы в качестве длины строки

Функциональные различия

  • База данных Oracle

    • Если указано значение меньше 1 в качестве длины строки, возвращается NULL.

  • Tantor SE

    • Если длина строки равна 0, возвращается нулевой символ. Отрицательное значение не может быть указано в качестве длины строки.

Процедура миграции

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

  • Когда ожидается NULL в качестве возвращаемого значения

    1. Ищите ключевое слово SUBSTRB и определите, где оно используется.

    2. Подтвердите, что в параметре длины строки указано значение меньше 1.

    3. Измените длину строки на NULL.

  • Когда ожидается нулевой символ в качестве возвращаемого значения

    1. Ищите ключевое слово SUBSTRB и определите, где оно используется.

    2. Подтвердите, что в параметре длины строки указано значение меньше 1.

    3. Если указано значение меньше 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.41.2.8. TO_CHAR и TO_DATE

Description

TO_CHAR и TO_DATE преобразуют указанное значение в соответствии с форматом.

F.29.41.2.8.1. Когда указана только часть формата даты и времени TO_DATE

Функциональные различия

  • База данных Oracle

    • Если указана только часть формата даты и времени TO_DATE, прне указанная часть устанавливается автоматически, с годом, установленным на текущий год, месяцем, установленным на текущий месяц, днем, установленным на 1, и часом, минутой и секундой, установленными на 0.

  • Tantor SE

    • Если указана только часть формата даты и времени TO_DATE, прне указанная часть устанавливается автоматически, с годом, месяцем и днем, установленными в 1, а часом, минутой и секундой - в 0.

Процедура миграции

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

  1. Ищите ключевое слово TO_DATE и убедитесь, что год или месяц не указаны в формате даты и времени.

  2. Используйте DATE_TRUNC для определения года. Если год не указан, уточните SYSDATE, чтобы получить текущий год.

  3. Умножьте результат функции DATE_PART на один месяц, указанный в типе INTERVAL, чтобы найти месяц. Если месяц не указан, укажите SYSDATE, чтобы получить текущий месяц.

  4. Добавьте результаты, найденные в шагах 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.41.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.

Процедура миграции

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

  1. Ищите ключевые слова TO_DATE и TO_CHAR и проверьте, где прне указан формат типа данных (формат даты и времени).

  2. Проверьте настройки параметра NLS_DATE_FORMAT.

  3. В 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.41.2.8.3. Установка локали формата типа данных (Установка третьего аргумента)

Функциональные различия

  • База данных Oracle

    • Третий аргумент (настройка формата локали для типа данных) может быть указан.

  • Tantor SE

    • Третий аргумент (настройка формата локали для типа данных) не может быть указан.

Процедура миграции

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

  1. Ищите ключевые слова TO_CHAR и TO_DATE и определите, где они используются.

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

  3. Удалите третий аргумент, указанный в 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.41.2.9. Функции, требующие скобок

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

  • SYSDATE

  • SESSIONTIMEZONE

  • DBTIMEZONE

Пример миграции

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

База данных Oracle Tantor SE
 SELECT SYSDATE FROM DUAL;
 SELECT SYSDATE() FROM DUAL;

F.29.41.3. Стандартные пакеты

В этом разделе объясняется, как перенести стандартные пакеты, добавленные с помощью orafce.

F.29.41.3.1. DBMS_ALERT

Description

Пакет DBMS_ALERT отправляет оповещения из сессии выполнения PL/pgSQL в несколько других сессий выполнения PL/pgSQL.

F.29.41.3.1.1. Установить значение DBMS_ALERT.REGISTER

Функциональные различия

  • База данных Oracle

    • Второй аргумент DBMS_ALERT.REGISTER может быть указан. Второй аргумент определяет, следует ли выполнить очистку используемого канала.
      По умолчанию установлено значение TRUE, что вызывает выполнение очистки.

  • Tantor SE

    • Второй аргумент не может быть указан.

Процедура миграции

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

  1. Поиск ключевого слова DBMS_ALERT.REGISTER и определение его использования.

  2. Если указан второй аргумент, удалите его.

Пример миграции

Приведенный ниже пример показывает миграцию, когда в DBMS_ALERT.REGISTER указан второй аргумент.

База данных Oracle Tantor SE
 DBMS_ALERT.REGISTER( 'SAMPLEALERT', TRUE );
 PERFORM DBMS_ALERT.REGISTER( 'SAMPLEALERT' );
F.29.41.3.1.2. Регистрозависимость имен предупреждений

Функциональные различия

  • База данных Oracle

    • Имена предупреждений не чувствительны к регистру.

  • Tantor SE

    • Имена предупреждений чувствительны к регистру.

Процедура миграции

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

  1. Поиск ключевых слов DBMS_ALERT.REGISTER, DBMS_ALERT.SIGNAL, DBMS_ALERT.WAITONE и DBMS_ALERT.REMOVE и определение их использования.

  2. Если имена предупреждений написаны в разных регистрах (заглавные и строчные буквы), измените их на одинаковый регистр.

Пример миграции

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

База данных 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.41.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.41.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.41.3.2. DBMS_ASSERT

Description

Пакет DBMS_ASSERT проверяет и нормализует элементы синтаксиса SQL.

F.29.41.3.2.1. DBMS_ASSERT.ENQUOTE_LITERAL

Функциональные различия

  • База данных Oracle

    • Если строка в аргументе уже заключена в апострофы, она не заключается в апострофы снова.

  • Tantor SE

    • Даже если строка в аргументе уже заключена в апострофы, она снова заключается в апострофы.

Процедура миграции

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

  1. Поиск ключевого слова DBMS_ASSERT.ENQUOTE_LITERAL и определение его использования.

  2. В условиях оператора IF используйте LEFT и RIGHT для проверки ведущих и завершающих символов.

  3. Если каждый результат не соответствует одной кавычке (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.41.3.2.2. DBMS_ASSERT.ENQUOTE_NAME

Функциональные различия

  • База данных Oracle

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

  • Tantor SE

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

Процедура миграции

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

  1. Поиск ключевого слова DBMS_ASSERT.ENQUOTE_NAME и определение его использования.

  2. В условиях оператора IF используйте LEFT и RIGHT для проверки ведущих и завершающих символов.

  3. Если каждый результат не соответствует двойной кавычке (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.41.3.2.3. DBMS_ASSERT.SIMPLE_SQL_NAME

Функциональные различия

  • База данных Oracle

    • Если в начале или конце строки в аргументе присутствует пробел, пробел удаляется перед вычислением строки.

  • Tantor SE

    • Если в начале или в конце строки в аргументе содержится пробел, то строка оценивается как есть, что вызывает ошибку.

Процедура миграции

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

  1. Поиск ключевого слова DBMS_ASSERT.SIMPLE_SQL_NAME и определение его использования.

  2. Если в начале или конце строки в аргументе содержится пробел, используйте 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.41.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.

Процедура миграции

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

  1. Поиск ключевого слова DBMS_ASSERT.SQL_OBJECT_NAME и определение его использования.

  2. Измените 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.41.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.41.3.3. DBMS_OUTPUT

Description

Пакет DBMS_OUTPUT отправляет сообщения из PL/pgSQL клиентам, таким как psql.

F.29.41.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.41.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.41.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.41.3.4. DBMS_PIPE

Description

Пакет DBMS_PIPE обеспечивает одно-к-одному взаимодействию между сессиями PL/pgSQL.

F.29.41.3.4.1. Различия с определением DBMS_PIPE.CREATE_PIPE

Функциональные различия

  • База данных Oracle

    • Второй аргумент указывает максимальный размер канала в байтах. По умолчанию это 8192 байта.
      Третий аргумент определяет тип канала. По умолчанию это TRUE (частный канал).

  • Tantor SE

    • Второй аргумент указывает максимальное количество сообщений, которое может содержать канал. Значение по умолчанию - 0. Диапазон задаваемых числовых значений составляет от 1 до 32767.
      Третий аргумент указывает тип канала. Значение по умолчанию - FALSE (общедоступный канал).

Процедура миграции

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

  1. Поиск ключевого слова DBMS_PIPE.CREATE_PIPE и определение его использования.

  2. Измените код так, чтобы максимальное количество сообщений было указано во втором аргументе.

  3. Если третий аргумент не указан и требуется создать частный канал, укажите 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.41.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 оба не возвращают значения.

Процедура миграции

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

  1. Ищите ключевые слова DBMS_PIPE.CREATE_PIPE и DBMS_PIPE.REMOVE_PIPE и определите, где они используются.

  2. Измените код так, чтобы обработка вызова, идентифицированная в шаге 1, вызывалась с помощью ключевого слова PERFORM.

  3. Если используются возвращаемые значения, замените целевую обработку на 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.41.3.4.3. Создание того же имени канала с помощью DBMS_PIPE.CREATE_PIPE

Функциональные различия

  • База данных Oracle

    • Если уже существует и может быть использован канал с таким же именем, DBMS_PIPE.CREATE_PIPE возвращает нормальное значение.

  • Tantor SE

    • Если канал с таким же именем уже существует, DBMS_PIPE.CREATE_PIPE возвращает ошибку.

Процедура миграции

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

  1. Поиск ключевого слова CREATE_PIPE и определение его использования.

  2. Если может быть канал с тем же именем, используйте оператор PERFORM, показанный ниже, чтобы проверить, существует ли такой же канал.

  3. Если 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.41.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

Процедура миграции

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

  1. Ищите ключевое слово NEXT_ITEM_TYPE и определите переменную, хранящую возвращаемое значение NEXT_ITEM_TYPE.

  2. Если определено возвращаемое значение 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.41.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 для получения сообщения.

Процедура миграции

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

  1. Ищите ключевое слово UNPACK_MESSAGE и определите, где используется UNPACK_MESSAGE.

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

Пример миграции

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

База данных Oracle Tantor SE
DBMS_PIPE.UNPACK_MESSAGE( testnum );
 testnum := 
     DBMS_PIPE.UNPACK_MESSAGE_NUMBER();
F.29.41.3.4.6. Чувствительность к регистру DBMS_PIPE.RECEIVE_MESSAGE и SEND_MESSAGE

Функциональные различия

  • База данных Oracle

    • Имена каналов регистронезависимы.

  • Tantor SE

    • Имена каналов чувствительны к регистру.

Процедура миграции

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

  1. Ищите ключевые слова RECEIVE_MESSAGE и SEND_MESSAGE и проверьте имена каналов.

  2. Если в именах каналов присутствуют символы в разных регистрах (заглавные и строчные), измените их на одинаковый регистр.

Пример миграции

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

База данных 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.41.3.4.7. Различия в функционале DBMS_PIPE.SEND_MESSAGE

Функциональные различия

  • База данных Oracle

    • Третий аргумент указывает максимальный размер канала в байтах. По умолчанию это 8192 байта.

  • Tantor SE

    • Третий аргумент указывает максимальное количество сообщений, которое может содержать канал.
      Диапазон задаваемых числовых значений составляет от 1 до 32767.
      Обратите внимание, что если максимальное количество сообщений не указано для неявного канала, то число сообщений не ограничено.

Процедура миграции

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

  1. Ищите ключевое слово SEND_MESSAGE и определите, где указано максимальное количество байтов.

  2. Замените максимальное количество байтов на максимальное количество сообщений.

Пример миграции

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

База данных Oracle Tantor SE
 DBMS_PIPE.SEND_MESSAGE( 'testPIPE', 10, 200 );
 DBMS_PIPE.SEND_MESSAGE( 'testPIPE', 10, 10 );

F.29.41.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.41.4.1. UTL_FILE

Description

Пакет UTL_FILE позволяет PL/pgSQL читать и записывать текстовые файлы.

F.29.41.4.1.1. Добавление новой строки при закрытии файла

Функциональные различия

  • База данных Oracle

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

  • Tantor SE

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

Процедура миграции

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

  1. Поиск ключевых слов UTL_FILE.FCLOSE и UTL_FILE.FCLOSE_ALL и определение их использования.

  2. Если 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.41.4.1.2. Обработка исключений UTL_FILE

Функциональные различия

  • База данных Oracle

    • Есть определения исключений для пакета UTL_FILE. Они могут быть использованы для определения исключений в блоке EXCEPTION.

  • Tantor SE

    • В пакете UTL_FILE нет определений исключений.

Процедура миграции

Для пакета UTL_FILE не определены исключения, поэтому, если они используются для определения исключений в предложении EXCEPTION, замените их на коды ошибок Tantor SE. Используйте следующую процедуру для выполнения миграции:

  1. Ищите ключевое слово UTL_FILE и проверьте, указано ли исключение в целевом PL/SQL.

  2. Если используется исключение 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.41.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.41.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.42. Приложение А Соответствие с базами данных Oracle

В этом приложении приведены пояснения по соответствию между базами данных Tantor SE и Oracle.

F.29.42.1. A.1 Подсказки предложений

Description

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

F.29.42.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.42.2. A.2 Динамические представления производительности

Description

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

F.29.42.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.42.3. A.3 Форматы

Description

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

F.29.42.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.42.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)