четверг, 10 ноября 2016 г.

Расширения функционала Oracle 12R2 (12.2) которые показались мне наиболее интересными.


Добавлена PL/SQL  pragma для пометки устаревших программных единиц.

Не обновленные материализованные представления могут быть  использованы в query rewrite для получения корректного результата используя materialized view logs.

К событиям обновления материализванного представления ON COMMIT и ON DEMAND добавлено событие ON STATEMENT.

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

Максимальная длина идентификаторов увеличена до 128 байт для большинства идентификаторов, по сравнению с 30 байтами в предыдущих версиях.

Начало поддержки sharding в not managed driver ODP.NET

JDBC полностью поддерживает JDK 8 и стандарт JDBC 4.2

OJVM поддерживает Java SE 8

Вы можете выполнить JavaScript в базе данных, используя движок Nashorn JavaScript, встроенный в Oracle JVM

Начало поддержки операций с CLOB, BLOB и XMLType через database links.
Fast Application Notification (FAN) позволяет уменьшить объём обработки исключений слоя передачи данных в приложении.

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

Split на лету партиций и субпартиций.

Перенос не паритиционированнй таблицы на лету без блокирования DML.

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

Новая архитектура Oracle Database Sharding для оперативной обработки OLTP в которой данные горизонтально распределены между несколькими дискретными базами данных Oracle не имеющими общего аппаратного и программного обеспечения.  Приложение работает с набором баз данных как с одной логической базой.

Поддержка партиционирования внешних таблиц. Поддержка декларативных ограничений целостности для внешних таблиц.

Аналитические представления/

dbms_stat стал работать с внешними таблицами и In-Memory полями таблиц.

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

NFS сервер в базе данных.

Ограничение лимита операций ввода вывода на уровня монтируемой базы.

Монтируемые базы теперь могут иметь различные character set в нутри одной контейнерной базы (CDB).

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

Возможность распараллеливания (указания степени паралелизма) при создании монтируемой базы из seed PDB.

Возможность копирования монтируемой базы данных без перевода базы источника в режим только для чтения, если база источник в режиме archivelog. База источник во время копирования является полностью работоспособной.

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

Возможность отката состояния монтируемой базы данных с помощью FLASHBACK DATABASE.

Увеличено максимальное количество поддерживаемых монтируемых баз данных в одной контейнерной (CDB) базе до 4098.

Возможность обновления (upgrade) всех монтируемых баз одной операцией.

SQL*Loader, expdp, impdp, exp, и imp теперь являются утилитами instant client.

Поддержка многосимвольных строк в параметрах ENCLOSED_BY, OPTIONALLY_ENCLOSED_BY, и TERMINATED_BY утилиты  SQL*Loader.
Новая утилита командной строки Trace File Analyzer.


четверг, 21 января 2016 г.

Особенности сравнения таблиц из записей %ROWTYPE

Имеем таблицы в двух схемах
create table MESSAGE
(
  message_id        INTEGER not null,
  message_code   VARCHAR2(128) not null,
  message_name  NVARCHAR2(256) not null,
  message_type   VARCHAR2(128) not null,
  message_level   INTEGER not null,
);

И процедуру сравнения содержимого в двух схемах
DECLARE
  TYPE t_m_tbl    IS TABLE OF message%ROWTYPE INDEX BY BINARY_INTEGER;
  v_sql1         CLOB;
  v_sql2         CLOB;
  v_cur1         SYS_REFCURSOR;
  v_cur2         SYS_REFCURSOR;

  v_m_tbl1       t_m_tbl;
  v_m_tbl2       t_m_tbl;
BEGIN
  v_sql1  := 'SELECT t.*
                FROM schema1.message t
              ORDER BY t.message_code';
  v_sql2  := 'SELECT t.*
                FROM schema2.message t
              ORDER BY t.message_code';          
  OPEN v_cur1 FOR v_sql1;
  FETCH v_cur1 BULK COLLECT INTO v_m_tbl1;
 
  OPEN v_cur2 FOR v_sql2;
  FETCH v_cur2 BULK COLLECT INTO v_m_tbl2;

  IF v_m_tbl1.count >0 THEN
    FOR prc_m1 IN v_m_tbl1.first..v_m_tbl1.last LOOP
    .................
    END LOOP;
  END IF;
END;

Если таблицы в разных схемах будут иметь одинаковую структуру но разную последовательность полей то получим ошибку не совместимости типов в строке
  FETCH v_cur1 BULK COLLECT INTO v_m_tbl1;
или
  FETCH v_cur2 BULK COLLECT INTO v_m_tbl2;

проблема решается явным перечислением полей в запросе
вместо t.* указать
t.message_id,
t.message_code,
t.message_name,
t.message_type,
t.message_level