您的位置:首页 > 数据库

function中使用动态sql和游标

2015-04-27 21:56 381 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: