现在的位置: 首页 > 综合 > 正文

oracle基础

2018年01月24日 ⁄ 综合 ⁄ 共 14564字 ⁄ 字号 评论关闭

1.常用用户:
1>sys/change_on_install;
2>system/manager;
3>scott/tiger;
4>sh/sh;
2常用命令:
. set linesize 300---设置每行显示的长度;
. set pagesize 300--设置每页显示的记录数;

.set  severoutput on;--打开服务器的输出;
. conn 用户名/密码 [AS sysdba/sysoper]---使用指定用户连接数据库
. select * from 用户名.表名称--查询指定用户权限的表信息
. desc 表名称--查看一个表的完整结构
. 使用显示的形式,返回查询结果信息,如下图所示:

.select table1.column,table2.column ----多表连接查询语法

    from table 1 [cross join table2]|---交叉连接(用于产生笛卡尔积)

    [natural join table2]|---自然连接(自动找到匹配的关联字段,消除笛卡尔积)

    [join table2 using(column_name)]|---用户自己指定一个消除笛卡尔积的关联字段

    [join table2 on(table1.column_name=table2.column_name)] |---用户自己指定一个消除笛卡尔积的关联条件

    [left | right | full outer join table2 on(table1.column_name=table2.column_name)];--连接方向的改变(左外边接,右外连接,全外连接)

.select [distinct]*| [分组字段1 [别名]]|----表连接统计查询语法

   from 表名1 [别名],[表名2 [别名],......]

   [where 条件(s)]------在执行group by操作之前进行过渡,表示从全部的数据中筛选出部分数据,在where字句不可以使用统计函数

   [group by 分组字段1,[分组字段2,.......]]

   [having (分组查询条件)]----group by分组之后再次过渡,可以在having字句中使用统计函数

   [order by 排序字段  asc|desc [,排序字段 asc|desc,......]]

.select [distinct]*| [分组字段1 [别名]]|  (---子查询语法,子查询可以出现在查询语句的任意位置,但是从具体的使用过程中出现在where ,from 之后较多

    select [distinct]*| [分组字段1 [别名]]| (大部分情况下,如果最终的查询结果之中需要出现select 子句,又不能直接使用统计函数时,就在子查询中统计信息)

   from 表名1 [别名],[表名2 [别名],......](有复杂统计的地方通常需要子查询)

   [where 条件(s)]

   [group by 分组字段1,[分组字段2,.......]]

   [having (分组查询条件)]

   [order by 排序字段  asc|desc [,排序字段 asc|desc,......]]

)

   from 表名1 [别名],[表名2 [别名],......] ,

       (select [distinct]*| [分组字段1 [别名]]|  

         from 表名1 [别名],[表名2 [别名],......]

          [where 条件(s)]

          [group by 分组字段1,[分组字段2,.......]]

          [having (分组查询条件)]

            [order by 排序字段  asc|desc [,排序字段 asc|desc,......]])

   [where 条件(s) and ((select [distinct]*| [分组字段1 [别名]]|  

         from 表名1 [别名],[表名2 [别名],......]

          [where 条件(s)]

          [group by 分组字段1,[分组字段2,.......]]

          [having (分组查询条件)]

            [order by 排序字段  asc|desc [,排序字段 asc|desc,......]])

     )]

   [group by 分组字段1,[分组字段2,.......]]

   [having (分组查询条件)]

   [order by 排序字段  asc|desc [,排序字段 asc|desc,......]]

.in,any,all---查询语句,where条件中出现多行单列数据

      in-----用于指定子查询的判断范围,not in使用时,如果在一个子查询中一个内容是null,则不会出现任何的查询结果

      any---与子查询的每个内容相匹配,有三种匹配形式(a.=any()---功能与in操作符完全相同b.>any()--比子查询中返回的最小记录还要大的数据c.<any()--比子查询中返回的最大记录还要小的数据)

       all----与子查询的每个内容相匹配,有两种匹配形式(a.>all()---比子查询返回的最大记录还要大的数据b.<all()--比子查询返回的最小记录还要小的数据)

