Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ГЕК базы данных.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
524.26 Кб
Скачать
  • Пример создания временной таблицы:

CREATE GLOBAL TEMPORARY TABLE SCOTT.TEMP_DEPT (            DEPTNO NUMBER(2,0),        DNAME VARCHAR2(14)            )     ON COMMIT PRESERVE ROWS; Данный пример демонстрирует создание временной таблицы, данные которой, относятся к сессии. 

  • Пример создания временной таблицы с использованием поздапроса

CREATE GLOBAL TEMPORARY TABLE min_salesemp 

ON COMMIT PRESERVE ROWS     AS SELECT * FROM EMP WHERE sal < 2000

  • Отличие временной таблицы ОN COMMIT PRESERVE ROWS от временной таблицы ОN COMMIT DELETE ROWS

Создаем две таблицы ON COMMIT PRESERVE ROWS CREATE GLOBAL TEMPORARY TABLE SCOTT.TMP_PRE_ROWS     

(     ID NUMBER(32)       )     ON COMMIT PRESERVE ROWS;

ОN COMMIT DELETE ROWS

CREATE GLOBAL TEMPORARY TABLE SCOTT.TMP_DEL_ROWS     

(     ID NUMBER(32)       )     ON COMMIT DELETE ROWS;

Добавляем данные в созданные таблицы

INSERT INTO SCOTT.TMP_DEL_ROWS(ID) VALUES (1); INSERT INTO SCOTT.TMP_DEL_ROWS(ID) VALUES (2); INSERT INTO SCOTT.TMP_DEL_ROWS(ID) VALUES (3);     INSERT INTO SCOTT.TMP_PRE_ROWS(ID) VALUES (1); INSERT INTO SCOTT.TMP_PRE_ROWS(ID) VALUES (2); INSERT INTO SCOTT.TMP_PRE_ROWS(ID) VALUES (3);    Смотрим

SELECT * FROM SCOTT.TMP_PRE_ROWS;

Реультат запроса  -- 1 2 3

SELECT * FROM SCOTT.TMP_DEL_ROWS;

Результат запроса

-- 1 2 3 

Выполняем команду COMMIT после чего вновь выполняем запросы

SELECT * FROM SCOTT.TMP_PRE_ROWS;

Результат запроса

-- 1 2 3 

SELECT * FROM SCOTT.TMP_DEL_ROWS;

Результат запроса

--

MS SQL

В MS SQL Server вы можете создавать локальные и глобальные временные таблицы. Локальные временные таблицы будут видны только вашей сессии, а глобальные таблицы видны всем сессиям. При этом и те, и другие таблицы, уничтожаются после завершения сессии.

