Новые возможности firebird 2.1 (in russian, vlad khorsun)
Post on 22-May-2015
4.867 Views
Preview:
DESCRIPTION
TRANSCRIPT
Первая российская конференция по СУБД Firebird и InterBase
FIREBIRD 2.1
Новая версияНовые возможности
Хорсун Владислав hvlad@users.sourceforge.net
Первая российская конференция по СУБД Firebird и InterBase
FIREBIRD 2.1• GLOBAL TEMPORARY TABLE
Глобальные временные таблицы
• COMMON TABLE EXPRESSIONS Сложные и рекурсивные запросы ? Это просто !
• TYPE OFДомены в процедурах, триггерах и CAST
• REPLACE, MERGEВставка или изменение ? Пусть сервер решает сам ;)
Первая российская конференция по СУБД Firebird и InterBase
GLOBAL TEMPORARY TABLE
• Стандартные свойства• Общие метаданные• Раздельные данные• Индексы, триггеры, контроль уникальности и
ссылочной целостности• Время жизни – соединение или транзакция
• Специфика Firebird• Нет проблем со сборкой мусора• Хранение вне файла БД, forced writes off
Первая российская конференция по СУБД Firebird и InterBase
GLOBAL TEMPORARY TABLE
• Синтаксис• CREATE GLOBAL TEMPORARY TABLE
…[ON COMMIT <DELETE | PRESERVE> ROWS]
• ON COMMIT DELETE ROWSвремя жизни данных - транзакция
• ON COMMIT PRESERVE ROWSвремя жизни данных - соединение
• По умолчанию - DELETE
Первая российская конференция по СУБД Firebird и InterBase
master
detailpersistent
on commit preserve rows
on commit delete rows
persistent ь
on commit preserve rows ь
on commit delete rows ь ь
Правила ссылочной целостности
GLOBAL TEMPORARY TABLE
Первая российская конференция по СУБД Firebird и InterBase
GLOBAL TEMPORARY TABLE
database
CREATE GLOBAL TEMPORARY TABLE T1
session 1
session 2
страницы не выделены
страницы не выделены
страницы выделены (временный
файл1, FW = OFF)
страницы освобождены (временный файл
удалён)
INSERT INTO T1 SELECT FROM T1
страницы выделены
disconnect
страницы освобождены (временный файл
удалён)
INSERT INTO T1SELECT FROM T1
страницы выделены (временный
файл2, FW = OFF)
disconnect
страницы не выделены
Общие метаданные Раздельные данные
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONS
WITH -- новое ключевое слово WITH
CTE_A -- имя первого табличного выражения[(a1, a2, …)] -- алиасы полей, необязательные
AS ( SELECT … ), -- определение выражения
CTE_B [(b1, b2, …)] -- второе табличноеAS ( SELECT … ), -- выражение
…
SELECT … -- основной запрос, использующийFROM CTE_A, CTE_B, -- табличные выражения
TAB1, TAB2 -- и обычные таблицы WHERE …
Простые не рекурсивные табличные выражения
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONSПримеры простых табличных выражений
WITH
A AS (SELECT … FROM T1),
B AS (SELECT … FROM A),
C AS (SELECT … FROM A, B B1, B B2),
D AS (SELECT … FROM E),
E AS (SELECT … FROM D),
F AS (WITH …)
• Выражений может быть несколько• В выражении можно использовать
любые конструкции синтаксиса SELECT
• Они могут ссылаться друг на друга• Их можно использовать в любой
части запроса• Их можно использовать в одном запросе несколько раз• Их можно использовать с любым
DML запросом : INSERT, UPDATE, DELETE, SELECT
• Их можно использовать в PSQL : FOR WITH … SELECT …
• Операторы WITH не могут бытьвложенными
• Ссылки между CTE не должны иметьциклов
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONS
WITH RECURSIVE -- новое ключевое слово RECURSIVECTE_R AS ( SELECT … FROM T1 -- не рекурсивный член
UNION ALL -- обязательно ALL
SELECT … -- рекурсивный членFROM CTE_R -- рекурсивная ссылка
)… -- другие выражения
SELECT … -- основной запросFROM CTE_R …
WHERE …
Рекурсивные табличные выражения
• CTE может ссылаться на само на себя• Рекурсивное выражение – это объединение рекурсивных и не рекурсивных членов• Обязательно должен быть не рекурсивный член• Сначала перечисляются не рекурсивные члены • Рекурсивные члены отделяются друг от друга с помощью UNION ALL
• По-прежнему не допускаются циклические ссылки• Рекурсивные члены не могут использовать агрегатные функции, DISTINCT, GROUP BY, HAVING• Рекурсивный член может содержать ровно одну рекурсивную ссылку и только во FROM• Рекурсивная ссылка не должна быть членом внешнего объединения
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONSПримеры рекурсивных табличных выражений
WITH RECURSIVER_TREE (ID, LEVEL) AS ( SELECT ID, 0 FROM TREE
WHERE PARENT_ID IS NULL
UNION ALL
SELECT TREE.ID, R_TREE.LEVEL + 1FROM TREE, R_TREE
WHERE TREE.PARENT_ID = R_TREE.ID)
SELECT TREE.*, R_TREE.LEVELFROM TREE, R_TREE
WHERE TREE.ID = R_TREE.ID
Первая российская конференция по СУБД Firebird и InterBase
COMMON TABLE EXPRESSIONSПримеры рекурсивных табличных выражений
WITH RECURSIVER AS (
SELECT PEOPLE, FATHER, MOTHERFROM PEOPLES
WHERE NAME = ‘VLAD’
UNION ALL
SELECT F.PEOPLE_ID, F.FATHER, F.MOTHER FROM PEOPLES F, R WHERE F.PEOPLE_ID = R.FATHER
UNION ALL
SELECT M.PEOPLE_ID, M.FATHER, M.MOTHER FROM PEOPLES M, R WHERE M.PEOPLE_ID = R. MOTHER
)
SELECT * FROM R
CREATE TABLE PEOPLES ( PEOPLE_ID INT NOT NULL PRIMARY KEY,
NAMEVARCHAR(255),FATHERINT REFERENCES PEOPLES,MOTHERINT REFERENCES PEOPLES
)
Первая российская конференция по СУБД Firebird и InterBase
Домены в параметрах процедур, в переменных и в CAST
CREATE DOMAIN D_MONEY AS NUMERIC (12, 4);
CREATE TABLE T (ID INT, AMOUNT D_MONEY);
CREATE PROCEDURE PROC1 (I1 TYPE OF D_MONEY)RETURNS (O1 TYPE OF D_MONEY)
ASDECLARE V_SUM TYPE OF D_MONEY;BEGINV_SUM = I1;O1 = V_SUM;SUSPEND;
END;
SELECT CAST(1 AS TYPE OF D_MONEY) FROM RDB$DATABASE;
ALTER DOMAIN D_MONEY TYPE NUMERIC (18, 4);
• Из определения домена используется только тип данных, ограничения (CHECK, NOT NULL) не используются. Чтобы подчеркнуть этот факт введено TYPE OF.
• Сохраняются зависимости доменов от процедур\триггеров
• При изменении домена процедуры не перекомпилируются сервером
• Зависимые от домена объекты ‘почувствуют’ изменение домена при загрузке в кеш метаданных
Первая российская конференция по СУБД Firebird и InterBase
REPLACE
REPLACE INTO <table> [(col1, …, colN)]
VALUES (val1, …, valN)
[MATCHING (mcol1, …, mcolM)]
[RETURNING (val1, …, valR) [INTO :var1, …, :varR]]
INSERT или UPDATE ?
IF EXISTS(SELECT * FROM <table> WHERE mc1 = val1 AND … AND mcM = valM)THEN UPDATE <table> SET col1 = val1, … colN = valN
WHERE mc1 = val1 AND … AND mcM = valM)ELSE INSERT INTO <table> [(col1, …, colN)]
VALUES (val1, …, valN)
REPLACE - два в одном !
• Если MATCHING не задан, то для поиска совпадения используется первичный ключ, который обязательно должен быть определён
• Требуются права доступа и на INSERT, и на UPDATE
• При использовании RETURNING, условию MATCHING должно соответствовать не более одной записи
Первая российская конференция по СУБД Firebird и InterBase
MERGE
MERGE INTO <table> -- новое ключевое слово MERGEUSING <table_or_join> -- источник данных для вставки\обновленияON <search_condition> -- условие поиска обновляемой строки-- запрос для обновления[WHEN MATCHED THEN UPDATE SET col1 = val1, … , colN = valN]-- запрос для вставки[WHEN NOT MATCHED THEN INSERT [col1, …, colN] VALUES (val1, …, valN)]
REPLACE – это хорошо, но если данные в другой таблице ?
MERGE INTO AMOUNTS USING ENTRIES E ON AMOUNTS.GOODID = E.GOODID AND AMOUNTS.DT = E.DTWHEN MATCHED THEN UPDATE SET SUMMA = SUMMA + E.DBT - E.CRDWHEN NOT MATCHED THEN INSERT (GOODID, DT, SUMMA) VALUES (E.GOODID, E.DT, E.DBT - E.CRD)
top related