[教学研究]PLSQL培训教程
PL/SQL培训教程
文档作者: Kenneth Shao 创建日期: 2010-5-18 确认日期: 2010-5-18 控制编码:
当前版本: 1.0
目录
目录 ................................................................................................................................................................ 28 UNIT1 SQL、PL/SQL概要 ...................................................................................................................... 1 单元培训目标..................................................................................................................................................... 1 LESSON 1 SQL、SQL*Plus和PL/SQL基本概念 .................................................................................... 1 UNIT2 数据查询.......................................................................................................................................... 3
..................................................................................................................................................... 3 单元培训目标
LESSON 1简单的数据查询 ............................................................................................................................ 3 基本结构: ....................................................................................................................................................... 3 算术表达式: ................................................................................................................................................... 3 字符串处理 ....................................................................................................................................................... 4 空处理 ............................................................................................................................................................... 4 消除重复行: ................................................................................................................................................... 4 显示表结构: ................................................................................................................................................... 4 LESSON 2 单行函数的使用 ............................................................................................................................ 5 字符函数 ........................................................................................................................................................... 5 数值函数 ........................................................................................................................................................... 6 日期函数 ........................................................................................................................................................... 6 转换函数 ........................................................................................................................................................... 7 单行函数使用的例子: ................................................................................................................................... 8 LESSON 3多表数据查询................................................................................................................................. 8 连接 ................................................................................................................................................................... 8 表别名 ............................................................................................................................................................... 9 非等号连接 ....................................................................................................................................................... 9 外连接 ............................................................................................................................................................... 9
自连接 ............................................................................................................................................................... 9
LESSON 4组函数 ............................................................................................................................................ 10 基本格式 ......................................................................................................................................................... 10 常用组函数 ..................................................................................................................................................... 10 LESSON 5 子查询............................................................................................................................................ 11 格式 ................................................................................................................................................................. 11 UNIT3数据库 .............................................................................................................................................. 13 单元培训目标................................................................................................................................................... 13 LESSON 1系统开发周期和数据关联 ........................................................................................................ 13 系统开发周期 ................................................................................................................................................. 13 数据关联 ......................................................................................................................................................... 14 约束 ................................................................................................................................................................. 14 LESSON ,创建表、序列、视图和索引................................................................................................... 14 创建表格式 ..................................................................................................................................................... 15 创建序列格式 ................................................................................................................................................. 16 创建视图 ......................................................................................................................................................... 17 创建索引 ......................................................................................................................................................... 17 LESSON 3Oracle数据字典 ........................................................................................................................... 18 Oracle数据字典的四大类视图:.................................................................................................................. 18 其他视图: ..................................................................................................................................................... 18 常用视图 ......................................................................................................................................................... 19 LESSON 4用户访问控制: .......................................................................................................................... 19 系统权限: ..................................................................................................................................................... 19 对象权限: ..................................................................................................................................................... 20 权限的回收: ................................................................................................................................................. 21 创建同义词: ................................................................................................................................................. 21 远程数据库的访问: ..................................................................................................................................... 22 UNIT4 PL/SQL ............................................................................................................................................ 23 单元培训目标................................................................................................................................................... 23 LESSON 1简单PL/SQL ................................................................................................................................. 23 PL/SQL结构 ................................................................................................................................................... 23
匿名块,过程和函数 ..................................................................................................................................... 24 包 ..................................................................................................................................................................... 24 程序中的参数和变量类型 ............................................................................................................................. 26 LESSON ,数据获取和游标 ......................................................................................................................... 28 数据获取 ......................................................................................................................................................... 28 游标 ................................................................................................................................................................. 29 LESSON ,PL/SQL控制流 ........................................................................................................................... 30 IF 语句 ............................................................................................................................................................ 30 LOOP 语句...................................................................................................................................................... 31 LESSON ...................................................................................................................................... 32 ,出错处理
Exception 类型................................................................................................................................................ 32 Exception 处理................................................................................................................................................ 32 非预定义的Oracle 数据库例外 .................................................................................................................... 33 用户自定义的例外: ..................................................................................................................................... 34 附录A:........................................................................................................................................................... 35 数据结构: ....................................................................................................................................................... 35 描述: ................................................................................................................................................................ 35
UNIT1 SQL、PL/SQL概要
单元培训目标
, 了解SQL、PL/SQL的基本概念、功能
, 了解Oracle 产品集和关联
, 了解SQL、PL/SQL的基本命令
LESSON 1 SQL、SQL*Plus和PL/SQL基本概念
本节主要讲述SQL、PL/SQL和SQL*Plus的基本概念,以及Oracle产品集之间的关联。
SQL、SQL*Plus和PL/SQL是用来检索和维护存储在Oracle数据库上数据的工具或语言。
, Oracle是一个对象— 关系型数据库管理系统(ORDBMS),它扩展了普通关系
型数据库管理方式,支持面向对象的概念,以表的形式存储信息,维护数据的输
入、数据的存储和数据查询并处理及对数据的三种基本操作:采集、存储、检
索。
, SQL: 结构化查询语言(Structured Query Language),用来与Oracle数据库服务
器进行交互。
例:select name, salary from t_emp
select sysdate from dual
, PL/SQL: Oracle扩展的SQL语言,具有完整的流程控制定义。
, SQL*Plus: Oracle常用的工具,用来识别SQL语言和编写、执行PL/SQL代码,
它与Oracle数据库管理系统紧密结合。
, SQL*Plus环境登录:
(1) windows环境
(2) 命令行环境
如下格式:
Sqlplus [username [/password [@database]]]
username 数据库用户名
password 数据库的密码,此时是可见的
@database 要登录的数据库名
一旦成功登录,系统提示如下:
SQL>
, SQL常用命令:
分类 命令
Select 数据检索
数据维护(DML) insert、update、delete
数据定义(DDL) create、drop、alter、rename、truncate 事务处理控制 commit、rollback、savepoint
数据控制(DCL) Grant、revoke
, 数据、操作系统、Oracle数据库管理器、SQL和PL/SQL及工具之间的关系
, 在Oracle的产品中有如下的关系:以数据为核心,Oracle Server 结合操作系统进行数据传递和通信,外围有SQL*Plus等工具提供给用户,通过SQL、PL/SQL与Oracle Server交互。 (如下图:)
数据操作系统
Oracle 8SQL、PL/SQL
工具
应用产品
, 代码、缩写和命名
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
:由于SQL与自然语的相似性,同时为提高代码的可读性,对于检索语句、表列命名和程序代码应采用标准规则,表名和列名既要反映数据的实际意义,又要考虑简洁性、完整性。Oracle允许使用最多30个字符命名表和列,为建立完整的、含义明确的、描述性的名称提供了足够的空间。对于程序代码,更要讲究规范性,如变量、函数名等等,要含义明确,提高程序的可读性。
UNIT2 数据查询
单元培训目标
, 理解Oracle数据查询的概念和作用; , 掌握数据查询的基本
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
;
, 通过函数、子查询的学习,能写一些较复杂的数据查询。
LESSON 1简单的数据查询
为了检索数据库中的数据,必须使用SQL建立相应的查询语句。本节从最基本的SELECT语句结构出发,讲述如何建立简单的数据查询。 基本结构:
SELECT [distinct] {*, column [alias], ……}
FROM TABLE
SELECT: 选择要查询的数据列
FROM: 数据列所在的表
*: 选择所有的列
COLUMN:选择的列名
ALIAS: 给选定的列一个别名
例:SELECT * FROM s_dept
SELECT last_name, first_name, address FROM s_emp 算术表达式:
除了单一的获取数据库数据,也可以在检索的数据列中,可以做各种的算术表达式,以获取所需数据,常用算术运算符有:
加:+
减:-
乘:*
除:/
例:
SELECT last_name, salary * 12, base_salary + salary
FROM tablename
字符串处理
字符串可以做最简单的“加”法,即合并运算:||
例:
SELECT column1||?.?||column2 ||?$?
FROM tablename
注:column1、column2必须位字符型数据列
SELECT first_name ||? „|| last_name||?,?|| title “Employees” FROM s_emp
空处理
在Oracle数据库中,常会用到一种空处理,对于数据列中的空值,要做特定处理,就会用到下面空处理函数:
NVL: 在数据列的值为空时(并非为零),以真实的值进行替代处理
例:
NVL (start_date, sysdate)
NVL (name, „no name?)
NVL (base_salary, 2000)
注:任何未被声明为NOT NULL或PRIMARY KEY的列都可包含空值,注意,
空值就是空值,并不是值为零或空格,零是一个数值,空格是一个字符,而空值
就是不具有任何类型的值。
例:
select first_name, nvl(base_salary, 2000)
from s_emp;
消除重复行:
对于数据检索中的重复行,可用如下方法去掉:
SELECT DISTINCT column1, column2 …
FROM TABLE
例:SELECT item_id from t_onhand
SELECT DISTINCT item_id FROM t_onhand
选择多列非重复:
例:SELECT DISTINCT warehoused_id, item_id FROM t_onhand
显示表结构:
对于一个并不熟悉的数据表,要检索其数据,必须知道它的结构和例的数据类型,否则,就无法在SELECT语句中(sql plus中),写出其数据列表达式,通过如下方法,可
以显示该数据表的结构:
格式:
DESC[RIBE] tablename
Oracle常用数据类型:
number(p, s): 浮点类型,最大精度p,小数位s位
varchar2(s): 可变长字符类型,最大长度s位
date: 日期型
char(s): 定长字符类型,长度为s
例:
SQL>desc t_item
Name Null Type -------- ------ -------
item_id NOT NULL number
item_name NOT NULL varchar2(20)
base_price number,
description varchar2(100)
class_id number
LESSON 2 单行函数的使用
在Oracle的数据检索中,当简单的运算,例如加、减等不能满足对数据列的处理时,可以通过使用功能更强大的单行函数来达到目标,基本格式如下: Function_name (column|expression, [arg1, arg2, ……])
SQL中共有两种列函数,一是单行函数,另一是多行函数,单行函数主要有四种类型:字符函数、数字函数、日期函数和转换函数。单行函数对数据检索中的每一行作用,每一行返回一个结果。
如下一一介绍各类型函数的使用:
字符函数
如下是用来处理类型为字符类型的数据或数据列:
LOWER(col|expr)、UPPER(col|expr)、INITCAP(col|expr)
CONCAT(col|expr1, col|expr2)、SUBSTR(col|expr, m[, n]) LENGTH(col|expr)
NVL(col|expr1, col|expr2)
其中,LOWER函数是把字符串全部转换为小写;UPPER函数功能与LOWER刚好相反,它是把全部字符串转换为大写;CONCAT是用来连接两个字符串,类似于运算符?||?;SUBSTR是用来截取母字符串中的一个子串,在SQL中较常用到;LENGTH是来册字符串的长度;而NVL具有所有NVL的通用性,即是在列值为空时,用后者取而代之。
例:
SQL>SELECT substr(„STRING?, 2,3) from dual SQL>TRI
数值函数
如下是用来处理类型为数值类型的数据或数据列: ROUND
TRUNC
MOD
注意:round和trunc函数具有不同之处,截取的方法不同,如下有一些示例,说明这两则的不同用法,如下:
例:round(23535.7476, 2) ==> 23535.75
round(23535.7476, 0) ==> 23536
round(23535.7476, -1) ==> 23530
trunc(23535.7476, 2) ==>23535.74
trunc(23535.7476) ==>23535
trunc(23535, -1) ==> 23530
日期函数
如下是用来处理类型为日期类型的数据或数据列的函数: MONTHS_BETWEEN(date1,date2)
ADD_MONTHS(date,n)
NEXT_DAY(date,‘char’)
LAST_DAY(date)
ROUND(date[,‘fmt’])
TRUNC(date[,‘fmt’])
日期函数有其特性:
例:
add_months(to_date(„2001-05-01?,?yyyy-mm-dd?), 2) ==>2001-07-01
add_months(to_date(„2001-05-01?,?yyyy-mm-dd?), -2) ==>2001-03-01
注意:
两个日期不可相加,但可做减法,结果为number型,日期型数据加/减数值型数据结果为日期型,日期型数据间不可做乘除法,其他运算借助于日期函数。
SYSDATE:
SYSDATE是一个返回系统日期和时间的函数,可以把SYSDATE作为任何表中都具有的普通列。
DUAL:
DUAL是用户SYS的一个表,可以被任何用户使用,它只包含一个列DUMMY,且只具有一行值“x”,这是一个非常有用的表,常用来返回一些常量、单值等等。
例如:
SQL>SELECT SYSDATE FROM DUAL
转换函数
很多时候,不仅要在同一类型中进行运算,还要把某一类型数据转换为其他类型,以
例运算或显示,如下是用来进行处理数据或数据列的类型的类型转换函数:
TO_CHAR(number/date, [„fmt?])
TO_NUMBER(char)
TO_DATE(char, [„fmt?])
转换函数即用来变换数据的类型,如把字符串按格式转换成日期型、数值型,八数值型、日期型转换成字符串等等。
在to_date的函数中,注意[„fmt?]的使用,区别?yyyy? 和?RRRR?,?RR?,?yy?等,如下是to_date格式的详细情况:
格式 描述
SCC or CC 世纪,S则在BC日期前加-
YYYY or SYYYY 年,S则在BC日期前加-
YYY or YY or Y 年份的后3或2或1位数字
Y,YYY 年份,中间以“,”号隔开
IYYY, IYY, IY, I ISO标准的年份,分别为四位,三位,两位和一位
SYEAR or YEAR 年的拼写,S则在BC日期前加-
BC or AD 年份的BC或AD的标示
Q 季度
MM 月份,数值
MONTH 月份的全拼写
MON 月份的拼写,前三位
RM 罗马数字月份
WW or W 一年中的星期或月中的星期
DDD or DD or D 年或月或星期中的天
DAY 天的星期,全拼写
DY 天的星期,前三位拼写
J Julia天,从4713BC开始
例:
SELECT TO_CHAR(sysdate,?DAY?) FROM DUAL;
SELECT TO_DATE(„2001-07-14?,?YYYY-MM-DD?) FROM DUAL
单行函数使用的例子:
例:
例1:SELECT last_name||?.?||first_name, employee_id, manager_id
FROM s_emp
WHERE trunc(start_date) = to_date(„2001-05-12?,?yyyy-mm-dd?)
And length(last_name)<10
LESSON 3多表数据查询
在数据的检索中,常常要按一定的联系同时从多个表中获取数据,尤其是数据库设计时遵循范式规则,这是就是一种所谓的多表数据查询,本节从建立表的联系开始,讲述多表数据的查询:
多表数据查询的首要条件是如何把多个数据表按一定的规则连接起来,从而获取多个表的、组织好的信息。连接的方式有多种,可按不同的要求进行选择。
连接
即是最简单的等号连接,以分别两个表中某列建立联系:
SELECT table.column, table.columnFROM table1, table2
WHERE table1.column1=table2.colmn2; 表别名
在多表数据检索中,由于检索的数据列可能存在于多个表中,且具有同一列名,这时必须在列名前加上表名以示区别,而对于较长的表名,写起来太麻烦,故可用表别名来区分各个不同的表,如下:
SELECT T1.column, T2.column…… FROM table1 T1,
table2 T2
WHERE T1.column1=T2.colmn2; 非等号连接
即不使用等号来连接两个或两个以上的表
例如:
使用:>=、<、between
外连接
对于两个表,如记录不能一一连接,而又不想漏掉数据,可使用外连接
SELECT T1.column, T2.column……
FROM table1 T1,
table2 T2
WHERE T1.column1=T2.colmn2(+); 自连接
对于某些情况,必须要有表自身的连接,这时可利用表别名的作用,即把表完全
看作两个不同的表来处理
对于已连接好的多表数据查询,如同一张“大数据表”,进行类似的数据查询。
例:
SELECT T1.fist_name, T2.first_name manager…… FROM t_emp T1,
T_emp T2
WHERE T1.employee_id=T2.employee_id(+);
对多于两个以上的表连接具有相同的处理方法,如下是一多表连接例子:
例:
SELECT t1.item_name, t2.quantity, t3.last_name
FROM t_item t1,
T_sales t2,
T_emp t3
WHERE t1.item_id=t2.item_id
And t2.emp_id=t3.employee_id
And t2.approval_flag=?Y?
LESSON 4组函数
在数据检索中,我们不仅仅要检索出数据信息,同时还需要一些加工,例如一些统计信息等等,而数据库表中的数据总是离散在许许多多的列中,要组织起来就会用到另一类列函数,即是组函数。
从基本的格式讲起,如何组织数据,分组,以及使用HAVING语句筛选出所需组信息。
基本格式
SELECT column, group_function
FROM table
[WHERE condition]
[GROUP BY group_by_expr]
[HAVING group_condition]
[ORDER BY column„„]
* GROUP BY: 对列进行分组
* HAVING: 条件限制组查询
常用组函数
AVG、COUNT、MAX、MIN
STDDEV、SUM、VARIANCE
组值函数如sum、avg、stddev等等,反映的是一组值的某种整体状况、一些统
计信息。同时,要注意的是,组值函数忽略NULL值,在做计算时将其排除在
外,如avg函数,如数据中含有较多的空值时,avg返回的统计信息偏差较大,
而count函数出外,它是一种特殊情况,它可以处理NULL值,并总是返回一个
数值,所求出的值决不会是NULL。
例:
SELECT T1.name, T2.item_name, sum(T3.quantity), min(T3.rec_date)
FROM t_inventory T1,
T_item T2,
T_onhand T3
Where T1.warehouse_id=T3.warehouse_id
And T3.item_id=T3.item_id
GROUP BY T1.name, T2.item_name
HAVING sum(T3.quantity)>100
所有的组值函数都有一个distinct或all选项,缺省的选项为all,count函数就是
一个说明起作用的例子:
注意如下查询的结果:
SELECT count(distinct item_id), count(item_id), count(*)
FROM t_onhand
HAVIGN与WHERE:
WHERE语句作用在数据检索的每一列上,对每一列进行判定,HAVING语句则
是作用在每一组上,对每一组进行判定,WHERE语句在HAVING起作用前作
用。
考虑以下SQL语句的查询:
SELECT t1.last_name, sum(t2.quantity*t2.price)
FROM s_emp t1,
S_sales t2
WHERE t1.emp_id=t2.emp_id
And nvl(t2.cancel_flag,?N?)<>?Y?
And nvl(t2.approval_flag,?N?)=?Y?
Having sum(t2.quantity*t2.price)>10000; LESSON 5 子查询
子查询是一段嵌入在另一段SQL语句中SELECT语句,通过子查询,可以建立功能强
大的查询语句,尤其在检索某以数据表时,又依奈这张表本身的一些情况。
格式
SELECT select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM table)
注:
I. Expr 与子查询的select_list有相应的结构和数据类型
II. 子查询无order by 语句
III. 子查询必须在operator的右面 下名通过一些例子来说明子查询的应用。 例:
SELECT t1.item_id, t1.quantity, t1.rec_date FROM t_onhand t1
WHERE rec_date = ( SELECT min(x.rec_date) FROM t_onhand x
WHERE x.item_id = t1.item_id) 当然,很多时候子查询也可由组函数实现,比较一下下面查询的结果与前者的情况:
SELECT T1.item_id, T1.quantity, T1.rec_date FROM t_onhand T1,
(SELECT item_id, min(rec_date) rec_date FROM t_onhand) T2
WHERE T1.item_id = T2.item_id
And T1.rec_date = T2.rec_date 可用于operator的运算符很多,分为单行子查询和多行子查询,单行子查询即是在自
查询的结果中,至多返回一行值,可用于单行子查询的逻辑运算符有:
=、>、<、>= 或者<=
多行子查询相对于单行子查询,即在子查询中可返回多行数据结果,可用于多行子查
询的逻辑运算有:
in、not in
还有一种存在性相关子查询,即exists语句,它与in子查询相似,但有两点不同:
i. 不能匹排一列或多列
ii. 只能用于相关子查询 例:
SELECT T1.item_name, T1.description FROM t_item T1
Where exists ( SELECT * from t_sales
WHERE item_id = T1.item_id)
UNIT3数据库
单元培训目标
, 理解Oracle数据库的概念和作用;
, 能创建常用的数据库对象(如表、索引、视图和序列); , 学会使用数据库字典,记住一些常用视图
LESSON 1系统开发周期和数据关联
大型数据库应用系统的开发都是以一定的标准流程开发的,而重要的一条就以系统开发周期为参照,定制开发流程和开发
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
,逐步实施。 深刻理解数据关联的概念时非常重要的,这对数据库应用系统的设计,具体到数据库对象的设计都是深刻影响的,一个性能优越的数据库应用系统很大程度上依耐于数据库结构的设计,而理解数据关联的实质有利于数据库的设计。 系统开发周期
通过使用系统开发周期策略,实现数据库从概念到产品的转变,系统开发周期包
含多个开发过程和步骤。这种由上到下、系统的方法可把实际的业务需求变成可
操作的数据库概念。
有如下步骤(流程):
I. 分析,策略: 根据企业的实际业务和将要扩展的业务需求,分析所要提
供的信息和企业及系统特性,建立相应系统模型;
II. 设计:数据库设计,把实体模型映射成数据库表之间的关联,外键关联和
约束;
III. 开发和创建文档:开发业务流程,建立用户界面,操作流程,并创建相应
文档(如帮助文档、操作手册等)
IV. 产品化:集成各模块功能,统一成一个完整产品,并做好各项测试准备;
V. 测试:功能测试、业务流程测试、出错流程测试最后的安装测试等。
在这几步步骤中,第二步尤为重要,直接影响开发的成败和效率,在第二步中,
应用开发者重点要要考虑以下一些因数:
效率:最初的设计是最终设计的一个雏形,要充分考虑业务的效率;
系统集成:系统的多个模块间不是孤立的,应有紧密的结合,这种结合并非看起
来或感觉上的,是从逻辑上和业务流程上的角度来分析的;
与其他系统的集成:企业与运作时,往往有多个系统的存在,但同时各个系统间
是有结合的、联系的,如数据上、业务上的,同时还要考虑未来业务需求的标准
接口等等;
数据关联
系统开发周期第二步的重点工作就是建立逻辑模型,逻辑模型是业务数据的非常规范化的流程图。懂得数据分解的原因和方法是理解模型的基础,而模型又是建立长期支持业务应用程序的基础。
规范化的过程通常用“范式“一词来讨论,最常见就是第一、二、三范式,其中第三范式是最高的规范化层次。
I. 第一范式(1NF):具体做法就是将每一个表中具有相似类型的数据存入不
同的表中,并给每个表确定一个主关键字(即是:Primary Key)----- 唯
一的标号或标示符,消除重复数据; II. 第二范式(2NF):即是表中数据列只依赖主关键字; III. 第三范式(3NF):即是找出不只是依赖于主关键字的所有数据列。
约束
为实现数据结构的规范化标准,即是各级范式,可以在定义表结构时,定一各个列和表的约束,从而严格表中的数据,格式如下: 数据列级约束:
Column [ CONSTRAINT constraint_name ] constraint_type
Column [ CONSTRAINT constraint_name ] constraint_type
数据表级约束:
约束主要要以下几种:
I. Primary Key(PK):由一列或多列构成的唯一标示各行的列;
II. Foreign Key(FK):即由表中一列或列组合来映射同一表或别的表的PK或
UK(unique key);
III. NOT NULL
IV. UNIQUE
V. CHECK
对于建立约束的例子,可在建立数据表中参考。
LESSON ,创建表、序列、视图和索引
下面从最基本的数据库对象建立讲起,逐步理解系统开发周期的意义,以及数据关联的意义。
创建表格式
Schema 所有者标识
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr] [ column_constraint ],
„„
[table_constraint ]);
Table 列表名
Column 列名
Datatype 列的数据类型
Column_constraint 列约束
Table_constraint 表约束
例:
CREATE TABLE s_dept
(id NUMBER(7)
CONSTRAINT s_dept_id_pk PRIMARY KEY, Name VARCHAR2(25)
CONSTRAINT s_dept_name_nn NOT NULL, Region_id NUMBER(7)
CONSTRAINT s_dept_region_id_fk REFERENCES S_region (id),
CONSTRAINT s_dept_name_region_id_uk UNIQUE (name, region_id));
很多时候,数据库表的设计都可以通过表的示例图来设计,通过先创建数据表的示例图,再来创写数据表的角本,这是一种非常有效的方式,如下: 例:通过如下数据表的示例图,创建数据表t_emp: Column ID Last_NamUserid Start_date CommissiDept_ID Name e on_pct Key Type PK FK Nulls/UnNN,U NN NN,U ique
FK Table FK ID Column
Datetype Num Char Char Date Num Num Length 7 25 8 6 7
创建序列格式
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUEn|NOMAXVALUE}] [{MINVALUEn|NOMINVALUE}] [{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}] 说明:
标示 说明
Sequence 建立的序列名
INCREMENT BY 序列数字间的间隔,缺省为1 START WITH n 第一个序列值,缺生为1 MAXVALUE n 序列的最大值
NOMAXVALUE 确定序列的最大值,为10的27次方 MINVALUE n 序列的最小值
NOMINVALUE 确定序列的最小值,为1 CYCLE|NOCYCLE 确定序列值达到最大值时,是否重复开始,缺省为
NOCYCEL
CACHE n|NO CACHE 确定数据库管理器于值和存储的值的个数,缺省为
NOCACHE
序列常用来给一个表的,,列赋值 序列有NEXTVAL和CURRVAL方法。 例:
CREATE SEQUENCE t_item_s
Increment by 1
Start wih 1
Maxvalue 999999
Nocache
Nocycle;
是运行如下命令,看看结果:
select t_item_s.nextval from dual;
select t_item_s.currval from dual;
创建视图
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[,alias]„)]
AS subsequery
[WITH CHECK OPTION [constraint]]
[WITH READ ONLY]
注:
I. Subquery可以是非常复杂的select语句 II. Subquery不能包含ORDER BY语句
实际上,视图是一个基于数据表或其他视图的逻辑数据表,一个视图本身并不包含数据,仅仅是一个可以用来查看数据或更新的窗口,一个视图在数据字典中是以一个select语句存储的。
使用视图有着许多优点:
i. 限制数据表的访问:由于它是一条select语句,通过选择的取舍,使用
户只能看到或只需看到所要检索的数据列;
ii. 允许用户通过一个视图检索多个表的信息,而不要去写复杂的SQL语
句;
创建索引
I. 自动创建
在创建表时,若包含Primary Key或者其他唯一约束时,一个唯一索引就自动创建立了。
II. 手动创建
用户可以创建非唯一的索引来提高检索速度。 CREATE INDEX index
ON table (column[, column]„);
III. 何时建立索引:
列经常在where或连接中使用;
列包含了一个大范围的值;
列包含了大量的空值;
两个或多个列常常在where或连接中一起被使用;
表的数据量大,而常常检索其中的2-4%;
太多的索引并不总是能提高检索速度。
表空间的概念:
Oralce把文件作为其组织系统的一部分,但是它的逻辑结构已超出文件的概念。
一个表空间就是一片磁盘区域,它有一个或多个磁盘文件组成。一个表空间可以
容纳许多表、索引或是试图等等。由于表空间的大小是固定的,所以在向表中间
增加行时,可能装满整个表空间。可以由拥有DBA权限的用户或是自动扩展这个
表空间,其过程是先创建一个磁盘文件,然后将此文件增加到表空间中,或是直
接扩大已存在的数据文件,因此,这些表中的行就会分布于两个文件中。一个或
多个表空间一起就构成了数据库。
每一个数据库均包含一个系统表空间,这里保存业者的记录和地址,它包含数据
字典、数据库的表空间、表、索引的名称和地址。
下面是一个创建表空间的示例:
create table space usertemp datafile „HOME.ONE? size 1000k
default storage (initial 25k next 10k)
minextents 1 maxextent 100
pctincrease 0)
permanent;
LESSON 3Oracle数据字典
Oracle数据字典是Oracle数据库管理系统的重要组件之一,它包含一系列数据表和数据视图,提供只读属性的数据库信息。
Oracle数据字典实在数据库建立的时候建立的,又Oracle数据库管理器进行更新和维护,提供Oracle数据库用户、各个用户的权限、数据库对象、数据表约束等等信息。
Oracle数据字典的四大类视图:
- user 用户拥有的对象
- all 用户可访问对象
- DBA 所有数据对象
- v$ 服务器性能对象
其他视图:
- DICTIONARY 显示所有数据字典的数据表、视图和同义词
- TABLE_PRIVILEGES 显示数据对象的所有者、授权者和权限
- IND User_indexes的同义词
常用视图
DICTIONARY、TABLE_PRIVILEGES、IND
ALL_TABLES、USER_OBJECTS
数据字典使用示例:
例一:SELECT distinct object_name,
object_type
FROM usr_objects
例二:SELECT *
FROM user_constraints
WHERE table_name =?T_ITEM?
LESSON 4用户访问控制:
在一个多用户数据库环境,必须维护数据访问和使用的权限,Oracle数据库管理器提供以下安全机制控制:
I. 控制数据库的访问;
II. 提供数据库对象的局部访问;
III. 通过数据字典验证赋予和接收特权;
IV. 为数据库对象创建同义词。
数据库安全分为两类,一是系统安全,二是数据安全。系统安全控制数据库
的访问和使用这一层次,例如用户和密码,用户能使用的数据空间,用户允
许使用的操作系统等等;数据库安全控制数据库对象的访问和使用,以及能
在这些数据库对象上能进行的操作。
权限的概念即是执行特定SQL语句的权利。数据库的系统管理员具有最高的
权限,普通用户必须有系统管理员赋予权限来访问数据库和数据库对象,当
然,用户也可具有赋予其他用户或角色的权利。 系统权限:
DBA具有最高级系统权限,典型的系统权限有:
系统权限 操作授权
CREATE USER 赋予创建其他Oracle用户权限
DROP USER 删除任何用户
DROP ANY TABLE 删除任何束中的表
BACKUP ANY TABLE 备份任何束中的表
创建用户格式:
CREATE USER user IDENTIFIED BY passwordGRANT privilege [, privilege ……] TO user [, user ……]
系统权限授权格式:
角色:即是一组相似的权限,可以用来同一授权给一些用户。这样把相似的权限统一起来,易于给用户授权和维护系统权限,同时,一个用户也可以被授予多个角色权限。
用例如下:
CREATE ROLE role;
GRANT create table, create view TO manager; GRANT manager TO userA, userB;
对象权限:
GRANT { object_priv (, object_priv …) | ALL } [ ( columns ) ] ON object
TO { user [, user … ] | role [PUBLIC] [WITH GRANT OPTION]
注意以下几点:
1. DBA可授权给用户,对特定的对象执行某项操作; 2. 对象权限因对相的不同类型而有区别; 3. 对象的所有者拥有对象的所有权限; 4. 对象的所有者可以对对象授予特定的权限。 格式如下:
例:
GRANT update ( last_name, first_name, address ) ON t_emp
TO manager
在Oracle系统中,可通过如下数据字典查看用户权限情况:
数据字典表 说明
ROLE_SYS_PRIVS 授予角色的系统权限
ROLE_TAB_PRIVS 授予据色的表权限
USER_ROLE_PRIVS 用户可使用的角色
USER_TAB_PRIVS_MADE 用户对象所授予的对象权限 USER_TAB_PRIVS_RECD 用户所授予的对象权限 USER_COL_PRIVS_MADE 用户对象列所授予的对象权限 USER_COL_PRIVS_RECD 用户在特定的列上所授予的权限
权限的回收:
通过使用revoke命令可以收回授予其他用户的权限,同时授予用户的with
grant option也会收回。
格式如下:
REVOKE {privilege [, privilege …] | ALL }ON object
FORM { user [,user …] | role | PUBLIC } [CASCADE CONSTRAINTS]
例:
REVOKE select, insert
ON S_EMP
FORM manager;
创建同义词:
为了引用其他用户的某个表,必须使用这个表的全称,即是用户名加表名,通过使用同义词就可避免这个麻烦,可以引用其他用户的表、视图、序列、过程或是其他别的对象。
格式如下:
CREATE [PUBLIC] SYNONYM synonym FOR object;
说明:
PUBLIC 所有用户都可访问的同义词 Synonym 创建的同义词名 Object 同义词的引用源 例:
CREATE SYNONYM T_EMP
FOR scott.t_tmp;
远程数据库的访问:
通过使用数据库链接,用户可以将一组分布的数据库作为一个单一的、集成的数据库来处理。
数据库链接需要SQL*NET运行在远程数据库访问中所涉及到的每一台主机上(“HOSTS”),通常SQL*NET由数据库管理员(DBA)或系统管理员启动。
创建数据库链接语法:
Create [public] database link remote_connectConnect to username identified by password Using „connect string?
当建立数据库链接是具体使用的语法取决于下面两个条件:
1. 数据库链接的“公共”或“私有”状态。 2. 使用缺省还是显示方式登录远程数据库。 为了建立数据库链接,必须拥有CREATE DATABASE LINK系统权限,用来连接远程数据库的账号必须拥有CREATE SESSION特权。这两种系统特权都包含在Oracle中的CONNECT角色中。 通过使用数据库链接和同义词来隐藏数据库的物理存放位置,如下:
create synonym emp for emp@remote_connect;
UNIT4 PL/SQL
单元培训目标
, 掌握PL/SQL常用语法;
, 使用Oracle Procedure Builder;
, 能创建包、函数和过程解决一些复杂问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
; , 掌握出错流程处理
LESSON 1简单PL/SQL
PL/SQL是Oracle扩展的、具有程序设计特色的程序语言,它可以把数据维护和数据检索容入在程序过程当中。
PL/SQL结构
DECLARE -可选项
- 变量,常数,游标,用户定义的例外 BEGIN - Mandatory
- SQL 语句
- PL/SQL 控制语句
EXCEPTION – 可选项
- 例外处理
END;
Declarative,optional,:包括所有变量、常量、游标和用户定的例外等
Executable [Mandatory]:包括各种SQL代码和PL/SQL代码等 Exception Handling [optional]:对各种例外情况的处理 通常,每一个PL/SQL单元包含一个或多个块结构,这些块之间可以是完全独立的,也可以是一个块在另一个块里面。即是,一个块又能被分为若干个更小的块。
下面是一些典型的PL/SQL程序结构:
程序结构 说明 使用位置 匿名块 没有特定名称的PL/SQL所有PL/SQL环境
块,存在于APPLICATION
中
Oracle database Server 数据库procedure、命名PL/SQL块,能接受参
function 数和重复调用
Application Procedure、命名PL/SQL块,能接受参Developer 2000的组件,function 数和重复调用 例如FORMS Package Oracle database Server 命名PL/SQL模块,包含相
关的Procedure、function
和变量
Database trigger Oracle database Server 与数据库表联系在一起的
PL/SQL块,能自动触发 Application trigger 与Application事件联系在Developer 2000的组件,
一起的PL/SQL块,能自动例如FORMS
触发
匿名块,过程和函数
,(匿名块
[DECLARE]
BEGIN
-- 语句
[EXCEPTION]
END;
II(过程
PROCEDURE name
is
BEGIN
-- 语句
[EXCEPTION]
END;
III(函数
FUNCTION name
RETURN datatype
IS
BEGIN
-- 语句
RETURN VALUE
[EXCEPTION]
END;
过程与函数的对比:
过程 函数 作为一段PL/SQL代码执行 作为一个表达式调用 没有返回数据类型 必须包含返回数据类型 可以返回一个或多个值 必须且只能返回一个值 包
包是被集中到单独一个单元的一组过程、函数、变量和SQL语句。为了执行一个保中
的过程,必须首先列出名称,接着是过程名称,如下: execute Test_sales_information_pkg.init_item_price(p_warehouse_id,1 );
包允许多个过程使用相同的变量和数据指针。包中的过程和函数,可为公共访问或为专用。
在创建包时,包的定义和包内容被分别地生成。从而,有两个命令create package和包内容的create package body命令。必须具备create procedure系统权限。
1. 建立包定义的语法:
create [or replace] package [user.]package{is |as}
PL/SQL package specification;
包的内容由所有列在包定义中的公用对象的PL/SQL代码块及其定义组成。包的内容也可包括未列在包定义中的对象。
2. 包的初始化:
一个包中可以包括代码,在每次用户执行此包时最先被运行。 Create or replace package body test_sales_information_pkg As
User_name varchar2(20);
Entry_date date;
…
…
begin
select user, sysdate
into user_name, entry_date
from dual;
end test_sales_information_pkg;
3. 包的编译和代码察看:
当对象在创建时,Oracle就编译它们,然而,当它们所引用的的数据库对象发生变化时,就有可能变为变为非法的操作。在这些对象下次执行时,它们被数据库重新编译。也可显示的重新编译这类对象,以提高数据库处理的性能,语法如下:
alter package [user.]package_name
compile [package| body];
可以通过查询下面的数据字典视图获得当前过程、函数、包和包的内容的源代码:
USER_SOURCE 对于用户所有的过程对象 ALL_SOURCE 对于用户所有的或者被授权访问的规程对象
DBA_SOURCE 对于数据库中所有的过程对象
检索的列为TEXT并按照LINE(行号)顺序。
程序中的参数和变量类型
参数:
参数有如下三种类型:
IN Argument
OUT Argument
IN OUT Argument
在参数格式中,IN 可以省略,它也是缺省的形式;IN 代表该参数用于向程序中传递值,OUT代表由程序单元返回给调用它的函数值,而对于 IN OUT 型参数,代表既可向子程序传递值,同时子程序也可返回值给主程序。
变量类型
通用数据类型:
数据类型 说明
BINARY_INTEGER 基本数值整型,-2147483647 -----
2147483647
NUMBER[(precision,scale)] 基本浮点数值型
CHAR[(maximun_length)] 固定长度的字符型,最大值为32760 LONG 可变常字符型,最大长度为32760 LONG RAW 二进制型,最大长度为32760 VARCHAR2(maximum_length) 可变长字符型,最大长度为32767 DATE 日期和时间类型
BOOLEAN 逻辑型(TRUE、FALSE或NULL)
程序单元(过程、匿名块和函数)中变量的声明: Identifier [CONSTANT] datatype [NOT NULL]
[:= | DEFAULT expr];
注意:具有初始值的常量和变量被认为是NOT NULL的,一行最多只有一个常量或是变量的声明
%TYPE类型:
这是一种动态数据类型,在PL/SQL中动态决定器数据类型。它有两大优点:
1( 决定其数据类型的数据库表列的类型未知;
2( 决定其数据类型的数据库表列的类型在运行时是可变的。
为了在PL/SQL中保存某个列的数值,必须确保变量与列具有相同的数
据类型和精度,否则,常会造成PL/SQL错误或是精度的丢失。
而%TYPE类型是由某一个预定的变量或时数据库表中列决定的,这样
就可以确保数据类型的一致。
例:
…
l_last_name t_emp.last_name%TYPE l_salary t_emp.base_salary%TYPE …
复合数据类型:
1( PL/SQL TABLES :
它有两部分组成:I) BINARY_INTEGER型的Primary Key;
II) 数据的列范围。
注意:
i. PL/SQL TABLES数据类型并不等同于数据库中的表;
i. PL/SQL TABLES数据类型类似一个一维数组;
ii. PL/SQL TABLES类型包含两个组件;
iii. PL/SQL TABLES类型可动态增长。
声明如下:
TYPE type_name IS TABLE OF scalar_datatype
[NOT NULL] INDEX BY BINARY_INTEGER; identifier type_name;
例:
…
TYPE name_table_type IS TABLE OF VARCHAR2(25) INDEX BY BINARY_INTEGER; First_name_table name_table_type; …
first_name_table(1):=?FRANCK?;
2( PL/SQL RECORDS:
它包含一个或是一个以上的任何范围、记录、PL/SQL TABLES类型的
组件。
注意:
i. PL/SQL RECORD数据类型并不等同于数据库中的表中的一条
记录;
iv. PL/SQL RECORD数据类型类似一个多维数组;
v. PL/SQL RECORD类型包含多个组件;
vi. PL/SQL RECORD类型可动态增长;
vii. PL/SQL RECORD类型方便地从一个表中获取一行数据,以便
于PL/SQL的处理。
声明如下:
TYPE type_name IS RECORD
(field_name1 field_type
[NOT NULL { :=|DEFAULT} expr],
(field_name2 field_type
[NOT NULL { :=|DEFAULT} expr], …);
identifier type_name;
例:
…
TYPE emp_record_type IS RECORD
(last_name varchar(25),
base_salary number,
manager_id number);
employee_record emp_record_type;
…
employee_record.last_name:=?FRANCK?;
LESSON ,数据获取和游标
在本节中,主要讲述如何在PL/SQL中访问数据库、获取数据库数据,同时,介绍游标的使用。
数据获取
SELECT select_list
INTO variable_name | record_name FROM table
WHERE condition;
I. INTO 语句是必须的
II. Select 只有一行数据返回
III. Select_list 不能为简写( eg. *)
Select_list 检索的数据列,可以包括SQL表达式、单行函数或是组函
数;
Variable_name 是一系列变量,用来存储检索的数据值;
Record_name PL/SQL RECORD变量,用来存储检索的数据值;
Table 数据库表;
Condition 一系列约束条件,实现数据的检索。 一个PL/SQL块并非是一个事务处理单元。Commit、savepoints、和rollback是独立的块,但是可以把这些命令写入在一个PL/SQL块中。PL/SQL块不支持数据定义语言(DDL),例如CREATE TABLE,ALTER TABLE,或是DROP TABLE。PL/SQL也不支持数据控制语言(DCL),例如GRANT或是REVOKE。但是,可以通过在PL/SQL块中,使用DBMS_SQL包来实现DDL和DCL功能。
使用范例:
FUNCTION sum_emp(v_dep_id IN NUMBER)
RETURN NUMBER
IS
L_sum_salary number;
BEGIN
SELECT sum(salary)
INTO l_sum_salry
FROM t_emp
WHERE dept_id = v_dept_id;
RETURN (L_sum_salary);
END;
若有零行或是多于一行数据返回 ,则会触发SELECT的例外:
TOO_MANY_ROWS(多于一行数据返回) NO_DATA_FOUND(未检索到一条数据) 在PL/SQL块中,还可以使用其它DML命令: INSERT 插入一行数据到数据库的某个表中去; UPDATE 更新数据库表中的某一行数据; DELETE 从数据库表中删除一行不要数据。
游标
在中使用SQL时,数据库服务器总是在内存区开闭一块空间来存储这段SQL的解析
和执行结果,这个区域就称为游标。游标有显式游标和隐式游标两种,当在程序块中
使用SQL检索时,PL/SQL就自动创建了一个隐式游标,PL/SQL自动管理这个游
标;显式游标是由编程者自行定义和命名。游标建立后,在PL/SQL中有四种属性可
使用:
SQL%ROWCOUNT 返回最近的SQL语句检索行数,整型 SQL%FOUND 判断最近的SQL语句执行的结果,若返回一行或多行,则
为TRUE,Boolean型 SQL%NOTFOUND 判断最近的SQL语句执行的结果,若未返回一行,则为
TRUE,Boolean型
SQL%ISOPEN 对于隐式游标,值总是FALSE,因为隐式游标在执行后立
即自动关闭
显式游标声明:
CURSOR cursor_name IS
Select statement……;
同时,显式游标也可以是带参数的,如下: CURSOR cursor_name(parameter and parameter list) IS Select statement……;
隐式游标例子:
RPOCEDURE del_rows(v_warehouse_id number) IS
V_rows_del number; BEGIN
DELETE FROM t_onhand
WHERE warehouse_id = v_warehouse_id; V_rows_del:=SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_rows_del)||?
rows deleted.?);
END;
LESSON ,PL/SQL控制流
在本节中,主要讲述在PL/SQL块中的流程控制。PL/SQL中有两种流程控制结构,一是IF语句的条件控制结构,二是LOOP语句循环控制结构。 IF 语句
IF condition THEN
语句;
[ELSEIF condition THEN
语句;]
[ELSE
语句;]
END IF;
类似于其他结构化程序语言,它是一种条件控制流。 注意:
1. ELSIF是作为一个单词;
2. END IF是两个单词;
3. 允许多个ELSIF语句; 4. 至多只有一个ELSE语句。 使用范例:
…
if v_salary<2000 then
return v_salary*0.05; elsif v_salary<3000 then
return v_salary*0.1; elsif v_salary<5000 then
return v_salary*0.15; else
return v_salary*0.2 end if;
…
LOOP 语句
LOOP是一种循环控制结构,以上是它的三种基本结构,对于多重循环,可以加上标
签,进行流程控制,如: (1)
LOOP
语句;
EXIT [ WHEN condition]; End loop
(2)
FOR index in [REVERSE]
lower_bound..upper_bound LOOP
语句
END LOOP
(3)
WHILE condition LOOP
语句;
END LOOP;
FOR循环是一种非常简洁的循环控制流程,如下示例:
…
BEGIN
Dbms_output.put_line(„Name Sales Amount?); FOR cur in ( select t1.first_name, sum(t2.quantity*t2.price)
amt
From s_emp t1, s_sales t2
Where t1.employee_id = t2.emp_id And nvl(t2.approval_flag,?N?)=?Y? And nvl(t2.cancel,?N?)<>?Y? Group by t1.first_name) LOOP Dbms_output.put_line(cur.first_name||?
„||to_char(cur.amt));
End loop;
END;
注意:变量cur是不能显示声明的,它是一个隐式声明的游标。
LESSON ,出错处理
在程序的执行中,总是难免会出现一些例外情况,或是要对某些情况做特定的处理,这时候,Oracle的例外处理提供了一个很好的解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
。 Exception 类型
根据定义的级别不同,例外有如下三种,
I. 数据库预定义
II. 数据库非预定义
III. 用户定义
Exception 处理
例外处理,即对某些特定情况做一些特定处理,这些代码完善了流程的完整性,使得程序具有更多的容错性。
类似于IF条件语句,分别对各种例外做特定处理,提供[WHEN OTHERS THEN]语
句,对其他例外做出通用的处理。
EXCEPTION
WHEN exception1 THEN
语句;
WHEN exception2 THEN
语句;
[WHEN OTHERS THEN
语句;]
注意:
1. WNEN OTHERS是最后的例外处理;
2. 由关键字EXCEPTION开始,在此语句后为例外处理(同一PL/SQL块
中);
3. 允许多个exception例外处理;
4. 在跳离此PL/SQL块至多只有一个例外被处理。
数据库预定的一些例外:
NO_DATA_FOUND
TOO_MANY_ROWS
INVALID_CURSOR
ZERO_DIVIDE
DUP_VAL_ON_INDEX
使用范例:
function item_onhand(p_item_id number) return number is
l_qty number;
begin
select quantity
into l_qty
from t_onhand
where item_id=p_item_id;
return l_qty;
exception
when NO_DATA_FOUND THEN
return 0;
text_io.put_line(to_char(p_item_id)||?is null?); when TOO_MANY_ROWs THEN
return to_number(null,?99?);
text_io.put_line(to_char(p_item_id)||? have more than one
rec!?);
when OTHERS then
return to_number(null,?99?);
text_io.put_line(„Other error occurred!?); end;
非预定义的Oracle 数据库例外
为了区别对待WHEN OTHERS例外,可以通过声明一些例外来处理Oracle数据库服务的一些错误,它是又PL/SQL自动触发,无需显示触发。
首先,必须在声明部分声明例外处理: exception EXCEPTION; 其次,通过使用PRAGMA EXCEPTION_INI使得所声明的例外同Oracle数据库服务中的错误代码联系起来:
PRAGMA EXCEPTION_INI (exception,error_number);
其中:exception 即是前面预定义的例外
error_number Oracle数据库标准的错误代码
最后,在相应的错误例外处理中引用前面声明的例外。
示例:
[Declare]
e_item_remaining EXCEPTION;
PRAGMA_EXCEPTION_INI( e_item_remaining, -2292) …
BEGIN
…
EXCEPTION
WHEN e_item_ramaining THEN
TEXT_IO.PUT_LINE(„Referential integrity
constraint violated.?);
…
END;
用户自定义的例外:
用户也可以自己定义一些例外处理,以便方便地处理流程,类似于非预定义的Oracle 数据库例外,它必须显示声明,并且它还必须显示的触发。类似于在处理流程时,根据发生的情况,转而调用另一个过程进行处理余下的流程。
手动触发格式如下:
RAISE exception;
使用示例:(比较于非预定义的Oracle 数据库例外的异同) [Declare]
e_item_remaining EXCEPTION; …
BEGIN
…
RAISE e_item_remaining;
…
EXCEPTION
WHEN e_item_ramaining THEN
TEXT_IO.PUT_LINE(„Referential integrity
constraint violated.?);
…
END;
附录A:
数据结构:
数据结构
t_itemt_emp
t_classt_onhandt_dept
t_inventoryt_sales
描述:
t_item:
item_id number PK, item_name varchar2(20) NOT NULL, base_price number,
description varchar2(100),
class_id number FK
t_inventory:
warehouse_id number PK, name varchar2(30) NOT NULL, description varchar2(100)
t_onhand:
warehouse_id number FK, item_id number FK, quantity number NOT NULL, rec_date date NOT NULL
t_sales:
transaction_id number PK, item_id number FK, creation_date date NOT NULL, quantity number NOT NULL, price number,
emp_id varchar2(20) FK, approval_flag varchar2(1),
shipped_flag varchar2(1),
cancel_flag varchar2(1)
t_emp:
employee_id number PK,
last_name varchar2(10) NOT NULL, first_name varchar2(10) NOT NULL, address varchar2(100),
start_date date NOT NULL, department_id number,
manager_id number,
salary number
t_dept:
department_id number PK, name varchar2(20) NOT NULL,
description varchar2(100)
t_class:
class_id number PK, name varchar2(20) NOT NULL, description varchar2(100)