-Локальные временные таблицы имеют префикс в имени в виде символа номера (#); они видны только в текущем соединении пользователя и удаляются после того, как пользователь отсоединится от экземпляра (instance) microsoft® sql server™ 2000.

-Глобальные временные таблицы имеют префикс имени в виде двойного символа #; они видны для любого пользователя после их создания и удаляются тогда, когда все пользователи, ссылающиеся на таблицу, отсоединятся от sql server."

declare @i int =0

create table #xxx

(

i int,

dt datetime

)

insert #xxx(i,dt) values (@i,SYSDATETIME())

while @i<5

begin

waitfor delay '00:00:02'

set @i = @i+1

insert #xxx(i,dt)values(@i,SYSDATETIME())

end

select * from #xxx

66. Индексы. Типы индексов: простые и составные, уникальные и неуникальные, кластеризованные и некластеризованные (Microsoft SQL Server 2008), Bitmap-индексы (Oracle 11.2g).

MS SQL

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

Индекс: Microsoft SQL Server бывают кластерные, некластерные (просто индексы).

Индексы бывают кластерными (CLUSTERED) и не кластерными (NONCLUSTERED). В кластерном индексе строки физически сортируются на диске в соответствии с индексируемым полем. Я думаю, что не надо объяснять, почему кластерный индекс может быть только один на таблицу? Нельзя же одновременно физически отсортировать данные по двум ключам.

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

Некластерный индекс: может быть несколько для одной таблицы.

Кластерный индекс: может только один для одной таблицы

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

Индекс: для первичных ключей и для UNIQ-столбцов автоматически создается индекс.

Уникальный индекс гарантирует, что все данные в колонке с таким индексом – уникальны, и не содержат повторяющихся значений. Сервер SQL автоматически создает индекс, когда создается ограничение PRIMARY KEY или UNIQUE.

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

Следующий пример создает не кластерный составной индекс для таблицы телефонного справочника. Обратите внимание, что поле "Фамилия" описывается первой, потому что она чаще всего является основой при выборке данных из таблицы:

CREATE UNIQUE NONCLUSTERED INDEX I_NCL_Фамилия_Имя

ON [Телефонный справочник] (Фамилия, Имя)

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

Создание в таблице :

create table FACULTY

(

FACULTY char(10) not null,

FACULTY_NAME varchar(50),

constraint PK_FACULTY primary key nonclustered (FACULTY)

)

Вне таблицы:

create table PULPIT

(

PULPIT char(10) not null,

PULPIT_NAME varchar(100),

FACULTY char(10),

constraint FK_PULPIT_FACULTY foreign key(FACULTY) references FACULTY(FACULTY),

constraint PK_PULPIT primary key nonclustered (PULPIT)

)

create clustered index NOT_UQ_FACULTY on dbo.PULPIT(FACULTY)

ORACLE

grant create any index to IEUCORE1

--12

create table IEUCORE1.TEACHER

(

TEACHER char(10),

TEACHER_NAME varchar(50),

PULPIT char(10)

)

create index IDXTEACHER_PULPIT1 on TEACHER(PULPIT);

create index IDXTEACHER_PULPIT2 on TEACHER(PULPIT desc);

create unique index IDXTEACHER_PULPIT3 on TEACHER(PULPIT asc);

create bitmap index IDXTEACHER_PULPIT4 on TEACHER(PULPIT);

Bitmap index – метод битовых индексов заключается в создании отдельных битовых карт (последовательность 0 и 1) для каждого возможного значения столбца, где каждому биту соответствует строка с индексируемым значением, а его значение равное 1 означает, что запись, соответствующая позиции бита содержит индексируемое значение для данного столбца или свойства.

bitmap-индексы более применимы для столбцов, имеющих мало различающихся значений – таких как ПОЛ, СЕМЕЙНОЕ_ПОЛОЖЕНИЕ и РОДСТВО.

67. Представления. Материализованные представления(Oracle 11.2g). DML-операции для представлений. Конструкция WITH CHECK OPTION.

Представление – это поименованный селект-запрос.

Привилегии:

grant create materialized view to RL_IEUCORE

grant create view to RL_IEUCORE

with read only – опция, запрещающая операции обновления, удаления и вставки данных базовой таблицы через представление.

with check option – режим, при котором добавлять или обновлять можно только строки , доступные в представлении.

Материализованное представление — физический объект базы данных, содержащий результат выполнения запроса.

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

Отличие материализованных представлений от обычных в том, что они не только выполняют запрос, составляющий основу описания представления, но также сохраняет данные во временном хранилище (таблице), выполняющем функции кэш-памяти. Это позволяет при повторном обращении к материализованному представлению не выполнять запрос к исходным таблицам, что может быть затратным, а произвести выборку из кэша.

create view vAUDITORIUM50

as select AUDITORIUM AU,AUDITORIUM_TYPE AT, AUDITORIUM_CAPACITY AC from AUDITORIUM where AUDITORIUM_CAPACITY>50

with check option

select * from vAUDITORIUM50

delete vAUDITORIUM50 where AU = '700-4'

insert into vAUDITORIUM50 (AU, AT, AC) values ('700-4','ЛК','123')– если такой строки нет в таблице AUDITORIUM, то ограничение целостности with check option не позволит вставить данную строку в представление vAUDITORIUM50

68. Табличные кластеры (Oracle 11.2g). Назначение. Создание и применение.

grant create cluster to IEUCORE1

Кластер (англ. cluster) — в СУБД Oracle Database специализированный объект базы данных, используемый для физически совместного хранения одной или нескольких таблиц, которые часто соединяются вместе в SQL-запросах.

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

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

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

create cluster IEUCORE1.ABC

(

X int,

V varchar(12)

)

hashkeys 200 //размер хэш-таблицы

create table IEUCORE1.A

(

XA int,

VA varchar(12),

CA int

)

cluster IEUCORE1.ABC(XA,VA)

69. Система программирования Microsoft Transact SQL. Поддерживаемые типы данных. Поддерживаемые программные структуры и структуры данных. Основные операторы. Курсоры. Механизм обработки ошибок. Сравнительный анализ с системой программирования Oracle PL/SQL.

70. Система программирования Oracle PL/SQL. Поддерживаемые типы данных. Поддерживаемые программные структуры и структуры данных. Основные операторы. Курсоры. Механизм обработки ошибок. Сравнительный анализ с системой программирования Microsoft Transact SQL.

ORACLE PL/SQL

Структура анонимного блока(программы):

DECLARE

<имя переменной > <тип данных><(значение)>;

BEGIN

< исполняемый оператор>;

EXCEPTION

< оператор обработки исключения >;

END;

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

BEGIN - END - исполняемый раздел. В этом разделе находятся операторы, которые выполняются ядром PL/SQL во время работы вашего приложения. Этот раздел является обязательным.

EXCEPTION - раздел исключений. В этом разделе обрабатываются различные исключения, предупреждения и ошибки. Этот раздел необязателен.

Анонимные блоки - это блоки, которые не имеют имени.

Анонимные блоки служат контейнерами для операторов PL/SQL и обычно включают в себя вызовы процедур и функций.

Прстейший анонимный блок

begin

null;

end;

Именованные блоки - это блоки, которые имеют имя, например, функция или процедура.

Типы данных PL/SQL (не путать с типами данных базы данных):

  • скалярные (Scalar);

  • ссылочные (Reference);

  • составные (Composite);

  • большие объекты (LOB).

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

  • символ/строка;

  • число;

  • булев;

  • дата/время.

CHAR(n byte|char)

n <= 2000

VARCHAR2(n)

n <= 4000 bytes

NUMBER(n,s)

n <= 38, s = [-84,127]

LONG

символы до 2GB

RAW(n)

бинарные данные n <= 2000 byte

ROWID

64 byte уникальный адрес строки в таблице, псевдо-столбец

NCHAR(n)

n <= 2000 bytes

NVARCHAR2(n)

n <= 4000 bytes

DATE

01.01.4712 до н.э – 31.12.9999

BINARY_FLOAT

32bit

BINARY_DOUBLE

64bit

TIMESTAMP(n)

дата и время n = [0,9] – точность секунд

TIMESTAMP (n)

WITH TIME ZONE

TIMESTAMP+значение смещение часового пояса

TIMESTAMP WITH(n) LOCAL TIME ZONE

TIMESTAMP нормализованный для локального времени

INTERVAL YEAR(n) TO MOUNT

n = [0,9] период времени в годах и месяцах

INTERVAL DAY(n)

TO SECOND(m)

n = [0,9], m =[0,9] период времени в днях, минутах и секундах

LONG RAW

бинарные данные до 2GB

UROWID(n)

n <= 4000, логический адрес строки в индексно-организованной таблице

CLOB

большой символьный объект до 4GB

NLOB

CLOB для многобайтных символов

BLOB

большой двоичный объект до 4GB

BFILE

указатель на двоичный файл операционной системы

Неявный курсор.

Сам оператор SELECT представляет собой в прямом определении "КУРСОР", или еще это называют SQL-курсор! Откуда следует вывод, что любой оператор DML объемлит собой курсор. Так как, каждый оператор DML выполняется в пределах контекстной области и по этому имеет курсор указывающий на контекстную область. В отличии от явных, SQL-курсор не открывается и не закрывается. PL/SQL - сам неявно открывает SQL-курсор, обрабатывает SQL-оператор и закрывает SQL-курсор. Для SQL-курсора операторы FETCHOPENCLOSE не нужны, но с ними можно использовать курсорные атрибуты, вот таким образом:

------ SQL%АТРИБУТ КУРСОРА ---------------

SQL%ROWCOUNT – целое количество строк, выбранных последней

командой SQL;

SQL%FOUND – логический атрибут, имеющий значение TRUE, если

последней командой SQL была выбрана хотя бы одна строка;

SQL%NOTFOUND – имеет значение TRUE, если последней коман-

дой не было выбрано ни одной строки;

SQL%ISOPEN – всегда FALSE (так как PL/SQL всегда закрывает не-

явные курсоры сразу после их выполнения).

Явный курсор.

Типичная последовательность, при операциях в данном случае с явными (определенными курсорами) будет такая:

  1. Объявление курсора и структуры данных, в которую, будут помещены найденные строки.(declare)

  2. Открытие курсора.(open – создание контекстной области PGA)

  3. Последовательная выборка данных.(fetch)

  4. Закрытие курсора.(close)

Курсорная переменная – это переменная, указывающая или ссылающаяся на курсор.

Для работы с курсорной переменной необходимо объявить ее, что вы" полняется в два этапа: 

1.Сначала следует создать тип курсора оператором TYPE.

2.Затем на основе созданного типа объявить фактическую курсорную переменную. 

Исключение – прерывание, которое возникает при наступлении какого-либо события.

Встроенное исключение – исключение, которое определено в СУБД.

Пользовательское исключение – исключение, которое определил пользователь.

RAISE - инициализация именованного исключения.

RAISE_APPLICATION_ERROR - создает собственное сообщение об ошибке.

Стандартные исключения:

Использование стандартных исключений:

IF, CASE

Циклы loop, for, while

MS SQL T-SQL

Типы данных T-SQL:

Точные числа

bigint

numeric

bit

smallint

decimal

smallmoney

int (целочисленное значение)

tinyint

money

 

Приблизительные числа

float

real

Дата и время

Date

datetimeoffset

datetime2

smalldatetime

datetime

time

Символьные строки

char

varchar

text

 

Символьные строки в Юникоде

nchar

nvarchar

ntext

 

Двоичные данные

binary

varbinary

image

 

Прочие типы данных

cursor

timestamp

hierarchyid

uniqueidentifier

sql_variant

xml

Таблица

Пространственные типы

Declare –объявление. Способы инициализации и вывода результатов локальной переменной:

declare @x char(30)=30

select @x as 'цифра'

print @x

select @x= (select FACULTY_NAME from FACULTY where FACULTY='ИДиП')

print @x

select @x=45

print @x

set @x = (select SUM(AUDITORIUM_CAPACITY) from AUDITORIUM)

print @x

if-else, begin/end – определяет блок, который выполняется как одно целое.

set @x1 = (select SUM(AUDITORIUM_CAPACITY) from AUDITORIUM)

if @x1 > 200

begin

print 'общее кол-во мест больше 200'

select CAST (count(*) as numeric(5,3))/CAST((select COUNT(*) from AUDITORIUM) as numeric(5,3)) * 100 '%'

from AUDITORIUM where AUDITORIUM_CAPACITY > (select AVG(AUDITORIUM_CAPACITY) from AUDITORIUM)

end

else if @x1>100

print 'общее кол-во мест от 100 до 200'

else if @x1>50

print 'общее кол-во мест от 50 до 100'

else

print 'общее кол-во мест менее 50'

конкатенация строк и преобразование типов:

declare @x char(50) =Кол-во учеников:',@y int =50

print @x + cast(@y as char(50))

while

select SUM(AUDITORIUM_CAPACITY) from AUDITORIUM

while (select SUM(AUDITORIUM_CAPACITY) from AUDITORIUM)<2000

begin

update AUDITORIUM set AUDITORIUM_CAPACITY=AUDITORIUM_CAPACITY*1.05

end

select SUM(AUDITORIUM_CAPACITY) from AUDITORIUM

case

declare @z1 numeric(8,3) = (select cast(sum(AUDITORIUM_CAPACITY) as numeric(8,3)) from AUDITORIUM)

print общее кол-во мест ' +

(

case

when @z1>200 then 'больше 200'

when @z1>100 then 'от 100 до 200'

else 'менее 50'

end

)

-----------------------------------------------------------------------------

select case(select count(*) from TEACHER where TEACHER_NAME like '%Владимир%')

when 0 then 'нет'

when 1 then 'один'

when 2 then 'два'

else 'много'

end 'Владимир'

RAISEERROR – создает сообщение об ошибке и запускает обработку ошибок для сеанса.

Try/catch

begin try

update TEACHER set TEACHER = 'ÓÐÁ' where TEACHER ='ÑÌËÂ'

end try

begin catch

print 'catch'

print error_number()

print error_message()

print error_line()

print error_procedure()

print error_severity()

print error_state()

end catch

Курсор: механизм, позволяющий обрабатывать отдельные строки полученные в результате select-запроса.

Пример:

declare ccc cursor local dynamic

for select SUBJECT,PULPIT from SUBJECT

read_only

declare @s char(10), @p char(10)

print '@@cursor_rows = '+ cast(@@cursor_rows as varchar(10))

open ccc

print '@@cursor_rows = '+ cast(@@cursor_rows as varchar(10))

fetch ccc into @s, @p

print @s+' '+@p+'cursor_rows = '+ cast(@@cursor_rows as varchar(10))

fetch ccc into @s, @p

print @s+' '+@p+'cursor_rows = '+ cast(@@cursor_rows as varchar(10))

close ccc

В соответствии со стандартом SQL при работе с курсорами можно выделить следующие основные действия:

1)создание или объявление курсора;

