暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss每日一练第15天

原创 张辉 2021-12-19
777

学习存储过程和函数


与众不同的是,其他都是分号就生效,但是存储过程貌似得打了斜杠方可创建成功。


使用select执行存储过程:


删除存储过程:


创建函数:


查看函数定义:


数据库查看:


感觉有点不大好看。


命名标记法传参:


第二种传参:


创建函数:


调用函数:


创建返回值为RECORD类型的函数:


执行函数:


修改函数名称:


删除函数:



开始做作业:

1.创建带有入参和出参的函数1,调用函数时使用按参数值传递和命名标记法传参

create table zhanghui (id integer, name varchar(20));


create function zhanghui1( id IN integer, name IN varchar(20), res OUT integer )

return integer

as

begin

insert into zhanghui values(id,name);

res := id;

end;

/

 

调用:

CALL zhanghui1( 1,'myname',1);

CALL zhanghui1( id => 2, name =>'myname2', res =>3);



CALL zhanghui1( id  := 3, name := 'myname3', res :=222);



2.创建返回类型为record的函数2,重命名函数2

create type record as ( f1 int , f2 varchar(20));


不是这么做的。。

drop type record



create function zhanghui2 ( id integer,  name varchar(20), OUT res1 integer, OUT res2 integer)

returns setof record

as $$

begin

insert into zhanghui values(id,name);

res1 = id;

res2 = id+1;

return next;

end;

$$ language plpgsql;


call zhanghui2( 99,'name99',3,4);



3.使用\sf和系统函数查看函数定义

\sf



select * from pg_proc where proname = 'zhanghui1';


select * from pg_proc where proname = 'zhanghui2' \G






alter function zhanghui2 (integer,  varchar(20), integer,  integer) rename to zhanghui3;


奇怪,怎么没有呢?


难道是varchar的问题?去掉varchar试试:

create function zhanghui22 ( id integer, OUT res1 integer, OUT res2 integer)

returns setof record

as $$

begin

insert into zhanghui values(id,'1');

res1 = id;

res2 = id+1;

return next;

end;

$$ language plpgsql;


alter function zhanghui22 (integer,  integer,  integer) rename to zhanghui3;


\sf zhanghui22


难道alter function的时候只能选输入参数?不用选输出参数?

有可能:

alter function zhanghui22 (integer) rename to zhanghui220;


alter function zhanghui2 (integer, varchar(20)) rename to zhanghui220;


好像查出了openGauss的一个bug。

换个函数名再试试:


create function zhanghui2000 ( id integer,  name varchar(20), OUT res1 integer, OUT res2 integer)

returns setof record

as $$

begin

insert into zhanghui values(id,name);

res1 = id;

res2 = id+1;

return next;

end;

$$ language plpgsql;


alter function zhanghui2000(integer, varchar(20)) rename to zhanghui2100;




4.删除函数

drop function zhanghui2100;

drop function zhanghui220;

 

drop function zhanghui220(integer);

drop function zhanghui220(integer,varchar(20));


这样看来,函数名只要参数不同,是可以同名的。也不算错误。只是建立和删除的时候需要指定参数。而参数只需要指定入参。不需要写出参。大概就是这个样子的吧!



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论