源码-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
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 5(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 2(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 3(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 4(PL/SQL语言概览)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 1(PL/SQL基础)
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 1(使用PL/SQL记录)
- 源码-Oracle数据库管理-第十四章-记录与集合-Part 2(使用PL/SQL记录)
- 源码-Oracle数据库管理-第十三章-子程序和包-Part 4(定义PL/SQL包)
- oracle数据库(PL/SQL)
- Oracle PL/SQL使用
- Oracle-PL/SQL使用
- 《oracle pl/sql programming》 第三章 pl/sql语言基础
- Oracle管理端 使用PL/SQL
- oracle使用PL/SQL创建用户
- PL/SQL创建Oracle用户
- Oracle PL/SQL语言基础
- Oracle PL/SQL语言基础
- Oracle PL/SQL语言初级教程
- git的基本使用(二)---git基本指令和操作
- Eclipse配制maven注意事项
- [MySQL]Fatalerror: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
- __declspec用法详解
- 《成神之路-基础篇》JVM——Java内存相关(已完结)
- 源码-Oracle数据库管理-第十二章-使用PL/SQL创建Oracle程序-Part 5(PL/SQL语言概览)
- android利用JNI调用C++自定义类
- 移动游戏战斗系统实现方式探讨
- 第九周 oj 一,统计各种字符个数
- Android 如何使控件对齐
- PHP SPL笔记
- sql中将一个表中的数据导入到另一个表中
- 【数学:线性代数】如何生动有趣的入门线性代数
- Sql 标识列 增长1000