function中使用动态sql和游标

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/ziptop/article/details/45317365
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;



猜你喜欢

转载自blog.csdn.net/ziptop/article/details/45317365