PL/SQL编程
2015-10-08 16:09
204 查看
PL/SQL块由三部分组成,声明部分、执行部分、异常处理。
DECLARE
--声明部分:声明PL/SQL用到的变量、类型及游标、以及局部的存储过程和函数。
变量名 变量类型(表.列%TYPE(与表里的列值相同)) := 给变量赋值;
变量名 变量类型 表.%ROWTYPE 与表里的一行值相同 := 给变量赋值;
BEGIN
--执行部分:过程及SQL语句,即程序的主要部分
SELECT 表列名 INTO 变量名(给变量赋值) FROM 表
PL/SQL 和 SQL语句
ELSE
其他语句
END IF;
WHEN 条件表达式1 THEN
语句段1
WHEN 条件表达式2 THEN
语句段2
END CASE;
要执行的语句;
EXIT WHEN 条件语句 判断停止循环条件;
END LOOP;
EXCEPTION
--异常处理部分:错误处理
WHEN 异常 THEN
输出 异常错误;
END;
cursor emp_cursor (游标名称) IS SELECT sal,empno,deptno FROM EMPLOYEE;
emp_record emp_cursor%rowtype;
e_cname_is_null EXCEPTION; -- 自定异常
BEGIN
IF not emp_cursor%ISOPEN THEN --判断游标是否打开
open emp_cursor; --打开游标
END IF;
LOOP
FETCH emp_cursor INTO emp_record;
exit WHEN emp_cursor%NOTFOUND;
IF emp_record.sal >= 10000 THEN -- 当钱大于或等于10000 则输出异常
RAISE e_cname_is_null;
ELSE -- 否则把钱小于10000的全部修改为10000
UPDATE EMPLOYEE SET SAL = 10000 WHERE EMPNO = emp_record.empno AND emp_record.deptno = 10;
end if;
END LOOP;
close emp_cursor; --关闭游标
EXCEPTION
WHEN e_cname_is_null THEN -- 输出自定义异常
dbms_output.put_line('工资不低于1
4000
0000!');
WHEN OTHERS THEN
dbms_output.put_line('其他异常');
END;
cur_salary OUT SYS_REFCURSOR, -- SYS_REFCURSOR 系统游标类型
on_Flag out NUMBER,
os_Msg out VARCHAR2
)
AS
BEGIN
OPEN cur_salary FOR
SELECT empno,sal FROM employee;
EXCEPTION
when others then
on_Flag := -1;
os_Msg := '查询失败';
END;
cur_salary SYS_REFCURSOR;
v_cmpno employee.empno%TYPE;
v_sal employee.sal%TYPE;
on_Flag NUMBER;
os_Msg VARCHAR2(10);
BEGIN
get_sals(cur_salary,on_Flag,os_Msg);
OPEN cur_salary;
LOOP
fetch cur_salary into v_cmpno,v_sal;
exit WHEN cur_salary%NOTFOUND;
DBMS_OUTPUT.PUT_LINE
('第'||'个雇员:'||v_cmpno||v_sal);
END LOOP;
close cur_salary;
dbms_output.put_line(os_Msg);
end;
DECLARE
--声明部分:声明PL/SQL用到的变量、类型及游标、以及局部的存储过程和函数。
变量名 变量类型(表.列%TYPE(与表里的列值相同)) := 给变量赋值;
变量名 变量类型 表.%ROWTYPE 与表里的一行值相同 := 给变量赋值;
BEGIN
--执行部分:过程及SQL语句,即程序的主要部分
SELECT 表列名 INTO 变量名(给变量赋值) FROM 表
--条件控制
IF 布尔表达式 THENPL/SQL 和 SQL语句
ELSE
其他语句
END IF;
--CASE选择结构
CASEWHEN 条件表达式1 THEN
语句段1
WHEN 条件表达式2 THEN
语句段2
END CASE;
--循环控制
LOOP要执行的语句;
EXIT WHEN 条件语句 判断停止循环条件;
END LOOP;
EXCEPTION
--异常处理部分:错误处理
WHEN 异常 THEN
输出 异常错误;
END;
-- 游标
DECLAREcursor emp_cursor (游标名称) IS SELECT sal,empno,deptno FROM EMPLOYEE;
emp_record emp_cursor%rowtype;
e_cname_is_null EXCEPTION; -- 自定异常
BEGIN
IF not emp_cursor%ISOPEN THEN --判断游标是否打开
open emp_cursor; --打开游标
END IF;
LOOP
FETCH emp_cursor INTO emp_record;
exit WHEN emp_cursor%NOTFOUND;
IF emp_record.sal >= 10000 THEN -- 当钱大于或等于10000 则输出异常
RAISE e_cname_is_null;
ELSE -- 否则把钱小于10000的全部修改为10000
UPDATE EMPLOYEE SET SAL = 10000 WHERE EMPNO = emp_record.empno AND emp_record.deptno = 10;
end if;
END LOOP;
close emp_cursor; --关闭游标
EXCEPTION
WHEN e_cname_is_null THEN -- 输出自定义异常
dbms_output.put_line('工资不低于1
4000
0000!');
WHEN OTHERS THEN
dbms_output.put_line('其他异常');
END;
--存储过程
CREATE OR REPLACE PROCEDURE get_sals(存储过程名称) (cur_salary OUT SYS_REFCURSOR, -- SYS_REFCURSOR 系统游标类型
on_Flag out NUMBER,
os_Msg out VARCHAR2
)
AS
BEGIN
OPEN cur_salary FOR
SELECT empno,sal FROM employee;
EXCEPTION
when others then
on_Flag := -1;
os_Msg := '查询失败';
END;
--调用存储过程
declarecur_salary SYS_REFCURSOR;
v_cmpno employee.empno%TYPE;
v_sal employee.sal%TYPE;
on_Flag NUMBER;
os_Msg VARCHAR2(10);
BEGIN
get_sals(cur_salary,on_Flag,os_Msg);
OPEN cur_salary;
LOOP
fetch cur_salary into v_cmpno,v_sal;
exit WHEN cur_salary%NOTFOUND;
DBMS_OUTPUT.PUT_LINE
('第'||'个雇员:'||v_cmpno||v_sal);
END LOOP;
close cur_salary;
dbms_output.put_line(os_Msg);
end;