1、 索引

① 在关系数据库表中为了能够找到数据,表中的每一行都用一个RowID来标识。 RowID告诉数据库这一行的准确位置,包括所在的文件、该文件中的块和该块中的行地址。

② 索引是帮助用户在表中快速地找到记录的数据库结构。它既可以提高数据库性能,又能够保证列值的唯一性。

③ 索引如何被创建

a) 自动创建索引:当你为一张表定义主关键或唯一性约束条件时一个惟一的索引就已经被创建了。

b) 手动创建索引: 用户可以自己创建索引。

对一列或多列创建索引

CREATE INDEX index  ON table (column[, column]...);

何时需要创建一个索引:

  在WHERE语句中该列被经常用到。

  该列所包含的值有很大取值范围。

  在WHERE语句中有两个或两个以上的列被经常在一起使用的时候。

  表很大。

何时不需要创建一个索引:

  表很小时。

  这列在查询中不经常用到。

  表不断地被更新。

基于函数的索引:是一个基于表达式的索引,建立于表的列,SQL函数等。

2、 同义词:

同义词是一个对象的别名,使用同义词可以让多个用户访问而不用添加拥有者的名称作为前缀。同义词是一个指向Oracl对象的指针,本身不包含自己的数据。

3、 视图:

视图是由一个或若干个基表产生的数据的集合,它不占用存储空间。

视图犹如数据库的窗户,管理员定义这些“窗户”的位置后,用户就只能查看他可以看到的数据。视图不是数据表,它仅是一些SQL查询语句的集合,作用是按照不同的要求从数据表中提取不同的数据。

视图中并没有存放数据,而仅仅是一条SELECT语句。对用户而言,如果不告诉是在视图中操作的话,还以为是在表中工作。使用视图可以增强数据表的安全性和隐蔽数据的复杂性。

视图与表不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的表。

视图与表的区别:

相同之处:

  1、视图和表一样有列组成,其查询方式与表完全相同。

  2、和表一样,用户也可以在视图中插入、更新或删除数据,在视图中做这些操作时与在表中是一样的。

区别:

查询语句。按此查询语句检索出的数据以表的形式表示。视图中的列可以在一个或多个基本表中找到。视图不使用物理存储位置来存储数据。

  2、视图的定义(列的安排、授予的权限等等)存储在数据字典中。对一个视图进行查询时,视图将查询其基于的表,并且以视图定义所规定的格式和顺序返回值。

  3、由于视图没有直接相关的物理数据,所以不能像表那样被索引。

语句,子查询不能包含ORDER BY语句。

4、 序列

序列是一种可被多个用户使用的用于自动产生一系列唯一(有序)数字的数据库对象。序列是一个共享的对象。通常被用来产生主键值。

oracle 实现自增需要创建 squence(序列);
如果需要插入时自动增加还需要创建一个 trigger(触发器),否则需要在程序中手工设置
例如:将表fcbook的主键fid设置为自增 
创建squence
Name : 创建的名字
Min value : 最小计数
Max value : 最大计数
Start with : 起始计数
Increment by : 步长
Cache size : 缓存序列
                  
 相应的squence创建sql:

-- Create sequencecreate sequence Rayn.SEQ_FCBOOK   minvalue 1   maxvalue 99999999999    start with 1increment by 1cache 20;

 

NEXTVAL返回下一个序列的值。一次返回一个值。

CURRVAL当前的序列值。

  每引用一次序列的伪列NEXTVAL,就会按照序列的定义产生一个新的序列码;而通过序列伪列CURRVAL可以反复利用当前的序列码。

适用场合:

1、INSERT语句的VALUES子句中

2、SELECT语句中的前面选择的表列名中

3、UPDATE语句中的SET子句

不适用场合:

1、子查询

2、视图定义的查询中

3、带有DISTINCT操作符的SELECT语句

4、带有GROUP BY或ORDER BY子句的SELECT语句

5、SELECT语句的WHERE子句中

6、检查约束条件中

PL/SQL编程

