创建和使用存储过程
语法:CREATE PROCEDURE proc[(name [IN|OUT|INOUT]type,.....)]AS|ISdeclare statrment;BEGINstatement;EXCEPTIONexception process;END;
例子一:
函数的创建create procedure procin(dno in number)isv_maxsal number;beginselect max(sal) into v_maxsalfrom expwhere deptno = dno;dbas_output.put_line(v_maxsal);end;
语法:
CREATE FUNCTION func[(name [IN|OUT|INOUT]type,.....)]RETURN return_typeAS|ISdeclare statrment;BEGINstatement;EXCEPTIONexception process;END;
例子一:
create function add(nol number,no2 number)return numberisv_result NUMBER;beginv_result :=no1+no2;return v_result;end;
创建和使用存储过程
create procedure 命令语法:create[or replace] procedure 过程名(参数列表)as --说明部分plsql子程序;
调用存储过程1、exec sayhellowworld();2、beginsayhellowodld();end;
实例:
带参数的存储过程
给指定的员工涨100元工资 并且打印涨前和涨后的薪水
实例:
create or replace procedure raisesalary(eno in number)
as
--定义一个变量保存涨前的薪水psal eml.sal%type
begin
--得到员工涨前的薪水
select sal into from emp where empno==eno;
--给员工涨100
update emp set sal=sal+100 where empno=eno;
--需要不需要commit?
--一般不再存储过程和存储函数中做commit roloback,
--打印
dbms_output put_line(涨前:'||psal||' 涨后:'||(psal+100)||') ;
end;
存储函数
函数(function)为一命名的存储程序,可带参数,并返回一计算值函数和过程的结构类似,但是必须有一个return子句
语法格式create [or replace] function 函数名(参数列表)return 函数值类型asplsql子程序体;
实例:
查询每个员工的年收入
create or replace function querympincome(eno in number)
return number
as
--定义变量保存员工的薪水和奖金psal emp,sal%type;pcomn emp.comn%type;
begin
--得到员工的月薪和奖金select sal.comn into psal.pcomn from emp where empno=eno;--直接返回年收入return psal*12+nvl(pcomn,0);
end;
in out参数
过程和函数都可以通过out指定一个和多个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 empon=eon;
end;
如何在out参数中使用游标
申明包结构(包头 包体)
包头(声明)
create or replace package mypackage(包名) as
type empcursor is ref cursor;--声明一个数据类型 引用光标的类型
procedure queryEmplist(dno in number,emplist out empcursor);
end mypackage;
包体(实现)
需要实现所有包头中声明的所有方法
create or replace package body mypackage as
procedure queryEmplist(dno in number,emplist out empcursor) as
begin
open emplist for select * from emp where deptno=dno;
end queryEmplist;
end mypackage;
--游标在使用前需要open 关键字for 指名函数代表什么