Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помощь по тригеру  [new]
BrokerKf
Member

Откуда:
Сообщений: 3
Здравствуйте
у меня есть тригер написанный для mysql. Работа тригера сводиться к преобразованию записей которые добавляються в первую табличку в интервалы.

REATE TABLE `quotations` (
`Symbol` varchar(12) character set cp1251 NOT NULL,
`DT` timestamp NOT NULL default '0000-00-00 00:00:00',
`O` decimal(15,6) NOT NULL,
`H` decimal(15,6) NOT NULL,
`L` decimal(15,6) NOT NULL,
`C` decimal(15,6) NOT NULL,
`V` int(10) unsigned NOT NULL,
PRIMARY KEY USING HASH (`Symbol`,`DT`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

REATE TABLE `quik_ticks` (
`id` int(10) unsigned NOT NULL auto_increment,
`Symbol` varchar(12) NOT NULL,
`price` decimal(15,6) NOT NULL,
`vol` int(10) unsigned NOT NULL,
`Operation` varchar(45) default NULL,
`T` time NOT NULL,
`Turnover` decimal(15,0) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=325014140 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;

CREATE DEFINER = `root`@`localhost` TRIGGER `make_quotes` BEFORE INSERT ON `quik_ticks` FOR EACH ROW begin

declare ts timestamp default Now();
declare _buyvol int default 0;
declare _sellvol int default 0;
declare _instvol int default 0;

Select timestamp(curdate(),maketime(hour(new.T),(minute(new.T) div 5)*5,00)) into ts;


insert into quotations (Symbol, DT, O, H, L, C, V) VALUES(new.Symbol, ts, new.price, new.price, new.price, new.price, new.Turnover/new.Price)
ON DUPLICATE KEY update H = Greatest(new.price, H), L = Least(new.price, L), C = new.price, V = V+new.TurnOver/new.Price;

end $$

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

таблица от куда
CREATE TABLE [dbo].[Deals_Gaz](
[Номер] [int] NOT NULL,
[Дата] [char](10) NOT NULL,
[Время] [char](10) NOT NULL,
[Код_Бумаги] [char](5) NULL,
[Цена] [int] NULL,
[Кол_во] [smallint] NULL,
[Обьем] [money] NULL
) ON [PRIMARY]

таблица куда.

CREATE TABLE [dbo].[GAZ_int](
[Дата] [date] NULL,
[Время] [time](7) NULL,
[Код] [char](5) NULL,
[O] [int] NULL,
[H] [int] NULL,
[L] [int] NULL,
[C] [int] NULL
) ON [PRIMARY]



CREATE TRIGGER My ON Deals_Gaz AFTER INSERT
AS
BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- число строк в таблице inserted
declare @count int
--время в таблице inserted
declare @T time
--дата в таблице inserted
declare @d date
--код инструмента в таблице inserted
declare @bum char(5)
--цена инструмента в таблице inserted
declare @price int
--кол-во в сделке в таблице inserted
declare @colvo smallint
--обьем в деньгах в таблице inserted
declare @vol money
--время преобразованное в начало интервала (минуты)
declare @ts int
-- число строк в таблице интервалов (проверка на их наличие)
declare @count2 int
-- полное время в таблице интервалов
declare @t2 time
-- максимальная цена за период
declare @h int
-- минимальная цена за период
declare @l int
-- цена последней сделки в интервале
declare @c int
-- дата в таблице инсертед в текстовом формате
declare @date_char char(10)
-- время в текстовом формате
declare @time_char char(10)
-- номер сделки в таблице инсертед
declare @num int

-- коли-во записей в транзакции экспорта
select @count=count(*) from inserted
-- если добавилась только одна запись
if @count=1 begin
-- выбираем из таблицы инсертед сточку
select @t=cast(время as time), @d=cast(дата as date), @bum=код_бумаги, @price=цена, @colvo=кол_во, @vol=обьем from inserted
-- расчитываем минуты начала интервала
set @ts=floor(datepart(minute,@t)/15)*15
-- считаем полное время
set @t2=cast((cast(datepart(hour,@t) as char(2))+':' + cast(@ts as char(2))+':00') as time)
-- проверяем если ли такая запись в таблице интервалов
select @count2=count(*) from gaz_int where дата=@d and время=@t2
if @count2=1 begin
-- если есть обновляем
select @h=H, @l=L from gaz_int where дата=@d and время=@t2
IF @price >= @H set @H = @price
iF @price <= @L set @L = @price
update gaz_int set h=@h, l=@l, c=@price where дата=@d and время=@t2
end
-- если нет добавляем новую
else insert into gaz_int (Дата, Время, Код, O,H,L,C)
values (@d, @t2,@bum, @price, @price,@price, @price)

end
else begin
-- все тоже самое но с расчетом что добавляеться несколько строк.
declare my_cur cursor local static for select * from incerted
open my_cur

fetch next from my_cur into @num, @date_char, @time_char , @bum, @price, @colvo, @vol

while @@fetch_status=0 begin
set @t=cast(@time_char as time)
set @d=cast(@date_char as date)
set @ts=floor(datepart(minute,@t)/15)*15
set @t2=cast((cast(datepart(hour,@t) as char(2)) +':'+ cast(@ts as char(2))+':00') as time)
select @count2=count(*) from gaz_int where дата=@d and время=@t2
if @count2=1 begin
select @h=H, @l=L , @c=c from gaz_int where дата=@d and время=@t2
IF @price >= @H set @H = @price
iF @price <= @L set @L = @price
update gaz_int set h=@h, l=@l, @c=@price where дата=@d and время=@t2
end
else insert into gaz_int (Дата, Время, Код, O,H,L,C)
values (@d, @t2,@bum, @price, @price,@price, @price)
fetch next from my_cur into @num, @date_char, @time_char , @bum, @price, @colvo, @vol
end
close my_cursor
deallocate my_cursor
end
19 авг 09, 13:48    [7556281]     Ответить | Цитировать Сообщить модератору
 Re: помощь по тригеру  [new]
BrokerKf
Member

Откуда:
Сообщений: 3
Здравствуйте
у меня есть тригер написанный для mysql. Работа тригера сводиться к преобразованию записей которые добавляються в первую табличку в интервалы.
[/src]REATE TABLE `quotations` (
      `Symbol` varchar(12) character set cp1251 NOT NULL,
      `DT` timestamp NOT NULL default '0000-00-00 00:00:00',
      `O` decimal(15,6) NOT NULL,
      `H` decimal(15,6) NOT NULL,
       `L` decimal(15,6) NOT NULL,
       `C` decimal(15,6) NOT NULL,
       `V` int(10) unsigned NOT NULL,
PRIMARY KEY USING HASH (`Symbol`,`DT`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

REATE TABLE `quik_ticks` (
`id` int(10) unsigned NOT NULL auto_increment,
`Symbol` varchar(12) NOT NULL,
`price` decimal(15,6) NOT NULL,
`vol` int(10) unsigned NOT NULL,
`Operation` varchar(45) default NULL,
`T` time NOT NULL,
`Turnover` decimal(15,0) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=325014140 DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED;

CREATE DEFINER = `root`@`localhost` TRIGGER `make_quotes` BEFORE INSERT ON `quik_ticks` FOR EACH ROW begin

declare ts timestamp default Now();
declare _buyvol int default 0;
declare _sellvol int default 0;
declare _instvol int default 0;

Select timestamp(curdate(),maketime(hour(new.T),(minute(new.T) div 5)*5,00)) into ts;


insert into quotations (Symbol, DT, O, H, L, C, V) VALUES(new.Symbol, ts, new.price, new.price, new.price, new.price, new.Turnover/new.Price)
ON DUPLICATE KEY update H = Greatest(new.price, H), L = Least(new.price, L), C = new.price, V = V+new.TurnOver/new.Price;

end $$
[src]

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

[/src]таблица от куда
CREATE TABLE [dbo].[Deals_Gaz](
[Номер] [int] NOT NULL,
[Дата] [char](10) NOT NULL,
[Время] [char](10) NOT NULL,
[Код_Бумаги] [char](5) NULL,
[Цена] [int] NULL,
[Кол_во] [smallint] NULL,
[Обьем] [money] NULL
) ON [PRIMARY]

таблица куда.

CREATE TABLE [dbo].[GAZ_int](
[Дата] [date] NULL,
[Время] [time](7) NULL,
[Код] [char](5) NULL,
[O] [int] NULL,
[H] [int] NULL,
[L] [int] NULL,
[C] [int] NULL
) ON [PRIMARY]



CREATE TRIGGER My ON Deals_Gaz AFTER INSERT
AS
BEGIN

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- число строк в таблице inserted
declare @count int
--время в таблице inserted
declare @T time
--дата в таблице inserted
declare @d date
--код инструмента в таблице inserted
declare @bum char(5)
--цена инструмента в таблице inserted
declare @price int
--кол-во в сделке в таблице inserted
declare @colvo smallint
--обьем в деньгах в таблице inserted
declare @vol money
--время преобразованное в начало интервала (минуты)
declare @ts int
-- число строк в таблице интервалов (проверка на их наличие)
declare @count2 int
-- полное время в таблице интервалов
declare @t2 time
-- максимальная цена за период
declare @h int
-- минимальная цена за период
declare @l int
-- цена последней сделки в интервале
declare @c int
-- дата в таблице инсертед в текстовом формате
declare @date_char char(10)
-- время в текстовом формате
declare @time_char char(10)
-- номер сделки в таблице инсертед
declare @num int

-- коли-во записей в транзакции экспорта
select @count=count(*) from inserted
-- если добавилась только одна запись
if @count=1 begin
-- выбираем из таблицы инсертед сточку
select @t=cast(время as time), @d=cast(дата as date), @bum=код_бумаги, @price=цена, @colvo=кол_во, @vol=обьем from inserted
-- расчитываем минуты начала интервала
set @ts=floor(datepart(minute,@t)/15)*15
-- считаем полное время
set @t2=cast((cast(datepart(hour,@t) as char(2))+':' + cast(@ts as char(2))+':00') as time)
-- проверяем если ли такая запись в таблице интервалов
select @count2=count(*) from gaz_int where дата=@d and время=@t2
if @count2=1 begin
-- если есть обновляем
select @h=H, @l=L from gaz_int where дата=@d and время=@t2
IF @price >= @H set @H = @price
iF @price <= @L set @L = @price
update gaz_int set h=@h, l=@l, c=@price where дата=@d and время=@t2
end
-- если нет добавляем новую
else insert into gaz_int (Дата, Время, Код, O,H,L,C)
values (@d, @t2,@bum, @price, @price,@price, @price)

end
else begin
-- все тоже самое но с расчетом что добавляеться несколько строк.
declare my_cur cursor local static for select * from incerted
open my_cur

fetch next from my_cur into @num, @date_char, @time_char , @bum, @price, @colvo, @vol

while @@fetch_status=0 begin
set @t=cast(@time_char as time)
set @d=cast(@date_char as date)
set @ts=floor(datepart(minute,@t)/15)*15
set @t2=cast((cast(datepart(hour,@t) as char(2)) +':'+ cast(@ts as char(2))+':00') as time)
select @count2=count(*) from gaz_int where дата=@d and время=@t2
if @count2=1 begin
select @h=H, @l=L , @c=c from gaz_int where дата=@d and время=@t2
IF @price >= @H set @H = @price
iF @price <= @L set @L = @price
update gaz_int set h=@h, l=@l, @c=@price where дата=@d and время=@t2
end
else insert into gaz_int (Дата, Время, Код, O,H,L,C)
values (@d, @t2,@bum, @price, @price,@price, @price)
fetch next from my_cur into @num, @date_char, @time_char , @bum, @price, @colvo, @vol
end
close my_cursor
deallocate my_cursor
end
[src]
19 авг 09, 13:56    [7556337]     Ответить | Цитировать Сообщить модератору
 Re: помощь по тригеру  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
а зачем проверять count и потом обрабатывать или одну запись, или курсор создавать?
в 2008 есть merge

для спящего время бодрствования равносильно сну
19 авг 09, 13:56    [7556344]     Ответить | Цитировать Сообщить модератору
 Re: помощь по тригеру  [new]
BrokerKf
Member

Откуда:
Сообщений: 3
Алексей2003,

возможно я не понял что вы имеете в виду. но делал за тем что пару записей в таблице инсертед могут объединяться в одну в результирующей таблице.
19 авг 09, 14:01    [7556379]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить