Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2





НазваниеПрограмма по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2
страница14/18
Дата публикации10.04.2014
Размер2.46 Mb.
ТипДокументы
100-bal.ru > Информатика > Документы
1   ...   10   11   12   13   14   15   16   17   18

9.Структурированный язык запросов SQL. Подъязыки: язык определения данных, язык манипулирования данными. Операторы SQL, функции SQL, выражения SQL. Реализация операций реляционной алгебры. Подзапросы. Подзапросы в предложениях FROM, подзапросы в предложениях WHERE, подзапросы в предложениях HAVING. Коррелированные подзапросы. Использование оператора EXISTS, подзапросы с использованием операторов сравнения IN, ANY, ALL. Модификация БД: вставка, удаление, обновление данных.


Язык SQL (Structured Query Language - структурированный язык запросов) - это основное средство общения с реляционными базами данных. Более того: для большинства реляционных СУБД использование языка SQL - это единственный способ выборки и модификации информации в базе.

Язык SQL был разработан в 1970 году компанией IBM и достаточно быстро получил широкое признание. Разработчики реляционных СУБД один за другим включали SQL в свои продукты, но диалекты языка в разных СУБД достаточно сильно отличались.

Массовое распространение SQL в различных, довольно сильно отличающихся диалектах привело к необходимости его стандартизации. В 1986 году ISO (Международная организация по стандартизации) и ANSI (Американский национальый институт стандартов) опубликовали стандарт SQL 86, который затем дважды - в 1989 и в 1992 годах - пересматривался. Стандарт SQL 92 действует по сей день.

В настоящее время практически все разработчики СУБД декларируют соответствие диалектов языка SQL, реализованных в их продуктах, стандарту SQL 92. Но при ближайшем рассмотрении оказывается, что не все так радужно. Те или иные, пусть совсем небольшие, отклонения от стандарта SQL 92 присутствуют во всех СУБД, с которыми мне доводилось работать.

Основные принципы языка SQL

SQL - непроцедурный язык. В SQL не записываются шаг за шагом все инструкции, а просто говорится, что нужно сделать. Например: выбрать все строки таблицы Users, в которых UserFIO = "Вася Пупкин". Как это будет делаться, в каком порядке блоки данных будут считываться с диска, какие циклы надо организовать для обработки запроса и т.п. - это уже забота СУБД, а не программиста.

Язык SQL предназначен только для взаимодействия с базой данных. Средств разработки законченных программ (организации красивых экранных форм, печати отчетов и т.п.) в нем нет.

Составные части языка SQL

Традиционно выделяют две основных части языка SQL (хотя деление это во многом условное):

DDL - Data Definition Language - Язык определения данных. DDL включает в себя операторы создания, модификации, удаления объектов (Create, Alter, Drop...). К DDL обычно также относят операторы управления правами пользователей (Grant, Revoke).

DML - Data Manipulation Language - Язык манипулирования данными. DML предназначен для ведения (добавления, модификации, удаления) и выборки информации из базы данных. Основные операторы DML - Select, Insert, Update и Delete.

Интерактивный, статический и динамический SQL

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

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

Операторы SQL могут быть непосредственно включены в программы на других языках программирования. В настоящее время практически все языки программирования высокого уровня (в частности, C++, Object Pascal (Delphi) и другие) содержат средства подключения к базам данных и выполнения SQL-операторов. Такой режим называется статический SQL.

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

Группы операторов языка SQL.

SQL содержит 4 группы операторов:

Операторы описания данных: CREATE, DROP, ALTER и др.

Операторы манипуляции данными: INSERT, DELETE, SELECT, UPDATE и др.

Операторы задания прав доступа в базе данных: GRANT / REVOKE , LOCK / UNLOCK , SET LOCK MODE

Операторы защиты, восстановления данных и прочие операторы.

1. Операторы Описания Данных.

Операторы описания данных предназначены для описания (создания), изменения описания и уничтожения объектов базы данных.
В SQL различаются следующие виды объектов:

база данных (database);

таблица (table);

столбец (column);

