oracle大纲(一)

ORACLE 基础

ORACLE 数据库具有以下特点:

  • 支持多用户、大事务量的事务处理
  • 数据安全性和完整性控制
  • 支持分布式数据处理
  • 可移植性

ORACLE 体系结构

  • 数据库
  • 实例
  • 数据文件(dbf)
  • 表空间
    -用户

在这里插入图片描述
这是Oracle的整体结构图

创建表空间

创建表空间
create tablespace  waterboss
datafile 'c:\waterboss.dbf'
【size 100m  autoextend on  next 10m maxsize 1g;】
waterboss 为表空间名称
datafile 用于设置物理文件名称
size 用于设置表空间的初始大小
autoextend on 用于设置自动增长,如果存储量超过初始大小,则开始自动扩容
next 用于设置扩容的空间大小

删除表空间(包括其下的文件)
drop tablespace tpname including contents and datafiles
设置表空间概念只读
alter tablespace tablespace_name read write;
alter tablespace  tpname read only;
设置表空间离线在线(脱机表空间)
alter tablespace tpname offline/online;
重命名表空间
alter tablespace tablespace_name1 rename to tablespace_name2;

创建用户

create user test
identified by 123456
default tablespace waterboss

test为创建的用户名
identified by 用于设置用户的密码
default tablesapce 用于指定默认表空间名称

用户赋权

grant dba,resourse,connect to wateruser;
revoke dba,resourse,connect from rose;
EXP_FULL_DATABASE、IMP_FULL_DATABASE角色分别用于操作数据库导出、导入相关的操作  

表的创建、修改与删除

创建表

CREATE TABLE 表名称(
字段名 类型(长度) primary key,
字段名 类型(长度),
.......
);

非空约束(not null)
如果在列上定义了not null,那么当插入数据时,必须为列提供,数据不能为NULL。约束只能在列级定义,不能在表级定义。

唯一性约束(unique)    UK
当定义了唯一约束后,该列值是不能重复的,但是可以为null。

主键约束(primary key)    PK
用于唯一的标识表行的数据,当定义主键约束后,该列不但不能重复而且不能为NULL。一张表最多只能有一个主键,但是可以由多个unique约束。

创建主键或唯一约束后,ORACLE会自动创建一个与约束同名的索引(UNIQUENES为UNIQUE唯一索引)。需要注意的是:每个表只能有且有一个主键约束。    

外键约束(foreign key)    FK
用于定义主表和从表之间的关系,外键约束要定义在从表上,主要则必须具有主键约束或是unique约束,当定义外键约束后,要求外键列数据必须在主表的主键列存在或是为NULL。

用来维护从表(Child Table)和主表(Parent Table)之间的引用完整性. 外键约束是个有争议性的约束,它一方面能够维护数据库的数据一致性,数据的完整性。防止错误的垃圾数据入库; 另外一方面它会增加表插入、更新等SQL性能的额外开销,不少系统里面通过业务逻辑控制来取消外键约束。例如在数据仓库中,就推荐禁用外键约束。

检查约束(目前MySQL不支持、Oracle支持)(check key)    CK
用于强制行数据必须满足的条件,假定在sal列上定义了check约束,并要求sal列值在1000~2000之间,如果不在1000~2000之间就会提示出错。

数据类型:

字符型

  1. CHAR : 固定长度的字符类型,最多存储 2000 个字节
  2. VARCHAR2 :可变长度的字符类型,最多存储 4000 个字节
  3. LONG : 大文本类型。最大可以存储 2 个 G

数值型

    NUMBER : 数值类型

    例如:NUMBER(5) 最大可以存的数为 99999

    NUMBER(5,2) 最大可以存的数为 999.99

 日期型

        DATE:日期时间型,精确到秒

        TIMESTAMP:精确到秒的小数点后 9 位

 二进制型(大数据类型)

        CLOB : 存储字符,最大可以存 4 个 G
        BLOB:存储图像、声音、视频等二进制数据,最多可以存 4 个 G

