数据库学问总结
Chpt 1
一、基本名词
1.数据库:实际上是一个信息列表
2.数据库程序:虚拟的列表管理员
3.表:只用于存储一类事情的信息,保持不同信息分类之间的独立性可以让数据库以一种严密的组织方式高效地存储信息
4.行/记录:每一行都包含一个(且只有一个)由表名称定义的项目信息
5.列/字段:包含特定事物的单个信息段
6.SQL:Structured Query Language,结构化查询语言(查询数据库标准语言)
二、数据库特点
1.存储信息量大 2.多用户 3.健壮安全 4.关联 5.数据约束
三、SQL命令分类
1.数据定义(DDL,对表的操作):CREATE、ALTER、DROP(不可逆)、RENAME、TRUNCATE
2.数据操作(DML,对记录的操作):INSERT、UPDATE、DELETE
3.数据控制(DCL,对权限的操作):GRANT、REVOKE
4.数据检索(DSL,检索数据):SELECT及其参数
5.事务控制:ROLLBACK、SAVEPOINT、COMMIT
Chpt 2
一、表和列的命名规则
1.最大长度30字符 2.可以包含数字字母下划线 3.首字符必须是字母 4.大小写等价
5.不可包含空格 6.同一个用户空间中表不可重名 7.不可单独使用保留字
二、Oracle的数据类型
1.文本:文本类型可以存储用键盘输入的任何内容,文本形式的数字不能做任何数学运算;文本数据通常都用单引号括起来;在文本类型中经常包含单引号,需要使用两个个单引号(’’)的形式进行转义
(1) CHAR:定义字段时需要指定该字段可以容纳的最大字数,若不指定则默认长度为1;若输入字数小于最大字数,则自动在输入字符后补空格;范围4KB
CREATE TABLE table_name (column_name CHAR(n))
(2) VARCHAR2:变长文本,范围4KB
(3) LONG:范围2GB
(4) CLOB:范围4GB
2.数字:
NUMBER:存储数字,需要指定位数
NUMBER(total_number_of_digits, digits_after_a_decimal_point)
3.日期:采用儒略历,开始日期为公元前4712年1月1日,Oracle会将儒略历转换成普通日期,在SQL语句中,日起必须用单引号括起来
4.空值:null,字段中没有数据,0不是空,空格也不是空
三、表的基本操作
1.查看表结构:DESCRIBE table_name或DESC table_name
2.插入表数据:(1) INSERT INTO table_name VALUES (value1, value2, …)
(2) INSERT INTO table_name (column_name1, column_name2, …)
VALUES (value1, value2, …)
3.查看表数据:(1) SELECT column_names FROM table_names;
(2) 算术表达式:SELECT column_name1 + column2 FROM table_name
其中column_name1 + column2可以替换为任何列的算术表达式
(3) 列名合并:可以在两个列名之间使用||,还可以用||连接文本串
SELECT column_name1 || ‘text’ || column_name2 FROM table_name
(4) 列的别名:可以在列头后面定义别名,如果别名用双引号括起,那么就可以包含空格
SELECT column_name alias FROM table_name
SELECT column_name “another alias” FROM table_name
Chapt 3
一、条件查找:SELECT columns FROM table_name WHERE condition(s)
1.条件关键字:=,<,>,<=,>=,!=,<>,AND,OR,BETWEEN,IN,NOT,(多字符通配%,单个字符通配_,LIKE),IS NULL,IS NOT NULL
2.检索结果排序:SELECT column_names FROM table_names ORDER BY columns_to_sort_by
按照columns_to_sort_by中出现的各列的顺序一个个排列
3.显示唯一值:SELECT DISTINCT或SELECT UNIQUE
二、修改表中数据:
UPDATE table_name SET column_name(s) = new_value(s) WHERE condition(s);
三、删除表中数据:(1) 条件删除:DELETE table_name WHERE condition(s);
(2) 全部删除:a. DELETE FROM table_name;
COMMIT之前可逆,在删除之前会读取每一列,开销大
b. TRUNCATE TABLE table_name;
快速,并自动释放表空间,但不可逆
四、事务控制
1.ROLLBACK(TO savepoint_name):在COMMIT之前撤销操作
2.SAVEPOINT savepoint_name:保存回滚点,可以直接回滚到这个点
3.COMMIT:将改变永久写入数据库
4.隐式COMMIT:所有的DDL命令都会隐式提交未保存的数据
Chapt 4
一、输出到磁盘
SPOOL spool_file_name
manipulations
SPOOL OFF
将manipulations所造成的屏幕输出都保存在spool_file_name所指定的文件中,类似于log
二、SQL脚本文件
1.创建或修改:EDIT script_name
2.运行脚本:@script_name
3.脚本变量:可以使用&variable_name的形式在脚本中代替一些暂时不能确定的值,运行脚本时会提示输入变量值
4.SQL脚本注释:(1) 单行注释:-- annotations
(2) 多行注释:/* annotations */
Chpt 5
一、单行函数:影响每一行记录
1.系统变量
(1) SYSDATE:返回当前日期和时间,进行加减运算时以天为单位
(2) SYSTIMESTAMP:返回数据库服务器当前日期、时间(包括秒)以及时区。
(3) CURRENT_DATE:返回本地计算机当前日期和时间
(4) CURRENT_TIMESTAMP:返回本地计算机当前日期、时间(包括秒)以及时区
(5) USER:返回用户ID,表示谁在执行函数(其中包含USER函数)
(6) USERENV:返回执行该函数的各种计算机环境参数,包括计算机名,用户名等
2.数字函数
(1) ROUND(input_value, decimal_places_of_pricision)
对数字进行四舍五入。第一个参数是被操作数;后一个参数若为正,则表示精确到小数点后多少位,若为负,则表示精确到小数点前多少位
(2) TRUNC(input_value, decimal_places_of_pricision)
不进行四舍五入,仅截取有效位数。参数与上相同。
3.文本函数
(1) UPPER(column_name):全部大写
(2) LOWER(column_name):全部小写
(3) INITCAP(column_name):首字母大写
(4) LENGTH(column_name):返回文本串长度
(5) SUBSTR(source_text, starting_character_position, number_of_characters):
从source_text所指定的长文本中得到起始位置为starting_character_position,长度为number_of_characters的子串
(6) INTSTR(source_text, text_to_locate, starting_character_position):
从source_text所指定的长文本中查找text_to_locate所指定的子串的开始位置
(7) LTRIM(column_name):从左边删除多余空格
(8) RTRIM(column_name):从右边删除多余空格
4.日期处理
(1) SYSDATE和TRUNC:由于SYSDATE不仅返回日期,还返回当前时间(但时间不能显示),如果在检索条件中使用SYSDATE那么就很难匹配,使用TRUNC(SYSDATE)或TRUNC(date_column)的形式,只保留日期。
(2) ADD_MONTHS(‘starting_date’, number_of_months):
在starting_date所指定的日期加上number_of_months所指定的月数
(3) LAST_DAY(‘date’):返回给定日期中当月最后一天
(4) MONTHS_BETWEEN(later_date, earlier_date):返回任意两个日期之间的月份数
5.数据类型转换
(1) TO_CHAR(input_value, ‘format_code’):将日期、时间或数字转换成文本
(2) TO_DATE(input_value, ‘format_code’):将文本形式的日期或时间转换成日期/时间类型
6.其它函数
(1) DECODE(类似于C中的switch-case用法):
语法:DECODE(incoming_source,
Incoming_value_1, outgoing_result_1,
Incoming_value_2, outgoing_result_2,
……
Last_incoming_value, last_outgoing_result,
[default_outgoing_result_if_no_match])
解释:incoming_value与outgoing_result是因果输出对,当满足incoming_value时就输出outgoing_result,若没有找到满足项,则输出可选的default_outgoing_result_if_no_match
(2) NVL(input_value, result_if_input_value_is_null):若input_value为空,则输出result_if_input_value_is_null
二、组函数
1.SUM(column_name):计算符合条件的列中数据的总合
2.COUNT(column_name):计算符合条件的记录的总数
3.AVG(column_name):计算符合条件的列的平均值
4.MIN(column_name):返回符合条件的列的集合中的最小值
5.MAX(column_name):返回符合条件的列的集合中的最大值
6.GROUP BY column_name:依据column_name所指定的列进行结果分组
7.HAVING condition:对检索结果集进行二次过滤,通常condition为一个算术表达式
Chpt 6
一、索引表
1.定义:一种辅助隐藏表,该表包含主表的一个或多个重要列,并包含指向主表每行记录的指针(主表行号),索引表比它指向的主表小很多,一个主表可以有多个索引表。Oracle索引中可以包含的最大列数为32。
2.特点
(1) 改变表时:索引表与主表会自动保持同步,任何对于主表的改变都会自动改变索引,所以INSERT、UPDATE、DELETE等操作时间都会被延长。
(2) 检索表时:索引表的检索速度很快,检索到结果后可直接根据行指针定位到主表记录,故能够加快检索速度。
3.创建索引:
CREATE INDEX index_name ON table_name (first_column_name, second_column_name, …);
其中column_name既可以是列名,也可以是对列的函数计算
4.删除索引:DROP INDEX index_name;
5.索引类型
(1) B*-树索引:在创建B*-树索引时,Oracle分析索引列中的值,并确定如何将表分离成带有相同记录号的“叶块”。然后创建“分支块”层,以尽可能少的步骤查找低层叶块中的记录。适合于索引列中包含大量不同的值时使用。
(2) 位图索引:当索引列为低基数(不同的值少)列时,创建位图索引可以极大地减少检索时间,因为位图索引非常小(用少量的位表示不同的值),且计算机可以快速处理0、1位数据。CREATE BITMAP INDEX index_name ON table_name (column_name);
二、约束
1.定义:约束是定义数据在插入表中之前必须符合的条件的方法。约束作为表定义的一部分而保存,一旦创建,就会自动执行。
2.约束种类
(1) NOT NULL:非空约束
a.创建表时定义:CREATE TABLE table_name (column_name NOT NULL);
b.修改现有表:ALTER TABLE table_name MODIFY (column_name NOT NULL);
(2) UNIQUE:唯一性约束
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column_name(s));
或CREATE UNIQUE INDEX constraint_name ON table_name (column_name(s));
(3) CHECK:自定义约束
ALTER TABLE table_name ADD CONSTRAINT [constraint_name]
CHECK (column_name condition_to_satisfy);
其中的column_name condition_to_satisfy形式与WHERE子句中的条件相同
3.删除约束
(1) 对于NOT NULL:ALTER TABLE table_name MODIFY (column_name NULL);
(2) 对于CONSTRAINT:ALTER TABLE table_name DROP CONSTRAINT constraint_name;
4.禁用与启用约束
(1) 禁用:ALTER TABLE table_name DISABLE CONSTRAINT constraint_name;
(2) 启用:ALTER TABLE table_name ENABLE CONSTRAINT constraint_name;
三、表间关联
1.“一对多”关联:在父/子表关系中,子表中的多个记录可以调用父表中的单个记录,例如多个员工表的记录可以调用同一个部门表的记录。
2.主键与外键
(1) 主键:能够唯一确定一条记录的一个(或多个)字段,是调用表中记录的主要方法,用PK表示。
a.创建表时定义:CREATE TABLE table_name (column_name PRIMARY KEY);
b.修改现有表:ALTER TABLE table_name ADD PRIMARY KEY (column_name(s));
(2) 外键:为了将父表的主键用于关联,必须在子表中进行调用。子表中包含的某个字段(或多个字段)必须与父表中的主键有相同的数据类型(字段名可以不同),在需要创建引用父表记录的子表记录时,必须在子表记录中包含父表的主键值。在子表中包含父表主键值的字段成为外键,外键允许子表中的记录引用父表记录,用FK表示。
a.创建表时定义:TODO
b.修改现有表:ALTER TABLE child_table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY (column_name(s)_in_child_table)
REFERENCES parent_table_name (column_name(s)_in_parent_table);
(3) 作用:在父表中输入数据,然后在其它多个子表中调用该数据,避免了重复输入。
3.实体关系图(ER图,Entity Relational Diagram):数据库中各个表的关系图。
4.笛卡尔乘积:在对多表进行检索的时候,没有使用WHERE子句而产生的结果,检索记录数为各张表记录数的连乘积。
5.外连接
(1) parent_table_name.primary_key = child_table_name.foreign_key (+)
父表中的每条记录不一定都包含在子表中,(+)表示该符号前面的表可能不包含另一个表中的所有记录,一般(+)符号放置在子表名称的后面,这是因为父表可以包含子表没有的数据,但子表不能包含与父表不匹配的数据。
(2)SQL 1999标准:
SELECT columns
FROM
table_1 LEFT/RIGHT/FULL OUTER JOIN table_2
ON (table_1.column1 = table_2.column2)
(1)LEFT OUTER JOIN:此连接左边的表影响输出结果
(2)RIGHT OUTER JOIN:此连接右边的表影响输出结果
(3)FULL OUTER JOIN:此连接两边的表的记录都显示
四、连接运算符:
1.UNION:合并两个SELECT语句产生的检索结果,不显示重复记录
2.UNION ALL:合并两个SELECT语句产生的检索结果,显示重复记录
3.INTERSECT:只显示两个SELECT语句所产生的相同检索结果
4.MINUS:显示在一个SELECT检索结果中存在而在另外一个SELECT检索结果中不存在的记录(相当于减号)
五、子查询:SELECT查询可以嵌套,理论上可以无数层地嵌套子查询
1.单行子查询:使用=符号进行匹配运算
2.多行子查询:使用IN(...)进行匹配运算
3.多列子查询:
SELECT column(s) FROM table_1
WHERE (column_1, column_2)
IN (SELECT column_3, column_4 FROM table_2)
Chpt 7
一、表间数据转换
1.检索-单表插入:INSERT INTO table_name (SELECT statement);
将SELECT statement生成的查询结果插入到table_name所指定的表中
2.检索-多表插入
(1) 无条件:
INSERT ALL
INTO first_table_name VALUES (first_column_name, … last_column_name)
…
INTO last_table_name VALUES (first_column_name, … last_column_name)
SELECT statement;
将SELECT statement生成的查询结果插入到各个表中
(2) 有条件:
INSERT ALL
WHEN first_condition THEN INTO first_table [VALUES(column_list)]
…
WHEN last_condition THEN INTO last_table [VALUES(column_list)]
SELECT statement;
将SELECT statement生成的查询结果经过每个condition二次筛选后再插入到各个表中
3.记录MERGE:将更新和插入结合起来,插入表中没有的记录,更新表中已有的记录
MERGE INTO main_table
USING change_table
ON (main_table.primary_key = change_table.primary_key)
WHEN MATCHED THEN
UPDATE SET main_table.first_column = change_table.first_column
…
main_table.last_column = change_table.last_column
WHEN NOT MATCHED THEN
INSERT (first_column, … last_column)
VALUES (change_table.first_column, … change_table.last_column);
4.检索-创建新表:CREATE TABLE new_table_name AS SELECT statement;
创建新表,并将检索结果作为新表的数据
二、改变表名:RENAME old_table_name TO new_table_name;
三、改变表结构
1.添加列:ALTER TABLE table_name ADD new_column_name datatype [NOT NULL];
2.改变列名:
ALTER TABLE table_name RENAME COLUMN old_column_name TO new_column_name;
3.删除列:ALTER TABLE table_name DROP COLUMN column_name;
4.改变列数据类型:ALTER TABLE table_name MODIFY column_name new_datatype;
四、视图(VIEW)
1.定义:定义经常使用的查询,将它保存到Oracle数据库中,并且允许通过名称进行调用(类似于表)。当用户选择视图中的记录时,Oracle执行保存在视图中的查询。
2.创建视图:
CREATE OR REPLACE VIEW view_name AS
SELECT statement;
OR REPLACE的作用在于当存在同名视图时,用新视图覆盖同名视图
3.删除视图:DROP VIEW view_name;
4.TOP N分析:显示前N条记录
SELECT * FROM (SELECTstatement) WHERE ROWNUM <= number_of_records_you_want;
五、序列(SEQUENCE)
1.定义:计数器,在插入记录时,通过使用序列可以确保为每个插入的记录分配唯一序号
2.创建序列:
CREATE SEQUENCE sequence_name
[INCREMENT BY increment_quantity]
[START WITH starting_value]
[MAXVALUE highest_value]
[MINVALUE lowest_value]
[CYCLE];
3.运用序列
(1)当前序号:sequence_name.curral
(2)下一个值:sequence_name.nextval
4.修改现有序列
ALTER SEQUENCE sequence_name
[INCREMENT BY increment_quantity]
[MAXVALUE highest_value | NOMAXVALUE]
[MINVALUE lowest_value | NOMINIVALUE]
[CYCLE | NOCYCLE];
5.删除序列
DROP SEQUENCE sequence_name;
六、同义词
1.定义:可以使用不同于实际名称的某个名称引用Oracle对象
2.创建同义词:CREATE [PUBLIC] SYNONYM synonym_name FOR object_name;
3.删除同义词:DROP [PUBLIC] SYNONYM synonym_name;
Chapt 8、Chpt 9 PL/SQL编程
一、基本块:是构成PL/SQL程序的单位,存储过程、存储函数、触发器、匿名块都是由基本块构成,由五部分构成。
1.规范部分:定义了基本块的名称,参数列表以及返回类型等信息。匿名块没有规范部分。
2.声明部分:匿名块以及标记块以关键字DECLARE开始,过程与函数以IS开始。定义了基本块要用的变量,游标,记录类型,异常等。在块嵌套时,子块需要在此定义。这个部分所定义的各个成员,只能作为本块以及子块内局部使用的成员(相当于块内局部变量)。
3.执行部分:以关键字BEGIN开始。包含此块具体要执行的命令语句。执行部分可包含以下控制结构:
(1) IF语句:
IF condition_1 THEN
actions_1;
[ELSEIF condition_2 THEN
actions_2;]
…
[ELSE
actions_last;]
END IF;
(2) 循环语句
a. LOOP循环:
<<loop_name>>
LOOP
statements;
EXIT loop_name [WHEN exit_condition_expression];
statements;
END LOOP;
b. WHILE循环:
WHILE while_condition_expression
LOOP
statements;
END LOOP;
c. FOR循环:
FOR counter IN [REVERSE] lower_bound … upper_bound
LOOP
statements;
END LOOP;
4.异常部分:以关键字EXCEPTION开始。在程序执行过程中碰到使程序无法继续执行的错误称为异常。格式如下:
EXCEPTION
WHEN exception_name_1
THEN actions to take when this exception occurs
WHEN exception_name_2
THEN actions to take when this exception occurs
5.结束部分:过程与函数的结束部分为END proc_or_func_name,过程需要载最后添加“;”号,而匿名块则只有END语句
二、复合数据类型—记录类型
1.定义:记录是基本数据类型的集合,隐藏了多个数据的复杂性。以record_name.field_name的形式对其中字段进行访问。可以将它理解为类似于C的structure结构或Java的POJO类,实质上就是PL/SQL自己的OR映射。
3.类型:
(1) 基于表中一列:variable_name table_name.column_name%TYPE;
(2) 基于表:record_variable_name table_name%ROWTYPE;
(3) 基于游标:record_variable_name cursor_name%ROWTYPE;
(4) 用户自定义:
a. 类型定义:TYPE record_type_name IS [RECORD]
(field_1_name field_1_type,
field_2_name field_2_type,
… );
b. 类型使用:record_variable_name record_type_name;
三、游标
1.定义:与一个检索SQL语句捆绑,代表这个SQL执行后的结果集,是记录的集合(List)。
2.显式游标:具有名称的游标
(1) 声明:显式游标在基本块的声明部分中声明
CURSOR cursor_name [parameter1 datatype1, parameter2 datatype2, …]
[RETURN return_specification] IS
select_statement
[FOR UPDATE OF table_or_col1, table_or_col2, …];
其中parameter1, parameter2, …是用于SELECT语句中WHERE子句的参数;return_specification指定了游标采用哪种记录类型,若不指定,则自动创建基于游标的匿名记录类型;table_or_col名称必须来自于游标SELECT语句中使用的表名或列名,FOR UPDATE命令锁定SELECT语句选择的行,直到关闭游标才解除锁定。
(2) 游标属性:指示游标的状态
a. cursor_name%ISOPEN:检查游标是否打开
b. cursor_name%ROWCOUNT:游标SELECT语句所返回的行数
c. cursor_name%FOUND:检查游标中是否还存在记录没有取出
d. cursor_name%NOTFOUND:与FOUND属性相反
(3) 游标操作
a. 打开游标:OPEN cursor_name;
打开游标时就会自动执行SELECT语句,将结果填充到指定记录类型或匿名记录类型中
b. 取得记录:FETCH cursor_name INTO record_var_or_list_of_var;
从游标的记录列表中取出一条记录,放到指定的记录变量(record_var)或变量列表(list_of_var)中去,并删除这条记录,从空游标中读取记录将会重复读取最后一条已经读取的记录,而且不会报错,故在取记录前必须用FOUND或NOTFOUND属性判定游标是否为空。
c. 关闭游标:CLOSE cursor_name;
关闭游标的同时还将释放游标打开时所占用的所有系统资源
(4) 游标FOR循环:
FOR cursor_record IN cursor_nameLOOP
statements;
END LOOP;
循环地从游标中取出一条记录,赋值给record_name指定的记录变量中,直至记录取完。
(5) WHERE CURRENT OF:
当打开游标进行更新或删除所选择的行时使用,相当于取得当前这行的检索条件,用于找到需要进行更新或删除操作的行。
3.隐式游标:只能用于只返回一条记录的SELECT语句,若有多条记录则报错
SELECT column(s) INTO record_var_or_list_of_var FROM table(s) WHERE condition(s);
四、变量与常量
1.声明变量:必须在基本块的声明部分声明
variable_name data_type [[NOT NULL] := default_value_expression]; 或
variable_name data_type [[NOT NULL] DEFAULT default_value_expression];
2.声明常量:必须在基本块的声明部分声明,常量必须赋予一个值且不能改变
variable_name data_type CONSTANT := constant_value_expression;
3.变量赋值
(1) variable_name := expression;
(2) 函数或过程的参数传递
(3) 显式游标取记录
(4) 隐式游标取记录
五、异常处理
1.定义:异常是出现某个特殊问题时激活的错误状况。当出现异常时,在提出异常的语句部分终止该代码的执行过程,并且将控制转移到基本块的异常处理部分。如果该基本块没有处理这个异常的部分,异常将会被抛至外层基本块,如果外层基本块还是没有处理该异常的部分则继续向上抛。如果到最后还是没有得到处理,则系统会报告有未处理的异常错误。
2.异常种类
(1) 系统定义异常:系统内部定义的异常,有错误代码。
(2) 自定义异常:用户可以创建自己的异常条件和名称,在基本块的声明部分定义
exception_name EXCEPTION;
3.发出异常:RAISE exception_name;
六、计时器:可用于计算语句命令消耗的时间
TIMING START;
statements;
TIMING STOP;
七、存储过程(Stored Procedure)
1.定义:为一组用PL/SQL语言编写的动作。调用某个过程时,它执行自身包含的动作。由于该过程存储在数据库中,因此称为“存储过程”。过程由基本块组成。
2.规范部分:
CREATE PROCEDURE [OR REPLACE]
procedure_name (parameter1 [IN/OUT/IN OUT] datatype1[:= default_value], …)
其中OR REPLACE表示这个过程可以覆盖系统中已经存在的同名过程;
parameter [IN/OUT/IN OUT] datatype是调用过程时需要的参数,若不需要参数,则用procedure_name()或procedure_name的形式;
IN表示调用过程时可以把实参传递给这个形参;OUT表示调用过程时可以使这个形参充当返回值;IN OUT表示这个参数既可以传入值也可以传出值;参数列表中的数据类型不可以包括尺寸规范;default_value为形参的默认值
3.其它部分与基本块所述相同
4.过程的调用方法
(1) EXECUTE procedure_name (parameter_list);
(2) BEGIN
procedure_name (parameter_list);
END;
/
parameter_list的说明:
a. 若形参带有默认值,且默认值形参位于形参列表结尾,那么调用时就不必指定最后几个形参的值,实参列表的顺序与形参列表相同。
b. 若默认值形参不是处于形参列表的最后位置,或者希望明确指定哪个形参使用哪个实参,那么可以实参列表中用指定符号进行参数捆绑:formal_param => actual_param
八、存储函数(Stored Function)
1.定义:与存储过程类似,不同之处在于存储函数只有一个返回值,可以用于表达式中。
2.规范部分:
CREATE FUNCTION [OR REPLACE]
function_name (parameter1 datatype1[:= default_value], …) RETURN datatype
3.其它都与存储过程相同
九、触发器(Trigger)
1.定义:一种PL/SQL过程,当触发器定义的某些时间发生时,它就自动执行。与过程与函数不同点在于:不可以在代码中调用触发器;没有参数列表。触发器也是由基本块组成。
2.创建触发器:
CREATE [OR REPLACE] TRIGGER trigger_name fire_time trigger_event
ON table_name
[WHEN trigger_restriction]
[FOR EACH ROW]
[DECLARE declarations]
BIGIN statements
[EXCEPTION WHEN exception_name THEN …]
END trigger_name;
(1) fire_time指定何时激活触发器。若为BEFORE,则在对触发事件影响的记录进行约束检查之前执行触发器;若为AFTER,则在对触发事件和所有约束检查处理完毕后执行触发器。
(2) trigger_event为触发事件,可以是INSERT、UPDATE、DELETE,可以用OR将多个不同的触发事件结合在一起,使用UPDATE时可以指定列表:UPDATE OF column1, …
(3) trigger_restriction为触发器执行时必须符合的一个或多个条件,大多数是被影响的记录新旧状态的对比。
(4) FOR EACH ROW为触发语句影响的每条记录执行触发器,也就是说若触发语句影响了N条记录,那么会对这N条记录分别执行触发器。
(5) 在处理语句中,可以使用:OLD访问旧记录,使用:NEW访问新记录;但在trigger_restriction中使用OLD与NEW,没有前置冒号。
3.删除触发器:DROP TRIGGER trigger_name;
4.注意事项
a. INSERT只能使用:NEW以及NEW
UPDATE可以使用:NEW以及NEW或:OLD以及OLD
DELETE只能使用:OLD以及OLD
b. 触发器不能使用ROLLBACK、COMMIT和SAVEPOINT,也就是不能进行事务处理
c. 可以对相同的事件定义多个触发器,但触发器执行顺序不能确定
十、PL/SQL包
1.定义:可以将函数、过程、记录类型和游标打包,以隐藏具体实现的信息。
2.创建包的规范:
CREATE PACKAGE package_name IS
[variable_and_type_declarations]
[cursor_specifications]
[function_and_procedure_declarations]
END [package_name];
包规范中的声明部分包括主体中使用的函数、过程、异常、游标、变量和常量的声明。包规范中给出的变量称为“包变量”,只有在首次访问该包时才对它们进行初始化。
3.创建包的主体:
CREATE OR REPLACE PACKAGE BODY package_name IS
[local_declarations]
[full_cursor_definitions]
[full_function_and_procedure_definitions]
END [package_name];
包主体包括规范部分中声明的所有游标、函数和过程的完整定义(不带CREATE OR REPLACE)。对包中内容进行调用时,Oracle将该包载入内存,直到用户撤销与数据库德连接时才释放内存。
4.访问:使用container.contained的形式访问包中的资源
原文出处: 考研帮