2)открытие курсора , т.е. наполнение его данными, которые сохраняются в многоуровневой памяти;

3)выборка из курсора и изменение с его помощью строк данных;

4)закрытие курсора, после чего он становится недоступным для пользовательских программ;

5)освобождение курсора, т.е. удаление курсора как объекта, поскольку его закрытие необязательно освобождает ассоциированную с ним память. (deallocate)

Продемонстрируйте разницу между GLOBAL и LOCAL-курсорами.

Глобальные и локальные курсоры имеют отдельные пространства имен, поэтому возможно существование как глобального, так и локального курсоров с одним и тем же именем в одно и то же время. Инструкции языка Transact-SQL, принимающие в качестве параметров имена курсоров, также поддерживают ключевое слово GLOBAL для определения области имени. Если ключевое слово GLOBAL не указано, и существуют локальный и глобальный курсор с указанным в параметре именем курсора, используется локальный курсор.

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

Продемонстрируйте разницу между STATIC и DYNAMIC-курсорами.

STATIC

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

DYNAMIC

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

71. Хранимые процедуры. Создание, применение. Имперсонизации в хранимых процедурах. Передача и возврат параметров. Основные отличия процедур Oracle 11.2 от процедур Microsoft SQL Server 2008.

Хранимые процедуры - (именованный PL/SQL-блок)поименованный блок операторов, который хранится в бд в откомпилированном виде.

