创建简单的删除函数postgresql

创建简单的删除函数postgresql,postgresql,postgres-9.6,Postgresql,Postgres 9.6,我是PostgreSQL的新手,我用insert函数创建了一个简单的表,但当我使用delete函数时,它会删除所有插入的查询,知道会发生什么吗?如果有人问我,我也在使用PostgreSQL v9.6 CREATE TABLE sample( id SERIAL PRIMARY KEY, sy char(9), sem char(1) ); CREATE FUNCTION insert(sy char,sem char) returns void AS $$ Begin insert into

我是PostgreSQL的新手,我用insert函数创建了一个简单的表,但当我使用delete函数时,它会删除所有插入的查询,知道会发生什么吗?如果有人问我,我也在使用PostgreSQL v9.6

CREATE TABLE sample(
id SERIAL PRIMARY KEY,
sy char(9),
sem char(1)
);

CREATE FUNCTION insert(sy char,sem char)
returns void
AS
$$
Begin
insert into sample(sy,sem) values (sy,sem);
END;
$$
LANGUAGE 'plpgsql';

select insert('2011-2012','1');
select insert('2013-2014','2');
select insert('2015-2016','1');
select insert('2017-2018','2');

CREATE FUNCTION delete(id int)
returns bool
AS
$$
BEGIN
    EXECUTE 'delete from sample where id = id';
    RETURN true;
END;
$$
LANGUAGE 'plpgsql';

select delete(1);
select * from sample
id     sy          sem

delete from sample,其中id=id
删除列
id
等于列
id
的所有行。由于这都是字符串的一部分,因此没有进行参数替换。但是,一开始就不需要使用动态SQL(
execute'…'
)。为了避免列名和参数名之间发生冲突,建议以某种方式区分它们。许多人通过为参数使用前缀来实现这一点。另外:语言名称是一个标识符,不应引用。该语法已被弃用,可能会在将来的版本中删除,因此不要习惯它

因此,摆脱动态SQL并重命名您的参数:

CREATE FUNCTION delete(p_id int)
  returns bool
AS
$$
BEGIN
  delete from sample where id = p_id;
  return true;
END;
$$
LANGUAGE plpgsql;