源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 5(PL/SQL语言概览)

来源:互联网 发布:smb协议端口 编辑:程序博客网 时间:2024/06/05 00:34

触发器挺有意思,因为可以利用其完成一些自动化的操作。

--12.2.9 触发器简介--创建调薪日志表drop table emp_log;create table emp_log(empno number, log_date date, new_salary number, action varchar2(20));--代码12.29 记录日志的触发器CREATE OR REPLACE TRIGGER log_sal_adj    --创建一个触发器  AFTER UPDATE OF sal ON emp             --指定当UPDATE执行后,监控对emp表sal列的更改             FOR EACH ROW                           --每UPDATE一行执行一次触发器代码DECLARE  v_action VARCHAR2(20);                 --定义一个保存更新行为的字符串变量BEGIN  IF :OLD.sal > :NEW.sal THEN            --根据原来的工资和调整后的工资来为v_action赋值    v_action := '减少工资';               ELSIF :OLD.sal = :NEW.sal THEN    v_action := '未作调整';  ELSE    v_action := '增加工资';  END IF;  INSERT INTO emp_log                    --向emp_log表中插入日志信息,记录更改内容    (empno, log_date, new_salary, action)  VALUES    (:NEW.empno, SYSDATE, :NEW.sal, v_action);END;/select * from emp_log;update emp set sal=sal*1.3 where empno=5093;select * from emp for update;--结构化异常处理--代码12.30 异常处理示例DECLARE   v_result NUMBER:=0;                               --定义结果变量   v_dividend NUMBER:=÷nd;                     --定义被除数,它的值来自替换变量dividendBEGIN   v_result:=ROUND(1000/v_dividend,2);               --1000除以被除数   DBMS_OUTPUT.put_line('结果值为:'||v_result);     --输出结果EXCEPTION                                            --异常处理块   WHEN ZERO_DIVIDE THEN                             --如果是被0除错误      DBMS_OUTPUT.put_line('出现被0除的错误了!');   --输出错误消息   WHEN OTHERS THEN                                  --所有其他错误的异常处理句柄      DBMS_OUTPUT.put_line(SQLCODE);                 --输出错误代码      DBMS_OUTPUT.put_line(SQLERRM);                 --输出错误消息END;  --12.2.11 集合与记录--代码12.31 记录类型使用示例DECLARE  TYPE EMP_REC_TYPE IS RECORD( --显式的定义一个记录类型    empno emp.empno%TYPE,    ename VARCHAR2(50),    job   VARCHAR2(20));  emp_info_rec EMP_REC_TYPE; --定义一个使用记录类型的变量   emp_row_rec  emp%ROWTYPE; --使用%ROWTYPE直接使用行记录BEGIN  --下面的语句初始化记录类型  emp_info_rec.empno := 8222;  emp_info_rec.ename := '李三思';  emp_info_rec.job   := '销售员';  --将记录类型的值插入到emp表  INSERT INTO emp    (empno, ename, job)  VALUES    (emp_info_rec.empno, emp_info_rec.ename, emp_info_rec.job);  --从数据库表中提取行数据到记录类型中  SELECT * INTO emp_row_rec FROM emp WHERE empno = 8222;  --输出插入的员工信息  DBMS_OUTPUT.put_line('新插入的员工记录信息:' || CHR(10) || '工号:' ||                       emp_row_rec.empno || CHR(10) || '姓名:' ||                       emp_row_rec.ename || CHR(10) || '职位:' ||                       emp_row_rec.job);END;select * from emp where empno=8222;--代码12.32 集合类型使用示例(疑惑:看似一大段代码,实现的功能却很简单,有没有更为实用的例子?)DECLARE  --定义保存员工工号的索引表,其类型为emp表中的empno字段相同的类型  TYPE NumTab IS TABLE OF emp.empno%TYPE INDEX BY BINARY_INTEGER;  --定义保存员工名称的索引表,其类型为emp表中的ename字段相同的类型  TYPE NameTab IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;  --定义集合类型的变量  enums NumTab;  names NameTab;  --定义一个内嵌的命名块,用来输出集合中的前面指定位置的记录  PROCEDURE print_first_n(n POSITIVE) IS  BEGIN    IF enums.COUNT = 0 THEN                             --判断集合的元素个数      DBMS_OUTPUT.put_line('当前集合为空!');    ELSE      DBMS_OUTPUT.put_line('前 ' || n || ' 名员工:');  --输出将要显示的员工信息      --循环提取集合中的元素信息      FOR i IN 1 .. n LOOP        DBMS_OUTPUT.put_line('  员工工号:' || enums(i) || ': ' || names(i));      END LOOP;    END IF;  END; BEGIN  --使用PL/SQL扩展BULK COLLECT INTO语句,查询多行记录插入到集合中  SELECT empno, ename BULK COLLECT    INTO enums, names    FROM emp   ORDER BY empno;  print_first_n(3);        --打印前3行记录  print_first_n(6);        --打印前5行记录END;/--代码12.33 使用游标遍历结果集DECLARE  emprow emp%ROWTYPE;            --定义保存游标检索结果行的记录变量  CURSOR emp_cur                 --定义游标  IS    SELECT * FROM emp WHERE deptno=20;BEGIN  OPEN emp_cur;                   --打开游标  LOOP                            --循环检索游标    FETCH emp_cur                 --提取游标内容      INTO emprow;    --输出检索到的游标行的信息    DBMS_OUTPUT.put_line('员工编号:' || emprow.empno || ' ' || '员工名称:' ||                         emprow.ename);    EXIT WHEN emp_cur%NOTFOUND;  --当游标数据检索完成退出循环  END LOOP;  CLOSE emp_cur;                 --关闭游标END;

0 0