/*****************************存储过程**************** 子程序:存储过程与函数 存储过程的语法: 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;