zoukankan      html  css  js  c++  java
  • PL/SQL集合(一):记录类型(TYPE 类型名称 IS RECORD)

    记录类型

    • 利用记录类型可以实现复合数据类型的定义
    • 记录类型允许嵌套
    • 可以直接利用记录类型更新数据。

     

    • 传统操作的问题
    • 对于Oracle数据类型,主要使用的是VARCHAR2NUMBERDATE等类型,但是这些基本数据类型,如果在进行一些实际操作的时候就会比较麻烦。

    获取一个雇员的完整信息:

    如下数据类型被单独定义.

    DECLARE

    v_emp_empno        emp.empno%TYPE ;

    v_emp_ename        emp.ename%TYPE ;

    v_emp_job            emp.job%TYPE ;

    v_emp_hiredate        emp.hiredate%TYPE ;

    v_emp_sal            emp.sal%TYPE ;

    v_emp_comm            emp.comm%TYPE ;

    BEGIN

    v_emp_empno := &inputempno ;

    SELECT ename,job,hiredate,sal,comm INTO

    v_emp_ename,v_emp_job,v_emp_hiredate,v_emp_sal,v_emp_comm

    FROM emp WHERE empno=v_emp_empno ;

    DBMS_OUTPUT.put_line('雇员编号:' || v_emp_empno || ',姓名:' || v_emp_ename || ',职位:' || v_emp_job || ',雇佣日期:' || TO_CHAR(v_emp_hiredate,'yyyy-mm-dd') || ',基本工资:' || v_emp_sal || ',佣金:' || NVL(v_emp_comm,0)) ;

    EXCEPTION

    WHEN others THEN

    RAISE_APPLICATION_ERROR(-20007,'此雇员信息不存在!') ;

    END ;

    /

    • 定义新类型
    • 定义记录类型

    TYPE 类型名称 IS RECORD (

    成员名称        数据类型 [[NOT NULL] [:= 默认值] 表达式] ,

    ...

    成员名称        数据类型 [[NOT NULL] [:= 默认值] 表达式]

    ) ;


     

    ROWTYPE只能够根据已有表来决定复合类型

    记录类型可以由用户自定义组成.

     

    使用记录类型接收查询返回结果

    注意使用逗号.

    DECLARE

    v_emp_empno        emp.empno%TYPE ;

    TYPE emp_type IS RECORD (

    ename        emp.ename%TYPE ,

    job        emp.job%TYPE ,

    hiredate        emp.hiredate%TYPE ,

    sal        emp.sal%TYPE ,

    comm        emp.comm%TYPE

    ) ;

    v_emp            emp_type ;         -- 定义一个指定的复合类型变量

    BEGIN

    v_emp_empno := &inputempno ;

    SELECT ename,job,hiredate,sal,comm INTO v_emp

    FROM emp WHERE empno=v_emp_empno ;

    DBMS_OUTPUT.put_line('雇员编号:' || v_emp_empno || ',姓名:' || v_emp.ename || ',职位:' || v_emp.job || ',雇佣日期:' || TO_CHAR(v_emp.hiredate,'yyyy-mm-dd') || ',基本工资:' || v_emp.sal || ',佣金:' || NVL(v_emp.comm,0)) ;

    EXCEPTION

    WHEN others THEN

    RAISE_APPLICATION_ERROR(-20007,'此雇员信息不存在!') ;

    END ;

    /

    用户自己操作记录类型数据

    这个时候没有通过查询,直接声明变量,然后为属性赋值.

    DECLARE

    TYPE dept_type IS RECORD (

    deptno        dept.deptno%TYPE := 80,    -- 定义默认值

    dname        dept.dname%TYPE ,

    loc            dept.loc%TYPE

    ) ;

    v_dept    dept_type ;

    BEGIN

    v_dept.dname := 'scent' ;    -- 为记录类型成员赋值

    v_dept.loc := '重庆' ;            -- 为记录类型成员赋值

    DBMS_OUTPUT.put_line('部门编号:' || v_dept.deptno || ',名称:' || v_dept.dname || ',位置:' || v_dept.loc) ;

    END ;

    /

    定义嵌套的记录类型

    这是一种面向对象的方式

    DECLARE

    TYPE dept_type IS RECORD (

    deptno    dept.deptno%TYPE := 80,    -- 定义默认值

    dname    dept.dname%TYPE ,

    loc    dept.loc%TYPE

    ) ;

    TYPE emp_type IS RECORD (

    empno    emp.empno%TYPE ,

    ename    emp.ename%TYPE ,

    job    emp.job%TYPE ,

    hiredate    emp.hiredate%TYPE ,

    sal    emp.sal%TYPE ,

    comm    emp.comm%TYPE ,

    dept    dept_type

    ) ;

    v_emp    emp_type ;

    BEGIN

    SELECT e.empno,e.ename,e.job,e.hiredate,e.sal,e.comm,d.deptno,d.dname,d.loc INTO

    v_emp.empno,v_emp.ename,v_emp.job,v_emp.hiredate,v_emp.sal,v_emp.comm,

    v_emp.dept.deptno,v_emp.dept.dname,v_emp.dept.loc

    FROM emp e,dept d

    WHERE e.deptno=d.deptno(+) AND e.empno=7369 ;

    DBMS_OUTPUT.put_line('雇员编号:' || v_emp.empno || ',姓名:' || v_emp.ename || ',职位:' || v_emp.job || ',雇佣日期:'     || TO_CHAR(v_emp.hiredate,'yyyy-mm-dd') || ',基本工资:' || v_emp.sal || ',佣金:' || NVL(v_emp.comm,0)) ;

    DBMS_OUTPUT.put_line('部门编号:' || v_emp.dept.deptno || ',名称:' || v_emp.dept.dname || ',位置:' || v_emp.dept.loc) ;

    END ;

    /

    增加一条新的记录,利用记录类型保存数据

    DECLARE

    TYPE dept_type IS RECORD (

    deptno    dept.deptno%TYPE ,

    dname    dept.dname%TYPE ,

    loc        dept.loc%TYPE

    ) ;

    v_dept        dept_type ;

    BEGIN

    v_dept.dname := 'gaga' ;

    v_dept.loc := 'chongqing' ;

    v_dept.deptno := 80 ;

    INSERT INTO dept VALUES v_dept ;     -- 直接插入记录类型的数据

    END ;

    /

    如果不需要插入全表数据,也可以插入指定栏位的数据

    DECLARE

    TYPE dept_type IS RECORD (

    deptno    dept.deptno%TYPE ,

    dname    dept.dname%TYPE

    ) ;

    v_dept        dept_type ;

    BEGIN

    v_dept.dname := 'wendy' ;

    v_dept.deptno := 90 ;

    INSERT INTO dept(deptno,dname) VALUES (v_dept.deptno,v_dept.dname) ;     -- 直接插入记录类型的数据

    END ;

    /

    修改数据,利用记录类型保存数据

    DECLARE

    TYPE dept_type IS RECORD (

    deptno        dept.deptno%TYPE ,

    dname        dept.dname%TYPE ,

    loc        dept.loc%TYPE

    ) ;

    v_dept            dept_type ;

    BEGIN

    v_dept.dname := 'yaya' ;

    v_dept.loc := '中国' ;

    v_dept.deptno := 90 ;

    UPDATE dept SET ROW=v_dept WHERE deptno=v_dept.deptno ;

    END ;

    /

     

     

  • 相关阅读:
    过滤选择器——简单过滤选择器
    层次选择器
    选择器——2——基本选择器
    This is a secret
    iframe加载问题
    懒加载
    biubiubiu
    使用JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超过了为 maxJsonLength属性
    HTML中       等6种空白空格的区别
    ASP.NET 4.0的ClientIDMode属性
  • 原文地址:https://www.cnblogs.com/thescentedpath/p/RECORD.html
Copyright © 2011-2022 走看看