学习存储过程和函数

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

使用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));

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




