Plpgsql:如何通过传递函数值从视图中删除特定行?

时间:2014-02-26 07:20:00

标签: postgresql

我试图通过从函数中传递值来从视图中删除一行,但是在rollno列不存在时出错。

例如:

create table tbl1  
( rollnumber int,  
name varchar);  

插入一些行

insert into tbl1 values(1,'abc');  
insert into tbl1 values(2,'def');  
insert into tbl1 values(3,'ghi');  

查看

create view view1 as select * from tbl1;  

从我的函数中删除view1中的特定行。

create or replace function function1(rollno int)  
returns void as  
$body$  
declare  
        temp varchar;  
begin  
        temp:='delete from view1 where rollnumber=rollno';  
        execute temp;  
end;  
$body$  
language plpgsql;  

1 个答案:

答案 0 :(得分:0)

此:

    temp:='delete from view1 where rollnumber=rollno';  

不可能奏效。你不是在替换一个变量,而是按字面意思运行该查询。

我想你可能意味着:

    temp:='delete from view1 where rollnumber = ' || quote_literal(rollno);
    execute temp;  

最好写成参数化查询:

EXECUTE 'delete from view1 where rollnumber = $1' USING rollno;

但在这种情况下,根本不需要使它成为动态SQL,所以你可以写:

create or replace function function1(rollno int)  
returns void as $$
delete from view1 where rollnumber=$1;
$$
language SQL;