修改表

    增加字段

    ALTER TABLE 表名称 ADD(列名 1 类型 [DEFAULT 默认值],列名 1 类型 [DEFAULT 默认值]…)

    修改字段

    ALTER TABLE 表名称 MODIFY(列名 1 类型 [DEFAULT 默认值],列名 1 类型 [DEFAULT 默认值]…)
 

 修改字段名

ALTER TABLE 表名称 RENAME COLUMN 原列名 TO 新列名

删除字段名

ALTER TABLE T_OWNERS DROP COLUMN REMARK

删除表

    drop table 表名称

数据增删改

        INSERT INTO 表名[(列名 1,列名 2,…)]VALUES(值 1,值2,…)
        UPDATE 表名 SET 列名 1=值 1,列名 2=值 2,…WHERE 修改条件;
        DELETE FROM 表名 WHERE 删除条件;
        TRUNCATE TABLE 表名称 ---- 删除表

比较 truncat 与 delete 实现数据删除?

        delete 删除的数据可以 rollback
        delete 删除可能产生碎片,并且不释放空间
        truncate 是先摧毁表结构,再重构表结构

JDBC 连接 ORACLE

//加载驱动

static{
    try {
        Class.forName("oracle.jdbc.driver.OracleDriver");
    } catch (ClassNotFoundException e) {
        e.printStackTrace();  
    }
}
// 获取数据库连接
public static java.sql.Connection getConnection() throwsSQLException{
    return java.sql.DriverManager.getConnection("jdbc:oracle:thin:@192.168.80.10:1521:orcl","wateruser", "itcast");
}

//JDBC 驱动为:

    oracle.jdbc.OracleDriver

    连接字符串( 瘦连接 ):

    jdbc:oracle:thin:@虚拟机的 IP:1521:orcl

数据导出与导入
整库导出与导入

    整库导出命令

    exp system/itcast full=y 或者 exp system/itcast file=文件名 full=y

    整库导入命令

    imp system/itcast full=y or imp system/itcast full=y file=water.dmp

按用户导出与导入

    按用户导出

    exp system/itcast owner=wateruser file=wateruser.dmp

    按用户导入

    imp system/itcast file=wateruser.dmp fromuser=wateruser

    按表导出与导入

        按表导出 exp wateruser/itcast file=a.dmp tables=t_account,a_area
        按表导入 imp wateruser/itcast file=a.dmp tables=t_account,a_area

 ORACLE 查询

单表查询
简单条件查询

        精确查询 select * from T_OWNERS where watermeter=‘30408’
        模糊查询 select * from t_owners where name like ‘%刘%’
        and 运算符 select * from t_owners where name like ‘%刘%’ and housenumber like ‘%5%’
        or 运算符 select * from t_owners where name like ‘%刘%’ or housenumber like ‘%5%’
        and 与 or 运算符混合使用 select * from t_owners where (name like ‘%刘%’ or housenumber like ‘%5%’) and addressid=3
        范围查询 select * from T_ACCOUNT where usenum>=10000 and usenum<=20000
        空值查询 select * from T_PRICETABLE t where maxnum is null

去掉重复记录

        select distinct addressid from T_OWNERS

排序查询

        升序排序 select * from T_ACCOUNT order by usenum
        降序排序 select * from T_ACCOUNT order by usenum desc

基于伪列的查询

        ROWID 具体某一行数据的物理地址 select rowID,t.* from T_AREA t
        ROWNUM 每一行的行号,查询后才会标注 select rownum,t.* from T_OWNERTYPE t

聚合统计

        聚合函数

        sum*     select sum(usenum) from t_account where year=‘2012’

        avg*      select avg(usenum) from T_ACCOUNT where year=‘2012’

        max*     select max(usenum) from T_ACCOUNT where year=‘2012’

        min*      select min(usenum) from T_ACCOUNT where year=‘2012’

        count*   select count(*) from T_OWNERS t where ownertypeid=1

        分组聚合 Group by* select areaid,sum(money) from t_account group by areaid
        分组后条件查询 having* select areaid,sum(money) from t_account group by areaid having sum(money)>169000

