1、掌握PL/SQL的数据结构和编程结构,掌握应用PL/SQL编写简单程序的方法
2、理解存储过程的概念,掌握编写存储过程的方法
3、理解函数的概念,掌握编写存储过程的方法
DECLARE -- 声明块
BEGIN -- 执行块
EXCEPTION -- 异常处理块
declare
n int;
result int;
begin
n:=0;
result:=0;
while n<=100 loop
result:=result+n;
n:=n+1;
end loop;
dbms_output.put_line('结果是'||result);
end;
procedure 存储过程,存储在数据库中的不带返回值的命名PL/sql程序块,(可以反复使用复杂操作,并提高执行效率)
create or replace procedure procedureName(parm parmType)
as
local varible defination
begin
procedure body;
end;
create or replace procedure sp_calcSum as
result int;
begin
result := 0;
for n in 1..100 loop
result := result + n;
end loop;
dbms_output.put_line('1+2+...+100的结果是' || TO_CHAR(result));
end;
create or replace procedure sp_calcSum(pEndNumber int) as
result int;
begin
result := 0;
foe n in 1..pEndNumber loop
result := result + n;
end loop;
dbms_output.put_line('1+2+...+' || TO_CHAR(pEndNumber) || '的结果是' || TO_CHAR(result));
end;
function函数,存储在数据库中的带返回值的命名pl/sql程序块
create or replace function functionName(parm parmType) return resultType
as
local varible defination
begin
function body
return result;
end;
create or replace function f_calcSum return number
as
result number :=0;
begin
for i in 1..100 loop
result :=result+i;
end loop;
return result;
end;
select f_calcSum() from dual;
create or replace function f_calcSum(pEndNumber int) return int
as
result int :=0;
begin
for i in 1..pEndNumber loop
result :=result+i;
end loop;
return result;
end;
select f_calcSum(100) from dual;
编写存储过程 sp_AlterSalByDeptno(pSalDelta,pDeptno)
调用存储过程将30号部门的薪水增加1000元 execute sp_AlterSalByDeptno(1000,30)
与使用update语句进行对比
--创建存储过程
CREATE OR REPLACE PROCEDURE sp_AlterSalByDeptno(pSalDelta NUMBER, pDeptno NUMBER) AS
BEGIN
UPDATE employees SET salary = salary + pSalDelta WHERE department_id = pDeptno;
COMMIT; -- 提交事务
DBMS_OUTPUT.PUT_LINE('部门' || TO_CHAR(pDeptno) || '的薪水已经增加' || TO_CHAR(pSalDelta) || '元');
END;
--调用存储过程
EXECUTE sp_AlterSalByDeptno(1000, 30);
编写函数 f_GetAvgSalByDeptno(pDeptno)
调用函数求出30号部门的平均薪水并显示tempSal:=f_GetAvgSalByDeptno(30)
与使用select语句进行对比
--创建存储过程
CREATE OR REPLACE FUNCTION f_GetAvgSalByDeptno(pDeptno NUMBER) RETURN NUMBER AS
v_avg_sal NUMBER;
BEGIN
SELECT AVG(salary) INTO v_avg_sal FROM employees WHERE department_id = pDeptno;
RETURN v_avg_sal;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN NULL;
END;
--调用存储过程
DECLARE
tempSal NUMBER;
BEGIN
tempSal := f_GetAvgSalByDeptno(30);
IF tempSal IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('部门30的平均薪水是:' || TO_CHAR(tempSal));
ELSE
DBMS_OUTPUT.PUT_LINE('部门30没有员工');
END IF;
END;
需要频繁重复的数据库操作通常会编制专门的存储过程或函数
存储过程应用: 先创建存储过程(编写sql语句,将编写的代码编译后保存在数据库中,同时存储了编写的plsql语句和对应的编译后的机器操作指令),再使用存储过程(直接调用机器操作指令)
sql语句:update emp set sal=sal+1000 where deptno=30;先检查sql是否正确,再转换成机器操作指令,最后执行机器操作
对比:
while deptno in(10,20,30) loop
execute alterSalBydeptno(delta,target); ---1 每次只需直接执行
update emp set sal=sal+delta where deptno=target; ---2 每次执行都要检查、转换、执行
DeptnoMoveNext();
end loop
可以在此段代码执行前后分别获取当前时间,检查其两种方式所用时间的差别