1:视图(view)
视图的作用:
A:控制数据访问
B:简化查询
C:数据独立性
D:可以控制视图中的数据的操作权限。
2:如何创建视图:
grant create view to 用户。
3:创建单张表的视图:
create or replace view v_mc as
Select nid,sname,sdescription,nprice
from t_mc
4:创建多张表的视图:
create or replace view v_mc2 as
Select a.nid,a.sname,a.nprice,a.nmaxid,
a.nminid,b.sname as 大类别,c.sname as 小类别
from t_mc a,t_mc_type b,t_mc_type c
where a.nmaxid = b.nid
and a.nminid = c.nid
5:视图的insert/update/delete操作:
A:只有符合一定条件的视图才能做增删改的操作。
不能有如下条件(组函数、GROUP BY子句、DISTINCT 关键字、ROWNUM 伪列、列的定义为表达式)
B:只读的视图:with read only;
6:删除视图。
7:自定义类型:
Record:
cursor cs_table1 is Select * from v_table1;
type Table1_Record is Record(
year varchar2(10),
month1 number,
month2 number,
month3 number,
month4 number,
month5 number
);
--var_table1_record Table1_Record;
var_table1_record cs_table1%rowtype;
使用rowType与Record接收游标中行数据类型的区别:
如果使用显示游标的话,由于SQL语句在编译期间已经确定,所以
可以直接使用rowType类型来替代Record类型。
但如果是使用动态游标的话,由于SQL在运行期间才能确定。因此不能
使用rowType类型。只能使用Record类型。
集合:
联合表 HashTable
嵌套表 Set
数组 数组
1:联合表的下标没有-24999到24999。下标可以随意访问。
嵌套表和数组的下标是从1开始。
2:联合表在定义的时候,PL/SQL会自动初始化。
嵌套表和数组,定义的时候不会自动初始化。往数组中添加元素之间,
必须使用构造方法做一初始化的操作。
参考
集合内建函数:
COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE(x) 删除元素下标为x的元素,如果x为null,则集合保持不变 对VARRAY非法
DELETE(x,y) 删除元素下标从X到Y的元素,如果X>Y集合保持不变 对VARRAY非法
EXIST(x) 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素 对Index_by非法
EXTEND(x) 在集合末尾添加x个元素 对Index_by非法
EXTEND(x,n) 在集合末尾添加元素n的x个副本 对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT。
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和Index_by集合无用。
NEXT(x) 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null。
PRIOR(x) 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRIM 从集合末端开始删除一个元素 对index_by不合法
TRIM(x) 从集合末端开始删除x个元素 对index_by不合法
8:触发器
创建触发器语法:
CREATE [OR REPLACE] TRIGGER trigger_name
[AFTER | BEFORE | INSTEAD OF]
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old_value / NEW [AS] new_value}]
[FOR EACH ROW[WHEN (condition)]]
[declare 定义变量]
begin
trigger_body;
end trigger_name;
说明:[REFERENCING {OLD [AS] old_value / NEW [AS] new_value}]
指可以通过referencing 把行级触发器中默认相关性标识符:OLD,:NEW 重命名为新的名字,一般没必要更改名字
[INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE]
[INSERT] [[OR] UPDATE [OF column_list]]--指定更新的列名才触发
触发器的类型:
(一)DML触发器--对表或者视图执行DML 语句时触发
1、语句级触发器
对每个DML语句执行只执行一次,不管受影响的行数是多少,都只执行一次
2、行级触发器
对DML语句影响的每一行都执行一次
3、INSTEAD OF 触发器或者替代触发器
此触发器是定义在视图上的,而不是定义在表上的。它是用来替换所使用实际语句 的触发器
(二)数据库级触发器或者系统事件触发器
Oracle数据库系统的事件中进行触发的触发器,如oracle系统的启动与关闭
(三)模式(DDL)触发器或者用户事件触发器
是指与数据库定义语句DDL或者用户的登录、注销等事件相关的触发器,如用户连 接到数据库,修改表结构等。
其中:DATABASE表示创建数据库级触发器,数据库级要给出数据库事件;SCHEMA表示创建模式级触发器,模式级要给出模式事件或DDL事件。
SCHEMA 表示用户方案
----------------DML触发器详细说明--------------------
/*
new与old对象说明
insert:只有new对象
delete:只有old对象
update:new和old对象都有
DML
行级触发器:拥有old和new对象
语句级触发器:没有new和old对象,因为语句级操作针对一次操作,无法获得任意记录。
---------------------------------------------------------------------------
行级触发器要点:1.new和old对象,2.谓语动词“inserting,deleting,updating”的使用
语句级触发器要点:1.没有new和old对象。2.没有for each row
instead of 触发器要点:1.不管有没有加for each row 都是行级类别
*/
视图:相当于虚拟表或者逻辑表,视图通常由多个基表连接而成,这种视图不允许进行insert,update,delete这样的DML操作。
当为视图编写INSTEAD OF 触发器后,用户对视图的DML操作就不会执行,而是执行触发器中的PL/SQL语句块,这样就可以通过在INSTEAD OF触发器中编写适当的代码对构成视图的各个表进行操作。
grant create view to scott;//system/oracle 登陆 授权给scott
--创建视图
create or replace view emp_dept_view as select empno,ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;
insert into emp_dept_view(empno,ename,job,sal,dname)
values (8088,'name8088','manager',6000,'oracle');
delete emp_dept_view;
==================系统级触发器======================
--创建一张表记录数据库用户登录的信息
grant ADMINISTER DATABASE TRIGGER to scott;--需要授权scott
create or replace trigger Login_Log_trig
after Logon on database
begin
insert into login_log
values(seq_login.nextval,ora_login_user,ora_client_ip_address);
end Login_Log_trig;
视图的作用:
A:控制数据访问
B:简化查询
C:数据独立性
D:可以控制视图中的数据的操作权限。
2:如何创建视图:
grant create view to 用户。
3:创建单张表的视图:
create or replace view v_mc as
Select nid,sname,sdescription,nprice
from t_mc
4:创建多张表的视图:
create or replace view v_mc2 as
Select a.nid,a.sname,a.nprice,a.nmaxid,
a.nminid,b.sname as 大类别,c.sname as 小类别
from t_mc a,t_mc_type b,t_mc_type c
where a.nmaxid = b.nid
and a.nminid = c.nid
5:视图的insert/update/delete操作:
A:只有符合一定条件的视图才能做增删改的操作。
不能有如下条件(组函数、GROUP BY子句、DISTINCT 关键字、ROWNUM 伪列、列的定义为表达式)
B:只读的视图:with read only;
6:删除视图。
7:自定义类型:
Record:
cursor cs_table1 is Select * from v_table1;
type Table1_Record is Record(
year varchar2(10),
month1 number,
month2 number,
month3 number,
month4 number,
month5 number
);
--var_table1_record Table1_Record;
var_table1_record cs_table1%rowtype;
使用rowType与Record接收游标中行数据类型的区别:
如果使用显示游标的话,由于SQL语句在编译期间已经确定,所以
可以直接使用rowType类型来替代Record类型。
但如果是使用动态游标的话,由于SQL在运行期间才能确定。因此不能
使用rowType类型。只能使用Record类型。
集合:
联合表 HashTable
嵌套表 Set
数组 数组
1:联合表的下标没有-24999到24999。下标可以随意访问。
嵌套表和数组的下标是从1开始。
2:联合表在定义的时候,PL/SQL会自动初始化。
嵌套表和数组,定义的时候不会自动初始化。往数组中添加元素之间,
必须使用构造方法做一初始化的操作。
参考
集合内建函数:
COUNT 返回集合中元素的个数
DELETE 删除集合中所有元素
DELETE(x) 删除元素下标为x的元素,如果x为null,则集合保持不变 对VARRAY非法
DELETE(x,y) 删除元素下标从X到Y的元素,如果X>Y集合保持不变 对VARRAY非法
EXIST(x) 如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND 在集合末尾添加一个元素 对Index_by非法
EXTEND(x) 在集合末尾添加x个元素 对Index_by非法
EXTEND(x,n) 在集合末尾添加元素n的x个副本 对Index_by非法
FIRST 返回集合中的第一个元素的下标号,对于VARRAY集合始终返回1。
LAST 返回集合中最后一个元素的下标号, 对于VARRAY返回值始终等于COUNT。
LIMIT 返回VARRY集合的最大的元素个数,对于嵌套表和Index_by集合无用。
NEXT(x) 返回在元素x之后及紧挨着它的元素的值,如果该元素是最后一个元素,则返回null。
PRIOR(x) 返回集合中在元素x之前紧挨着它的元素的值,如果该元素是第一个元素,则返回null。
TRIM 从集合末端开始删除一个元素 对index_by不合法
TRIM(x) 从集合末端开始删除x个元素 对index_by不合法
8:触发器
创建触发器语法:
CREATE [OR REPLACE] TRIGGER trigger_name
[AFTER | BEFORE | INSTEAD OF]
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old_value / NEW [AS] new_value}]
[FOR EACH ROW[WHEN (condition)]]
[declare 定义变量]
begin
trigger_body;
end trigger_name;
说明:[REFERENCING {OLD [AS] old_value / NEW [AS] new_value}]
指可以通过referencing 把行级触发器中默认相关性标识符:OLD,:NEW 重命名为新的名字,一般没必要更改名字
[INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE]
[INSERT] [[OR] UPDATE [OF column_list]]--指定更新的列名才触发
触发器的类型:
(一)DML触发器--对表或者视图执行DML 语句时触发
1、语句级触发器
对每个DML语句执行只执行一次,不管受影响的行数是多少,都只执行一次
2、行级触发器
对DML语句影响的每一行都执行一次
3、INSTEAD OF 触发器或者替代触发器
此触发器是定义在视图上的,而不是定义在表上的。它是用来替换所使用实际语句 的触发器
(二)数据库级触发器或者系统事件触发器
Oracle数据库系统的事件中进行触发的触发器,如oracle系统的启动与关闭
(三)模式(DDL)触发器或者用户事件触发器
是指与数据库定义语句DDL或者用户的登录、注销等事件相关的触发器,如用户连 接到数据库,修改表结构等。
其中:DATABASE表示创建数据库级触发器,数据库级要给出数据库事件;SCHEMA表示创建模式级触发器,模式级要给出模式事件或DDL事件。
SCHEMA 表示用户方案
----------------DML触发器详细说明--------------------
/*
new与old对象说明
insert:只有new对象
delete:只有old对象
update:new和old对象都有
DML
行级触发器:拥有old和new对象
语句级触发器:没有new和old对象,因为语句级操作针对一次操作,无法获得任意记录。
---------------------------------------------------------------------------
行级触发器要点:1.new和old对象,2.谓语动词“inserting,deleting,updating”的使用
语句级触发器要点:1.没有new和old对象。2.没有for each row
instead of 触发器要点:1.不管有没有加for each row 都是行级类别
*/
视图:相当于虚拟表或者逻辑表,视图通常由多个基表连接而成,这种视图不允许进行insert,update,delete这样的DML操作。
当为视图编写INSTEAD OF 触发器后,用户对视图的DML操作就不会执行,而是执行触发器中的PL/SQL语句块,这样就可以通过在INSTEAD OF触发器中编写适当的代码对构成视图的各个表进行操作。
grant create view to scott;//system/oracle 登陆 授权给scott
--创建视图
create or replace view emp_dept_view as select empno,ename,job,sal,dname from emp,dept where emp.deptno=dept.deptno;
insert into emp_dept_view(empno,ename,job,sal,dname)
values (8088,'name8088','manager',6000,'oracle');
delete emp_dept_view;
==================系统级触发器======================
--创建一张表记录数据库用户登录的信息
grant ADMINISTER DATABASE TRIGGER to scott;--需要授权scott
create or replace trigger Login_Log_trig
after Logon on database
begin
insert into login_log
values(seq_login.nextval,ora_login_user,ora_client_ip_address);
end Login_Log_trig;
发表评论
-
plsql一些补充
2012-07-05 14:33 873704 一些补充 1、存储过程的参数 in:输入参数, ... -
plsql包、触发器和大对象操作
2012-07-05 14:32 1886703 ------------------------- ... -
plsql存储过程、函数
2012-07-05 14:30 6145629 ------------------------- ... -
sql trace与执行计划
2012-07-04 17:32 1929627 ----执行计划 oracle在执行一个SQL之前 ... -
plsql高级操作
2012-07-04 17:31 1319627 ---group by 子句的增强 --roll ... -
plsql权限、数据连接和集合操作
2012-07-04 17:30 1419627 ---控制用户权限 Oracle的权限主要包括角色 ... -
plsql查询和数据对象
2012-07-04 17:01 3706626 ---多表查询 --Oracle ... -
plsql简单操作
2012-07-04 16:59 2945626 1、pl/sql --NULL表示不可用、未赋值、不 ... -
oracle与jdbc的结合
2012-06-13 22:17 1272import java.sql.Connectio ... -
oracle 存储过程和函数、程序包
2012-06-13 22:07 15821:存储过程 什么是存 ... -
oracle 游标管理
2012-06-13 22:04 908游标: 游标:逐行处理查询结果,以编程的方式访问数据。 游 ... -
oracle pl/sql编程
2012-06-13 22:01 9981:什么是PL/SQL 编程式的SQL语句 2:PL/SQ ... -
oracle单表查询与多表查询
2012-06-11 19:21 6202一、单表查询 1 基本查询 查询格式: ... -
oracle DDL、DML与TCL
2012-06-11 19:07 1488一、DDL 1、建表 建表语 ... -
oracle基础
2012-06-10 12:40 10031 oracle数据库基础 Oracle数据库简介 ...
相关推荐
2. **数据类型**:包括数值类型(如NUMBER)、字符串类型(如VARCHAR2、CHAR)、日期时间类型(如DATE)、布尔类型(BOOLEAN)以及PL/SQL特有的记录和数组类型。 3. **变量声明**:在PL/SQL中,变量需要先声明后...
- **复合类型**:用于存储复杂的数据结构,如记录和数组。 **2.4 复合类型(记录和表)** - **记录**:可以用来存储一组相关的数据项。例如,一条客户记录可能包含客户的姓名、地址等信息。 - **表**:类似于SQL表...
5. **集合和数组**:可以使用PL/SQL的索引变量、关联数组和多维数组存储一组值。 6. **游标**:游标允许程序逐行处理SQL查询结果,是数据库操作中的重要工具。 7. **过程和函数**:可以创建自定义的过程和函数,...
- 其他类型:INTERVAL、ROWID、PL/SQL记录和数组。 3. **SQL Server** 数据类型: - 数值类型:INT、TINYINT、SMALLINT、BIGINT、FLOAT、REAL、DECIMAL、NUMERIC。 - 字符串类型:VARCHAR、NVARCHAR、CHAR、...
此外,还可以定义记录类型和数组,以适应更复杂的数据结构需求。 三、控制流语句 PLSQL支持条件判断(IF-THEN-ELSIF-ELSE)、循环(WHILE、FOR)、分支(CASE)等控制流语句,用于实现逻辑流程的控制。 四、游标 ...
触发器是数据库中的一种特殊类型的存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。通过实验,学生将了解如何定义和使用触发器,以实现业务规则的自动应用,如数据的一致性检查、审计...
可以使用`WITH CHECK OPTION`来创建受限制的视图,模拟查询表,同时支持自定义类型和数组,提供更丰富的数据表示方式。 5. **SQL Server中的查询表** SQL Server支持`CHECK`约束和`FOREIGN KEY`约束来保证查询表的...
9. **PL/SQL块**:Oracle的PL/SQL是扩展SQL的编程语言,它包含声明部分、执行部分和异常处理部分,提供了流程控制、变量声明和数组处理等功能。 10. **存储过程的管理**:可以通过`ALTER`和`DROP`语句修改或删除...
以上只是特殊SQL中的一部分概念,实际应用中还可能遇到更具体的数据库系统特性,如Oracle的物化视图、MySQL的用户定义变量、PostgreSQL的JSON和数组处理等。学习并掌握这些特殊SQL技巧,能够让你在面对复杂数据需求...
15. Java的复合数据类型除了类和数组,还包括接口。简单数据类型包括数值类型、布尔类型和字符类型。 16. 在Word2003的打印预览视图下,使用放大镜按钮可以在预览和编辑状态之间切换。 17. Visual Basic是一种基于...
个字段创建复合唯一性约束,如下所示: 代码如下: ```sql CREATE TABLE products ...继续学习PostgreSQL教程,深入探索更多高级特性,如窗口函数、递归查询、JSON和数组支持等,将使你在数据库管理领域更加得心应手。