Локальные процедуры и функции – такие процедуры и функции, которые создаются во время выполнения программы.

Локальная процедура:

declare

x number(3):=4;

y number(3):=5;

z number(3);

procedure summod5 (x1 number,x2 number, x3 out number)

is

z number(3):=5;

begin

x3:= mod(x1+x2,z);

end summod5;

begin

summod5(x,y,z);

dbms_output.put_line('z = '|| z);

exception

when others then dbms_output.put_line(sqlerrm);

end;

Хранимая процедура Oracle:

create or replace procedure GPUCORE.xxsum(min_cy in

GPUCORE.auditorium.auditorium_capacity%type default 20,

max_cy in out GPUCORE.auditorium.auditorium_capacity%type,

n_aud out number)

authd current user is

no_max_cy exception;

begin

select count(*), max(auditorium_capacity) into n_aud, max_cy from GPUCORE.auditorium

where auditorium_capacity >= min_cy and auditorium_capacity <= max_cy;

if n_aud is null

then raise no_max_cy;

end if;

exception

when no_max_cy then return;

when others then dbms_output.put_line(sqlerrm);

end xxsum

Хранимая процедура MS SQL:

create procedure r_teacher

@p char(5)

as

declare @s4 char(10),@p4 char(50),@ps char(10)

declare @x varchar(10) = dbo.cc_teacher(@p)

print ' кол-во преподавателей на кафедре '+@p+'= ' + @x

declare ccc cursor local read_only

for select PULPIT, TEACHER_NAME from TEACHER where PULPIT=@p

open ccc

fetch ccc into @s4,@p4

while @@FETCH_STATUS=0

begin

print @s4+'--'+@p4

fetch ccc into @s4,@p4

end

close ccc

exec r_teacher 'ÈÑèÒ'

Параметры: входные, выходные и по-умолчанию:

72. Скалярные и табличные функции (Microsoft SQL Server 2008). Создание функций. Вызов и применение функций. Передача параметров. Основные отличия функций Oracle 11.2 от функций Microsoft SQL Server 2008.

Функции: встроенные (математические, строковые, работа с датами и др.) и пользовательские.

Пользовательские функции : скалярные(возвращает одно значение), inline(одна команда select, возвращает таблицу в качестве результата).

Пример скалярной функции:

create function cc_faculty() returns int

begin

declare @rc int = (select COUNT(FACULTY) from FACULTY)

return @rc

end

declare @x int = dbo.cc_faculty()

print ' кол-во факультетов = ' + cast(@x as varchar(10))

Результат:

кол-во факультетов = 7

select dbo.cc_faculty() 'кол-во факультетов'

Пример табличной(inline) функции:

create function t_profession(@p char(10)) returns table

return select * from PROFESSION where FACULTY=@p

select * from dbo.t_profession('ТОВ')

Функция с параметром @p

create function cc_profession(@p char(10)) returns int

begin

declare @rc int = (select COUNT(PROFESSION_NAME) from PROFESSION where FACULTY=@p)

return @rc

end

declare @x int = dbo.cc_profession('ÈÝÔ')

print ' кол-во специальностей на факультете ИЭФ = ' + cast(@x as varchar(10))

select dbo.cc_profession('ИЭФ') 'кол-во специальностей на факультете ИЭФ'

Локальная функция Oracle с параметрами:

declare

x number(3):=4;

y number(3):=5;

z number(3);

s number(5);

function summod5 (x1 number,x2 number, x3 out number)

return number is

z number(3):=5;

begin

x3:= mod(x1+x2,z);

return (x1+x2);

end summod5;

begin

s := summod5(x,y,z);

dbms_output.put_line('s = '|| s);

dbms_output.put_line('z = '|| z);

exception

when others then dbms_output.put_line(sqlerrm);

end;

Хранимая функци и ее вызов в Oracle:

create or replace function maxcy(min_cy auditorium.auditorium_capacity%type,

max_cy auditorium.auditorium_capacity%type)