连接查询
多表内连接查询

    查询显示业主编号,业主名称,业主类型名称

    select o.id 业主编号,o.name 业主名称,ot.name 业主类型
    from T_OWNERS o,T_OWNERTYPE ot
    where o.ownertypeid=ot.id

    查询显示业主编号,业主名称、地址和业主类型

     select o.id 业主编号,o.name 业主名称,ad.name 地址,ot.name 业主类型
     from T_OWNERS o,T_OWNERTYPE ot,T_ADDRESS ad
     where o.ownertypeid=ot.id and o.addressid=ad.id

    查询显示业主编号、业主名称、地址、所属区域、业主分类

     select o.id 业主编号,o.name 业主名称,ar.name 区域, ad.name 地址, ot.name 业主类型
      from T_OWNERS o ,T_OWNERTYPE ot,T_ADDRESS ad,T_AREA ar
    where o.ownertypeid=ot.id and o.addressid=ad.id and ad.areaid=ar.id

    查询显示业主编号、业主名称、地址、所属区域、收费员、业主分类

    select ow.id 业主编号,ow.name 业主名称,ad.name 地址, ar.name 所属区域,op.name 收费员, ot.name 业主类型
    from T_OWNERS ow,T_OWNERTYPE ot,T_ADDRESS ad ,T_AREA ar,T_OPERATOR op
    where ow.ownertypeid=ot.id and ow.addressid=ad.id and ad.areaid=ar.id and ad.operatorid=op.id

左外连接查询

    查询业主的账务记录,显示业主编号、名称、年、月、金额。如果此业主没有账务记录也要列出姓名
    SQL1999标准:

    SELECT ow.id,ow.name,ac.year ,ac.month,ac.money
    FROM T_OWNERS ow left join T_ACCOUNT ac
    on ow.id=ac.owneruuid

Oracle语法:

    SELECT ow.id,ow.name,ac.year ,ac.month,ac.money FROM
    T_OWNERS ow,T_ACCOUNT ac  WHERE ow.id=ac.owneruuid(+)

右外连接查询

    查询业主的账务记录,显示业主编号、名称、年、月、金额。如果账务记录没有对应的业主信息,也要列出记录
    SQL1999标准:

    select ow.id,ow.name,ac.year,ac.month,ac.money from
    T_OWNERS ow right join T_ACCOUNT ac  on ow.id=ac.owneruuid

Oracle语法:
    select ow.id,ow.name,ac.year,ac.month,ac.money from
    T_OWNERS ow , T_ACCOUNT ac  where ow.id(+) =ac.owneruuid

子查询
where 子句中的子查询

    单行子查询: 只返回一条记录 / 单行操作符(= <> < <= > >=)
    查询 2012 年 1 月用水量大于平均值的台账记录

    select * from T_ACCOUNT
    where year='2012' and month='01' and usenum> ( select avg(usenum) from T_ACCOUNT where year='2012'  and month='01' )

    多行子查询: 返回了多条记录 多行操作符(in any all)
    in 运算符

    select * from T_OWNERS where addressid in ( 1,3,4 )
    select * from T_OWNERS where addressid in ( select id from t_address where name like '%花园%' )
    select * from T_OWNERS where addressid not in ( select id from t_address where name like '%花园%' )

from 子句中的子查询

    查询显示业主编号,业主名称,业主类型名称,条件为业主类型为”居民”,使用子查询实现。

    select * from
    (select o.id 业主编号,o.name 业主名称,ot.name 业主类型 from T_OWNERS o,T_OWNERTYPE ot where       o.ownertypeid=ot.id)
    where 业主类型='居民'

select 子句中的子查询 ? select 子句的子查询必须为单行子查询

    列出业主信息,包括 ID,名称,所属地址,所属区域。

    select id,name,
    ( select name from t_address where id=addressid )addressname,( select (select name from t_area where id=areaid ) fromt_address where id=addressid ) adrename
    from t_owners;

分页查询
简单分页

    select rownum,t.* from T_ACCOUNT t where rownum<=10
    select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20) where r>10

基于排序的分页

   select * from (select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc) where r>10 !
   select rownum r,t.* from T_ACCOUNT t where rownum<=20 order by usenum desc !
   select * from (select rownum r,t.* from (select * from T_ACCOUNT order by usenum desc) t where rownum<=20 ) where r>10   

