-
触发器:
a. 触发器可响应的事件有:
i. 对表的INSERT,UPDATE及DELETE操作 i. 对视图进行类似的操作 i. 数据库的启动与关闭等
a. 触发器主要分类:
i. DML触发器insert,update,delete i. DDL触发器 create,drop,alter i. 系统级触发器dastart,dbshut,logon,grant等
a. 触发器的定义语法:
i. CREATE OR REPLACE TRIGGER 触发器名字 [BEFORE|AFTER|INSTEAD OF] [DELETE|AFTER|UPDATE [OF column.......]] ON [表名|视图名] [FOR EACH ROW ] sql_statment[...n] --INSTEAD OF 只支持视图 触发器需要编译后使用
a. :new 和 :old对象
i. 当insert时,:new 表示的是当前待插入的数据 i. 当update时,:new表示更新后的数据 i. :old 操作完成前的数据值
-
PLSQL编程入门
a. PL/SQL是一种面向数据库的可编程的程序语言,即过程化SQL语言(Procedural Language/SQL) a. PL/SQL编程通常是指 Oracle的编程语言 T_SQL通常指 SQL_server的编程语言
a. 变量标识符规范
i. 变量必须以字母(A~Z)开头; i. 可选的一个或多个字母,数字或特殊字符$,#或_; i. 变量长度不超过30个字符; i. 变量中不能有空格
a. 变量赋值方式
i. 方式一,直接赋值 变量名 := 1; i. 方式二, select 字段名1[,字段名2] INTO 变量名1[,变量名2,....] FROM 表名 where 条件表达式(一次只可赋值一行)
a. 快速变量类型 %Type与%RowType
i. %TYPE类型参照:定义变量,变量的数据类型与已经定义的某个变量名或者表中的某个字段的数据类型一样, DECLARE 变量名 表名.字段名%type :=<初始值>; i. %RowType类型参照: 返回一个记录类型,(表中一行数据的数据类型,相当于返回一个行对象) 变量名 表名%RowType 表示获取表中一行的数据类型 举例: DECLARE V_STUDENT STUDENT%ROWTYPE; --与SF_ORG表中的各个列相同 BEGIN SELECT * INTO V_STUDENT FROM STUDENT WHERE V_STUDENT.STUDENT_ID=&ORG_ID; --接收一个用户输入的学生ID; END;
a. 控制台输入输出
i. 控制台输出:
1. set serverout on; --开启输出开关 1. DBMS_OUTPUT.PUT_LINE(要输出的语句)
i. 控制台输入:
1. v_empno := &要输入的语句; --&后面输入要输入的语句
a. IF条件结构
i. IF 条件表达式 THEN 语句体 [ELSIF 条件表达式2 THEN 语句体] [ELSE 语句体 ] ENDIF;
i. 选择和跳转语句
CASE 变量 WHEN 变量为 表达式1 THEN 语句体 WHEN 变量为 表达式2 THEN 语句体 WHEN 变量为 表达式3 THEN 语句体 END CASE;
a. LOOP-EXIT-END循环结构(先执行后判断)
i. 语法结构一: LOOP 循环体 IF 条件表达式 THEN EXIT; END IF; END LOOP; 语法结构二: LOOP 循环体 EXIT WHEN 条件表达式 END LOOP;
a. WHILE-LOOP-END循环 (先判断后执行)
WHILE 条件表达式 LOOP 循环体 END LOOP;
a. 认识游标
i. Oracle 在内存中的一块区域(即上下文区),存储着一次的select的结果集,游标就是指向该上下文区的句柄或指针。(可以认为就是结果集的起始地址) i. 游标分类 1. 显式游标(与select查询是一对一的绑定关系) 定义游标,指定SELECT查询语句 打开游标,执行游标所对应的SELECT查询语句 提取数据,读取游标指向的数据行。 关闭游标,释放游标所占用的系统资源 举例: declare cursor v_cursor is select ename,job,sal from emp where job = ‘MANAGER‘; c_row v_cursor%rowtype; --v_cursor可替换成 emp,而这当前表达意思一样 begin open v_cursor; --打开游标 loop fetch v_cursor into c_row; --提取数据 exit when v_cursor%notfound; --判断循环结束条件 dbms_output.put_line(c_row.ename ||‘==‘|| c_row.job ||‘==‘c_row.sal); --打印数据,游标对象的字段名 end loop; close c_cursor; --关闭游标 end; 1. 隐式游标 (FOR循环游标)不需要显示open,close游标。 declare cursor v_cursor is select ename,job,sal from emp where job = ‘MANAGER‘; c_row v_cursor%rowtype; begin for c_row in v_cursor loop dbms_output.putline(c_row.ename||‘==‘c_row.job); end loop; end;