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命令解锁
  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/ding0910/p/1675720.html
Copyright © 2011-2022 走看看