Лекция_2_ТипыКоманд SQL.ppt
- Количество слайдов: 161
T-SQL
Типы команд SQL • команды DDL (Data Definition Language – язык определения данных), • команды DML (Data Manipulation Language – язык манипулирования данными), • команды TC (Transaction Control – команды управления транзакциями) • команды DCL (Data Control Language – язык управления доступом к данным).
Команды DDL используются для создания (CREATE …) изменения (ALTER…), удаления (DROP…) различных объектов. Например: CREATE DATABASE bd 1 CREATE TABLE deti(ks INT, Fio VARCHAR(25), Im VARCHAR(25)) ALTER TABLE deti ADD dr SMALLDATETIME
Типы данных Назначение Хранимые значения Bigint от-9223372036854775808 9223372036854775807 от -2147483648) до 2147483647 от -32768 до 32767 от 0 до 255 Int Smallint Tinyint Decimal numeric Для хранения целых чисел Для хранения От-10^38 до 10^38 -1 чисел в формате n. d где n-общее число десятичных цифр, d – число цифр после десятичной до
Float Real Для хранения От -1. 79 E + 308 до 1. 79 E + 308 данных с От -3. 40 E + 38 до 3. 40 E + 38 плавающей точкой Datetime Для хранения От 1 января 1753 до 31 декабря 9999 Smalldatetime данных типа От 1 января 1900 до 6 июня 2079 дата и время
Char Varchar Text Nchar Nvarchar Ntext Строка До 8000 символов фиксированн ой длины Строка переменной длины До 8000 символов Текстовые До 2^31 - 1 (2147483647) символов данные До 4000 символов Unicode фиксированн ой длины Данные До 4000 символов Unicode 2^30 - 1 (1073741823) переменной длины. Текстовые данные
Команда открытия базы данных USE имя_базы_данных Например, USE detal
Команды TC BEGIN TRANSACTION [имя_транзакции] … … [ROLLBACK TRANSACTION] … COMMIT [TRANSACTION] [имя_транзакции]
Команда запроса SELECT [DISTINCT|ALL] {* | имя_поля 1 [AS наименование_столбца], имя_поля 2…. } FROM имя_таблицы1 [JOIN имя_таблицы2 ON выражение_для_связи_между _таблицами] [WHERE условие_отбора_строк] [GROUP BY имя_поля] [HAVING условие_для_отбора_групп] [Order by имя_поля 1[ASC | DESC] [, имя_поля 2 …]]
Знаки логических операций в опции WHERE Назначение Пример Неточное сравнение, обычно применяется, если сравниваются строковые данные Fio LIKE ‘И%’ (значение поля, которое начинается с буквы «И» ) Знак LIKE = <> >= <= > < Равно Не равно Больше или равно Меньше или равно Больше Меньше Fio=’Иванов’ Fio <>’Иванов’ Oklad>=8000
BETWEEN Между (в интервале) Oklad between 5000 AND 10000 IN Находится в списке Oklad IN (5000, 10000)
Состав изделий Код изделия Код детали Количество деталей Деталь Код детали Наименование Цена Выпуск Код цеха Код изделия Количество Цех Код цеха Наименование Изделие Код изделия Наименование
Пример 1. Создать запрос для вывода списка изделий. Use detal SELECT * FROM izdel Пример 2. Создать запрос для вывода списка изделий, наименование которых начинается со слова «стол»
Пример 3. Показать список сотрудников (таблица sotr), которые работают в цехах 1 и 3 SELECT * FROM sotr WHERE kod_c IN (1, 3)
Пример 4. Вывести список кодов различных деталей, которые использовались для выпуска изделий SELECT DISTINCT kod_d FROM izd_det
Логические операторы • AND • OR • NOT
Пример 6. Вывести список изделий, наименование которых начинается с букв «с» и «к»
Сортировка. Запросы типа «n наибольших» или «n наименьших»
Команда Update UPDATE таблица SET имя_поля 1= новое_значение [, имя_поля 2=новое_значение, …] WHERE условия_отбора Пример: увеличить зарплату менеджера Белова на 1300 р UPDATE manager SET oklad=oklad+1300 WHERE fio=‘Белов’
Команда удаления данных DELETE FROM имя_таблицы WHERE условия_отбора Пример 7. Удалить из таблицы sotr все записи, в которых поле fio не определено (имеет значение NULL). DELETE FROM sotr WHERE fio IS NULL
Команда добавления записей в таблицу. INSERT Добавление одной записи INSERT INTO имя_таблицы [(поле 1[, поле 2[, . . . ]])] VALUES (значение 1[, значение 2[, . . . ]) Добавление нескольких записей INSERT INTO имя_таблицы1 [(поле 1[, поле 2[, . . . ]])] запрос
Сложные запросы Сгруппированные запросы COUNT() SUM() AVG() MIN() MAX() SELECT MAX(oklad) FROM manager SELECT n_nakl, SUM(kol*cena) FROM Tovar_v_nakl GROUP BY n_nakl SELECT KOD_C, COUNT(FIO) FROM SOTR GROUP BY KOD_C
Условия отбора Пример: показать, на какую сумму проданы товары по накладной с номером 5 SELECT n_nakl, SUM(kol*cena) FROM tovar_v_nakl WHERE n_nakl=5 GROUP BY n_nakl SELECT n_nakl, SUM(kol*cena) FROM tovar_v_nakl GROUP BY n_nakl HAVING n_nakl=5
Показать номера накладных сумму проданных по ним товаров, количество различных наименований товаров только для тех накладных, продажи по которым больше или равны 3000 select n_nakl, sum(kol*cena) as Сумма, count(*) as Строк_в_списке from tovar_v_nakl group by n_nakl having sum(kol*cena)>=3000
Запросы к нескольким таблицам Select поле 1, поле 2, …. From Таблица 1 INNER| LEFT OUTER |RIGHT OUTER JOIN таблица 2 ON условие объединения [INNER| LEFT OUTER |RIGHT OUTER JOIN таблица 3 ON условие объединения ] […]
Показать список товаров, находящихся на каждом из складов. Вывести поля: номер склада, наименование склада (таблица sklad), код товара (таблица Tovar_na_sklade), наименование товара (price_list), количество товара (Tovar_na_sklade), цену (price_list), и стоимость товара.
Показать наименование изделий, наименование деталей и количество деталей, из которых оно собирается.
• Показать фамилии и общую сумму продаж по всем накладным для тех менеджеров, у которых эта сумма превышает 9000
Иногда таблицы связываются не по эквивалентности полей. Например, требуется подсчитать, сколько менеджеров (БД firma) получают оклады, находящиеся в определенной категории, заданной таблицей cat_oklad
Соединение таблицы с самой собой Например, в базе данных Northwind имеется таблица Employees, в которой имеется код сотрудника Employee. ID и код его начальника Reports. To. Требуется вывести фамилию и имя начальника (поля Last. Name и First. Name) и фамилию и имя подчиненного.
select m. Last. Name+m. First. Name as 'Начальник', e. Last. Name+e. First. Name as 'Подчиненный' from employees m inner join employees e on m. employee. ID=e. Reports. To order by m. Last. Name, m. First. Name
Оператор для объединения запросов SELECT …. UNION SELECT … Объединяет результаты двух запросов в один результирующий набор Каждый из запросов должен содержать: одинаковое количество одноименных и однотипных полей
Создание новой таблицы из запроса Пример. Создать таблицу veteran, включив в нее поля ks, fio, hireday из таблицы kadry. . sotrud, для тех сотрудников, которые проработали более 10 лет USE kadry select ks, fio, hireday into veteran from sotrud where cast( (getdate()hireday) as real) /365>10 select * from veteran
Запросы с подзапросами Подзапрос - запрос, который содержится в другом запросе или DML командах (UPDATE , DELETE). Подзапрос всегда заключается в скобки.
Подзапросы могут • Возвращать один результат (однострочный) • Возвращать много результатов • Быть коррелированным (т. е. ссылаться на один или несколько столбцов внешнего запроса)
Подзапросы могут быть использованы • В условии внешней SQL команды • В списке полей внешнего запроса (только однострочный запрос) • В выражении, которое присваивается для обновляемого поля в команде UPDATE (только однострочный запрос) • В конструкции FROM вместо имени таблицы
Показать фамилии и оклады менеджеров, получающих оклады выше среднего по фирме.
Пример 22. Вывести фамилию и оклад менеджера, который получает максимальный оклад. SELECT fio, oklad FROM manager WHERE oklad= (SELECT MAX(oklad) FROM manager)
Найти номер цеха в БД detal, в котором работает максимальное число сотрудников
select nnt. kod_c from (select kod_c, count(fio) as ch_s from sotr group by kod_c ) as nnt where nnt. ch_s=(select max(nt. ch_s) from (select kod_c, count(fio) as ch_s from sotr group by kod_c )as nt) Найти номер цеха, в котором работает максимальное число сотрудников
В таблице kadry. . sotrud выявить ошибочные записи, в которых коды должностей сотрудников отсутствуют в справочной таблице dolg.
Требуется показать списки сотрудников тех подразделений, в которых число сотрудников больше или равно двум
Подзапросы можно использовать и в других командах DML, например, в команде обновления данных. Увеличить на 10% оклады тех менеджеров, заработная плата которых ниже средней. UPDATE manager SET oklad=oklad*1. 1 WHERE oklad < (SELECT AVG(oklad) FROM manager)
Повысить на 20 % оклады тем менеджерам, которые продали товар на сумму, превышающую 3000 р. UPDATE manager SET oklad= oklad*1. 2 WHERE kod_men IN (SELECT kod_men FROM nakladnay WHERE n_nakl IN (SELECT n_nakl FROM tovar_v_nakl GROUP BY n_nakl HAVING SUM(kol*cena)>3000))
Для сотрудника с кодом 86 установить разряд, равный среднему разряду в подразделении с кодом 55 UPDATE sotrud SET r= (SELECT CAST(AVG(r) AS INT) FROM sotrud WHERE kp='55') WHERE ks='86'
Коррелированные подзапросы • Пример. Показать список сотрудников каждого подразделения (поля kp, fio, r), которые имеют разряд выше, чем средний разряд в своем подразделении
select so. kp, so. fio, so. r from sotrud so where so. r> (select avg(si. r) from sotrud si where so. kp=si. kp group by si. kp) order by so. kp
Внутренний подзапрос выполняется заново для каждой строки внешнего запроса. Поэтому такой запрос может очень долго выполняться!!!
Здесь таблица sotrud сканируется только один раз
Представления Create view имя_представления AS Команда_запроса Например: CREATE VIEW v 1 AS SELECT s. fio, s. kd, d. dolg from Sotrud s inner join dolg d on s. kd=d. kd Where kp=’ 55’
Представления позволяют: • Организовать более простые запросы • Изменять данные в основной таблице(представление должно содержать поля только одной таблицы) • Ограничить доступ к полям с секретной информацией
Основы программирования
Переменные. Команда объявления типа переменной. Команда присваивания. Команды вывода • Имя переменной должно начинаться с символа «@» • Тип переменной определяется с помощью команды DECLARE. • DECLARE @a int, @b int • Оператор присваивания SET имя_переменной=выражение или SELECT имя 1=выр1, имя 2=выр2, …
Для вывода значения переменной можно использовать команду PRINT или SELECT
declare @a int, @b int, @c int set @a=10 set @b=20 set @c=@a+@b print @a print @b print @c print str(@a)+' '+str(@b)+' '+str(@C) select 'a'=@a , 'b'=@b, @c as Сумма
Множественное присваивание
Округление результата
Операторы • арифметические, • операторы сравнения (=, >, <, >=, <>) • логические операторы AND, OR и NOT Порядок действий арифметических операций: 1. действия в скобках, 2. арифметические операции *(умножения), /(деления), %-остаток от деления 3. операции сложения и вычитания. Приоритет логических операций : 1. NOT, 2. AND 3. OR
Оператор % находит остаток отделения
Логические операторы, используемые в подзапросах Оператор IN
ANY | SOME
EXISTS
Комментарии • Блочные начало блока - «/*» , конец – «*/» , Например, /* Это программа называется product. sql Она служит для выдачи сообщений о наличии товаров */
Присоединяемый комментарий начинается двумя символами «-» . Например, SELECT Product. Name, (Units. In. Stock-Units. On. Order) as 'Остаток‘ --расчет остатка товара , Supplier. ID from products
Функции • Агрегатные функции (AVG, SUM и т. д. ), • Скалярные функции, • Функции набора данных.
Агрегатные функции обрабатывают набор данных, но возвращают единственный результат
Скалярные функции обрабатывают единственное данное и возвращают единственный результат. Категории встроенных скалярных функций Configuration Cursor Date and Time Mathematical Конфигурация Курсор Дата и время Математические Security Meta Data System Text и Image Безопасность Метаданные Системные
Пример функций из категории «Мета-данные»
Примеры функций конфигурации
Примеры системных функций
Примеры функций для обработки строк
Примеры функций для обработки данных типа «Дата и время»
Для вывода даты в нужном формате можно использовать функцию CONVERT (CHAR(ширина), данное_типа_дата [, стиль])
Элементы языка, управляющие потоком команд • Команды, воздействующие на группу других команд Операторные скобки Begin …. End Операторы разветвления IF …. ELSE Операторы цикла WHILE Команды, воздействующие на строки таблицы Конструкция CASE
Операторные скобки BEGIN. . . END Begin Команды SQL …. end
Оператор IF…ELSE Общий вид команды: IF логическое выражение Команда SQL 1 [ELSE Команда SQL 2] или IF логическое выражение Begin … End [ELSE Begin … End ]
Пример 4. 3. Проверить, все ли сотрудники (kadry. . sotrud) имеют разряд ниже пятнадцатого. IF 15>ALL (SELECT r FROM sotrud) PRINT 'Все сотрудники имеют разряд ниже 15' ELSE Print 'Не все сотрудники имеют разряд ниже 15'
Удалить запись для клиента FRANK из таблицы Customers, если у него не было заказов (таблица Orders) USE Northwind IF EXISTS (SELECT Order. ID FROM Orders WHERE Customer. ID= 'FRANK') Print 'Покупатель по имени Frank имеет заказы, поэтому его нельзя удалять' ELSE BEGIN DELETE from Customers where Customer. ID='FRANK' Print 'Покупатель FRANK удален из таблицы Customer' END
USE KADRY_NEW --SELECT * FROM DOLG IF EXISTS(SELECT kd FROM sotrud WHERE kd= (SELECT kd FROM dolg WHERE dolg='проректор')) print 'нельзя удалить должность из списка должностей' else begin delete from dolg where dolg='проректор' print 'должность "проректор " удалена из списка' end
Оператор цикла WHILE условие { Команда sql | блок команд SQL} [ BREAK ] {Команда sql | блок команд SQL} [ CONTINUE ] {Команда sql | блок команд SQL}
Увеличивать цену книг вдвое, если средняя цена не превышает $30 до тех пор, пока максимальная цена книг не станет выше $50.
declare @a money, @b money set @a= (SELECT AVG(price) FROM titles) select @a as Средняя_цена WHILE @a < $30 BEGIN UPDATE titles SET price = price *2 set @b=(SELECT MAX(price) FROM titles) select @b as Максимальная_цена IF @b > $50 BREAK ELSE begin set @a= (SELECT AVG(price) FROM titles) select @a as Средняя_цена CONTINUE end END Select 'Цена для рынка слишком велика‘
Найти сумму первых 4 натуральных чисел. Значение переменной цикла и значение суммы печатать на каждом шаге цикла.
Найти сумму ряда 1+1/3+1/5+1/7+…Вычисления закончить,
Конструкция CASE используется при проверке множества условий. Может применяться при обработке строк таблицы Пример 1: По данным таблиц Sotrud, Dolg начислить премию: Ассистентам – 300 р, Доцентам и Ст. преподавателям – 500 р, Профессорам – 1000. Вывести в результате запроса поля Sotrud. fio, Dolg. dolg и значение премии
use kadry select s. fio as 'Фамилия' , d. dolg as Должность, case when (d. dolg='ассистент') Then 300 when (d. dolg='доцент' or d. dolg='ст. преподаватель' ) Then 500 when (d. dolg='профессор') Then 1000 else 0 End as 'Премия' from sotrud s inner join dolg d on s. kd=d. kd
Выдать полное название штата
Динамическое конструирование команд. Execute(выражение символьного типа) declare @bd char(15), @field 1 char(25), @field 2 char(1), @dop char(2), @t char(8) set @bd='kadry' set @t='sotrud' set @field 1='fio' set @field 2='r' execute ('USE '+@bd+' '+ 'SELECT '+@field 1+', '+@field 2+' from '+@t)
• Команда EXECUTE выполняет операции, которые состоят из строк, объединяя их в так называемые «командные блоки» , поэтому добавляйте необходимые пробелы между отдельными словами. • Команда EXECUTE может содержать строковые константы, строковые переменные или сочетание и того, и другого.
• Все члены команды EXECUTE должны иметь символьный тип, другие данные необходимо преобразовать к символьному типу до выполнения команды EXECUTE. • Нельзя использовать функцию для преобразования данных другого типа в строку внутри команды EXECUTE. • Можно использовать любое корректное выражение Transact SQL динамически, включая и функции.
Потенциально опасная команда
Пакет – это набор команд, которые клиент пересылает серверу. Некоторые команды, например CREATE, не могут выполняться в одном пакете. CREATE VIEW v 1 … GO CREATE TRIGGER T 1… GO CREATE TRIGGER T 2…. GO
Локальные переменные сохраняют параметры объявления только внутри пакета DECLARE @a int SET @a=10 SELECT @a Будет выведено значение 10 DECLARE @a int SET @a=10 GO SELECT @a Будет выведено сообщение, что переменная а не объявлена
Создание скриптов (программ) Скрипты- файлы с расширением. sql. Тексты скриптов можно создавать в QUERY ANALYZER или в любом текстовом редакторе, например, в блокноте. Выполнять такие файлы можно также из QUERY ANALYZER или включать в задания и пакеты обмена данными. В скрипты можно включать команды транзакции: BEGIN TRANSACTION … COMMIT TRANSACTION …. ROLLBACK TRANSACTION.
Создание пользовательских функций Пользовательская функция – объект базы данных Пользовательские функции могут быть трех типов: • Scalar (возвращают единственный результат • Inline (возвращают результат в виде таблицы, но сами состоят из одной команды SELECT • Multi-scalar (возвращают результат в виде таблицы и сами могут состоять из сложной программы)
Скалярные функции CREATE FUNCTION [владелец. ] имя_функции ( [ { @имя_параметра [AS] тип_параметра[ = значение_по_умолчанию ] } [ , . . . n ] ] ) RETURNS тип_возвращаемого_данного [ WITH < опции_функции> [ [, ]. . . n] ] [ AS ] BEGIN команды функции RETURN скалярное_выражение END < опции_функции> Encription |Schemabinding
create function premia(@d char(20)) returns real as begin declare @prem real if @d='доцент' or @d='ст. преподаватель' set @prem=500 else if @d='профессор' set @prem=1000
else if @d='лаборант' set @prem=300 else set @prem=0 return @prem End Созданную функцию можно использовать в запросе: select sotrud. fio, dolg, dbo. premia(dolg) from sotrud inner join dolg on sotrud. kd=dolg. kd Или в команде вывода Select dbo. premia(‘доцент’)
Использование типа данных TABLE в функциях типа Inline и Multi-scalar Тип данных TABLE применяется только тогда, когда результатом работы функции должна быть временная таблица, она будет храниться в памяти в течение только данного сеанса работы. Результат работы такой функции объявляется после ключевого слова RETURNS, который возвращает тип результата.
Создать функцию для выбора авторов из таблицы pubs. . authors, которые проживают в определенном штате use pubs go create function spisok_authors(@state char(2)) returns table as return(select au_lname, au_fname, state from pubs. . authors where state=@state) select * from spisok_authors('UT')
Пример. Разработать функцию, которая возвратить в виде таблицы название подразделения и количество сотрудников в подразделении (БД kadry) create function kol_sotr() returns table as return (select p. podr, count(s. fio) as c. H_sotr from sotrud s inner join podr p on s. kp=p. kp group by p. podr)
Создать функцию, которая бы возвратила список товаров, проданных по определенной накладной CREATE FUNCTION spis_tov(@n_nakl smallint) RETURNS @sp TABLE (n_nakl smallint, data datetime, k_tov smallint, n_tov varchar(30), kol int, cena real, stoim real) as begin INSERT INTO @sp SELECT n. n_nakl, n. data_nakl, t. k_tov, p. n_tov, t. kol, t. cena, t. kol*t. cena FROM nakladnay n INNER JOIN tovar_v_nakl t ON n. n_nakl=t. n_nakl INNER JOIN price_list p ON p. k_tov=t. k_tov WHERE n. n_nakl=@n_nakl Return end
Хранимые процедуры CREATE PROCEDURE имя_процедуры[ ; номер ] [ { @параметр тип_параметра} [ VARYING ] [ = значение_параметра_по_умолчанию ] [ OUTPUT ] ] [ , . . . n ] AS команды Transact_SQL
Разработать процедуру для выдачи списка авторов, проживающих в Калифорнии /*файл get_list_authors 2. sql*/ create procedure get_list_authors; 1 @state char(2)='UT' as Select au_id, au_lname, state from pubs. . authors where state =@state /*вызов процедуры*/ exec get_List_authors; 1 'CA'
Разработать процедуру для поиска должности по коду и, наоборот, для поиска кода должности по ее названию. create proc spisok_sotrud @kd char(2) =null output, @dolg char(20)=null output as begin if @kd is not null set @dolg=(select dolg from dolg where kd=@kd) else if @dolg is not null set @kd=(select kd from dolg where dolg=@dolg) else print 'Не заданы параметры' end
create proc spis_sotr @kd char(2) =null output, @dolg char(20)=null output as begin if @kd is not null set @dolg=(select dolg from dolg where kd=@kd) else if @dolg is not null set @kd=(select kd from dolg where dolg=@dolg) else print 'Не заданы параметры' end
Работа с курсорами • В каждый момент времени пользователь может работать только с одной строкой курсора • Наиболее часто используются статические курсоры • Курсоры хранятся в базе данных Tempdb • Статические курсоры не будет отслеживать изменения, которые могут произойти в исходных таблицах, поэтому его данные служат только для чтения.
Динамические курсоры • при обращении к каждой строке курсора сервер заново обрабатывает связанный с курсором запрос, результирующий набор обновляется. • пользователи могут выполнять изменения в исходных таблицах. • Для этого предназначены специальные команды UPDATE, DELETE и INSERT, имеющие особый синтаксис.
Курсор должен быть объявлен командой DECLARE имя_курсора CURSOR FOR SELECT…. Пример. Объявить статический курсор DECLARE cur 1 CURSOR STATIC FOR SELECT product. ID, Product. Name From Northwind. . Products where Product. ID<5
После объявления курсор следует открыть командой OPEN имя_курсора Выборка данных командой FETCH из курсора осуществляется FETCH [FIRST | NEXT | PRIOR | LAST] FROM имя_курсора INTO список_переменных
Пример. Вывести данные из созданного курсора cur 1. Для этого: • объявим рабочие переменные для считывания в них данных курсора, • в цикле обработаем все записи курсора. • Для организации цикла используем системную переменную @@FETCH_STATUS, которая принимает значение 0, если в курсоре есть данные и – 1, если все данные из курсора уже выбраны.
declare @productid int, @productname char(20) Fetch first from cur 1 into @productid, @productname while @@FETCH_STATUS=0 BEGIN Select [Код продукта]=@productid, [Наименование]=@productname Fetch Next from cur 1 into @productid, @productname End Close cur 1 Deallocate cur 1
Пример 4. 17. Создать курсор для вывода списка проданных товаров по первым трем накладным. Включить в курсор следующие поля и выражения: номер накладной (n_nakl из таблицы nakladnay) , наименование товара (n_tov из таблицы price_list), код товара , количество и цену товара (соответственно k_tov, kol, cena из таблицы tovar_v_nakl. сумму продажи товара (kol*cena). Создать программу для обработки курсора, чтобы вывести сведения о каждом товаре в накладной, подсчитать общую сумму в накладной и вывести под списком товаров.
Пример 4. 17 DECLARE sum 1 CURSOR FOR SELECT n. n_nakl, p. n_tov, t. kol, t. cena, t. kol*t. cena as summa FROM nakladnay n INNER JOIN tovar_v_nakl t ON n. n_nakl=t. n_nakl INNER JOIN price_List p ON t. k_tov=p. k_tov WHERE n. n_nakl<=3 order by t. n_nakl OPEN SUM 1
DECLARE @n_nakl SMALLINt, @n_tov CHAR(30), @k_tov SMALLINT, @kol INT, @cena REAL, @summa REAL DECLARE @s 1 REAL, @nn SMALLINT FETCH NEXT FROM sum 1 INTO @n_nakl, @n_tov, @kol, @cena, @summa WHILE @@fetch_status>-1 BEGIN SET @nn=@n_nakl SET @s 1=0 WHILE @nn=@n_nakl BEGIN SELECT @n_nakl as накладная, @n_tov as товар, @k_tov as код, @kol as количество, @cena as цена, @summa as сумма SET @s 1=@s 1+@summa FETCH NEXT FROM sum 1 INTO @n_nakl, @n_tov, @kol, @cena, @summa IF @@fetch_status=-1 BREAK END SELECT [Сумма в накладной]=@s 1 END CLOSE sum 1
Пример 18. Создать процедуру для выборки сведений о проданных по определенной накладной товаров в первый курсор, а общую сумму, на которую проданы эти товары – в другой (см. условие предыдущего примера). Созданные курсоры использовать в качестве выходных параметров процедуры. Проверить работу курсора, задав при вызове процедуры номер накладной, равный единице.
Create proc имя_процедуры @имя_курсора CURSOR VARING OUTPUT, … SET @имя_курсора= CURSOR FOR SELECT …
Пример 4. 18. CREATE PROC sum_nakl @n_nakl smallint, @cved CURSOR VARYING OUTPUT, @sum 1 CURSOR VARYING OUTPUT AS BEGIN SET @cved= CURSOR FOR SELECT n. n_nakl, p. n_tov, t. kol, t. cena, t. kol*t. cena as summa FROM nakladnay n INNER JOIN tovar_v_nakl t ON n. n_nakl=t. n_nakl INNER JOIN price_List p ON t. k_tov=p. k_tov WHERE n. n_nakl=@n_nakl OPEN @cved
SET @sum 1=CURSOR FOR SELECT n_nakl, sum(kol*cena)FROM tovar_v_nakl WHERE n_nakl=@n_nakl group by n_nakl OPEN @sum 1 END
Исправление хранимых процедур и функций. Удаление Для изменения CREATE ALTER, а затем исправить следующий далее текст. Для удаления DROP PROCEDURE|FUNCTION имя. База должна быть открыта !!! select * from sysobjects where xtype=‘P’
Размещение хранимых процедур и функций
Просмотр текста хранимой процедуры