.create table 表名 as select  * from 表名---复制表语法
.insert into 表名称 [(字段1,字段2,......)]  values (值1,值2,......);(增加数字:直接编写数字;增加字符串:字符串应使用" ' "声明;增加date数据:第一种--可以按照已有的字符串的格式编写字符串,例如“17-12月-80”;第二种:利用to_date函数将字符串变为DATE类型数据;第三种:使用sysdate设定系统当前时间)
.update 表名称 set 更新字段1=更新值1,更新字段2=更新值2,......[where更新条件语句];
.delete  from 表名称 [where 删除条件(s)]
.commit--提交用户的更新操作,一旦提交之后无法回滚
.rollback--更新操作回到原点

.set transaction read only;-----设置只读事务,适合以sql查询语句组成的事务

.set transaction read write;----设置读写事务,事务的默认方式

.set transaction use rollback segment rollback;---为事务设置回滚段

.set autocommit on;----设置事务自动提交

.savepoint 保存点名称;-----设置事务保存点

.lock table 表名 in row share model;----在表中加入行共享锁rs

.lock table 表名 in row exclusive model;--在表中加入行排他锁rx

.lock table 表名 in share model;---在表中加入共享锁

.lock table 表名 in share row exclusive--在表中加入共享行排他锁

.lock table 表名 in exclusive;--在表中加入排他锁。

.create table 表名称( 字段1, 数据类型,[default 默认值],字段2,数据类型,[default 默认值],........字段n,数据类型,[default 默认值])

.create table 复制表名称 as 子查询;----根据子查询复制表

.create table 复制表名称  as 子查询  where 1=2;---复制表结构

.rename 旧的表名称 to 新的表名称;----修改表名称

.truncate table 表名称;----截断表,将表占用的资源会进行全部释放,区别delete 操作,delete操作在删除之后并不会立刻释放资源,可以进行事务的回滚

.drop table 表名称;---删除表

.show recyclebin;------查看回收站

.flashbakc table 表名称 to before drop;----恢复用户删除已放在回收站的表

.purge table 表名称;----删除回收站中的表

.purge recyclebin;-----清空回收站

.drop table 表名称 purge;----彻底删除表,表不进入回收站

.alter table 表名称 add (列名称 数据类型 [default 默认值],列名称 数据类型 [default 默认值],.......);---修改表结构,向表中加入新的字段in

.alter table 表名称 modify(列名称 数据类型 [default 默认值],列名称  数据类型 [default默认值],......);---修改已有表的表结构

.创建表约束时,加入CONSTRAINT 约束名称  约束类型(需要加约束的字段)  显示定义违反表约束的错误

.alter table 表名称 add constraint 主键约束名称 primary key(表字段名称);----表中增加主键约束

.alter table 表名称 add constraint 检查约束名称 check(约束条件);---表中增加检查约束

.alter table 表名称 drop constraint 约束名称;---删除表中指定的约束

.select * from user_constraints;---查询约束(只能查询约束名称,约束所在表名称,不能查看约束所在的列名称)

.select  * from user_cons_columns;--查询约事(可以查询约束所在表名,列表)

.on delete cascade;(设置外键约束应该先删除子表再删除父表,这种方式为级联删除)

.on delete set null;(删除主表时,将子表的与相关联字段的设置为null)

.col  列名称 from A15;---格式化查询,规定列的长度

.select * from 表名 union select * from 表名;---连接两个表的查询,相同的部分不显示

.select * from 表名 union all select * from 表名;---连接两个表的查询,相同的部分显示

.select * from 表名 intersect select * from 表名;----连接两个表的查询,只显示两个表的相同部分

.select * from 表名 minus select * from 表名;----连接两个表的查询,只显示两个表的不同部分 

.create sequencs 序列名 [INCREMENT TY n] [START WITH n] [{maxvalue n|nomaxvalue}] [{minvalue n|nominvalue}] [{cycle|nocycle}] [{cache|nocache}];----创建序列(在oracle数据库之中,由于序列经常使用到,所以oracle为了提升性能,将序列的操作形式做了如下的处理,首先在用户每次使用序列时序列再增加,则肯定会造成一些性能上的损耗,所以在oracle中专门为用户准备了一块儿空间,为用户准备好了若干已经生成好了的序列,每次操作时从这块儿空间中取出序列的内容,但是这样做有一个问题,如果现在数据库的实例关闭了,那么保存在这块空间的内容就有可能消失了,但是虽然消失但数据已经增长好了,这样就会出现跳号的现象。解决出现这种问题的办法,最好的方式就是将序列设置为不缓存nocache)