单行函数
字符函数

        求字符串长度 LENGTH select length(‘ABCD’) from dual;
        求字符串的子串 SUBSTR select substr(‘ABCD’,2,2) from dual;
        字符串拼接 CONCAT select concat(‘ABC’,‘D’) from dual; 或者 select ‘ABC’||‘D’ from dual;

数值函数

        四舍五入函数 ROUND select round(100.567) from dual 或者 select round(100.567,2) from dual
        截取函数 TRUNC select trunc(100.567) from dual 或者 select trunc(100.567,2) from dual
        取模 MOD select mod(10,3) from dual

日期函数

        当前日期和时间 select sysdate from dual
        加月函数 ADD_MONTHS select add_months(sysdate,2) from dual
        求所在月最后一天 LAST_DAY select last_day(sysdate) from dual
        日期截取 TRUNC select TRUNC(sysdate) from dual

        select TRUNC(sysdate,'yyyy') from dual
        select TRUNC(sysdate,'mm') from dual

转换函数

* 数字转字符串 TO_CHAR  .....select TO_CHAR(1024) from dual
* 日期转字符串 TO_CHAR....select TO_CHAR(sysdate,'yyyy-mm-dd') from dual
                         select TO_CHAR(sysdate,'yyyy-mm-dd hh:mi:ss') from dual
*  字符串转日期 TO_DATE select TO_DATE('2017-01-01','yyyy-mm-dd') from dual
* 字符串转数字 TO_NUMBER select to_number('100') from dual

其它函数

        空值处理函数 NVL : … NVL(检测的值,如果为 null 的值);
        空值处理函数 NVL2:…NVL2(检测的值,如果不为 null 的值,如果为 null 的值);
        条件取值 decode: decode(条件,值 1,翻译值 1,值 2,翻译值 2,…值 n,翻译值 n,缺省值)【功能】根据条件返回相应值

   select name ,(case ownertypeid
   when 1 then '居民'
   when 2 then '行政事业单位'
   when 3 then '商业'
   else '其它'
   end ) from T_OWNERS

   select name,(case
   when ownertypeid= 1 then '居民'
   when ownertypeid= 2 then '行政事业'
   when ownertypeid= 3 then '商业'
   end ) from T_OWNERS

行列转换

   select (select name from T_AREA where id= areaid ) 区域,
   sum( case when month='01' then money else 0 end) 一月,
   sum( case when month='02' then money else 0 end) 二月,
   sum( case when month='03' then money else 0 end) 三月,
   sum( case when month='04' then money else 0 end) 四月,
   sum( case when month='05' then money else 0 end) 五月,
   sum( case when month='06' then money else 0 end) 六月,
   sum( case when month='07' then money else 0 end) 七月,
   sum( case when month='08' then money else 0 end) 八月,
   sum( case when month='09' then money else 0 end) 九月,
   sum( case when month='10' then money else 0 end) 十月,
   sum( case when month='11' then money else 0 end) 十一月,
   sum( case when month='12' then money else 0 end) 十二月
   from T_ACCOUNT where year='2012' group by areaid

按季度统计 2012 年各个地区的水费

   select (select name from T_AREA where id= areaid ) 区域,
   sum( case when month>='01' and month<='03' then money else 0 end) 第一季度,
   sum( case when month>='04' and month<='06' then money else 0 end) 第二季度,
   sum( case when month>='07' and month<='09' then money else 0 end) 第三季度,
   sum( case when month>='10' and month<='12' then money else 0 end) 第四季度
   from T_ACCOUNT where year='2012' group by areaid

分析函数

        RANK 相同的值排名相同,排名跳跃 select rank() over(order by usenum desc ),usenum from T_ACCOUNT

                                                   例如:age:10、10、20、30、50;结果:1、1、3、4、5
        DENSE_RANK 相同的值排名相同,排名连续 select dense_rank() over(order by usenum desc ),usenum from T_ACCOUNT

                                                   例如:age:10、10、20、30、50;结果:1、1、2、3、4
        ROW_NUMBER 返回连续的排名,无论值是否相等 select row_number() over(order by usenum desc ),usenum from T_ACCOUNT

                                                   例如:age:10、10、20、30、50;结果:1、2、3、4、5