индекс (index);

снимок (view);

синоним (synonym).


Каждый объект имеет собственное имя - идентификатор. Каждый объект имеет владельца - т.е. того пользователя, который его создал. Имя объекта можно уточнять с помощью имени его владельца (owner-name) в такой форме: moshkow.table1
Ниже приводятся примеры использования всех операторов описания данных. Полный же их синтаксис можно найти в "Кратком справочнике по 4GL", либо в "Справочном руководстве по INFORMIX-4GL".

Создание базы данных.

CREATE DATABASE zawod


В любой момент времени вы можете иметь доступ к объектами только одной - ТЕКУЩЕЙ (CURRENT) - базы данных. Оператор DATABASE делает новую базу текущей, закрывая при этом доступ к объектам предыдущей текущей базы. Оператор CLOSE DATABASE просто закрывает текущую базу данных.

DATABASE zawod

. . . # текущей является база zawod

DATABASE stanciq

. . . # текущей является база stanciq

CLOSE DATABASE

# текущей базы нет


Создаются таблицы kadry и ceh, содержащие столбцы разных типов.

CREATE TABLE kadry (

nomerceh INT,

tabnom SERIAL ,

fio CHAR(20) UNIQUE,

zarplata MONEY(16,2),

datarovd DATE,

pribytie DATETIME year TO minute )

CREATE TABLE ceh ( nomerceh int, nameceh char(20) )


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

ALTER TABLE kadry ADD (dolvnostx CHAR(20) BEFORE zarplata),

DROP(pribytie), ADD CONSTRAINT UNIQUE(tabnom, fio) CONSTRAINT

tabnomfio

ALTER TABLE items MODIFY (manu_code char(4))


Изменение структуры таблицы приводит к физическому преобразованию данных в ней. Если изменен тип столбца, то данные в нем преобразуются к новому типу, и если это невозможно осуществить, то оператор ALTER "валится" с кодом ошибки, а таблица остается в неизмененном состоянии.
View - "псевдо" таблица, базируется на существующих таблицах.

CREATE VIEW poor AS SELECT tabnom, fio, datarovd FROM kadry

WHERE zarplata < 120

# создано view - "псевдотаблица" из трех столбцов содержащая

# строки из таблицы kadry, в которых zarplata меньше 120 рублей.


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

CREATE UNIQUE INDEX indkdtb ON kadry (tabnom)

# создан индекс для столбца tabnom из таблицы kadry. Индекс

# уникальный, значит в столбце не могут появиться одинаковые

# значения.


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

ALTER INDEX indkdtb TO CLUSTER


Имена столбцов в разных таблицах могут совпадать. Если в каком либо операторе SQL упоминаются два столбца с одинаковыми названиями, то их нужно уточнять именами таблиц, их содержащих. Перед именем любого объекта можно (а иногда и необходимо) указать имя его владельца (owner-name) - входное имя пользователя, который создал (CREATE) этот объект.

kadry.nomerceh # столбец nomerceh из таблицы kadry

ceh.nomerceh # столбец nomerceh из таблицы ceh

iwanow.table1.c1 # столбец c1 из таблицы table1, владельцем которой является iwanow

moshkow.table1.c1 # столбец c1 из другой (!) таблицы table1, владельцем которой является moshkow


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

CREATE SYNONYM t1 FOR petrow.sostoqnie_postow


Теперь повсюду можно (хотя и не обязательно) вместо имени petrow.sostoqnie_postow использовать имя t1.
База данных может иметь системный журнал транзакций (logfile).

START DATABASE zawod WITH LOG IN "/udd/moshkow/logfile/zawod"


Если нет журнала транзакций для всей базы данных, то для отдельных таблиц в базе с той же целью можно создать audit trail.

CREATE AUDIT FOR kadry IN "/udd/moshkow/kadry.audit"


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

DROP VIEW poor # Уничтожается только view. С данными в таблицах, на которых оно базировалось ничего не происходит.

DROP TABLE kadry # уничтожает таблицу вместе с данными.

