Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用游标打印我在postgresql中添加到表中的新内容?_Postgresql - Fatal编程技术网

如何使用游标打印我在postgresql中添加到表中的新内容?

如何使用游标打印我在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_

我想在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_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解决方案,您将得到一个非常低效且不可扩展的解决方案。我的答案中的解决办法是在研究生中这样做。你也需要迁移你的思维方式。然后你没有像我向你展示的那样创建触发器(
为每个语句引用…