集合运算

    UNION ALL(并集),返回各个查询的所有记录,包括重复记录。

    select * from t_owners where id<=7
    union all
    select * from t_owners where id>=5

    UNION(并集),返回各个查询的所有记录,不包括重复记录。

    select * from t_owners where id<=7
    union
    select * from t_owners where id>=5

    INTERSECT(交集),返回两个查询共有的记录。

    select * from t_owners where id<=7
    intersect
    select * from t_owners where id>=5

    MINUS(差集),返回第一个查询检索出的记录减去第二个查询检索出的记录之后剩余的记录。在这里插入图片描述

    select * from t_owners where id<=7
    minus
    select * from t_owners where id>=5

ORACLE 对象
视图
定义:

视图其实是一个虚拟的表,它的数据其实来自于表。如果更改了视图的数据,表的数据也自然会变化,更改了表的数据,视图也自然会变化。一个视图所存储的并不是数据,而是一条 SQL语句。
优点:

        简化数据操作:视图可以简化用户处理数据的方式。
        着重于特定数据:不必要的数据或敏感数据可以不出现在视图中。
        视图提供了一个简单而有效的安全机制,可以定制不同用户对数据的访问权限。
        提供向后兼容性:视图使用户能够在表的架构更改时为表创建向后兼容接口。

语法:

    创建视图

    CREATE [OR REPLACE] [FORCE] VIEW view_name
    AS subquery(sql语句)
    [WITH CHECK OPTION ]
    [WITH READ ONLY]

   OR REPLACE :若所创建的试图已经存在,ORACLE 自动重建该视图;----修改视图
    FORCE     :不管基表是否存在 ORACLE 都会自动创建该视图;---- 带错误地试图
    subquery  :一条完整的 SELECT 语句,可以在该语句中定义别名;
    WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;----带检查约束
    WITH READ ONLY    :该视图上不能进行任何 DML 操作。 ---- 只读视图

    删除试图

    DROP VIEW view_name

键保留表(复杂视图,即关联多个表时)

    键保留表是理解连接视图修改限制的一个基本概念。该表的主键列全部显示在视图中,并且它们的值在视图中都是唯一且非空的。也就是说,表的键值在一个连接视图中也是键值,那么就称这个表为键保留表。

物化视图
定义:

    视图是一个虚拟表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被执行一次。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
    物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。而对一个物化视图查询的执行效率与查询一个表是一样的。

创建物化视图:

      CREATE METERIALIZED VIEW view_name
      [BUILD IMMEDIATE | BUILD DEFERRED ]
      REFRESH [FAST|COMPLETE|FORCE]
      [
     ON [COMMIT |DEMAND ] | START WITH (start_time) NEXT
     (next_time)
     ]
     AS
     subquery

    BUILD IMMEDIATE 是在创建物化视图的时候就生成数据 BUILD DEFERRED
    则在创建时不生成数据,以后根据需要再生成数据。 默认为 BUILD IMMEDIATE。

        刷新(REFRESH):指当基表发生了 DML 操作后,物化视图何时采用哪种方式和基表进行同步。

        REFRESH 后跟着指定的刷新方法有三种:FAST、COMPLETE、FORCE。 FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE 刷新对整个物化视图进行完全的刷新。如果选择 FORCE 方式,则
        Oracle 在刷新时会去判断是否可以进行快速刷新,如果可以则采用 FAST 方式,否则采用 COMPLETE的方式。FORCE
        是默认的方式。

        刷新的模式有两种:ON DEMAND 和 ON COMMIT。 ON DEMAND 指需要手动刷新物化视图(默认)。ON COMMIT 指在基表发生 COMMIT 操作时自动刷新。

        手动书信物化视图
        begin
        DBMS_MVIEW.refresh(‘物化视图名称’,‘C’);
        end;
        或者命令窗口 输入 EXEC DBMS_MVIEW.refresh(‘物化视图名称’,‘C’);

        创建增量刷新的物化视图

        创建物化视图中涉及表的物化视图日志
        在查询语句中,必须包含所有表的 rowid ( 以 rowid 方式建立物化视图日志 )