return number is

rc number(5);

begin

select count(*) into rc from GPUCORE.auditorium

where auditorium_capacity >= min_cy and auditorium_capacity <= max_cy;

return rc;

exception

when others

then return -1;

end maxcy;

SELECT maxcy(20,80) FROM dual;

73. Триггеры. Типы триггеров: DDL (системные) и DML, строчные и операторные, BEFFORE, AFTER, INSTEAD OF. События, обрабатываемые триггерами. Основные отличия триггеров Oracle 11.2 от триггеров Microsoft SQL Server 2008.

MS SQL:

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

Триггер: DML-триггеры, DDL-триггеры.

Триггеры DML создаются для инструкций INSERT, UPDATE и DELETED, чтобы обеспечить соблюдения правил и целостность данных таблиц или представлений при их изменении.

DML-триггеры: создаются для таблицы или представления.

DML-триггеры: реагируют на события INSERT, DELETE, UPDATE.

DML-триггеры: для одной таблицы или представления может быть несколько триггеров. Частично (первый и последний) порядок триггеров может быть установлен с помощью процедуры sp_settriggerorder (не работает для INSTEAD OF).

DML-триггеры: AFTER-триггеры, INSTEAD OF-триггеры.

AFTER-триггеры: триггеры уровня оператора (выполняются по одному разу для каждого оператора), выполняются после наступления события.

INSTEAD OF-триггеры: триггеры уровня оператора (выполняются по одному разу для каждого оператора), выполняются вместо операции (сама операция не выполняется). INSTEAD OF-триггеры не могут вызываться рекурсивно (если в триггере сработает операция, снова вызвавшая работу триггера). Если образуется рекурсия вызовов триггеров, то будет сделана попытка выполнить оператор.

DDL-триггеры: AFTER-триггеры: CREATE, ALTER, DROP...., LOGON (при подключении).

Использование таблицы inserted:

create trigger tr_subject on SUBJECT after insert

as

select SUBJECT from inserted

insert into SUBJECT values('MATH','Математика','ИСиТ')

Последовательность триггеров, если их 3, можно контролировать c помощью процедуры sp_settriggerorder (только для AFTER-триггеров):

exec sp_settriggerorder 'dbo.tr_subject1', 'first', 'insert'

exec sp_settriggerorder 'dbo.tr_subject2', 'last', 'insert'

В таблице deleted находятся копии строк, с которыми работали инструкции DELETE или UPDATE. При выполнении инструкции DELETE или UPDATE происходит удаление строк из таблицы триггера и их перенос в таблицу deleted. У таблицы deleted обычно нет общих строк с таблицей триггера.

В таблице inserted находятся копии строк, с которыми работали инструкции INSERT или UPDATE. При выполнении транзакции вставки или обновления происходит одновременное добавление строк в таблицу триггера и в таблицу inserted. Строки таблицы inserted являются копиями новых строк таблицы триггера.

Oracle:

Триггер базы данных: особый вид именованных блоков PL/QL (особый вид процедур) которые срабатывают (firing – стрелять, запускать) по запускающему их событию.

Типы триггеров:

  • DML-триггер(insert, delete, update)

  • триггеры замещения(instead of)

  • системные триггеры

  • beforeвыполняется до наступления события для таблицы

  • afterвыполняется после фиксации события для таблицы

  • instead ofприменяется только на уровне строки, используется только для представления

  • FOR EACH ROW – уровня строки

Привилегии на триггер: назначаются напрямую USERу, а не через роль.

  • CREATE TRIGGER (создавать, удалять изменять в своей подсхеме);

  • CREATE ANY TRIGGER (создать любой триггер в любой схеме, кроме SYS, не рекомендуется для словаря, не разрешает менять текст триггера);

  • ALTER ANY TRIGGER (разрешать, запрещать, изменять, компилировать, любые, кроме SYS-триггеров, триггеры) ;

  • DROP ANY TRIGGER (удалять любой триггер, кроме SYS-триггеров);

  • ADMINISTER DATABASE TRIGGER (создавать, изменять, удалять системные триггеры, должен иметь привилегию CREATE TRIGGER или CREATE ANY TRIGGER).

Порядок выполнения DML-триггеров:

  1. операторные BEFORE;

  2. для каждой строки: строковые BEFFORE, выполняется оператор, строковые AFTER;

операторные AFTER.

CREATE OR REPLACE TRIGGER BAO_1 AFTER INSERT ON AAA

BEGIN

DBMS_OUTPUT.PUT_LINE('BAO_1');

END;

CREATE OR REPLACE TRIGGER BAS_1 BEFORE INSERT ON AAA FOR EACH ROW

BEGIN

DBMS_OUTPUT.PUT_LINE('BAS_1');

END;

Системные триггеры: BEFORE, AFTER (момент выполнения)

Системные триггеры: DATABASE, SCHEMA (уровень триггера)

Системные триггеры: 1)серверные события; 2) DDL-события; 3)события сбора статистики; 4) события аудита; 5) DCL-события.

Событие

Допустимые моменты

Атрибуты событий, функции

Серверные события

STARTUP

AFTER

заполнить

SHUTDOWN

BEFORE

заполнить

SERVERERROR

AFTER

IS_SERVERERROR()

LOGON

AFTER

ORA_CLIENT_API_ADDRESS

LOGOFF

BEFORE

заполнить

SYSPEND

AFTER

заполнить

DDL-события

CREATE

BEFORE, AFTER

заполнить

DROP

BEFORE, AFTER

заполнить

ALTER

BEFORE, AFTER

заполнить

TRUNCATE

BEFORE, AFTER

заполнить

DDL

BEFORE, AFTER

заполнить

RENAME

BEFORE, AFTER

заполнить

COMMENT

BEFORE, AFTER

