oracle存储过程

Posted 菜菜小谭

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle存储过程相关的知识,希望对你有一定的参考价值。

之前我们学的pl/sql代码都属于匿名块...

没有名字


匿名块的缺点


1. 不能够保存在数据库服务器上 如果想以后使用 只能把它复制到一个文件中

或者是 另存为成*.sql文件.下一次再使用的时候 还要复制回来或者 打开这个sql
文件再执行,比较麻烦! 不可复用


2.匿名块执行速度慢

第二次执行的时候 要从新编译 再运行 比较慢

而存储过程 相当于给匿名块起一个名字 预编译的sql语句
编译好以后 存到数据库服务器上 下一次直接用就可以了
存储过程执行速度比匿名块快


二. 什么是存储过程

预编译的sql语句, 把以前的pl/sql匿名块 起一个名字 预编译保存到数据库服务器上
就是存储过程.


三. 如何编写存储过程


把匿名块转换成存储过程需要两步

1. declare 改成is 或者as


2. create or replace procedure 存储过程名


(一)定义存储过程

语法如下:
create or replace procedure 存储过程名

is

begin


end;

演示代码:


--定义一个存储过程
--需求: 给所有的员工涨工资

create or replace procedure increase_salary

is
cursor c is
select * from emp2 for update;
begin
for v_temp in c loop
if(v_temp.sal<1200) then
update emp2 set sal=sal+500 where current of c;--当前游标指向的记录
elsif(v_temp.sal<1500) then
update emp2 set sal=sal+300 where current of c;--当前游标指向的记录
else
update emp2 set sal=sal+100 where current of c;--当前游标指向的记录
end if;
end loop;

end;

(二)调用存储过程

(1) 命令窗口

execute 存储过程名;

execute increase_salary;

(2) 使用pl/sql代码块执行


begin
存储过程名();
end;

演示代码:

begin
increase_salary();
end;

 

*******************************带参数的存储过程***********************************


--需求: 求两个数中的比较大的那个数是谁
--in 输入参数 只能输入不能当做左值
--out 输出参数 只能用做左值 不能给它传入一个值 如果程序员非要给一个输出参数 传值 打印的时候是打印不出来的
create or replace procedure proce(v_a in number,v_b number,v_res out number,v_temp in out number)
is
begin
dbms_output.put_line(v_res);
end;


declare
v_a number:=3;
v_b number:=4;
v_res number;
v_temp number:=5;
begin
proce(v_a,v_b,v_res,v_temp);
--dbms_output.put_line(v_res);
--dbms_output.put_line(v_temp);
end;

 

********************************存储过程和函数的区别*******************************

1.存储过程没有返回值, 函数是有返回值的

2.存储过程一般用于执行某个业务逻辑(涨工资),函数一般用来辅助sql进行计算的...


3.函数是可以用在select语句后面的,而存储过程不能用在select 语句后面


select lower(ename) from emp

 

*****************************存储过程如果想返回一个值怎么办?*************************


使用 输出参数 代替返回值

 

 

一.什么是函数 what
函数:类似于java方法 有一定的作用

区别: 必须有返回值

二.自定义函数
function

根据员工的工资 得到税率
create or replace function sal_tax(v_sal number)
return number
is
v_tax number;
begin
if(v_sal<2000) then

v_tax:=0.10;
elsif(v_sal<2750) then
v_tax:=0.15;
else
v_tax:=0.20;
end if;

return v_tax;
end;


使用函数
select lower(ename),sal_tax(sal) from emp;


****************学生练习: 定义一个函数 *******************

输入参数 boolean 类型的变量

返回值 varchar2 如果传入的是true 返回‘true‘;传入false 返回‘false‘;
传入null 返回‘null‘















































































以上是关于oracle存储过程的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程基本语法

oracle 存储过程中调用存储过程

oracle 如何终止存储过程的运行!

请问oracle怎么执行存储过程

oracle中的存储过程怎么写

oracle存储过程中循环调用存储过程