DROP INDEX indkdtb

DROP SYNONYM t1

DROP DATABASE zawod # уничтожает базу вместе со всеми данными и системным журналом

2. Операторы задания прав доступа в базе данных.

Выдавать и забирать права доступа к таблице может владелец таблицы, Администратор Базы Данных (имеющий DBA права), а так же пользователь, которому было выдано право выдавать права (Оператором GRANT WITH GRANT OPTIONS)

REVOKE ALL ON customer FROM PUBLIC

GRANT ALL ON customer TO iwanow, petrow WITH GRANT OPTION

GRANT UPDATE(fname,lname,company, sity),SELECT

ON customer TO PUBLIC

REVOKE CONNECT FROM sidorowa, root

REVOKE DBA FROM ivanov


Отобрать у вас права DBA (если вы, конечно, им являетесь) может только другой DBA. На время транзакции все измененные строки автоматически блокируются системой от изменения (но не от просмотра). Вы можете явно блокировать всю таблицу целиком, тогда система не будет блокировать строки по отдельности. Вы можете блокировать таблицу целиком не только от изменения но и от просмотра.

BEGIN WORK

LOCK TABLE kadry

. . .

UNLOCK TABLE kadry

. . .

LOCK TABLE kadry EXCLUSIVE


Если ваш оператор пытается записать в блокированную другим пользователем строку, то оператор "сваливается". Вы можете установить для своей программы режим "Ждать разблокирования строк".

SET LOCK MODE TO WAIT

3. Операторы транзакций и восстановления данных.

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

START DATABASE zawod WITH LOG IN "/ARM/log/zawod"


Восстанавливают разрушенную (например из-за сбоя оборудования) базу данных так:
В среде UNIX

Уничтожают остатки базы.

Заливают вместо них копию базы с ленты (например, недельной давности) используя команду cpio или утилиту INFORMIX dbimport.

Входят в среду INFORMIX и выполняют операторы:

DATABASE kadry EXCLUSIVE # чтобы никто не лез

ROLLFORWARD DATABASE kadry # прогнать базу вперед

# по системному журналу

CLOSE DATABASE # теперь всем можно работать


Транзакция

BEGIN WORK # начать транзакцию

. . . # операторы

IF все нормально THEN COMMIT WORK

ELSE ROLLBACK WORK

END IF


Если во время транзакции программа "свалилась" то INFORMIX автоматически сделает откатку.

4. Операторы Манипуляции Данными.

Следующая группа операторов предназначена для манипулирования данными в таблицах. В нее входят операторы выбора (SELECT) строк из таблицы (или таблиц), уничтожения (DELETE) строк в таблице, вставки (INSERT) строк, и изменения (UPDATE) значений в существующих в таблице строках.

Оператор DELETE.

Уничтожить в таблице kadry все строки, в которых номер цеха равен 4, а фамилия кончается на буквы "ов"

DELETE FROM kadry WHERE ceh=4 AND fio MATCHES "*ов"


В результате из списков будут вычеркнуты работники 4-го цеха "Петров", "Иванов", "Сидоров" и т.п Как видим, INFORMIX предоставляет националистически озабоченным руководителям мощные средства для воплощения в жизнь своих идей.
А этот оператор уничтожит ВСЕ строки в таблице kadry, владельцем которой является moshkow, но не саму таблицу

DELETE FROM moshkow.kadry

Простейшая форма оператора SELECT.

Первый пример находит в таблице kadry строку, в которой столбец tabnum=345 . Из этой строки берутся только три указаных столбца. Второй пример выбирает ВСЕ строки из таблицы ceh, и все столбцы.

SELECT fio, dolvn, zarplata FROM kadry WHERE tabnom=345

SELECT * FROM ceh

SELECT kadry.fio, ceh.nameceh WHERE kadry.nomerceh=ceh.nomerceh


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

Оператор INSERT.

Может вставить в таблицу одну строку, если используется в форме INSERT INTO ... VALUES, а может вставить в таблицу целый набор строк, выбранных подзапросом SELECT из другой таблицы.

