zoukankan      html  css  js  c++  java
  • oracle的包和大对象学习笔记

    代码
    包的概念 
    包是存储在一起的相关对象组成的P L 
    / S Q L结构
    包有两个独立的部分,即说明部分和包体,这两部分独立地存储在数据字典中 
    包的类型:
    自定义包:
    oracle内置包:
    自定义包:
    包的规格说明部分: 
    CREATE [OR REPLACE] PACKAGE 
    IS|AS
    -- 公有类型声明
    < Public Subprogram specifications> -- 公有子程序声明
    END ; 
    程序包主体部分 : 
    CREATE [OR REPLACE] PACKAGE BODY 
    IS|AS
    -- 私有类型声明
    < Private Subprogram bodies> -- 私有子程序体
    < Private cursor define> -- 私有游标定义
    < putblic Subprogram bodies> -- 公有子程序体
    < putblic cursor define> -- 私有游标定义
    END ; 
    ORACLE9i内置包 
    扩展数据库的功能
    为 PL
    /SQL 提供对 SQL 功能的访问
    用户 SYS 拥有所有程序包
    可以由任何用户访问
    DBMS_ALERT支持数据库事件的异步通知
    DBMS_STANDARD提供语言工具
    DBMS_DDL某些DDL命令的PL
    /SQL等效项
    CALENDAR提供日历维护功能
    DBMS_LOB操纵ORACLE的LOB数据
    DBMS_OUTPUT在SQL
    *PLUS或服务管理器中提供屏幕输出
    DBMS_PIPE会话间异步通信
    DBMS_ROWID允许从ROWID获得信息
    DBMS_SESSIONALTER SESSION的PL
    /SQL等效项
    DBMS_SQL动态PL
    /SQL和SQL
    内置包"DBMS_OUTPUT" 
    DBMS_OUTPUT是一个拥有几个入口点(API)的程序包,使用最多的是以下几个:
    PUT
    ----在输出缓冲区中放置一个字符串,NUMBER或DATE,而不填加新换行符;
    PUT_LINE----在输出缓冲区中放置一个STRING,NUMBER或DATE字符串,并加换行符;
    NEW_LINE----在输出流中放置一个新换行符;
    ENABLE/DISABLE----启用或禁用程序包中的数据缓冲区,有效地从程序上打开和关闭DBMS_OUTPUT。 
    内置包“DBMS_STANDARD” 和"DBMS_LOB" 
    “DBMS_STANDARD”程序包提供帮助应用程序与ORACLE进行交互的语言工具 
    DBMS_LOB数据包提供了访问BLOB、CLOB、NCLOB和BFILE的例程
    可以使用DBMS_LOB访问和操作完整的或部分的LOB
    DBMS_LOB可以读取也可以修改BLOB、CLOB和NCLOB,而且还提供了对BFILE的只读操作
    大型对象类型简介 

    在Oracle9i中,还可以使用附加的数据类型来存储大型数据
    LOB数据类型 描述
    BLOB 二进制LOB,为二进制数据,最长可达4GB,存储在数据库中
    CLOB 字符LOB,字符数据,最大可达4GB,存储在数据库中
    BFILE 二进制文件,存储在数据库之外的只读型二进制数据,最大长度由操作系统限制
    NCLOB 支持多字节字符集合的一个CLOB类型

    LOB(大型数据对象)由两个部分组成
    --数据和定位器
    LOB数据:存储的实际数据
    LOB定位器:指定数据库中对象的位置指示器
    在大对象字段中插入值 
    初始化值
    当在包含有LOB的表中插入一个记录时,可以使用DBMS_LOB包中的函数告诉Oracle对于内部存储的LOB列,生成一个空的定位器。
    一个空的定位器与一个NULL值不同。如果一个内部存储的LOB列的值为NULL,则在把它更新为一个非NULL值之前,必须先把它设置为一个空的定
    位器。 
    LOB数据类型 空定位器函数
    BLOB EMPTY_BLOB()
    CLOB EMPTY_CLOB()
    NCLOB EMPTY_NCLOB()
    在数据库中要创建一个DIRECTORY对象来引用目录
    语法:
    CREATE DIRECTORY AS 
    directory:Oracle中的目录对象名
    disk_path:磁盘路径

    更新大对象字段 
    在对一个LOB数据值修改之前,必须要锁定被更新的行
    通常情况下,行锁定发生在后台,由Oracle自动加锁和解锁。
    如果是在更新包含有LOB数据的行,则在执行UPDATE命令之前,需要锁定该行,否则就不能更新无效。
    在SELECT语句后加上FOR UPDATE子句,就可以实行对行的加锁。 
    显示大对象中的数据
    无法通过SELECT语句显示LOB中的数据, CLOB和NCLOB数据类型除外
    使用DBMS_LOB数据包操作大对象 
    过程或函数 描述
    READ 用来读入一段LOB值的过程
    SUBSTR 用来在LOB值上执行SQL SUBSTR函数的函数
    INSTR 用来在LOB值上执行SQL INSTR函数的函数
    GETLENGTH 用来在LOB值上执行SQL LENGTH函数的函数
    COMPARE 用来比较两个LOB值的函数
    WRITE 用来在一个LOB值中的指定点写入数据到此LOB值的过程
    APPEND 用来在一个LOB值中的内容添加到另一个LOB值的过程
    ERASE 用来删除全部或部分LOB值的过程
    TRIM 用来减少一个LOB值的大小尺寸,是从值的结尾处开始删除字符或字节
    COPY 用来把全部或部分的LOB值从一个LOB列复制到另一个LOB列的过程

    DBMS_LOB.READ过程
    过程READ读入一个LOB值中的一部分数据。过程READ有4个参数,它们按照以下的顺序来指定:
    1.LOB定位器
    2.欲读入的字节或字符数
    3.从LOB数据起点开始的位移(即读入开始的位置)
    4.从READ过程输出的数据。该参数是一个输出参数。
    如果在指定的字节读入之前,遇到此LOB数据的结尾,则READ过程将返回一个错误。
    需要选取检索LOB定位器数值,并把它作为参数提供给READ过程,最后通过DBMS_OUTPUT显示读入的文本书。
    举例:对于WORK_TYPE表中,读取CRITERION字段的前8个字符

    DBMS_LOB.SUBSTR函数 
    包DBMS_LOB中的SUBSTR函数在一个LOB数据值上执行SQL SUBSTR函数。
    此函数具有三个输入参数,且必须按照下面的顺序来指定:
    1.LOB定位器
    2.欲读入的字节或字符个数
    3.从此LOB数据值开始处计算的位移(即读入的开始位置)
    由于SUBSTR是一个函数,所以与READ过程不同,将不会有输出变量值,直接从SUBSTR中返回。

    DBMS_LOB.INSTR函数 
    INSTR函数在一个LOB数据值上执行函数SQL INSTR。函数INSTR有四个参数,且必须按照如下顺序指定:
    1.LOB定位器
    2.对应LOB数据值的测试模式(对于BLOB为RAW字节, CLOB为字符串)
    3.从此LOB数据值起始处开始的位移(读入操作的起点)
    4.在此LOB数据值中出现的某个模式
    INSTR函数搜索LOB数据以寻找由字节或字符构成的特定模式,函数返回的是在被检索的字符串中此模式的起始位置。
    例如:INSTR(’ABCABC’,’A’,
    11)。
    GETLENGTH函数返回某个LOB数据值的长度。这个函数只需要一个参数,就是LOB定位器。
     
    DBMS_LOB.COMPARE函数
    COMPARE函数对两个LOB的值作比较。如果这两个LOB的值相同,则COMPARE函数返回一个值0;否则它将返回1个非0的整数(通常为1或
    -1)。
    为了执行COMPARE函数,DBMS_LOB包必须执行两个READ函数并比较其结果。所以,对于每个欲被比较的LOB数据值,需要分别提供其定位器的值
    或位移(offset)值;而对于这两个LOB数据值来说,要比较字节或字符串个数是相同的。
    COMPARE函数只能比较相同数据类型的LOB。
    COMPARE函数有5个参数,它们必须按照下面的顺序指定:
    1.对应第一个LOB定位器
    2.对应第二个LOB定位器
    3.总数变量(即需要比较的字节或字符个数)
    4.从第一个LOB值起始处算起的位移(即读操作的起始点)
    5.从第二个LOB值起始处算起的位移(即读操作的起始点)
    由于被比较的两个LOB具有不同的位移值,所以能够将一个LOB值中的某一部分与另外一个不同的LOB值中的另外不同的部分作比较。
     
    DBMS_LOB.WRITE过程
    WRITE过程允许在LOB中指定的位置写入数据。例如,可以在一个BLOB列的某一部分中写入二进制数据,并覆盖掉已有的数据。也可以使用WRITE
    过程写入字符数据到CLOB中。此过程有4个输入参数,并且必须按照下面的顺序指定:
    1.此LOB的定位器
    2.总数变量(即要写入的字节或字符个数)
    3.从LOB值的起始处算起的位移(即写操作的起始点)
    4.分配被写入的字符串或二进制数据的缓冲区变量
    由于WRITE过程会更新LOB的值,所以必须用SELECT 
    FOR UPDATE命令来锁定行数据。 

    DBMS_LOB.APPEND过程
    APPEND过程把1个LOB中的数据添加到第2个LOB中。由于需要对1个LOB值进行更新操作,所以在执行APPEND过程前,被更新的记录必须要锁定。
    这个过程需要两个参数,并且必须按照下面的顺序指定:
    1.目的LOB的定位器
    2.源LOB的定位器
    如果这两个参数都是NULL值,APPEND过程将返回1个错误。
     
    DBMS_LOB.ERASE过程 
    ERASE过程来删除一个LOB中任何位置的字符(串)或字节。可以使用ERASE来删除整个LOB值,也可以指定此LOB中哪个部分被删除。在功能上
    ERASE与WRITE很相似。如果删除一个BLOB值中的数据,则代之以空格填充此CLOB。由于对一个LOB值执行了更新,所以应该遵从LOB更新的标准
    过程—即锁定数据行和当过程结束时提交记录。此ERASE过程有3个参数,顺序为:
    1.LOB的定位器
    2.总数变量(即要删除的字节或字符个数)
    3.从此LOB值开始计数的位移(即删除的开始处) 

    DBMS_LOB.TRIM过程
    TRIM过程来减少一个LOB值的大小尺寸,是从值的结尾处开始删除字符或字节(与SQL RTRIM函数类似)。该过程更新LOB列,所以需要锁定和解
    锁。TRIM过程需要2个参数,顺序如下:
    1.LOB的定位器
    2.此LOB的新长度

    DBMS_LOB.COPY过程 
    COPY可以把一个LOB中的某一部分数据拷贝到另一个LOB中。与APPEND过程不同,并不需要把一个LOB的全部数据拷贝到另一个LOB中。在COPY过
    程中,可以指定读出和写入操作的位移。COPY过程需要5个参数,依次为:
    1.目的LOB的定位器
    2.源LOB的定位器
    3.总数(即要拷贝的字节或字符个数)
    4.在目的LOB值中欲开始写入数据的位移
    5.在源LOB值中开始读入的位移
    COPY是READ和WRITE能力的结合。与WRITE过程相同,COPY过程改变了LOB值。所以必须首先被锁定,并且在执行完成后要用一条COMMIT命令解锁
  • 相关阅读:
    tomcat 自动部署代码
    weex Android
    视频大全
    sql语句
    来一个朴素的验证码小插件
    tcp通信客户端本地日志查看
    python练习题
    由count(sno)和count(cno)引发的思考
    centos7命令行和图形界面的相互切换(附centos7安装配置教程)
    Jenkins配置有用摘抄笔记
  • 原文地址:https://www.cnblogs.com/ding0910/p/1675720.html
Copyright © 2011-2022 走看看