pg 创建视图索引 视图创建索引oracle_触发器

case when

--Case两种风格
--1
SELECT ex.registno,
       ex.driversname,
       case ex.driverssex
         when '1' then '男'
         when '0' then '女'
         else '其他'
       end sex
  FROM prplregistex ex;
--2
SELECT ex.registno,
       ex.driversname,
       case 
         when ex.driverssex = '1' then '男'
         when ex.driverssex = '0' then '女'
         else '其他'
       end sex
  FROM prplregistex ex;

5、 游标

游标是从数据表中提取出来的数据,以临时表的形式存放在内存中,在游标中有一个数据指针,在初始状态下指向的是首记录,利用fetch语句可以移动该指针,从而对游标中的数据进行各种操作,然后将操作结果写回数据表中。

① 游标的定义

游标作为一种数据类型,首先必须进行定义,其语法如下。

游标名  is select 语句:

是定义游标的关键字,select是建立游标的数据表查询命令。

② 游标的打开

要使用创建好的游标就要打开游标,语法形式如下。

open  游标名;

打开游标的过程有以下两个步骤。

1) 、将符合条件的记录送入内存。

)、将指针指向第一条记录

③游标数据的提取

要提取游标中的数据,需要使用fetch命令,语法形式如下。

游标名 into 变量名1,变量名2,……;   或

fetch 游标名 into 记录型变量名;

④游标的关闭

使用完游标后,需要关闭游标,使用close命令,语法形式如下。

游标名  

游标的重要属性

① %isopen属性

属性功能:测试游标是否打开,如果没有打开游标就是用fetch语句并提示错误。

② %FOUND

逻辑值,游标是否找到一条记录。如游标找到记录其值为True,反之为False

③ %NOTFOUND

逻辑值,游标没有找到记录,是%FOUND属性的逻辑非。

④ %ROWCOUNT

返回提取游标记录的行数

6、 过程与函数

过程procedure 也叫存储过程,是由SQL语句和PL/SQL语句组合在一起为执行某一个任务的一个可执行单位。我们在使用时可以调用,过程没有返回值。

函数function和过程的结构类似,也是有SQL语句和PL/SQL语句组合在一起,执行某一任务的一个可执行单位。过程和函数的差别在于,函数总返回单个值给调用者,而过程没有值返回给调用者。

 

存储过程创建语法:
 create or replace procedure 存储过程名(param1 in type,param2 out type) 
as 
变量1 类型(值范围); --vs_msg   VARCHAR2(4000); 
变量2 类型(值范围);
Begin
Select count(*) into 变量1 from 表A where列名=param1;
    If (判断条件) then
       Select 列名 into 变量2 from 表A where列名=param1;
       Dbms_output.Put_line(‘打印信息’);
    Elsif (判断条件) then
       Dbms_output.Put_line(‘打印信息’);
    Else
       Raise 异常名(NO_DATA_FOUND);
    End if;
Exception
    When others then
       Rollback;
End;
注意事项:
1.存储过程参数不带取值范围,in表示传入,out表示输出
类型可以使用任意Oracle中的合法类型。
2.变量带取值范围,后面接分号
3.在判断语句前最好先用count(*)函数判断是否存在该条操作记录
4.用select...into...给变量赋值
5.在代码中抛异常用 raise+异常名

 

无参过程的创建

语法结构

Create or replace procedure  过程名  as

声明语句段;

begin

执行语句段;

exception

异常处理语句段;

End;

带参数过程的创建

①参数类型

在PL/SQL过程中,可以有3中类型的参数。

参数:读入参数,主程序向过程传递参数值。

参数:读出参数,过程向主程序传递参数值。

参数:双向参数,过程与主程序双向交流数据。

②定义带参数过程的语法

过程名(

参数1[in|out|in out]数据类型

参数2[in|out|in out] 数据类型]

            ……

参数n[in|out|in out] 数据类型]

    )

    (is|as)

声明语句段;

    Begin

执行语句段;

    Exception