INSERT INTO kadry VALUES (4,0,"Грицько",num,"10/25/1939",NULL)

INSERT INTO customer VALUES (ps_customer.*)

# ps_customer - переменная типа RECORD - аналог структуры в

# языке Си. Этот оператор вставляет значения элементов записи

# ps_customer в соответствующие поля таблицы customer

INSERT INTO kadry (tabnom, fio, nomerceh, dolvnostx)

SELECT 0 , fio, 4, dolvnostx FROM kadryold

WHERE nomerceh=3 AND fio IS NOT NULL

# последний оператор вставляет сразу несколько строк


Если мы хотим, чтобы при вставлении строки в столбец типа SERIAL автоматически заносилось очередное значение счетчика, нужно вставлять в этот столбец константу 0. Если не во все столбцы вставляемой строки вносится значение (как это сделано в третьем операторе), то незаполненные столбцы заполняются значением NULL.

В операторах DELETE, UPDATE, SELECT может присутствовать WHERE предложение, в котором можно задать условия на строки, которые требуется обработать (соответственно уничтожить, изменить или выбрать). Рассмотрим примеры использования WHERE предложения.

Оператор UPDATE.

Меняет значения столбцов, в строках, удовлетворяющим WHERE условию.

UPDATE kadry SET fio="Зыкова" WHERE fio="Гирусова"

UPDATE ceh SET kod_ceha[1,4]=nameceh[5,8] WHERE

nomerceh BETWEEN 3 AND 5 OR nameceh IN ("токарный","литейный")


В таблице ceh в цехах номер 3,4,5 а так же в токарном и литейном первые четыре символа в коде цеха будут заменены на подстроку поля nameceh из той же строки.

Предложение WHERE.

Предложение WHERE может присутствовать в любом из операторов DELETE, UPDATE, SELECT, когда нужно задать условия на строки, которые требуется обработать (соответственно, уничтожить, изменить или выбрать). Рассмотрим структуру и примеры использования предложений WHERE.
В предложении WHERE пишется логическое условие, которое получается соединением с помощью логических операторов AND, OR и NOT элементарных сравнений типа:

выражение1 < выражение2,

выражение1 >= выражение2, и т.п.,


а так же элементарных сравнений специального вида:

column-name IS [NOT] NULL

выраж [NOT] BETWEEN выраж1 AND выраж2

выраж [NOT] IN (выраж1 , ... [, ...] )


Можно выяснить, подходит ли символьная строка под определенный шаблон, или нет. Для этого используются две операции сравнения по шаблону - LIKE и MATCHES.

симв-выражение MATCHES "шаблон"

симв-выражение LIKE "шаблон"


LIKE имеет более простой шаблон. В нем используются только два спецсимвола: (%) замещает произвольное количество символов, (_) замещает ровно один символ. Все остальные символы в шаблоне обозначают сами себя. Если мы хотим включить в шаблон % или _ отменив их специальный смысл, то перед ними надо поставить ESC╜символ (по умолчанию это (\)).
Допустим нам нужно выбрать из таблицы tab8 все строки, в которых символьный столбец string1 содержит символ "+" а предпоследняя буква в нем - "Ы". Оператор выборки будет выглядеть так:

SELECT * FROM tab8 WHERE string1 LIKE "%+%Ы_"


MATCHES использует такие спецсимволы шаблона: *, ?, [, ], ^, -.

*

заменяет любое количество символов

?

заменяет один любой символ

[...]

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

возможно указание от и до (-), и не (^)

[abH]

любой из символов a, b, H

[^d-z]

любой символ, исключая d,e,f,g, ... ,y,z

\

отменяет спецсмысл спецсимволов *,?,[,]


Если вы хотите воспользоваться спецсимволами как обычными, примените escape-char. Если escape-char="\", то \? обозначает просто символ ?, \* обозначает просто символ *, \\ обозначает просто символ \ . Зато знак кавычки (") внутри шаблона нужно обозначать двумя кавычками ("").
Выбрать все данные о заказчиках в названии компании которых вторая буква не лежит в интервале от G до L, а третья буква c. (Кстати, коды русских букв на БЕСТЕ идут подряд, но в отличие от латинских букв, русские не упорядочены по алфавиту.)

