您的位置:首页 > 数据库 > Oracle

Oracle存储过程、存储函数

2016-09-17 17:39 661 查看

存储过程:

1、指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。

2、存储过程和存储函数的相同点:完成特定功能的程序。

3、存储过程和存储函数的区别:是否用return语句返回值。存储函数可以使用一个return语句返回一个函数值,而存储过程不能。

创建和使用存储过程:
用create procedure 命令建议存储过程和存储函数。
语法:
create [or replace] PROCEDURE 过程名(参数列表)
AS
PLSQL子程序体;


第一个存储过程:打印Hello World

如何调用存储过程:



F5运行脚本:



调用存储过程:



带参数的存储过程:

举例:为指定的员工,涨100快钱的工资;并且打印涨前和涨后的薪水(并调式)。

--创建一个带参数的存储过程:
--给指定的员工涨100元的工资,并且打印涨薪前和涨薪后的薪水
/*
如何调用
begin
raisesalary(7839);
raisesalary(7566);
commit;
end;
*/
create or replace procedure raisesalary(eno in number)
as
--定义一个变量保存涨前的薪水
psal emp.sal%type;
begin
--得到员工涨薪前的薪水
select sal into psal from emp where empno=eno;
--给该员工涨100
update emp set sal=sal+100 where empno=eno;
--需不需要commit?
--注意:一般不在存储过程或者存储函数中,commit和rollback

--打印
dbms_output.put_line('涨前:'||psal||'涨后:'||(psal+100));

end;
/













报权限不足,解决方法:





在这里的时候报错,报错信息如下:

连接到数据库 demo。
执行 PL/SQL: ALTER SESSION SET PLSQL_DEBUG=TRUE
执行 PL/SQL: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( '192.168.100.114', '49296' )
ORA-24247: 网络访问被访问控制列表 (ACL) 拒绝
ORA-06512: 在 "SYS.DBMS_DEBUG_JDWP", line 68
ORA-06512: 在 line 1
进程已退出。
从数据库 demo 断开连接。
解决方法,参考文章:http://blog.csdn.net/btt2013/article/details/52563756





存储函数:

1、函数(Function)为一命名的存储程序,可带参数,并返回一计算值。

2、函数和过程的结构类似,但必须有一个return子句,用于返回函数值。

创建存储函数的语法:
create [or replace] FUNCTION 函数名(参数列表)
return 函数值类型
AS
PLSQL子程序体;
存储函数举例:查询某个员工的年收入

create or replace
function queryempincome(eno in number)
return number
as
--定义变量保存员工的薪水和奖金
psal   emp.sal%type;
pcomm  emp.comm%type;
begin
--得到该员工的月薪和奖金
select sal,comm into psal,pcomm from emp where empno=eno;

--直接返回年收入
--return psal*12+pcomm;  如果存在没有奖金的员工,这种方式返回会为NULL
return psal*12+nvl(pcomm,0);
end;













in和out参数:

一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值。

1、存储过程和存储函数都可以有out参数

2、存储过程和存储函数都可以有多个out参数

3、存储过程可以通过out参数来实现返回值

原则:

如果只有一个返回值,用存储函数;否则,就用存储过程。
create or replace
procedure queryempinform(eno in number,
pename out varchar2,
psal out number,
pjob out varchar2)
as
begin
--得到该员工的姓名、月薪和职位
select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: