`
Supanccy2013
  • 浏览: 214557 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

oracle 复合类型-record、数组、%type、%rowtype、plsql table类型

阅读更多
知识点:
1,ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型---
   记录和表.
   记录类型类似于C语言中的结构数据类型,它把逻辑相关的、分离的、基本数据类型的变量组成一个整体存储起来,它必须包括至少一个标量型或RECORD 数据类型的成员,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。在使用记录数据类型变量时,需要先在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
定义记录类型语法如下:
TYPE record_name IS RECORD(
   v1 data_type1 [NOT NULL] [:= default_value ],
   v2 data_type2 [NOT NULL] [:= default_value ],
   ......                       [color=red]//注意末尾不能带逗号[/color]
   vn data_typen [NOT NULL] [:= default_value ] );

实例1:
declare
   type test_rec is record(
      name varchar2(30) not null := '胡勇',
      info varchar2(100)  --该处末尾不能添加逗号
   );
   rec_book  test_rec;
begin
   rec_book.name := '陈超阳';
   rec_book.info := '中华人民共和国';
   dbms_output.put_line(rec_book.name || ',' || rec_book.info);
end; 


实例2:
declare
  --定义与hr.employees表中的这几个列相同的记录数据类型
  type record_type_emp is record(
      v_ename   emp.ename%type,
      v_job     emp.job%type,
      v_sal     emp.sal%type
  );
  --声明一个该记录数据类型的记录变量
  v_emp_record record_type_emp;
begin
   --注意查询的类型应该与复合变量成员的顺序一致
  select ename,job,sal into v_emp_record  from emp where empno = 7369;
  dbms_output.put_line(v_emp_record.v_ename);    
  dbms_output.put_line(v_emp_record.v_job);    
  dbms_output.put_line(v_emp_record.v_sal);
end;   
 
输出如下:
SMITH
CLERK
800

实例3:
declare
   type type_mytype is record(
       ename  scott.emp.ename%type,
       job    scott.emp.job%type,
       sal    scott.emp.sal%type
   );
   v_mytype type_mytype;
begin
  select e.ename,e.job,e.sal into v_mytype from scott.emp e where empno = '7499';
  dbms_output.put_line(v_mytype.ename);
end;

注意:一个记录类型的变量只能保存从数据库中查询出的一行记录,若查询出了多行记录,就会出现错误。否则会报错:
ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在 line 11


第二种复合类型--数组
    数据是具有相同数据类型的一组成员的集合。每个成员都有一个唯一的下标,它取决于成员在数组中的位置。在PL/SQL中,数组数据类型是VARRAY。

定义VARRY数据类型语法如下:
TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];

varray_name是VARRAY数据类型的名称,size是下整数,表示可容纳的成员的最大数量,每个成员的数据类型是element_type。默认成员可以取空值,否则需要使用NOT NULL加以限制。对于VARRAY数据类型来说,必须经过三个步骤,分别是:定义、声明、初始化。
实例1:
--定义数组类型
declare
  --定义一个最多保存5个varchar(25)数据类型成员的varray数据类型
  type reg_varray_type is varray(5) of varchar(25);
  --声明一个该varray数据类型的变量
  v_reg_varray reg_varray_type;
begin
  --用构造函数赋予初值(注意赋值方式--构造函数)
 [color=red] --访问数组是从下标1开始的(不是0)[/color]
  v_reg_varray := reg_varray_type('中国','美国','英国','日本','河南');
  dbms_output.put_line(v_reg_varray(1));
  dbms_output.put_line(v_reg_varray(2));
  dbms_output.put_line(v_reg_varray(3));
  dbms_output.put_line(v_reg_varray(4));
  dbms_output.put_line(v_reg_varray(5));
end;


实例2:
--数组 varray实例
declare
   type type_myVarray is varray(3) of Varchar2(30);
   v_myvarrayType  type_myVarray;
begin
   --第一种赋值方法:构造函数赋值
   v_myvarrayType := type_myVarray('男人','女人','不男不女');
   dbms_output.put_line(v_myvarrayType(1));
   dbms_output.put_line(v_myvarrayType(2));
   dbms_output.put_line(v_myvarrayType(3));
   --第二种赋值方法:一个一个的赋值
   select e.ename,e.job,to_char(e.sal) into v_myvarrayType(1),v_myvarrayType(2),v_myvarrayType(3)  from scott.emp e where empno = 7369;
   --这种方式不行:会报错:---PLS-00642: 在 SQL 语句中不允许使用本地收集类型(这种赋值方式只适应与record类型的变量)
   --select e.ename,e.job,to_char(e.sal) into v_myvarrayType from scott.emp e where empno = 7369;
   dbms_output.put_line(v_myvarrayType(1));
   dbms_output.put_line(v_myvarrayType(2));
   dbms_output.put_line(v_myvarrayType(3));
end;


第三种类型:%type
    定义一个变量,其数据类型与已经定义的某个数据变量(尤其是表的某一列)的数据类型相一致,这时可以使用%TYPE。
    使用%TYPE特性的优点在于: 
       所引用的数据库列的数据类型可以不必知道; 
       所引用的数据库列的数据类型可以实时改变,容易保持一致,也不用修改PL/SQL序。

实例:
DECLARE
  -- 用%TYPE 类型定义与表相配的字段
  TYPE T_Record IS RECORD(
       T_no emp.empno%TYPE, 
       T_name emp.ename%TYPE, 
       T_sal emp.sal%TYPE );
   -- 声明接收数据的变量
    v_emp T_Record; 
BEGIN 
    SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788;     
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' ' ||    
    TO_CHAR(v_emp.t_sal));
end;
  


第四种类型:%rowtype
    PL/SQL 提供%ROWTYPE操作符, 返回一个记录类型, 其数据类型和数据库表的数据结构相一致。 使用%ROWTYPE特性的优点在于:
    所引用的数据库中列的个数和数据类型可以不必知道;
    所引用的数据库中列的个数和数据类型可以实时改变,容易保持一致,也不用修改PL/SQL程序。
实例:
declare
  v_empno  emp.empno%type  := &no;
  rec emp%rowtype;
begin
  select * into rec from emp where empno = v_empno;
  dbms_output.put_line(rec.ename);
  dbms_output.put_line(rec.job);
  dbms_output.put_line(rec.sal);
  dbms_output.put_line(rec.deptno);
end;

待续**************************************************************

第五种:更高级的数据类型psql表类型;
   在前面我们已经讲解了varray,record类型,可以看出他们都是一维的。下面我们要讲解的是综合上面两种类型的数据类型plsql 表,该表示二维的。可以囊括上面的两种类型。
   定义记录表(或索引表)数据类型。它与记录类型相似,但它是对记录类型的扩展。它可以处理多行记录,类似于高级中的二维数组,使得可以在PL/SQL中模仿数据库中的表。

  
  
分享到:
评论

相关推荐

    Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    PLsql语法.md

    - 是专用于Oracle服务器,在SQL基础之上,**添加了一些过程化控制语句,叫PLSQL** - 过程化包括有:类型定义,判断,循环,游标,异常或例外处理。。。 - **PLSQL强调过程** ![PLsql图片描述]...

    Oracle_plsql基本语法笔记.txt

    %type用法,%rowtype用法,TYPE用法 游标的使用 for 循环 loop循环 while循环 if / else 的用法 case 的用法 标题 错误定义 error的设定 exception用法 标题 存储过程及函数 procedure 的建立...

    PL/SQL 基础.doc

    TYPE tabletype IS TABLE OF type(类型名,要保存成的数据类型) INDEX BY BINARY_INTEGER; 例:DECLARE TYPE t_emp IS TABLE OF s_emp%ROWTYPE INDEX BY BINARY_INTERGER; v_emp t_emp; BEGIN SELECT * ...

    Oracle数据库实验--PL/SQL程序基础1

    4、接收雇员号,输出该雇员的所有信息,...(用%rowtype实现)。(存储过程) 7、输入部门编号,按照下列加薪比例执行给该部门的雇员加薪(用CASE实现,修改emp1表的数据) (存储过程) 13、输出如下九九乘法表。(存储过程)

    PLSQL编程03

    PL/SQL基础编程之(三)[自定义复合变量][%TYPE和%ROWTYPE的应用]

    精髓Oralcle讲课笔记

    -- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...

    oracle存储过程、游标、函数、PL/SQL块

    包含oracle存储过程的增、删、查、改 %type、%rowtype的使用 自定义函数 PL/SQL块

    SQLBoy 存储过程之历险记

    文章目录:1、概述:2、存储过程概念及语法格式:3、数据类型与定义变量和常量4、特殊数据类型之%TYPE和%ROWTYPE5、在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量:6、 循环语句Loop 使用7、PL/SQL 游标 概念...

    plsql_oracle 编程

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 易懂

    C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 --PL/SQL基础1 declare begin dbms_output.('不输出不换行'); dbms_output.put_line('输出并换行'); end; --PL/SQL基础2 declare dig number(20,...

    oracle 基础

    这个文档主要是讲pck里面的语法,还没写完 ...重点是对函数请求参数、返回,into、 for、 corsor、%type、%rowtype等的简单理解tst 测试pck文件还会继续完善 PCK文件配置有截图和详细说明 请看文件夹里面的 说明 文件

    plsql_oracle 8i 编程讲义

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    oracle存储过程进阶

    介绍了oracle存储过程中常见的sql写法,游标(隐式,显式),触发器, CASE ... WHEN ...... ELSIF ...THEN...ELSE...END IF,记录类型变量定义和使用 ,%type定义变量,%rowtype定义变量,goto,异常。多且全

    Oracle 10g 开发与管理

    7.4 使用%TYPE和%ROWTYPE类型的变量 58 1.%Type 59 2.%RowType 59 7.5 复合变量 60 1.记录类型(“行”) 60 2.记录表类型(“表” ) 60 (1)使用的原因: 60 (2)定义记录表类型(联合数组) 60 7.6 条件判断...

    Oracle8i_9i数据库基础

    §12.4.2 复合类型(记录和表) 238 §12.4.3 使用%ROWTYPE 240 §12.4.4 LOB类型 240 §12.4.5 用户定义的子类型 241 §12.4.6 数据类型的转换 243 §12.5 运算符和表达式(数据定义) 243 §12.5.1 关系运算符 243 ...

    oracle下巧用bulk collect实现cursor批量fetch的sql语句

    在一般的情况下,使用批量fetch的几率并不是很多,但是Oracle提供了这个功能我们最好能熟悉一下,说不定什么时候会用上它。 代码如下:declare cursor c1 is select * from t_depart; v_depart t_depart%...

    oracle学习资料

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    亚信科技面试原题数据库

    课程名称 oracle数据库系统编程 课程号 MD02 考试时间 90分钟 考试方式(闭)卷 (共 6 页) (本试卷满分100分,60分合格,答案请写在答题卡上) 一、选择题(含单选题和多选题,每题2分,共60分) 在每小题列出...

    PLSQL基础教程

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13...

Global site tag (gtag.js) - Google Analytics