异常处理语句段;

    End;

过程的执行

①利用begin..end执行

        begin

过程名;

        end;

③ 利用execute执行

过程名

7、 触发器

触发器是一种特殊类型的存储过程,由一些SQL语句组成,主要用于执行强制性的业务规则或要求,但不返回结果。当对数据库的操作触发了触发器的条件时,系统将自动执行触发器里设置的SQL语句,完成某些特定的功能。当数据表被修改时,与其相关的触发器隐式地被激发执行。对表的INSERT、UPDATE或DELETE操作都可以定义触发器。

 

创建 trigger
ORACLE触发器有以下两类:
 1> 语句级(Statement-level)触发器,在CREATE TRIGGER语句中不包含FOR EACH ROW子句。语句级触发器对于触发事件只能触发一次,而且不能访问受触发器影响的每一行的列值。
  一般用语句级触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。
 2> 行级(Row-level)触发器,在CREATE TRIGGER语句中包含FOR EACH ROW子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。
  行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。
OK确认后,需要输入trigger_body,对应的sql补全为:
create or replace trigger TR_FCBOOK before insert on fcbook for each rowbegin SELECT SEQ_FCBOOK.Nextval INTO :new.fid FROM dual;end TR_FCBOOK;
上语法中:trigger_event 是对应于DML的三条语句INSERT、UPDATE、DELETE;
table_name是与触发器相关的表名称;
FOR EACH ROW是可选子句,当使用时,对每条相应行将引起触发器触发;
condition是可选的ORACLE BOOLEAN条件,当条件为真时触发器触发;
trigger_body是触发器触发时执行的PL/SQL块。
在触发器体内,行级触发器可以引用触发器触发时已存在的行的列值,这些值依赖于引起触发器触发的SQL语句。
1> 对于INSERT语句,要被插入的数值包含在new.column_name,这里的column_name是表中的一列。
2> 对于UPDATE语句,列的原值包含在old.column_name中,数据列的新值在new.column_name中。
3> 对于DELETE语句,将要删除的行的列值放在old.column_name中。

 

触发器的结构

触发事件或语句:引起触发器被激发的SQL语句,是对指定表执行的INSERT、UPDATE或DELETE语句。

触发器限制:一个布尔表达式,当触发器激发时该条件必须为TRUE。触发器的限制是用WHEN子句来指定。

触发器的动作:一个PL/SQL块(过程),由SQL语句和PL/SQL语句组成。当触发语句发出,触发器的限制计算为TRUE时,它被执行。在触发器动作的语句中,可使用触发器的处理的当前行的列值(包括新值和旧值),使用的形式为:NEW.列名(引用新值)或者OLD.列名(引用旧值)。

触发器的分类

按照激活触发的操作分类

激活触发的操作是指对数据表实行什么样的操作时激活触发器,分为3类:

INSERT触发器:对数据表插入数据时执行触发器动作。

触发器:对数据表更新数据时执行触发器动作。

触发器:对数据表删除数据时执行触发器动作。

触发器的创建

可以使用CREATE TRIGGER来创建一个触发器。与过程不同,每个触发器都必须和某个特定的表相关,而且每一个触发器都只和作用于该表上的一个或多个动作有关。

可以使用任何想用的名称来命名触发器,但是每个触发器都必须由惟一的名称。建议在触发器的名称内包含与触发器相关联的表和动作。

  • 触发器的创建

在企业管理器下面创建触发器。

  • 触发器的修改

在企业管理器下面用鼠标右键点击触发器名称选择‘查看/编辑详细资料

  • 触发器的删除

在企业管理器下面用鼠标右键选择移去

  • 触发器的启用

“HR”.”TEMPTRIGGER”

     ENABLE

如果要启用数据表的所有触发器,可以使用下面的SQL代码。

“HR”.”EMPLOYEES”

      ENABLE ALL TRIGGERS;

  • 触发器的停用

触发器的停用可以执行下面的SQL语句来完成。

“HR”.”TEMPTRIGGER”

    DISABLE