当前位置:  数据库>oracle

Oracle的特殊数据类型

    来源: 互联网  发布时间:2017-06-24

    本文导语: Oracle的特殊数据类型 1.%TYPE 允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联。语法如下: variable_name table.column%TYPE     2.%ROWTYPE 允许用户定义单一的变量,该变量包含数据库表的每一列的多个变量。语法规则如...

Oracle的特殊数据类型
1.%TYPE
允许用户动态地将数据库中某一列的数据类型与PL/SQL中某个变量关联。语法如下:
variable_name table.column%TYPE
 
 
2.%ROWTYPE
允许用户定义单一的变量,该变量包含数据库表的每一列的多个变量。语法规则如下:
variable_name table%ROWTYPE
一旦定义了这种变量,就可以使用 如下的方式来访问各个列:
row_variable.column_name
 
另外:可以使用%ROWTYPE类型的变量向数据库表中插入或更新整个记录,方法如下:
EmpRec scott.emp%ROWTYPE;
insert into scott.emp values EmpRec;
 
3.FOR 游标,语法如下
FOR record_variable in cursor
Loop
//处理逻辑
END Loop;
借助于%ROWTYPE,record_variable自动定义为一个变量。该循环打开游标,再循环中为每个记录执行逻辑操作,当不再存在记录时终止循环并关闭游标。
 
4.隐式游标,为FOR游标的一种特殊形式,其通过直接使用SQL语句而不需要显示声明游标
FOR record_variable in (select 语句)
Loop
//处理逻辑
END Loop;
 
