oracle存储过程入门案例学习
存储过程个人理解:
存储过程是一种编程的思想,它可以给sql语句加上各种规则从而达到自己特殊的需要,提升SQL语句的执行效率和增强数据库的安全性。
--创建表
create table employee(empno number(5) ,--员工编号
ename varchar2(20), --名称
sal number(10), --薪水
job varchar2(10) default 'CLERK',--工种默认CLERK
deptno number(10) --部门编号
)
--创建存储过程
eno number ,--员工编号
name varchar2, --名称
salary number, --薪水
job varchar2 default 'CLERK',--工种默认CLERK
dno number--部门编号
)
is
begin
insert into ADD_EMPLOYEE
(empno,ename,sal,job,deptno)values(eno,name,salary,job,dno);
end;
--传递参数的三种方式
begin
--按位置传递参数
ADD_EMPLOYEE(1111,'MARY',2000,'MANAGER',10);
--按名字传递参数
ADD_EMPLOYEE(dno=>10,name=>'MARY',salary=>2000,eno=>2112,job=>'MANAGER');
--混合方式传递参数
ADD_EMPLOYEE(3111,name=>'MARY',salary=>2000,dno=>2112,job=>'MANAGER');
end;
--删除存储过程
drop procedure add_employee;
--存储过程的参数模式
--参数传递主要分为三种:IN,OUT和IN OUT,即输入参数、输出参数和输入/输出参数。默认情况下参数类型为IN
--创建存储过程create or replace procedure QueryEmployee
(
v_empno in employee.empno%TYPE,
v_ename out employee.ename%TYPE,
v_sal in out employee.sal%TYPE
)
as
begin
select ename,sal into v_ename,v_sal
from employee
where empno=v_empno;
end;
--调用存储过程
declare
v1 employee.ename%TYPE;
v2 employee.sal%TYPE;
BEGIN
v2:=5000;
QueryEmployee(1111,v1,v2);
END;
--小案例理解in和out的区别
create or replace procedure p(
A pls_integer,--默认情况下为In
B in pls_integer,
C out pls_integer,
D in out number
)
is
begin
if c is null then
dbms_output.put_line('NULL');-- dbms_output.put_line理解为打印信息的方法else
dbms_output.put_line(c);
end if;
dbms_output.put_line(d);
C:=A+10;
D:=10/B;
end;
declare
aa CONSTANT PLS_INTEGER:=1;
bb PLS_INTEGER:=2;
cc PLS_INTEGER:=3;
dd PLS_INTEGER:=4;
begin
p(aa,bb,cc,dd);
dbms_output.put_line('After invoking procedure p:');
dbms_output.put_line('aa='||aa);--||号理解为字符连接符结果集为:aa=1(数字)
dbms_output.put_line('bb='||bb);
dbms_output.put_line('cc='||cc);
dbms_output.put_line('dd='||dd);
end;
--新建测试窗口 执行调用语句
--执行调用语句得到以下结果
--首先会发现为什么c会为null,因为我们在前面在设置存储参数模式时将C字段的参数模式设置为了out,大家记住设置为out模式后无论我们赋予c字段什么值,调用存储过程执行时都不会有任何值的传入。只有赋值为in或者iN out