/*****************************存储过程****************
子程序:存储过程与函数
存储过程的语法:
create [or replace] procedure 存储过程的名称[(参数列表)]
is|as
本地变量声明
begin
   ---存储过程执行语句;
end [存储过程的名称];
针对参数的类型有三种:
in  --输入参数(默认)
out ---输出参数
in out

******************************************/

------为员工编号为7369员工工资加10%
create or replace procedure pro_updateSal
is
begin
    update emp set sal=sal*1.1 where empno=7369;
    dbms_output.put_line('update!!');
end;

---调用存储过程
--1.在PL/SQL块中调用
begin
   pro_updateSal();
end;
--2.使用 call--(只能调用无参数的存储过程)
call pro_updateSal();
--测试
select * from emp where empno=7369;
---3.在SQL/PLUS命令行中调用 execute


----根据输入员工编号,为对应员工加工资10%
create or replace procedure pro_updateSal(myempno in emp.empno%type)
is
begin
    update emp set sal=sal*1.1 where empno=myempno;
    dbms_output.put_line('update!!');
end;

---调用
declare
    inputempno emp.empno%type;
begin
   inputempno := &请输入编号;
   pro_updateSal(inputempno);
end;

---根据输入的员工编号,获得员工的姓名
create or replace procedure pro_getEmpName(myempno in emp.empno%type,
                                                                          myename out emp.ename%type)
 is
 begin
       select ename into myename from emp where empno=myempno;
       dbms_output.put_line('获得成功');
 end;       
 
 --调用
 declare
     inputempno emp.empno%type;
     ----与sqlserver不需要使用out关键字来声明out类型的参数
     myname emp.ename%type;
 begin
     inputempno := &请输入员工编号;
     pro_getEmpName(inputempno,myname);
     dbms_output.put_line('姓名:'||myname);
 exception
       when no_data_found
           then dbms_output.put_line('输入员工编号错误或没有此数据');   
 end;
                                                                 

 

/***********************
存储过程的定义
create [or replace] procedure <过程名> [(参数列表)]
is | as
   [局部变量声明]
begin
   可执行语句
   exception
     异常处理语句
end [<过程名>];
**************************/

create or replace procedure updateSal(theno emp.empno%type,percent number)
is
       cursor updateEmp(theEmpno emp.empno%type) is
       select * from emp where empno=theempno for update;
       updateRow emp%rowtype;
begin
       open updateEmp(theno);
       fetch updateEmp into updateRow;
       update emp set sal = sal*(1+percent) where current of updateEmp;
       dbms_output.put_line('数据修改完成');
       close updateEmp;
end;

select empno,ename,sal from emp where empno=7369;

begin
  updateSal(7369,0.2);
end;

--带参数的存储过程
create or replace procedure updateSal(theempno number,thesal in out number)
is
       thejob emp.job%type;
       tempsal emp.sal%type;
begin
  select job,sal into thejob,tempsal from emp where empno = theempno;
  if thejob = 'MANAGER' then
    thesal := thesal*1.2;
  end if;
  update emp set sal = thesal where empno = theempno;
end;

declare
  thesal emp.sal%type;
begin
  thesal := 3000;
  updateSal(7698,thesal);
  dbms_output.put_line(thesal);
end;

/***********************************
函数的定义
create [or replace]  function 函数名称
[(参数 [ { in | out | in out } ]   类型, ……
(参数 [ { in | out | in out } ]   类型 )]
return 返回类型 { is | as }
函数的执行语句
************************************/

create or replace function myadd(a int,b int)
return int
as
begin
  return a + b;
end;

--在PL/SQL中调用必须要有一个参数接受函数的返回值
declare
  result int := 100;
begin
  result := myadd(32,16);
  dbms_output.put_line('结果是:'||result);
end;