заполнить

события сбора статистики

ANALYZE

BEFORE, AFTER

заполнить

ASSOCIATE STATISTICS

BEFORE, AFTER

заполнить

DISASSOCIATE STATISTICS

BEFORE, AFTER

заполнить

события аудита

AUDIT

BEFORE, AFTER

заполнить

NOAUDIT

BEFORE, AFTER

заполнить

DCL-события

GRANT

BEFORE, AFTER

ORA_WITH_GRANT_OPTION

REVOKE

BEFORE, AFTER

заполнить

Все события

ORA_DATABASE_NAME

ORA_INSTANCE_NUM

ORA_NAME_SQL_TEXT

ORA_SYS_EVENT

74. Транзакции. Режимы: автофиксации, неявной транзакции, явной транзакции. Свойства ACID. Уровни изоляции.

Транзакция: одна или несколько команд SQL, которые либо успешно выполняются как единое целое, либо отменяются как единое целое.

Примеры с TCL-операторами:

begin transaction MyTransact

insert into SUBSTGROUP(SUBGROUP,STGROUP,FACULTY,YYYY,PROFESSION) values('1','9','ИДиП','2006','1-40 01 02')

insert into SUBSTGROUP(SUBGROUP,STGROUP,FACULTY,YYYY,PROFESSION) values('2','9','ИДиП','2006','1-40 01 02')

commit transaction MyTransact

select COUNT(*) from SUBSTGROUP where YYYY= '2006'

---------------------------------------------------------------------

delete SUBSTGROUP where YYYY = '2006'

select COUNT(*) '-1-' from SUBSTGROUP where YYYY = '2006'

begin transaction MyTransact

insert into SUBSTGROUP(SUBGROUP,STGROUP,FACULTY,YYYY,PROFESSION) values('1','9','ÈÄèÏ','2006','1-40 01 02')

insert into SUBSTGROUP(SUBGROUP,STGROUP,FACULTY,YYYY,PROFESSION) values('2','9','ÈÄèÏ','2006','1-40 01 02')

select COUNT(*) '-2-' from SUBSTGROUP where YYYY = '2006'

rollback transaction MyTransact

select COUNT(*) '-3-' from SUBSTGROUP where YYYY = '2006'

---------------------------------------------------------------------

delete SUBSTGROUP where YYYY = '2006'

select COUNT(*) '-1-' from SUBSTGROUP where YYYY = '2006'

begin transaction MyTransact

insert into SUBSTGROUP(SUBGROUP,STGROUP,FACULTY,YYYY,PROFESSION) values('1','9','ÈÄèÏ','2006','1-40 01 02')

save transaction Point1

select COUNT(*) '-2-' from SUBSTGROUP where YYYY = '2006'

insert into SUBSTGROUP(SUBGROUP,STGROUP,FACULTY,YYYY,PROFESSION) values('2','9','ÈÄèÏ','2006','1-40 01 02')

select COUNT(*) '-3-' from SUBSTGROUP where YYYY = '2006'

rollback transaction Point1

select COUNT(*) '-4-' from SUBSTGROUP where YYYY = '2006'

commit transaction MyTransact

select COUNT(*) '-5-' from SUBSTGROUP where YYYY = '2006'

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

Неявные транзакции. Не существует оператора начала транзакцииТранзакция начинается с началом сеанса работы с БД. Завершается транзакция при следующих событиях:

  • Явно выполненный оператор завершения транзакции - rollback или commit

  • Оператор DDL

  • Завершение сеанса.

Режим автофиксации означает, что каждый запрос к базе данных, который вы выполняете, неявно заключается в транзакцию, если СУБД их поддерживает. Если база данных не поддерживает этот механизм, запрос обрабатывается без транзакции.

ACID: требование к транзакционной системе:

Atomicity (Атомарность) транзакция либо завершается полностью и успешно, либо полностью не выполняется (аварийно завершается);

Consistency(Согласованность) – транзакция (успешно или аварийно завершенная) всегда оставляет базу данных в согласованном состоянии;

Isolation(Изолированность) - до фиксации изменения видит только сеанс, выполнивший эти изменения; есть различные уровни изолированности;

Durability (Устойчивость, долговечность) - после фиксации транзакцию нельзя отменить.

Уровни изоляции (ANSI SQL-92), читатели писатели

READ UNCOMMITED (неподтвержденное (грязное) чтение). Читатель может прочитать незафиксированные строки. Читатель не может изменить незафиксированные строки (ожидает);

READ COMMITED (подтвержденное чтение). Читатель не может прочитать неподтвержденные данные (ожидает), писатель может изменить и удалить уже прочитанные читателем данные;

REPETABLE READ (повторяемое чтение). В начале транзакции и в конце транзакции результат одного и того же запроса читателя будет одинаков; писатели могут вводить данные, что приводит к появлению фантомных записей;

SERIALIZABLE (сериализуемость). Высший уровень изоляции. Данные не могут не прочитаны ни изменены до окончания транзакции.

75. Пакеты процедур и функций (Oracle 11.2g).Спецификация и тело пакета. Принцип применения пакетов.

Пакет – совокупность некоторых функций и процедур, объявленных под общим именем.

Пакеты обычно состоят из двух частей, спецификации и тела, хотя иногда в теле нет необходимости. СПЕЦИФИКАЦИЯ пакета - это интерфейс с вашими приложениями; она объявляет типы, переменные, константы, исключения, курсоры и подпрограммы, доступные для использования в пакете. ТЕЛО пакета полностью определяет курсоры и подпрограммы, тем самым реализуя спецификацию пакета. В отличие от подпрограмм, пакеты нельзя вызывать, передавать им параметры или вкладывать их друг в друга.

create or replace package teacherpkg as

type teacher_rec is record