SELECT * FROM customer WHERE company MATCES"?[^G-L]c*"


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

SELECT * FROM customer

WHERE company MATCHES "*Я?*" ESCAPE"Я"


В данном примере использовался ESC-символ "Я" для отмены спецсмысла символа "?".

Если вы хотите:

Сравнить выражение с результатом другого SELECT оператора

выраж сравн {ALL | [ANY | SOME]} (SELECT-statement)

Определить, принадлежит ли выражение результатам другого SELECT оператора.

выраж [NOT] IN (SELECT-statement)

Выяснить, выбрал ли хоть что-нибудь другой SELECT оператор.

[NOT] EXISTS (SELECT-statement)


то применяйте условия с подзапросом.

Условия с Подзапросом.

SELECT fio FROM kadry WHERE zarplata=

(SELECT MAX(zarplata) FROM kadry )


Здесь подзапрос возвращает единственное значение - максимальное значение зарплаты. А внешний SELECT оператор находит фамилии обладателей оной.

SELECT fio, shifr, organizaciq FROM zaqwki WHERE denxgi_rek is

not NULL and

gorod in (SELECT gorod FROM regiony WHERE region="Урал")


Здесь запрос выводит данные об руководителях, получивших финансирование и работающих на Урале.

SELECT order_num,stock_num,manu_code, total_price FROM items x

WHERE total_price > (SELECT 2*MIN(total_price)

FROM items WHERE order_num=x.order_num)


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

Оператор UNLOAD.

Оператор UNLOAD сбрасывает данные из таблицы в файл в печатном представлении. Каждая строка преобразуется в отдельную запись, значения из столбцов разделяются символом "|".
После выполнения оператора

UNLOAD TO "kadry19.unl" SELECT * FROM kadry


в файле kadry19.unl можно будет обнаружить следующее:

5|5|туев |завхоз |100.0|31.12.1946|

4|6|петунин|кладовщик|80.0 | |

. . .

Оператор LOAD.

Оператор LOAD выполняет обратную операцию - считывает строки из файла и вставляет их в таблицу. Естественно, что типы и количество значений в строках файла должны соответствовать столбцам таблицы.

LOAD FROM "kadry20.unl" INSERT INTO kadry

5. Снова Оператор SELECT.

Предложения INTO, INTO TEMP, FROM.

Выбрать все строки (нет предложения WHERE) из таблицы kadry, взять в них все столбцы (вместо перечисления столбцов стоит *), оставить только различные строки (ключевое слово UNIQUE) и поместить результат во временную таблицу (INTO TEMP) x, которая будет при этом создана с такими же столбцами, что и у kadry.

SELECT UNIQUE * FROM kadry INTO TEMP x


Выбирать можно из нескольких таблиц. При этом берутся все возможные комбинации строк из первой таблицы со второй. Предположим, что таблице tab1 6 строк а в tab2 - 7 строк. Результат нижеприведенного примера - таблица, содержащая три столбца и 7*6=42 строки.

SELECT tab1.a-tab2.b, tab1.a, tab2.b FROM tab1, tab2


Мы сейчас не будем уточнять, куда именно результирующая таблица помещается. Но использовать ее можно по разному: ее можно перегнать (INTO TEMP) во временную таблицу, ее можно отдать на обработку другому оператору (если выборку осуществлял подзапрос), для нее можно создать курсор ("буфер" с указателем на текущую строку), а можно положить ее (INTO) в простую программную переменную (если выбрано не более одной строки).
Выбранные строки можно упорядочить по возрастанию (убыванию) значения в столбце (столбцах)

SELECT a,b,c,d+e FROM tabl ORDER BY b,c

SELECT a,b,c,d+e FROM tabl ORDER BY 2,3


