一、存储进程
存储进程是一种命名的PL/SQL数据块,存储在oracle数据库中,可以被用户调用。存储进程可以包括参数,也能够没有参数,它一般没有返回值。存储进程是事前编译好的代码,再次调用的时候不需再次编译,因此程序的运行效力非常高。
1、存储进程的创建
存储进程是一种命名的PL/SQL数据块,存储在oracle数据库中,可以被用户调用。存储进程可以包括参数,也能够没有参数,它一般没有返回值。存储进程是事前编译好的代码,再次调用的时候不需再次编译,因此程序的运行效力非常高。
语法以下
create [or replace] 进程名
[<参数1> inioutin out <参数类型>[默许值|:=初始值]]
[,<参数2> inioutin out <参数类型>[默许值|:=初始值],…]
isias
[局部变量声明]
begin
程序语句序列
[exception]
异常处理语句序列
end 进程名
参数说明以下:
1、or replace 可选参数,表示如果数据库中已存在要创建的进程,则先把本来进程删除,再重新建立进程,或说覆盖本来的进程。
2、如果进程中存在参数,则需要在参数后面用“inioutin out”关键字。如果是输入参数,则参数后面用“in”关键字,表示接受外部进程传递来的值;如果是输出参数,则参数后面用“out”关键字,表示此参数将在进程中被复制,并传递给进程体外;如果是“in out” 关键字则表示该参数既具有输入参数特性,又具有输出参数的特性。默许是in参数,即如果不写就默许为in参数。
3、参数类型不能指定长度,只需要给出类型便可。
4、局部变量声明中所定义的变量只在该进程中有效。
5、局部变量声明,程序语句序列和异常处理语句序列定义和使用同上一章PL/SQL块。
2、存储进程的调用及删除
存储进程创建后,以编译的情势存在于oracle数据库中,可以在sql plus中或pl/sql块中调用。
1、在sql plus中调用存储进程
语法以下:
execute 进程名 [参数序列]
其中execute可以简写成exec。
2、在pl/sql块中调用存储进程
直接把进程名写到其他pl/sql块中便可调用,此时不需使用execute命令。
3、存储进程的删除
存储进程的删除和表的删除类似,基本语法以下所示。
drop procdure 进程名
3、存储进程的使用
1、不带参数的存储进程
1、创建一个存储进程,向student表中插入一条记录
begin
insert into student<id,name,class> values<10,’张三’,’五班’>;
commit;
dbms_output.put_line<‘插入一条新纪录!!!’>;
end pro_stu;
上面存储进程已成功创建,但是并没有履行,履行语句以下。
上面是exec命令履行,我们也能够在PL/SQL块中直接调用,语法以下。
pro_stu;
end;
2、带in参数的存储进程
使用in参数可以向存储进程中的程序单元输入数据,在调用的时候提供参数值,被存储进程读取。这类模式是默许的参数模式。下面看一个范例。
2、创建一个存储进程,接收来自外部的数值,在存储进程中判断该数值会不会大于零并显示。
var_num in number
> is
begin
if var_num>=0 then
dbms_output.put_line<‘传递进来的参数大于等于0’>;
else
dbms_output.put_line<‘传递进来的参数小于0’>;
end if;
end pro_decide;
履行存储进程
结果显示:
传递进来的参数大于等于0
3、输入一个编号,查询student表中会不会有这个编号,如果有则显示对应学生的姓名,如果没有则提示没有对应的学生。
var_stuid in student.id%type –定义in参数
> is
var_name student.name%type; –定义存储进程内部变量
no_result exception;
begin
select name into var_name from student where id = var_stuid; –取值
if sql%found then
dbms_output.put_line<‘所查询的学生姓名是:’ || var_name>; –显示
end if;
when no_data_found then
dbms_output.put_line<‘没有对应此编号的学生’>; –毛病处理
end pro_show;
履行存储进程。
4、创建一个存储进程,向数据表student中插入一条记录。
var_id in number,
var_name in varchar2,
var_class in varchar2> is
begin
insert into student values<var_id,var_name,var_class>; –插入记录
commit;
dbms_output.put_line<‘插入一条新纪录!!!’>;
end pro_add;
履行存储进程
5、输入一个编号,查询student表中会不会有这个编号,如果有则返回对应学生的姓名,如果没有则提示没有对应的学生。
上面我们使用in是显示学生的姓名,现在我们要返回学生的姓名就要使用out,语法以下
var_id in student.id%type, –定义in参数
var_name out student.name%type –定义out参数
> is
no_result exception;
begin
select name init var_name from student where id = var_id; –取值
exception
when no_data_found then
dbms_output.put_line<‘没有对应此编号的学生’>; –毛病处理
end pro_show1;
调用含有out参数的存储进程需要提早声明一个相应类型的变量,然后用来接收。
exec pro_show1<10,:var_name>;
在调用的时候,使用“:”后面紧跟变量名。
4、存储进程的查询
存储进程的查询需要使用到数据字典user_source,语法以下
上面这个语句查询当前用户下所有的存储进程的名字。
另外,我们还可以查询存储进程的内容,查询语句以下所示。
二、函数
上面的存储进程有输入参数和输出参数,但是没有返回值,函数和存储进程非常类似,也是可以存储在oracle数据库中的PL/SQL代码块,但是有返回值,可以把常常使用的功能定义为一个函数,就像系统自带的函数(例如大小写转换,求绝对值等函数)一样使用。
1、函数的创建
函数的创建的基本语法格式以下所示。
create or replace function 函数名
[<参数1> inioutin out <参数类型>[默许值|:=初始值]]
return 返回数据类型
isias
[局部变量声明]
begin
程序语句序列
[exception]
异常处理语句序列
end 进程名
其中的参数说明以下。
1、or replace 可选参数,表示如果数据库中已存在要创建的函数,则先把本来函数删除,再重新建立函数,或说覆盖本来的函数。
2、如果进程中存在参数,则需要在参数后面用“inioutin out”关键字。如果是输入参数,则参数后面用“in”关键字,表示接受外部进程传递来的值;如果是输出参数,则参数后面用“out”关键字,表示此参数将在进程中被复制,并传递给进程体外;如果是“in out” 关键字则表示该参数既具有输入参数特性,又具有输出参数的特性。默许是in参数,即如果不写就默许为in参数。
3、参数类型不能指定长度,只需要给出类型便可。
4、函数的返回值类型是必选项。
5、局部变量声明中所定义的变量只在该函数中有效。
6、局部变量声明、程序语句序列和异常处理语句序列定义和使用PL/SQL块。
在函数的主程序中,一定要使用return语句返回终究的函数值,并且返回值的数据类型要和声明的时候说明的类型一样。
>和显示游标区别,隐式游标是系统自动创建的,用于处理DML语句(例如insert、update、delete等指令)的履行结果或select查询返回的单行数据,这时候隐式游标是指向缓冲区的指针。使用时不需要进行声明、打开和关闭,因此不需要open、fetch、close这样的操作指令。隐式游标也有前述介绍的4种属性,使用时需要在属性前面加上隐式游标的默许名称SQL,因此隐式游标也叫SQL游标。
### 1、将student表中张三的学生年龄增加10岁,然后使用隐式游标的%rowcount属性输出触及的员工数量
“`go
begin
update student set age=age+10 –年龄增加10
where name = ‘张三’;
if sql%notfound then –会不会有符合条件的记录
dbms_output.put_line<‘没有符合条件的学生’>;
else
dbms_output.put_line<‘符合条件的学生数量为:’ || sql%rowcount>;
end if;
end;
2、函数的调用与删除
函数的调用基本上与系统内置函数的调用方法相同。可以直接在SQL plus中使用,也能够在存储进程中使用。
函数的删除与存储进程的删除类似,语法以下:
3、函数的使用
1、创建一个函数,如果是偶数则计算其平方,如果是奇数则计算其平方根
<var_num number> –声明函数参数
return number –声明函数返回类型
is
i int:=2;
begin
if mod<var_num,2>=0 then –判断奇偶性
return power<var_num,i>; –返回平方
flse
return round<sqrt<var_num>,2>; –返回平方根
end if;
end fun_cal;
4、函数的查询
在实际使用中常常会需要查询数据库中已有的函数或某一个函数的内容,使用的方法和存储进程类似,也需要使用到数据字典user_source,使用的查询语句以下所示。
上面这个语句查询当前用户下所有的用户定义的函数名字。
另外,我们还可以查询函数的内容,查询语句以下所示。
补充:存储进程与存储函数的区分和联系
相同点:1.创建语法结构类似,都可以携带多个传入参数和传出参数。
2.都是一次编译,屡次履行。
区别点:1.存储进程定义关键字用procedure,函数定义用function。
2.存储进程中不能用return返回值,但函数中可以,而且函数中一定要有return子句。
3.履行方式略有区别,存储进程的履行方式有两种(1.使用execute2.使用begin和end),函数除存储进程的两种方式外,还可以当作表达式使用,例如放在select中(select f1() form dual;)。
总结:如果只有一个返回值,用存储函数,否则,一般用存储进程。
总结
这里的相关内容还没有整理终了,文章后面延续更新,建议收藏。
文章中触及到的命令大家一定要像我一样每一个都敲几遍,只有在敲的进程中才能发现自己对命令会不会真实的掌握了。
到此这篇关于Oracle存储进程与函数的详细使用的文章就介绍到这了,更多相关Oracle存储进程与函数内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!
本文来源:https://www.yuntue.com/post/150309.html | 云服务器网,转载请注明出处!

微信扫一扫打赏
支付宝扫一扫打赏