(

t teacher.teacher%type,

tn teacher.teacher_name%type,

pp teacher.pulpit%type

);

exc_xinsert exception;

exc_xupdate exception;

procedure xinsert(tr teacher_rec);

function xupdate(tr teacher_rec) return boolean;

end teacherpkg;

create or replace package body teacherpkg as

end teacherpkg;

76. Архитектура программного обеспечения СУБД (на примере Oracle 11.2g). Клиент-серверная архитектура. Основные файлы СУБД: перманентные данные, временные данные, журналы, архивы, трассировка, параметры сервера. Процессы: серверные, фоновые. Основные области памяти. Словарь (каталог) базы данных.

Архитектура СУБД: клиент\сервер.

Табличное пространство – логическая структура хранения данных, контейнер сегментов. С одним табличным пространством связаны один или несколько файлов операционной системы, с каждым файлом связано только одно табличное пространство. Управление табличным пространством: управление по словарю, локальное управление (битовая карта экстентов).

Табличные пространства бывают:

  • PERMANENT(для хранения постоянных объектов БД);

  • TEMPORARY(для хранения временных данных);

  • UNDO (для хранения сегментов отката, используется всегда один).

PERMANENT-пространств может быть несколько. В общем случае пользователь-владелец может создавать свои объекты в любом PERMANENT-пространстве (если это не запрещено), одно из PERMANENT-пространств ему может приписано в качестве пространства по умолчанию.

TERMPORARY-пространств может быть несколько. TERMPORARY-пространство приписывается одному или нескольким пользователям, которые могут там размещать свои временные данные (обычно для сортировки). Использование TERMPORARY-пространств прозрачно для пользователя.

UNDO-пространств может быть несколько, но активным является всегда только одно (указывается в конфигурационном файле SPIFLE.ORA)

Сегмент – область памяти, выделяемая под объекты (для каждой таблицы – свой сегмент (при секционировании несколько сегментов), индекс – сегмент индекса, есть сегменты откатов, кластеров и т.д.). Сегмент полностью в одном табличном пространстве.

Экстент - непрерывный фрагмент файла. Каждый сегмент первоначально состоит хотя бы из одного экстента (некоторым объектам надо два сразу, например: сегмент отката). 1 экстент от 1 блока до 2GB. Один экстент всегда в одном файле. Экстенты одного сегмента могут быть в различных файлах. Экстенты могут переноситься между файлами.

Блок наименьшая единица пространства в Oracle. Размер блока – величина постоянная. Бывают: 2К, 4К, 8К.

Журналы (Redo logs) — содержат информацию о всех изменениях, произошедших в базе денных.

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

Области оперативной памяти:

-System Global Area-системная глобальная память: это разделяемая, общая область памяти, которая содержит данные и служебную информацию инстанции Oracle. Oracle выделяет SGA во время запуска инстанции и возвращает память обратно, когда инстанция завершает работу. Каждая инстанция имеет свою SGA.

Пользователи, подключенные к базе данных, работаю с одной, общей областью SGA.

  • fixed sga-фиксированная часть sga

  • buffer cache-буферный кэш

  • log buffer-буферы журналов повтора

  • shared pool-разделяемый пул

  • java pool-пул для процедур и функций java

  • large pool - пул для режима MTS

-Program Global AREA-программная глобальная память: буфер памяти, который содержит данные и управляющую информацию серверных процессов. PGA создается, когда запускаются серверные процессы. Информация, хранящаяся в PGA, зависит от конфигурации Oracle.

Cуществуют три обширных класса процессов:

Серверные процессы. Эти процессы выполняют свои задачи в зависимости от запроса клиента. Мы уже до определенной степени ознакомились с выделенным и разделяемым сервером. Они относятся к серверным процессам.

Фоновые процессы. Эти процессы запускаются при запуске базы данных и выполняют различные служебные задачи, такие как запись блоков на диски, поддержание оперативных журналов повторения, очистка после прерванных процессов, обслуживание AWR (Automatic Workload Repository — автоматический репозиторий рабочей нагрузки) и т.п.

  1. LGWR – запись данных из журнального буфера в журнал изменений

  2. ARCH – копирует файлы журнала при их заполнении

  3. DBWR – запись грязных блоков из буфера БД на диск

  4. Процессы SMONPMON это процессы мониторов БД. PMON - (Process Monitor) это процесс, который осуществляет контроль за состоянием подключений к БД.. SMON - чуть более скромен, но так же немаловажен. После запуска БД, он как это не грандиозно звучит, выполняет автоматическое восстановление экземпляра. 

Подчиненные процессы. Эти процессы аналогичны фоновым, но выполняют дополнительную работу от имени либо фонового, либо серверного процесса.

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

Представления словаря:

  • static data dictionary views

  1. user_XXX – представления, позволяющие видеть объекты принадлежащие пользователю

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

  3. dba_XXX – представления, позволяющие видеть все объекты

  • dynamic performance data dictionary views

  1. V$XXX – информация об экземпляре БД к которому подключен пользователь

  2. GV$XXX – информация обо всех экземплярах БД

В состав словаря данных базы данных входят:

-Базовые таблицы: Основу словаря данных составляет совокупность базовых таблиц, хранящих информацию о базе данных. Эти таблицы читаются и пишутся ТОЛЬКО самим ORACLE; они редко используются непосредственно пользователем ORACLE любого типа, потому что они нормализованы, и большая часть данных в них закодирована.

-Доступные пользователю представления: Словарь данных содержит доступные пользователю представления, которые суммируют и отображают, в удобном представлении формате информацию из базовых таблиц словаря. Эти представления декодируют информацию базовых таблиц, представляя ее в полезном виде, таком как имена пользователей или таблиц, и используют соединения и фразы WHERE, чтобы упростить информацию. Большинство пользователей имеют доступ к этим представлениям вместо базовых таблиц словаря.