序列
定义:

序列是 ORACLE 提供的用于产生一系列唯一数字的数据库对象。
语法

CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默
认是 1
[START WITH n] //开始的值,递增默认是 minvalue 递减是 maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中
* NEXTVAL 返回序列的下一个值
* CURRVAL 返回序列的当前值

修改和删除序列

        ALTER SEQUENCE 序列名称 MAXVALUE 5000 CYCLE;
        DROP SEQUENCE 序列名称;

同义词
定义:

    同义词实质上是指定方案对象的一个别名。通过屏蔽对象的名称和所有者以及对分布式数据库的远程对象提供位置透明性,同义词可以提供一定程度的安全性。同时,同义词的易用性较好,降低了数据库用户的
    SQL 语句复杂度。 同义词允许基对象重命名或者移动,这时,只需对同义词进行重定义,基于同义词的应用程序可以继续运行而无需修改。
    你可以创建公共同义词和私有同义词。其中,公共同义词属于 PUBLIC
    特殊用户组,数据库的所有用户都能访问;而私有同义词包含在特定用户的方案中,只允许特定用户或者有基对象访问权限的用户进行访问。
    同义词本身不涉及安全,当你赋予一个同义词对象权限时,你实质上是在给同义词的基对象赋予权限,同义词只是基对象的一个别名。

        create [public] SYNONYM synooym for object;

索引
定义:

    索引是用于加速数据存取的数据对象。合理的使用索引可以大大降低 i/o 次数,从而提高数据访问性能。
    索引是需要占据存储空间的,也可以理解为是一种特殊的数据。形式类似于下图的一棵“树”,而树的节点存储的就是每条记录的物理地址,也就是我们提到的伪列(ROWID)

        普通索引 create index 索引名称 on 表名(列名);
        唯一索引 create unique index 索引名称 on 表名(列名);
        复合索引 create index 索引名称 on 表名(列名,列名…);
        反向键索引 create index 索引名称 on 表名(列名) reverse; 应用场景:当某个字段的值为连续增长的值,如果构建标准索引,会形成歪脖子树。这样会增加查询的层数,性能会下降。建立反向键索引,可以使索引的值变得不规则,从而使索引树能够均匀分布。
        位图索引 create bitmap index 索引名称 on 表名(列名); 使用场景:位图索引适合创建在低基数列上位图索引不直接存储 ROWID,而是存储字节位到 ROWID 的映射 优点:减少响应时间,节省空间占用

