如何使用游标打印我在postgresql中添加到表中的新内容?
我想在postgresql中编写SQL触发器如何使用游标打印我在postgresql中添加到表中的新内容?,postgresql,Postgresql,我想在postgresql中编写SQL触发器 create trigger add_car on samochod after insert as begin declare k_inserted cursor for select car_model, mileage from inserted declare @car_model(30), @mileage varchar(30) open k_inserted fetch next from k_
create trigger add_car on samochod
after insert
as
begin
declare k_inserted cursor
for select car_model, mileage from inserted
declare @car_model(30), @mileage varchar(30)
open k_inserted
fetch next from k_inserted into @car_model(30), @mileage varchar(30)
while @@FETCH_STATUS = 0
begin
print 'Added car: '
print 'Model: ' + @car_model
print 'Mileage: ' + @mileage
fetch next from k_inserted into @car_model(30), @mileage varchar(30)
end
close k_inserted
deallocate k_inserted
end
INSERT INTO car(car_model, mileage)
VALUES ('Audi', 15011646);
create function add_car()
RETURNS TRIGGER
as
$$
declare
car_model varchar(30);
mileage varchar(30);
k_inserted cursor for select new.car_model, new.mileage from car;
begin
open k_inserted;
fetch next from k_inserted into car_model, mileage;
while (FOUND)
LOOP
RAISE NOTICE 'Added car: ';
RAISE NOTICE 'Marka: %', car_model;
RAISE NOTICE 'Mileage: %', mileage;
fetch next from k_inserted into car_model, mileage;
end LOOP;
close k_inserted;
return new;
end;
$$ LANGUAGE plpgsql;
CREATE TRIGGER add_car
after INSERT on car
for each row EXECUTE PROCEDURE add_car();
那个触发器实际上对我有效。然后我尝试了postgresql
create trigger add_car on samochod
after insert
as
begin
declare k_inserted cursor
for select car_model, mileage from inserted
declare @car_model(30), @mileage varchar(30)
open k_inserted
fetch next from k_inserted into @car_model(30), @mileage varchar(30)
while @@FETCH_STATUS = 0
begin
print 'Added car: '
print 'Model: ' + @car_model
print 'Mileage: ' + @mileage
fetch next from k_inserted into @car_model(30), @mileage varchar(30)
end
close k_inserted
deallocate k_inserted
end
INSERT INTO car(car_model, mileage)
VALUES ('Audi', 15011646);
create function add_car()
RETURNS TRIGGER
as
$$
declare
car_model varchar(30);
mileage varchar(30);
k_inserted cursor for select new.car_model, new.mileage from car;
begin
open k_inserted;
fetch next from k_inserted into car_model, mileage;
while (FOUND)
LOOP
RAISE NOTICE 'Added car: ';
RAISE NOTICE 'Marka: %', car_model;
RAISE NOTICE 'Mileage: %', mileage;
fetch next from k_inserted into car_model, mileage;
end LOOP;
close k_inserted;
return new;
end;
$$ LANGUAGE plpgsql;
CREATE TRIGGER add_car
after INSERT on car
for each row EXECUTE PROCEDURE add_car();
它工作,但它打印我6倍相同的东西(我有6辆车在我的表)
我如何修复它,使其打印的次数与我添加的汽车的打印次数相同对于每一行,您都将触发器声明为
,
,因此不需要循环或选择“from inserted”(SQL Server没有)。对于插入的每一行,触发器将被调用一次,因此只需打印新记录中的值即可
create function add_car()
RETURNS TRIGGER
as
$$
begin
RAISE NOTICE 'Added car: ';
RAISE NOTICE 'Marka: %', new.car_model;
RAISE NOTICE 'Mileage: %', new.mileage;
return new;
end;
$$ LANGUAGE plpgsql;
如果确实希望语句级触发器模拟SQL Server的行为,可以执行以下操作:
使用插入的
转换表的触发功能:
create function add_car()
RETURNS TRIGGER
as
$$
declare
l_row record;
begin
for l_row in select * from inserted
LOOP
RAISE NOTICE 'Added car: ';
RAISE NOTICE 'Marka: %', l_row.car_model;
RAISE NOTICE 'Mileage: %', l_row.mileage;
end LOOP;
return new;
end;
$$ LANGUAGE plpgsql;
以及语句级触发器的相应定义:
CREATE TRIGGER add_car
after INSERT on car
REFERENCING NEW TABLE AS inserted
for each statement EXECUTE PROCEDURE add_car();
问题是我需要使用游标。@Tadziuuuu:不,您尤其不需要在行级触发器中使用游标-没有可供选择的表。您只有一行的触发器firedmy任务是用postgresql替换sql触发器。使用光标是此任务的一部分。如果任务是迁移触发器代码,我的答案将说明如何执行此操作。使用游标是一个坏主意(最初是在SQLServer中)。不要盲目地在Postgres中实现来自SQL Server的方法-那是行不通的。Postgres与SQL Server非常不同,在大多数情况下,如果您尝试复制SQL Server解决方案,您将得到一个非常低效且不可扩展的解决方案。我的答案中的解决办法是在研究生中这样做。你也需要迁移你的思维方式。然后你没有像我向你展示的那样创建触发器(
为每个语句引用…
)