注意:select 语句一定要使用括号把它包起来
 
 
5.REF 游标
游标引用一个结果集。REF CURSOR允许PL/SQL程序单元之间传递一个游标引用。
也即是它允许用户创建一个变量,该变量接收一个游标并且能够访问其结果集。
使用方式:
  • 声明一个TYPE: TYPE ref_cursor_name IS REF CURSOR [RETURN_TYPE];return_type子句是可省的,可以指定或不指定REF_CURSOR返回的数据类型。如果不指定,则游标是弱类型的。如果指定,则游标是强类型的。PL/SQL提供了一个预定义的称为SYS_REFCURSOR的弱REF CURSOR。
  • 然后创建该类型的一个实例: cursor_variable ref_cursor_name ; sys_cursor SYS_REFCURSOR
  •  
    注意:由于弱REF CURSOR容易导致在REF CURSOR返回的数据和应用程序所使用的变量之间的不匹配,因此更有可能产生bug。
     
    在创建强类型的REF CURSOR时,既可以使用%ROWTYPE ,如
    TYPE rc_employees HR.EMPLOYEES%ROWTYPE --声明rc_employees 类型
    TYPE rc_emp IS REF CURSOR rc_employees%TYPE --声明REF CURSOR类型,并制定返回类型为rc_employees
     
     
    也可以使用包含%TYPE的PL/SQL RECORD,如
    TYPE jr_rec is RECORD (
    employee_id JOB_HISTORY.EMPLOYEE%TYPE,
    job_id JOB_HISTORY.JOB_ID%TYPE,
    speed_of_promotion VARCHAR2(4)
    );
    type rc_jr is REF CURSOR jr_rec%TYPE;
     
     
     
    6.RECORD
     
     
    RECORD是一种复合数据类型--单个记录可以拥有多个分量。RECORD的典型用法是与%ROWTYPE一起配套使用,如:
    record_name table%ROWTYPE
    在这个声明之后, 可以使用record_name.column_name来访问单个列。
     
    还可以显示的定义RECORD包含多个列,语法如下:
    TYPE record_name IS RECORD(col_name dataType[,...]); --声明类型
    rec record_name; --定义变量
     
    当定义Record类型的变量后,可以
  • 接收select语句的结果:select employee_id, employee_name from employee into rec;
  • 向数据库表中insert:insert into employee values rec;
  • 更新表记录update: update empee set row rec where employee_id = rec .employee_id;
  • 可以在delete语句中使用: DELETE FROM HR.JOB_HISTORY WHERE DEPART_ID =1 RETURN TYPE EMPLOEE_ID,EMPLOEE_NAME into rec;
  •  
     
    7.关联数组
    关联数组是按照某个值索引的数据的集合,它类似于某些其他程序设计语言中的散列表。
    语法如下:
    TYPE array_name IS TABLE OF DATATYPE INDEX BY VALUE;
    声明后,即可定义一个该类型的变量: v_arr array_name ;
     
    使用循环为关联数组设值:
    FOR temp in (select 语句 )
    LOOP
    v_arr[temp .key] = temp.value;
    END LOOP;
     
    从关联数组中索引值:
    v_temp := v_arr(v_key);
     
     
    8.嵌套表
    嵌套表使用顺序整数作为集合的索引。尽管数组也使用整数索引数组的内容,但是用于索引数据的正式是顺序和连续的。
    通过创建一种称为稀疏索引,嵌套表可以使用不连续的数字作为索引。
    声明嵌套表的语法如下所示:
    TYPE collection_name is TABLE OF datatype [NOT NULL];
    这里 datatype可以是任务有效的PL/SQL数据类型,REF CURSOR除外。 NOT NULL关键字表名,该集合不能包含NULL值的元素。
     
    借助对象类型可以将嵌套表保存在某个数据列中,而且可以访问这种被存储的表中的单个元素。
     
     
    9.可变数组
    可变数组又称为VARRAY。这种稽核采用整数索引,而且可以保存在数据库中的某列中。
    VARRAY的定义又包含了一个特定的索引上边界。
    定义VARRAY的语法如下所示:
    TYPE collection_name IS VARRAY(size) OF dataType [NOT NULL];
    其中 size是VARRAY大小的上限。
     
     
    10.使用集合
    PLSQL中的集合是包含单一数据块或由单个变量构成的复合数据的多个实例。
    集合的类型:关联数组、嵌套表和可变数组
     
    可以按照两种方式给稽核赋值。对于嵌套表和可变数组,可以在单一的语句中赋所有的值:
    TYPE number_array IS TABLE OF NUMBER;
    number_collection number_array := (1,2,3,4,5,6,7,8,9);
    使用索引值,一次只能附一个值:number_collection(1) := 1;
     
    还可以使用一个集合给另一个集合赋值,只要这两个集合拥有相同的数据类型。
    集合可以用于两种类型的逻辑比较:
    判断两个集合是否相等: IF collection1 = collection2
    判断集合是否为空: IF collection1 IS NULL;
     
    集合操作:
    操作 含义 语法 EXISTS 检查集合中是否存在某个元素 collection.EXISTS(index) COUNT 返回集合中元素的个数 collection.COUNT LIMIT 返回VARRAY中的最大条目数 collection.LIMIT FIRST 返回集合中的第一个元素 collection.FIRST LAST 返回集合中最后一个元素 collection.LAST NEXT 返回集合中下一个元素 collection.NEXT PRIOR 返回集合中的上一个元素,如果不存在,则返回NULL collection.PRIOR EXTEND 扩展集合中元素的个数。不能用于关联数组或其他未被
    初始化的集合 collection.EXTEND(给集合增加单个元素)
    collection.EXTEND(n) :给集合增加n个元素
    collection.EXTEND(n,I):通过复制下标I的值,给集合增加n个元素 TRIM 从集合结尾处删除元素 collection.TRIM;从结尾处删除单个元素
    collection.TRIM(n):从集合结尾处删除n个元素 DELETE 从集合中删除元素 collection.DELETE:从集合中删除所有元素
    collection.DELETE(n):从集合中删除下标为n的元素
    collection.DELETE(m,n):从集合中删除下标值位于m,n之间的元素
     
    集合使用注意事项:
    • EXTEND、TRIM和DELETE以外其他操作都返回值
    • 根据环境所定义的语言,包含VARCHAR2下标的关联数组按字母顺序排列
    • 如果集合为空(NULL),则FIRST和LAST返回NULL,它不包含于任何元素
    • 如果集合中不存在下一个或上一个元素,则NEXT和PRIOR返回NULL
    • EXTEND 和 TRIM 不能用于关联数组
    • LIMIT可以用于限制添加至集合的值的个数,通常的语法是l select... into
     
    集合的适用性:集合类之间存在的差异
      关联数组 嵌套表 VARRAY 下标类型 数字或字符串 数字 数字 声明为固定大小 否 否 是 允许稀疏下标 是 是 否 在数据库中存储 否 是 是 访问存储在集合中的各个元素 N/A 是 是
     
     
     
    11.BULK COLLECT
    使用BULK COLLECT和关联数组的结合,可以进行批处理操作,如下所示:
    TYPE REC IS RECORD(...,...);
    定义关联数组类型:TYPE rec_table is TABLE OF rec index by PLS_INTEGER;
    声明变量:rec_table_array rec_table;
     
    OPEN cursor;
    fetch cursor bucket into rec_table_array;
    close cursor;
    FOR counter in rec_table_array.FIRST ... rec_table_array.LAST
    LOOP
    //处理逻辑
    END LOOP;
     
    12.FORALL
    FORALL结构允许执行写操作时获得与BULK COLLECT所提供的相同效率,这个结构封装多个写语句,并且在单一的消息中将它们发送给ORACLE数据库,从而提高该操作的总体性能。
     
    FORALL结构的语法如下:
    FORALL index_name in lower_bound ... upper_bound
    sqlstatment
     
    其中index_name是一个为在该FORALL循环中使用而隐士声明的变量。
    lower_bound和upper_bound限制该集合的范围,这个循环是针对集合的。
    例如:如果想要使用FORALL插入位于集合中的所有所有记录:
    FORALL jh_index in jh.FIRST .. jh.LAST
    INSERT INTO HR.JOB_HISTORY VALUES jh(jh_index);
     
    注意:挡在FORALL 循环中包含SAVE EXCEPTIONS关键字时,该循环不再对个别SQL语句中的错误报告异常。
    相反,如果在FORALL循环的处理过程中出现任何异常,则在该处理过程结束时报告错误代号为-24381的一个异常。
     
     
    FORALL的改进
    1.INDICES OF
    这是一种对稀疏集合处理的改进。该集合的记录并非连续分布---他们连续地分布在集合的整个范围内。
    FORALL INDICES OF collection_name [between lower_bound... upper_bound]
    sql_statement
     
    以上语句告诉FORALL读下一个下标值而不是下一个连接的值。使用 INDICES OF 子句可以让FORALL结构适用于稀疏集合。
    通过指定集合的上、下边界, INDICES OF 子句还允许只选择处理整个集合的一部分。
     
    2.VALUES OF
    这种改进使得FORALL结构的应用更具灵活性。
    VALUES OF 子句允许使用另一种集合, 确定哪些记录作为FORALL结构的目标。
     
    FORALL index_values VALUES OF driver_collection
    使用这个子句的唯一要求是该驱动集合必须是嵌套表或关联数组。用于这种结构的关联数组的下标和元素都必须是BINARY_INTEGER或PLS_INTEGER


        
     
     

    您可能感兴趣的文章:

  • ORACLE数据库常用字段数据类型介绍
  • oracle中的空类型与c语言的空类型相匹配吗?
  • 关于Oracle BLOB类型,一个String字符怎么写入BLOB字段?
  • Oracle中查看某列数据类型
  • 测试添加Oracle中Blob数据类型对象
  • jsp文件上传smartupload到oracle数据库中没有longblob的数据类型如何处理的?
  • oracle中 VARCHAR2是什么数据类型
  • 请问保存文章内容的字段应用什么类型的(oracle),急!!!
  • oracle中怎么没有boolean类型的字段?应该用什么代替?
  • 如何向oracle库中字段类型是date的添加数据
  • 请问:ORACLE中的数据取出来后,需不需要进行一定的转换才能变为C语言的数据类型啊?
  • jsp中在oracle中查询日期类型时sql语句该怎么写啊?
  • 怎样将当前时间写到Oracle中date类型的字段中!!!!!!!!!!!!
  • 急!急!oracle 中 long 类型在 tomcat 中的问题
  • 不能把几百个以上的汉字插入oracle varchar2类型的问题!
  • Oracle里long类型
  • jsp显示oracle中varchar2类型字段 在线等待
  • Oracle中的Raw类型解释
  • 我要向oracle中插入大文本,用的是lang类型的字段,但是只能插3000字,再多就抱错,说我字符串过长。谁遇到过此问题?
  • Oracle返回表类型的自定义函数
  • Oracle中字符集的类型决定varchar2的字符长度
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • oracle数据库导出和oracle导入数据的二种方法(oracle导入导出数据)
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • Oracle 数据库开发工具 Oracle SQL Developer
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • 怎样调出ORACLE数据库中的数据,该如何连接?
  • 用JDBC连接Oracle数据库时,如何向数据库中写日期型数据(格式)?谢了!
  • 关于JDBC连接Oracle数据库,是否必须有Oracle客户端
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle 10g和Oracle 11g网格技术介绍
  • 怎样调出ORACLE数据库中的数据,该如何连接? iis7站长之家
  • ORACLE日期相关操作
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • Oracle 12c的九大最新技术特性介绍
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE中DBMS_RANDOM随机数生成包
  • Linux系统下Oracle的启动与Oracle监听的启动
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • 网间Oracle的连接,远程连接Oracle服务器??
  • 请教:.profile中:if [ -d /opt/oracle/db01/app/oracle/product/9.2.0 ]是什么意思?
  • 在linux 中如何删除oracle db 与卸载oracle.
  • linux下安装oracle后使用命令行启动的方法 linux启动oracle
  • 如何将Aix上的oracle 物理备份 然后再在linux 系统上还原oracle
  • 那里有免费的oracle odbc driver for linux?或怎么破解easysoft oracle odbc driver安装包?急


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3