存储过程
之前的PL/SQL块, 匿名的PL/SQL 没有名字, 数据库不会存储, 每一次执行: 都要经过编译-运行
存储过程: 都是命名的PL/SQL, 存储在数据库中,作为数据库的一个对象,类似表, 只需要第一次把这个存储过程
编译(把这个存储过程保存到数据库), 后面调用存储过程, 不需要进行再编译, 直接运行
-- 关键字: Procedure
语法:
create [or replace] procedure 存储过程名 [(参数1 model 类型1,参数2 model 类型2,.....)] is/as [变量。游标声明] begin --相当于java中的{ --执行语句 [exception --异常处理 ] end;
注意: 存储过程: 变量的声明, 游标声明,... 写在is/as 之后, 没有declare
参数列表: 参数名 model(IN: 输入参数, out:输出参数, inout: 输入输出参数, 数据的转换) 数据类型
无参的存储过程:例:
--编写一个无参的存储过程, 查询7788员工姓名,薪水 --选中这个存储过程, 点执行, 编译存储过程, 并且把存储过程保存到数据库 -- 我们还需要查看这个存储过程是否有错误, 有错误,一定需要修改, 修改之后一定在一次编译 create or replace procedure proc_findNameAndSal is --定义变量 v_ename emp.ename%type; v_sal emp.sal%type; begin select ename , sal into v_ename,v_sal from emp where empno = 7788; dbms_output.put_line(v_ename||v_sal); end;
运行存储过程:
--第一种调用方式,通过pl/sql运行 begin proc_findNameAndSal; end; --第二种方式: 在小黑屏,dos命令窗口: dbms_output.put_line() 默认不显示, 打开显示 set serverout on; exec 存储过程名;
有参的存储过程:例:
存储过程的参数 model
in 输入参数: 这个参数只能由调用者传递过程, 这个参数不能再存储过程内部修改 ,默认model 就是in
--查询指定员工编号的姓名薪水 create or replace procedure proc_findNameAndSal2(eno in number) is --定义变量 v_ename emp.ename%type; v_sal emp.sal%type; begin --eno := 7788; --错误的 select ename , sal into v_ename,v_sal from emp where empno = eno; dbms_output.put_line(v_ename||v_sal); end;
调用:
begin proc_findNameAndSal2(7902); end;