77. Структура вторичной памяти базы данных (на примере Oracle 11.2g): табличные пространства, сегменты, экстенты, блоки.

Табличное пространство – логическая структура хранения данных, контейнер сегментов. С одним табличным пространством связаны один или несколько файлов операционной системы, с каждым файлом связано только одно табличное пространство. Управление табличным пространством: управление по словарю, локальное управление (битовая карта экстентов).

Табличные пространства бывают:

  • PERMANENT(для хранения постоянных объектов БД);

  • TEMPORARY(для хранения временных данных);

  • UNDO (для хранения сегментов отката, используется всегда один).

PERMANENT-пространств может быть несколько. В общем случае пользователь-владелец может создавать свои объекты в любом PERMANENT-пространстве (если это не запрещено), одно из PERMANENT-пространств ему может приписано в качестве пространства по умолчанию.

TERMPORARY-пространств может быть несколько. TERMPORARY-пространство приписывается одному или нескольким пользователям, которые могут там размещать свои временные данные (обычно для сортировки). Использование TERMPORARY-пространств прозрачно для пользователя.

UNDO-пространств может быть несколько, но активным является всегда только одно (указывается в конфигурационном файле SPIFLE.ORA)

Сегмент – область памяти, выделяемая под объекты (для каждой таблицы – свой сегмент (при секционировании несколько сегментов), индекс – сегмент индекса, есть сегменты откатов, кластеров и т.д.). Сегмент полностью в одном табличном пространстве.

Экстент - непрерывный фрагмент файла. Каждый сегмент первоначально состоит хотя бы из одного экстента (некоторым объектам надо два сразу, например: сегмент отката). 1 экстент от 1 блока до 2GB. Один экстент всегда в одном файле. Экстенты одного сегмента могут быть в различных файлах. Экстенты могут переноситься между файлами.

Блок наименьшая единица пространства в Oracle. Размер блока – величина постоянная. Бывают: 2К, 4К, 8К.

Создание табличного пространства(connect system)

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

78. Секционирование таблиц. Реализация секционирования в Microsoft SQL Server 2008 и Oracle 11.2g.

В MS SQL только диапазонное секционирование.

Секционирование - метод хранения объектов базы данных (таблиц и индексов), при котором данные разбиваются на блоки (секции) и распределены между различными файловыми группами.

SQL Server использует для хранения базы данных три различных типа файлов: первичные файлы данных, вторичне файлы данных и файлы журнала транзакций. Первичные файлы данных имеют расширение .MDF. Это файлы, создаваемые в БД в первую очередь и содержащие создаваемые пользователем объекты, такие как таблицы и представления, а также системные таблицы, необходимые sql server для поддержки БД.

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

Третьим типом файлов являются файлы журнала транзакций. Они имеют расширение .LDF и не содержат объектов базы данных, таких как таблицы или представления. Журнал содержит информацию для восстановления базы данных.

Файловая группа - логическая группировка файлов; при этом физически файлы могут размещаться на разных дисках, но SQL Server будет их интерпретировать как единое целое.

Файловая группа по-умолчанию – это группа в которую добавляются создаваемые объекты без определения группы.

CREATE DATABASE [NEW_Evgeny_Ivashkevich] ON PRIMARY

( NAME = 'Primary_Evgeny_Ivashkevich', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\Primary.mdf' , SIZE = 4MB , MAXSIZE = 10MB, FILEGROWTH = 1MB ),

filegroup G1

( NAME = 'G1_Evgeny_Ivashkevich1', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\G1\G1_1.ndf' , SIZE = 1MB , MAXSIZE = 10MB, FILEGROWTH = 1MB ),

( NAME = 'G1_Evgeny_Ivashkevich2', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\G1\G1_2.ndf' , SIZE = 1MB , MAXSIZE = 10MB, FILEGROWTH = 1MB ),

filegroup G2

( NAME = 'G2_Evgeny_ivashkevich1', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\G2\G2_1.ndf' , SIZE = 1MB , MAXSIZE = 10MB, FILEGROWTH = 1MB ),

( NAME = 'G2_Evgeny_ivashkevich2', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\G2\G2_2.ndf' , SIZE = 1MB , MAXSIZE = 10MB, FILEGROWTH = 1MB ),

( NAME = 'G2_Evgeny_ivashkevich3', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\G2\G2_3.ndf' , SIZE = 1MB , MAXSIZE = 10MB, FILEGROWTH = 1MB )

LOG ON

( NAME = 'LOG_Evgeny_Ivashkevich', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL10.SQLEXPRESS\MSSQL\DATA\Ivashkevich\log.ldf' , SIZE = 1MB , MAXSIZE = 10MB , FILEGROWTH = 1MB)

GO

create table TLESSON

(

TLESSON CHAR(10) NOT NULL,

TLESSON_NAME VARCHAR(30),

CONSTRAINT PK_TLESSON PRIMARY KEY(TLESSON)

)on G2

create table FACULTY

(

FACULTY char(10) not null,

FACULTY_NAME varchar(50),

constraint PK_FACULTY primary key nonclustered (FACULTY)

) on 'Primary'

create table PULPIT

(

PULPIT char(10) not null,

PULPIT_NAME varchar(100),

FACULTY char(10),

constraint FK_PULPIT_FACULTY foreign key(FACULTY) references FACULTY(FACULTY),

constraint PK_PULPIT primary key nonclustered (PULPIT)

)on G1

----------------------------------------------

CREATE PARTITION FUNCTION Range1 (tinyint) --|

AS RANGE LEFT FOR VALUES (2, 3, 4); --|

CREATE PARTITION SCHEME Schema1 --|

AS PARTITION Range1 --|

TO ('Primary',G1,G2) --|

----------------------------------------------

Oracle: