为什么要创建存储过程?存储过程有什么用?
创建存储过程就在硬盘上生成了一个文件,而不是像declare,只是在内存中存放,
退出的时候就失去了相关操作.
存储过程把复杂的业务逻辑都放在块中进行处理,让外界调用时可以直接使用.
不用第二次转换.
1.创建存储过程的语法:
create or replace procedure 存储过程名字(参数名1 in/out/in out 参数类型,参数名2 .....,参数名3)
is/as
变量名 变量类型;
begin
处理业务逻辑;
end;
例子(不带任何参数的存储过程):
--or replace 可以省略,含义是:如果存在此存储过程就覆盖掉之前的
create or replace procedure myproc
is
begin
dbms_output.put_line('hello');
end;
执行存储过程: SQL>exec myproc(参数1,参数2);/如果不带参数:SQL>exec myproc;
2.关于in / out / in out这三种用法:
in : 参数是带值传入的,默认情况就是in
out: 参数是不带值传入,带值输出.
in out: 带值输入,带值输出.
下面是这三种情况的一个小小的用法:
例 一 (关于in):
create or replace procedure myproce(emp_empno emp.empno%type)
is
a emp.sal%type;
begin
select sal into a from emp where empno = emp_empno;
dbms_output.put_line(a);
end;
执行也可以用begin ....end块..
begin
myproce(7369);
end;
例二(关于out的用法)
create or replace procedure myproce(emp_empno emp.empno%type,i out number) is
a emp.sal%type;
begin
select sal into a from emp where empno = emp_empno;
i:=a;
dbms_output.put_line(i);
end;
执行存储过程
DECLARE
n number;
begin
--n:=100
myproce(7369,n);
end;
从这个事例我们可以看出 out参数不能传入参数值,只能输出参数值,
in的可以接受参数值,
可以这样执行:
SQL> var m number;
SQL> exec myproce(7369,:m);-- 传入out参数需要用var定义变量然后在变量前面加 : 传入
SQL>print m;
最后总结了一点:
带in的参数放在等式右边,带out的两边都可以放,但是放在右边才有意义.
in out两边都可以放.
我们再来看看in out的用法
例子如下:
create or replace procedure myproce(emp_empno emp.empno%type, i in out number) is
a emp.sal%type;
begin
select sal into a from emp where empno = emp_empno;
dbms_output.put_line(a||'begain,,,,,,,,,,,');
dbms_output.put_line(i||'over');
end;
执行代码块如下:
DECLARE
s number;
begin
s:=100;
myproce(7369,s);--注意这里的s 它只能是参数,不能是具体值,除了in外 out/in out不能直接带值传
end;
如果这里不用in out 这里定义的s 传值进去是无效的,也就是答应dbms_output.put_line(i||'over')没有打印i的值
它是不会带任何值的,而in out就可以带值也可以不带值....
在sqlplus中执行时
首先声明变量 SQL>VAR N NUMBER;--声明传入进去的变量
SQL>EXEC :N:=100;--给变量赋值,
SQL>EXEC MYPROCE(7369,N);--执行存储过程;
你范德萨范德萨