ORACLE 编程
PL/SQL
定义:

    PL/SQL(Procedure Language/SQL)是 Oracle 对 sql 语言的过程化扩展,指在 SQL
    命令语言中增加了过程处理语句(如分支、循环等),使 SQL 语言具有过程处理能力。把 SQL
    语言的数据操纵能力与过程语言的数据处理能力结合起来,使得 PLSQL 面向过程但比过程语言简单、高效、灵活和实用。

    基本语法

    [declare
    – 声明变量
    ]
    begin
    – 代码逻辑
    [exception
    – 异常处理
    ]
    end;

    变量:

    声明变量:变量名 类型(长度)
    变量赋值:变量名:=变量值

    属性类型

    %TYPE 引用型: 引用某表某列的字段类型
    %ROWTYPE 记录型: 标识某个表的行记录类型

    异常

    exception
      when 异常类型 then
      异常处理逻辑

    预定义异常 - 当 PL/SQL 程序违反 Oracle 规则或超越系统限制时隐式引发

    NO_DATA_FOUND - 使用 select into 未返回行
    TOO_MANY_ROWS - 执行 select into 时,结果集超过一行

    用户定义异常 - 用户可以在 PL/SQL 块的声明部分定义异常,自定义的异常通过 RAISE 语句显式引发

    条件判断

        if 条件 then
        业务逻辑
        elsif 条件 then
        业务逻辑
        else
        业务逻辑
        end if;

    循环

    无条件循环

    loop
    – 循环语句
    end loop;

    条件循环

    while 条件
    loop
    end loop;

    for循环

    for 变量 in 起始值…终止值
    loop
    end loop;

    游标

    .什么是游标

    游标是系统为用户开设的一个数据缓冲区,存放 SQL 语句的执行结果。我们可以把游标理解为 PL/SQL 中的结果集。

    语法结构及示例

    cursor 游标名称 is SQL 语句;

   open 游标名称
   loop
   fetch 游标名称 into 变量
   exit when 游标名称%notfound
   end loop;
   close 游标名称

   带参数的游标
   declare

   v_pricetable T_PRICETABLE%rowtype;-- 价格行对象
   cursor cur_pricetable(v_ownertypeid number) is select *
   from T_PRICETABLE where ownertypeid=v_ownertypeid;-- 定义游标
   begin
   open cur_pricetable(2);-- 打开游标
   loop
   fetch cur_pricetable into v_pricetable;-- 提取游标到变量
   exit when cur_pricetable%notfound;-- 当游标到最后一行下面退出循环
   dbms_output.put_line('价格:'||v_pricetable.price ||'吨位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
   end loop;
   close cur_pricetable;-- 关闭游标
   end ;

    for 循环提取游标值

      declare
        cursor cur_pricetable(v_ownertypeid number) is select *
        from T_PRICETABLE where ownertypeid=v_ownertypeid;-- 定义游
        标
        begin
        for v_pricetable in cur_pricetable(3)
        loop
        dbms_output.put_line('价格:'||v_pricetable.price ||'吨
        位:'||v_pricetable.minnum||'-'||v_pricetable.maxnum );
        end loop;
        end ;

存储函数
定义:

    存储函数又称为自定义函数。可以接收一个或多个参数,返回一个结果。在函数中我们可以使用 P/SQL 进行逻辑的处理。

存储函数语法结构

    CREATE [ OR REPLACE ] FUNCTION 函数名称
  (参数名称 参数类型, 参数名称 参数类型, ...)
    RETURN 结果变量数据类型
    IS
    变量声明部分;
    BEGIN
    逻辑部分;
    RETURN 结果变量;
    [EXCEPTION
    异常处理部分]
    END;

存储过程
什么是存储过程

    存储过程是被命名的 PL/SQL 块,存储于数据库中,是数据库对象的一种。应用程序可以调用存储过程,执行相应的逻辑。
    存储过程与存储函数都可以封装一定的业务逻辑并返回结果,存在区别如下:

        存储函数中有返回值,且必须返回;而存储过程没有返回值,可以通过传出参数返回多个值。
        存储函数可以在 select 语句中直接使用,而存储过程不能。过程多数是被应用程序所调用。
        存储函数一般都是封装一个查询结果,而存储过程一般都封装一段事务代码。

存储过程语法结构

  CREATE [ OR REPLACE ] PROCEDURE 存储过程名称
    (参数名 类型, 参数名 类型, 参数名 类型)
    IS|AS
    变量声明部分;
    BEGIN
    逻辑部分
    [EXCEPTION
    异常处理部分]
    END;

参数只指定类型,不指定长度
过程参数的三种模式:

        IN 传入参数(默认)
        OUT 传出参数 ,主要用于返回程序运行结果
        IN OUT 传入传出参数

触发器
定义

    数据库触发器是一个与表相关联的、存储的 PL/SQL
    程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle
    自动地执行触发器中定义的语句序列。

触发器可用于

     数据确认
     实施复杂的安全性检查
     做审计,跟踪表上所做的数据操作等
     数据的备份和同步

触发器分类

     前置触发器(BEFORE)
     后置触发器(AFTER)

创建触发器的语法

    CREATE [or REPLACE] TRIGGER 触发器名
    BEFORE | AFTER
    [DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]]
    ON 表名
    [FOR EACH ROW ][WHEN(条件) ]
    declare
    ……
   begin
   PLSQL 块
   End ;

        FOR EACH ROW 作用是标注此触发器是行级触发器 语句级触发器
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值