function中使用动态sql和游标

本文介绍了一个使用PL/pgSQL创建、调用、修改及删除自定义函数的完整示例,展示了如何通过函数操作数据库表数据,包括动态SQL和游标的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

create table test(id int,name text);
insert into test(id) values(generate_series(1,10));

select * from test;

输出结果:

highgo=# select * from test;
 id | name 
----+------
  1 | 
  2 | 
  3 | 
  4 | 
  5 | 
  6 | 
  7 | 
  8 | 
  9 | 
 10 | 
(10 行记录)



--create
create or replace function delete_insert_value(tablename varchar(240),idname varchar(240))  
returns void as $$

declare

 sqlstring varchar(240);

 mycur refcursor;

 id int;

 name text;

begin

 sqlstring='delete from "'||tablename||'" where "'||idname||'" between 5 and 10;'; 

 execute  sqlstring;--支持动态sql语句

 open mycur for select * from test;--支持游标的使用

 fetch next from mycur into id;

 insert into test(name) values('xu');

 

 close mycur;

end;

$$ language plpgsql; 



--use function
select delete_insert_value('test','id');
select * from test;

输出结果:

highgo=# select delete_insert_value('test','id');
 delete_insert_value 
---------------------
 
(1 行记录)


highgo=# select * from test;
 id | name 
----+------
  1 | 
  2 | 
  3 | 
  4 | 
    | xu
(5 行记录)



--alter
alter function delete_insert_value(varchar,varchar) rename to delete_insert_value_new;
--view the structure
SELECT n.nspname as "Schema",p.proname as "Name",pg_catalog.pg_get_function_result(p.oid) as "Result data type",pg_catalog.pg_get_function_arguments(p.oid) as "Argument data types",
CASE
    WHEN p.proisagg THEN 'agg'
    WHEN p.proiswindow THEN 'window'
    WHEN p.prorettype = 'pg_catalog.trigger'::pg_catalog.regtype THEN 'trigger'
ELSE 'normal'
END as "Type"
FROM pg_catalog.pg_proc p LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE p.proname ~ '^(delete_insert_value_new)$' 
AND pg_catalog.pg_function_is_visible(p.oid) ORDER BY 1, 2, 4;


输出结果:

 Schema |          Name           | Result data type |                  Argument data types                  |  Type  
--------+-------------------------+------------------+-------------------------------------------------------+--------
 public | delete_insert_value_new | void             | tablename character varying, idname character varying | normal
(1 行记录)


--drop 
drop function delete_insert_value_new(varchar,varchar);

drop table test;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值