.序列名.nextval()----让序列增长到下一个内容;

.序列名.currvale(0---取得当前序列的内容

.create [or replace]  view 视图名称 as 子查询 [with check option(注:此选项指明不能更新视图的创建条件,但其他的字段允许更新)] [with readonly(注:不允许更新字段的任何内容)];----创建视图

.create [PUBLIC] synonym 同义词的名称 for 用户名.表名称;----创建同义词,创建时如果不使用public则不是公共的同义词,其他用户不可以使用

.create index 索引名  on 表名(列名);----创建索引,在数据库会形成一个树形结构,可以优化查询,但如果频繁修改,则代码的性能会降低,因此索引常用于修改较少的表

.create user 用户名 indentified by 密码;---创建用户(但用户不可以登录,没有创建session的权限)

.grant create sesion to 用户名;---授权用户创建session权限

.grant create table to 用户名;----授权用户创建表权限(关于数据表的保存问题,oracle的数据表都是保存在硬盘上,但是不是每张表都保存在硬盘上,而是表空间保存在硬盘上,而数据表又保存在表空间上。没有操作表空间权限的用户,也是不可以创建表的,为了解决用户的授权问题,oracle为用户提供了很多角色,每个角色包含多个权限,而角色主要有两个:connect resource)

.grant connect,resource to 用户;---简化用户的授权操作

.alter user 用户名 identified by 密码;---为用户修改密码

.alter user 用户名 password expire;---希望用户在第一次登录时可以修改密码,该命令可以使密码失效

.alter user 用户名 account lock;---锁定用户

.alter user 用户名 account unlock;---将锁定的用户解锁

.grant [select |update|insert|delete] on 用户名.表名 to 用户名;----将其他用户的表增删改查权限赋予当前用户

.revoke [select |update|insert|delete]  on 用户名.表名 from 用户名;---把授予用户的权限进行回收

.drop user 用户名 cascade;--级联删除用户

.exp 导出数据表

.imp导入数据表
.[declare <声明部分>] begin [程序体]  exception[异常处理部分]  end;-----pl/sql(procedural language,过程化的sql语言基本结构)

.type <数据类型名>  is <数据类型>;---定义数据类型(RECORD,TABLE),%type和%rowtype用于声明与表列相匹配的变量和用户定义数据类型

.type <数据类型名>  is record ( 字段名,数据类型[:=value],字段名,数据类型,......字段名,数据类型);---定义record数据类型

.<常量名> constant<数据类型>:=<值>;----定义常量

.<变量名> <数据类型> [宽度;=<初始值>];----定义变量

.if  (条件表达式)  then (语句序列1;) [elsif(条件表达式2)  then (语句序列2)] [else (语句序列;)] end if;----选择命令结构

.case 检测表达式  when 表达式1 then 语句序列1  when 表达式2  then 语句序列2.....when 表达式 n then 语句序列n [else 其他语句序列 ]  end;----case结构

.if 变量名 is null then....elsif....else....end if;-----null值检查语句

.loop...exit...end loop;----循环语句,常在一个判断语中

.loop...exit when...end loop;----表示当后面判断为真时退出循环

.when...loop...end loop;----判断再进入循环

.for...in...loop....end loop;----预知循环次数的控制语句

.cursor <游标名> is  select <语句>;----需要在块的声明部分进行声明

.open  <游标名>; 打开游标

.fetch <游标名> into <变量列表>; 或者fetch <游标名> into pl/sql记录;

.close <游标名>;关闭游标

.type <类型名> is ref curson return <返回类型>;----其中,<类型名>是新的引用类型的名字,而<返回类型>是一个记录类型,它指明了最终由游标变量返回的选择列表的类型。游标变量的返回类型必须是一个记录类型。它可以被显式声明为一个用户定义的记录,或者隐式使用%rowtype进行声明。

.open <游标变量> for <select语句>;----将一个游标变量与特定的select语句相关联

.create [or replace]  prcedure <过程名>  (<参数1>,[方式1] <数据类型1>,<参数2>,[方式2] <数据类型2>)  IS|AS PL/SQL 过程体---创建存储过程

.execute <过程名> (参数1,参数2);---执行存储过程

.drop procedure <过程名>;---删除存储过程

.create [or replace] function <函数名> (<参数1>,[方式1] <数据类型1>,<参数2>,[方式2 ]<数据类型2>....) return <表达式> IS|AS PL/SQL 程序体-----其中,return在声明部分需要定义一个返回参数类型,而在函数体中必须有一个return语句。而其中<表达式> 就是函数要返回的值。当该语句执行时,如果表达式的类型与定义不符,该表达式将被转换为函数定义子句return.同时,控制立即返回到调用环境,函数可以有一个以上的返回语句。如果函数结束时还没有遇到返回语句,就会发生错误。

.<函数名> (参数1,参数2,......参数n);-----调用函数

.drop function <函数名>;-------删除函数.

.create package <包名> is (变量,常量及数据类型定义);(游标定义头部);(函数,过程的定义和参数列表及返回类型)  end<包名>;----创建包说明部分

.create package body <包名> as 游标,函数,过程的具体定义; end <包名>;---创建包体部分

.包名.变量名(常量名);

.包名.游标名;

.包名.函数名;

.drop package <包名>;------删除包

.create or replace trigger <触发器名>  触发条件  触发体;----创建触发器

.drop  tirgger <触发器名>;-----删除触发器

3.常用函数:
1>字符函数:
.lower()--大写字母转换为小写;
.upper()--小写字母转换为大写;
.substr()--字符串截取;(注:截取点从0或1开始,结果是一样的),起止截取点输入负数,则表示从后往前截取指定长度的字符串
.length()---获取字符串长度;
.replace()---字符串替换;
.initcap()----该函数将传入字符的每个单词的第一个字母大写,其他字母小写返回。
.instr(c1,[c2,<i>,[.j]])----该函数用于返回c2在c1中第j次出现的位置,搜索从第i个字符开始。没有发现所需要的字符时返回0,如果i为负数,那么搜索从右到左进行,但是位置还是按从左向右计算,i,j的默认值为1 
.ltrim(c1,c2);---将c1中最左边的字符去掉,使其第一个字符不在c2中,如果没有c2,c1就不会改变。
2>日期函数:
.months_between()--求出给定日期范围的月数
.add_months()--在指定日期上加上指定的月数,求出之后的日期
.next_day()--下一个的今天是星期几
.last_day()--求出给定日期的最后一天
3>通用函数
.nvl()--可以将一个指定的null变为指定的内容
.decode()--类似于if...elseif...else语句(该函数判断的是数值,而不是逻辑条件)
4>数字函数
.round(数字|列[,保留小数的位数])--对数字进行四舍五入的操作,如果是负数,则从正数开始截取
.trunc(数字|列[,保留小数的位数])--舍弃指定位置的内容
.mod(数字1,数字2)--取模,取余数
5>转换函数
.to_char(字符串|列,格式字符串)---将日期或者是数字变为字符串;
.to_date(字符串,格式字符串)--将字符串转换为Date格式显示;
.to_number(字符串)--将字符串转变为数字
.chartorwid()---将字符串转换为rwid数据类型

6>统计函数

.count()--查询表中的记录数

.avg()--求出平均值

.sum()--求和

.max()--求出最大值

.min()--求出最小值
4.事务处理:

1>概念:逻辑工作单元,包含一条到多条语句,要么全部成功,要么全部失败,以commit结尾持久化更改或以rollback撤销操作

2>事务ACID属性:

     .Atomic(原子性)----整个事务作为同一个单元要么全部成功要么全部失败

     .consistency(一致性)-----事务中的操作保证数据库中的数据不会出现逻辑不一致的情况,一致性一般隐含包含在其他的属性中

     .isolation(隔离性)----事务允许多个用户对同一数据进行并发访问,而不破坏数据的正确性和完整性。同时,并行事务的修改必须与其他并行事务相互独立,由事务锁来控制

     .durability(持久性)----事务处理后,事务的处理结果必须得到固化。

3>事务的状态:

     .活动状态---事务在执行时的状态

     .部分提交状态--事务中最后一条语句被执行后的状态。此时事务虽然已经完成,但由于实际的输入可能在内存中,事务成功前可能还会发生硬件故障,进入中止状态

     .失败状态---事务不能正常执行的状态。导致失败状态发生的原因有硬件原因或逻辑错误,这样的事务必须回滚,进入中止状态

     .提交状态----事务在部分提交后,将往硬盘上写入数据,最后一条信息写入后的状态叫提交状态,进入提交状态的事务就成功完成了

     .中止状态---事务回滚,并且数据库已经恢复到事务开始执行前的状态。

其中处理提交状态和中止状态的事务称为已决事务,处于活动状态,部分提交状态和失败状态的事务称为未决事务。

4>设置事务

      .设置只读事务----将事务设置为只读的,将不建立回滚信息,适合以sql查询语句组成的事务

      .设置读写事务----事务的默认方式,将建立回滚信息

      .为事务分配回滚阶段----可以为事务分配和指定回滚阶段 ,oracle 赋予用户可以自行分配和回退的权限,其目的是可以灵活地调整性能,用户可以按照不同的事务来分配大

         小不同的回滚阶段,分配原则如下:

          .若没有长时间运行查询读取相同的数据表,则可以把小的事务分配给小的回滚段,这样数据更容易保存到内存中

          .若长时间运行的查询读取相同的数据表,则可以把修改表的事务分配给大的回滚段,这样读一致的查询结果就不用回滚事务

          .可以将插入,删除和更新大量数据的事务分配给那些足以保存这些回滚信息的事务

5>事务提交的方式

     .显式提交事务:使用commit命令使当前事务生效

     .自动提交事务:在sqlplus中执行:set autocommit on;

     .隐式提交事务:发出ddl命令,程序中止或关闭数据库     

6>锁:在事务访问相同资源时,防止事务之间的有害性交互的机制,这些资源包括用户系统对象,内存和数据字典中的共享数据结构。oracle使用锁来保证事务的隔离性,即事务内部的操作和使用的数据对并发执行的其他事务是隔离的,互不干扰的。oracle的事务要执行时,必须首先申请对该资源的锁,按照获的锁不同,就能够对该资源进行锁所赋予的操作;如果没有获得锁就不能执行对该资源的任何操作。当某种事务出现或该事务完成之后,自动解除对该资源的锁。

   .锁的类型:锁的类型---排他锁(exclusive lock) 共享锁(share lock)  锁所分配的资源---数据锁(data lock),字典锁(dictionary lock),内部锁,分布锁和并行管理缓存锁

       .按照权限划分

          .排他锁:又称为X锁或写锁。若事务T1对资源R加上X锁,则只允许T1读取和修改R,其他事务可以读取R,但不能修改R,除非T1事务解除加在R上的锁;

          .共享锁:又称为S锁或读锁。若事务T2对资源R加上S锁,允许T2读取R,其他事务也可以读取R.

       .按照资源划分

          .数据锁:当用户对表中的数据进行INSERT,UPDATE和DELETE操作时将要用到数据锁。数据锁在表中获得并保护数据

          .字典锁:当用户创建,修改和删除数据表时将要用到字典锁。字典锁用来防止两个用户同时修改同一个表结构。

  .查询锁信息:oracle在动态状态表中V$LOCK中存储与数据库中的锁有关的信息。

  .加锁的方法:

       .行共享锁RS(Row share)---对数据表定义行共享锁后,如果被事务A获得,那么其他事务可以进行并发查询,插入,删除及加锁操作,但不能排他方式存取数据表。

       .行排他锁RX(Row Exclusive)-- 对数据表定久排他锁后,如果被事务A获得,那么A事务对数据表中的行数据具有排他的权利,其他事务可以对同一数据表的其他数据行

         进行并发查询,插入,修改,删除及加锁,但不能使用以下3种方式加锁:行共享锁,共享排他锁,行排他锁

       .共享锁S(Share)---对数据表定义共享锁后,如果被A事务获得,其他事务可以执行并发查询和加共享锁,但不能修改表,也不能加入排他锁,共享行排他锁,行排他锁。

       .共享行排他锁SRX(Share Row Exclusive)---对数据表加入该锁后,如果被A事务获得,其他事务可以并发查询和对其他数据行加锁,但不能修改表

        .排他锁X(Exclusive)---对加入该锁的表,如果被A事务获得,A可以执行对数据表的读写操作,其他事务可以执行查询,但不能执行插入,修改和删除操作。

        
所有的事务处理操作都 针对一个每一个seesion进行的,在oracle数据库中,把每一个连接到数据库上的用户都称为一个session,每个session之间彼此独立,不会有任何的通讯,而每一个session独享自己的事务控制。事务控制主要使用两个命令:事务的回滚 (rollback,更新操作回到原点);事务的提交(commit真正的发出更新操作,一旦提交之后无法回滚),当某一个session在更新数据表时还没有提交事务,其他session是无法更新,必须等待之前的session提交后才可以。(这种情况在oracle数据库操作中称之为死锁)。所有的数据更新一定都会受到事务的控制。

5.数据伪列:

   用户不需要处理的列,由oracle自行维护的数据列,在oracle有两个数据伪列:rownum 和rowid

  1>rownum为每一个显示的记录自动随着查询生成行号,不是固定不变的。可以实现数据的部分显示,进而实现数据的分页操作,语句如下

       select * from (select rownum rn,deptno from dept where row<@currentpage*@pagesize) temp where temp.rn>(@currentpage-1)*@pagesize

  2>rowid表示每一行数据保存的物理地址编号,每一条记录的rowid是不会重复的。可以用于删除表中的重复记录(在一个表中数据插入的早,rowid的值就小)

       delete from 表名 where rowid not in(select min(rowid) from 表名 group by 字段1,字段2,.......)

6.数据字典:

   在oracle数据库中,所有的数据实际上都是通过数据字典保存的,在oracle中,提供了三种类型的数据字典,最常用的是:dba_,user_;也就是说oracle中的所有数据都是按照文件保存的,所有的内容都会在数据字典中注册既然这样,所谓的修改表名称实际上对于oracle而言就相当于修改一条数据而已。

7.内回技术:oracle 10g以后的新技术,为了预防用户的误删除表操作,提供了回收站的功能,用户所删除的表默认情况下会在一下回收站中保存,用户可以通过回收站,进行表的恢复,也称为FlashBack技术

8.游标:

 1>原理:在pl/sql块中执行select,update,delete 和insert 语句时,oracle会在内存中为其分配上下文区(Context Area),即一个缓存区。游标是指向该区的一个指针,为应用程序提供了一种对具有多行数据查询结果集中的每一行数据分别进行单独处理的方法。

 2>属性:%ISOPEN, %FOUND,%NOTFOUND,%ROWCOUNT

       %ISOPEN----判断游标是否打开

       %FOUND/%NOTFOUND----判断游标所在的行是否有效

       %ROWCOUNT---返回当前位置为止游标已经读取的记录条数

 3>分类:显示游标   隐式游标

 4>显示游标---包括声明游标,打开游标,提取游标,关闭游标4步,如下图所示

     

     声明游标:在块的declare 部分声明

     打开游标:执行定义的select 语句。执行完毕,查询结果装入内存,游标停在查询结果的首部,注意并不是第一行。当打开游标时,会完成以下几件事情:检查联编变量的b取值,根据联编变量的初始值,确定活动集;活动集的指针指向第一行。(备注:联编变量,已经分配空间并映射到绝对地址的变量,这些变理必须在声明游标的位置可见)打开一个已经打开的游标是合法的,在第二次执行open之前,pl/sql将在重新打开该游标前隐式地执行一条close语句,一次可以同时打开多个游标。

    提取游标: 提取的标名必须是已经声明并且已经打开了的游标,into后面的变量列表是已经声明的pl/sql变量的列表,变量的类型必须与查询的选择列表的类型相兼容。提取游标的语句每执行一次,游标向后移动一行,直到结束。

    关闭游标:一旦关闭了游标,也就关闭了select操作,释放了占用的内存区,再从游标中提取数据是不合法的。关闭一个已经关闭的游标也是不合法的。

    注意事项:

      a.使用前必须用%ISOPEN检查其打开状态,只有此值为true的游标才可使用,否则要先将游标打开。

      b.在使用游标的过程中,每次都要用%FOUND或%NOTFOUND属性检查是否返回成功,即是否还有要操作的行

      c.将游标中行取至变量组中时,对应变量的个数和数据类型必须完全一致。

      d.使用完游标时必须将其关闭,释放资源。

   5> 隐式游标:

       在pl/sql程序中使用select语句进行操作时,则隐式使用了游标,也就是隐式游标,这种游标无需打开,也无需关闭。对每个隐式游标来说,必须要有一个into子句,因些使用隐式游标的select语句必须只选中一行数据或产生一个数据。

   6>游标变量:

       游标变量可以在运行时与不同的语句关联,是动态的,被用于处理多行的查询结果集。在同一个pl/sql中,游标变量不同于特定的查询绑定,而是在打开游标时才确定对应的查询。因此游标变量可以依赖于多个查询。使用游标变量前,必须先声明,然后在运行时必须为其分配存储空间。

    a.声明游标变量:pl/sql中引用类型通过ref <类型>声明,后面的类型必须是一个指向经过定义的类型的指针,游标可以使用的类型就是REF CURSOR

    b.打开游标变量:如果要将一个游标变量与一个特定的select 语句相关联,需要使用 open  for语句。如果游标变量是受限的,则select语句的返回类型与游标所限的记录类型匹配,如果不匹配将会报错。

    c.关闭游标变量:与静态关闭游标相同,使用close语句

9.存储过程:

    1>创建存储过程(语法见上)

    2>执行存储过程(语法见上)

    3>删除存储过程(语法见上)

    4>存储过程的参数类型及传递

          a.in参数类型----输入类型的参数,表示这个参数值输入给过程,供过程使用

           b.out参数类型----输出类型的参数,表示这个参数在过程中赋值,可以传给过程体以外的部分或环境

          c.in out参数类型----既向过程体传值,在过程体中也被赋值而传向过程体外。

     5>存储过程(返回数据集)

          a.创建包

            

           b.创建存储过程

            

           c.调用存储过程

             

 10.函数:

           一般用于计算和返回一个值,函数与过程在创建的形式上有些相似,也是编译后放在内存中供用户使用,只不过调用时函数要用表达式,而不像过程只需调用过程名。另外函数必须有一个返回值,而过程则没有。

     1>创建函数:

         

   2>调用函数:可以使用全局变量接收其返回值

       

    3>删除函数:当一个函数不使用时,从系统中删除它。

11.程序包:

    1>概念---package简称包,用于将逻辑相关的PL/SQL 块或元素(变量,常量,自定义数据类型,异常,过程,函数,游标)等组织在一起,作为一个完整的单元存储在数据库中,用名称来标识程序包。类似于面向对象中的类,基中变量相当于类的成员变量,而过程和函数则相当于类中的方法。

    2>原理---程序包有两个独立的部分:说明部分和包体部分。这两部独立存在于数据字典中。说明部分是包与应用程序之间的接口,只是过程、函数、游标等的名称或者首部。包体部分才是这些过程,函数,游标等的具体实现。包体部分在开始构建应用程序框架时暂不需要。对包体的更新不会导致重新编译包的应用程序,而对说明部分的更新则需要重新编译每一个调用包的应用程序。

    3>创建包:由包说明和包体部分,包说明部分相当于一个包的头,对包的所有部件进行简单声明,这些部件可以被外界应用程序访问。

           

    4>调用包:(调用过程,见命令部分)

    5>删除包:(调用过程,见命令部分)   

12.触发器:

      通常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

      1>原理:与普通的过程,函数不同的是函数需要用户显式地调用才执行,而触发器则是当某些事件发生时,由oracle自动执行,触发器的执行对用户来说是透明的

      2>类型:

            a.dml触发器----对表或视图执行DML操作时触发

            b.INSERT OF 触发器----只定义在视图上,用于替换实际的操作语句。

            c.系统触发器-----对数据库系统进行操作(如DDL语句,启动或关闭数据库等系统事件)时触发。

      3>创建触发器:

           

       4>执行触发器:

           当某些事件发生时,由oracle自动执行触发器。对一张表的触发器最好加以限制,否则会因为触发器过多而加重负载,影响性能。最好一张表的触发器编写在一个触发体中。可以改善性能。

        5>删除触发器:(语法见上)
        6>示例:
         

         

       

   

 

抱歉!评论已关闭.