Поиск по этому блогу

среда, 20 апреля 2011 г.

Архитектура DataVault

Основные сущности
Хаб(HUB) -- основные бизнес сущности
-- Список бизнес ключей
-- Суррогатные ключи (внутренние ИД)
-- Временная отметка загрузки
-- Источник данных

Связь(Link) -- Таблицы фактов типа "Многие ко многим" -- Действия
-- Суррогатный ключь
-- Ключи Хаба

-- Временная отметка загрузки
-- Источник данных

Спутник(Satelite) -- Описательные таблицы для хабов (Редкие изминения)
-- Суррогатный ключь
-- Ключи Хаба

-- Временная отметка загрузки
-- Источник данных














четверг, 7 апреля 2011 г.

Неявные курсоры в Oracle


  1. Цикл с неявным курсором
        begin
           for r in (select * from emp) loop
             dbms_output.put_line(sql%rowcount);
           end loop;
        end;
     2.  Передача значений между SQL и PL/SQL
           SELECT base INTO myVar from emp;

Коллекции значений в Pl/SQL на примере таблицы Pl/SQL

Рассмотрим коллекции значений на примере таблицы Pl/SQL, основной особенностью является наличия поля-индекса,по которому можно обратиться к любому элементу по его ключу.

declare
type MyTab is table of varchar2 index by pls_integer;
r MyTab;
begin
r(-100):= "Hello";
r(100):= "Hello World";
r(0):= sysdate;
dbms_output.put_line(r.count);
end;
/

Обход таблицы PL_SQL в цикле:

for w in r.first .. r.last loop
   if r.exists(w) tren
      dbms_output ....
   end if;
end loop;



понедельник, 31 января 2011 г.

Классификация идентификаторов в зависимости от их "Видимости"


  • Идентификатор определен в текущем блоке
  • Идентификатор определен в блоке который родительском блоке
  • Одиночный объект в базе данных (Таблица, представление) или PL/SQL объект в вашей схеме 
  • Одиночный объект в базе данных (Таблица, представление) или PL/SQL объект на который у Вас есть привилегии
  • Индексная переменная цикла

Основные нововведения в PL/SQL в зависимости от версий

ВерсияОсновные отличия
9.1
  • Добавлена поддержка наследования в объектных типах
  • Добавлены табличные функции и курсорные выражения
  • Добавлены многоуровневые коллекции
  • Добавлены выражения CASE
9.2
Основной акцент сделан на поддержку XML, но кроме того появились такие важные вещи как ассоциативные массивы,добавлена возможность производить вставку в таблицу используя данные из записей.Также появился такой мощный пакет как UTL_FILE.
10.1
Для разработчиков главным нововведение является появление предупреждений "Предупреждений времени компиляции"
10.2
Появление синтаксиса для "управления" препроцессором , что дало возможность компиляции части кода в зависимости от логического условия
Появление возможности моделирования: появился диалект Oracle SQL MODEL
11.1 -11.2
  • Опция FORCE с директивой CREATE
  • Функция Кеш результатов(Oracle сохраняет входящие и исходящие значение переменной в отдельном кеше для каждой функции,это значение является общим для всех сессий и не копируется в каждую из них )
  • Выражение CONTINUE, которое определяет условие при котором текущая итерация цикла будет завершена и начнется следующая итерация
  • Поддержка в PL/SQL sequence_name.CURRVAL and sequence_name.NEXTVAL
  • Новые типы данных SIMPLE_INTEGER,SIMPLE_FLOAT,SIMPLE_DOUBLE
  • Поддержка "соединенных тригерров" (compound trigger), что позволяет в одном теле триггера определять в поведение для BEFOE и AFTER,разделяя на отдельные секции

среда, 12 января 2011 г.

Аналитические функции в Oracle. Часть 1

Давайте разберем аналитические функции.
Для начала, тезисно пару слов о самих аналитических функциях:Процесс выполнения запроса в Оракле, содержащий аналитические функции выполняется в 3 этапа
    • Выполняются все соединения(JOIN),условия содержащиеся в WHERE,GROUP BY и HAVIG
    • Теперь для результирующего множества доступны аналитические функции, на котором они собственно и выполняются 
    • Если запрос содержит сортировку, то выполнятся условия  из ORDER BY   
Давайте более подробно разберем 2-ой этап, а именно работу аналитических функций.
Эти функции дают разработчику разбить результат  запроса на подгруппы, которые называются партициями.Обращаю внимание на то что эти партиции не имею ни какого отношения к партициям которые создаются для таблиц на "Физическом" уровне.
Партиции формируются после выполнения  группировок GROUP BY, по-этому  для них доступны такие агрегатные функции,как сумма или среднее. 
Для каждой партиции, разработчик может определить "скользящее окно данных"(Window).
Эти окна необходимы для определения массива строк по которым будет вычисляется значение в текущей строке.
Окно может содержать все строки партиции, или какую то одну или несколько строк в партиции, которые определяются логическими условиями.   Следует помнить о том что когда производятся вычисления в "оконных функциях" результирующая строка тоже учитывается.


Перед началом разбора на примерах самих аналитических функций давай определим нашу тестовую предметную область.

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


CREATE TABLE anl_incom_lpm  (
member_row_id      varchar2(15), -- уникальный идентификатор участника
member_reg_store   varchar2(4),    -- идентификатор точки регистрации (торговой точки)
member_created      date,               -- дата регистрации
points_count            number            -- количество "скидочных" баллов на карточке
)

Наконец перейдем к описанию самих аналитических функций