В ORDER BY предложении вместо имени столбца можно указывать его порядковый номер в списке выборки (select-list). Вышеприведенные операторы эквивалентны.
Поместить значения из столбцов в переменные: (Поскольку lname используется и как имя переменной, и как имя столбца, то имя столбца предваряется знаком (@)

SELECT customer_num, @lname,city INTO cnum,lname,town

FROM customer

Агрегатные функции.

К выбранным строкам можно применять агрегатные функции COUNT(*) - количество, MAX(column) и MIN(column) - максимальное и минимальное значение в столбце, SUM(column) - сумма всех значений в столбце, AVG(column) - среднее значение в столбце.
Поместить в переменную num количество строк в таблице orders, в которых столбец customer_num равен 101:

SELECT COUNT(*) INTO num

FROM orders WHERE customer_num=101


Пример с использованием соединения таблиц. Находится среднее значение зарплаты превосходящей 300 (столбец zarplata принадлежит одной из таблиц), при условии совпадения столбцов dolvnost в двух таблицах.

SELECT AVG (zarplata) FROM table1,table2

WHERE table1.dolvnost=table2.dolvnost and zarplata>300

Группировка GROUP BY.

Группировка используется для для "сплющивания" группы (строк) в одну. Результат запроса содержит одну строку для каждого множества строк, удовлетворяющих WHERE предложению и содержащих одно и то же значение в указанном столбце.

SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry

GROUP BY dolvnostx


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

SELECT dolvnostx, COUNT(*), AVG(zarplata) FROM kadry GROUP BY 1


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

SELECT order_num, AVG(total_priece) FROM items

GROUP BY order_num HAVING COUNT(*) > 2


Этот запрос возвращает номера ордеров и среднее значение total_price в заявках для всех ордеров, имеющих не менее двух заявок.

Внешнее соединение таблиц.

Строки из таблицы, присоединенной внешним образом (на внешнее соединение указывает ключевое слово OUTER) будут выбираться не смотря на то, удовлетворяют они условиям WHERE предложения или нет. В некоторых случаях это полезно, когда у вас есть главная таблица и есть вспомогательная, и данные из главной таблицы вам нужно получить в любом случае. Пример внешнего соединения:

SELECT company, order_num

FROM customer c, OUTER orders o

WHERE c.customer_num=o.customer_num


Запрос находит названия компаний и номера ордеров, которые они послали. Если же компания ордеров не присылала, то ее название все равно будет выбрано, а номер ордера в этой строке будет равен NULL. (А если бы мы запустили запрос без параметра OUTER, то названия этих компаний вообще бы не попали в выборку.)
Храни́мая процеду́ра — объект базы данных, представляющий собой набор SQL-инструкций, который компилируется один раз и хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления потоком.

Реализация хранимых процедур

Хранимые процедуры обычно создаются с помощью языка SQL или конкретной его реализации в выбранной СУБД. Например, для этих целей в СУБД Microsoft SQL Server существует язык Transact-SQL, в Oracle DatabasePL/SQL, в Interbase и Firebird - PSQL, в PostgreSQLPL/pgSQL, PL/Tcl, PL/Perl, PL/Python, в IBM DB/2 — SQL/PL и MySQL достаточно близко следует стандарту SQL:2003, её язык похож на SQL/PL.

В некоторых СУБД возможно использование хранимых процедур, написанных на любом языке программирования, способном создавать независимые исполняемые файлы, например, на C++ или Delphi. В терминологии Microsoft SQL Server такие процедуры называются расширенными хранимыми процедурами и являются просто функциями, содержащимися в DLL Win32. А, например, в Interbase и Firebird для функций, вызываемых из DLL/SO, определено другое название - UDF (User Defined Function).

Назначение и преимущества хранимых процедур

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

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

Кроме собственно выполнения запроса, хранимые процедуры позволяют также производить вычисления и манипуляцию данными - изменение, удаление, выполнять DDL-операторы (не во всех СУБД!) и вызывать другие хранимые процедуры, выполнять сложную транзакционную логику. Один-единственный оператор позволяет вызвать сложный сценарий, который содержится в хранимой процедуре, что позволяет избежать пересылки через сеть сотен команд и, в особенности, необходимости передачи больших объёмов данных с клиента на сервер.

В большинстве СУБД при первом запуске хранимой процедуры она компилируется (выполняется синтаксический анализ и генерируется план доступа к данным). В дальнейшем её обработка осуществляется быстрее. В СУБД Oracle выполняется интерпретация хранимого процедурного кода, сохраняемого в словаре данных. Начиная с версии Oracle 10g поддерживается так называемая естественная компиляция (native compilation) хранимого процедурного кода в Си и затем в объектный код целевой машины, после чего при вызове хранимой процедуры происходит прямое выполнение её скомпилированного объектного кода.

Возможности программирования

Созданную хранимую процедуру можно вызвать в любой момент, что обеспечивает модульность и стимулирует повторное использование кода. Последнее облегчает сопровождение базы данных, так как она становится изолированной от меняющихся бизнес-правил. Модифицировать хранимую процедуру в соответствии с новыми правилами можно в любой момент. После этого все приложения, использующие её, автоматически придут в соответствие с новыми бизнес-правилами без непосредственной модификации.

Безопасность

Использование хранимых процедур позволяет ограничить или вообще исключить непосредственный доступ пользователей к таблицам базы данных, оставив пользователям только разрешения на выполнение хранимых процедур, обеспечивающих косвенный и строго регламентированный доступ к данным. Кроме того, некоторые СУБД поддерживают шифрование текста (wrapping) хранимой процедуры.

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

Снижена вероятность таких действий как «инъекция SQL» (или «SQL-вторжение»), поскольку хорошо написанные хранимые процедуры дополнительно проверяют входные параметры перед тем, как передать запрос системе управления базами данных.

3.2. Скалярные выражения

Скалярное выражение - это выражение, вырабатывающее результат некоторого типа, специфицированного в стандарте. Скалярные выражения являются основой языка SQL/92, поскольку, хотя это реляционный язык, все условия, элементы списков выборки и т.д. базируются именно на скалярных выражениях. Заметим, что в SQL/89 не требовалось вводить такое отдельное понятие, поскольку единственным допустимым скалярным выражением было арифметическое (т.е. вырабатывающее число). В связи с расширением ассортимента типов и операций над их значениями, в SQL/92 появилось три разных вида скалярных выражения - численные, над строками и над временем и датами (и интервалами). Мы не будем слишком глубоко вникать в тонкости, но тем не менее, приведем некоторые базовые спецификации и пояснения.

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

Спецификация значения и спецификация цели

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

::=



|

::=



|

::=
|

|

|USER

|CURRENT_USER

|SESSION_USER

|SYSTEM_USER VALUE

::=
|
|

::=
|

::=



::= &

lt;parameter name> [
1   ...   10   11   12   13   14   15   16   17   18

Похожие:

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Проектно-образовательная деятельность по формированию у детей навыков безопасного поведения на улицах и дорогах города
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Цель: Создание условий для формирования у школьников устойчивых навыков безопасного поведения на улицах и дорогах
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
«Организация воспитательно- образовательного процесса по формированию и развитию у дошкольников умений и навыков безопасного поведения...
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Цель: формировать у учащихся устойчивые навыки безопасного поведения на улицах и дорогах, способствующие сокращению количества дорожно-...
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Конечно, главная роль в привитии навыков безопасного поведения на проезжей части отводится родителям. Но я считаю, что процесс воспитания...
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Поэтому очень важно воспитывать у детей чувство дисциплинированности и организованности, чтобы соблюдение правил безопасного поведения...
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Всероссийский конкур сочинений «Пусть помнит мир спасённый» (проводит газета «Добрая дорога детства»)
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...
Поэтому очень важно воспиты­вать у детей чувство дисциплинированности, добиваться, чтобы соблюдение правил безопасного поведения...
Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...

Программа по формированию навыков безопасного поведения на дорогах и улицах «Добрая дорога детства» 2 iconПрограмма по формированию навыков безопасного поведения на дорогах...



Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск