源码-Oracle数据库管理-第十四章-记录与集合-Part 1(使用PL/SQL记录)

记录:单行多列

集合:多行单列

这样说,确实简单明了啊大笑

--第14章 记录与集合
--14.1 使用PL/SQL记录
--代码14.1 使用记录的PL/SQL语句块示例
DECLARE
   --定义记录类型
   TYPE t_emp IS RECORD (
      v_empno    NUMBER,
      v_ename    VARCHAR2 (20),
      v_job       VARCHAR2 (9),
      v_mgr       NUMBER (4),
      v_hiredate   DATE,
      v_sal        NUMBER (7, 2),
      v_comm     NUMBER (7, 2),
      v_deptno    NUMBER (2)
   );
   --声明记录类型的变量
   emp_info   t_emp;
BEGIN
   --从emp表中取出字段值赋给记录类型
   SELECT *
     INTO emp_info
     FROM emp
    WHERE empno = 7369;
    --为记录类型的变量更新新的值
    emp_info.v_job:='职员';
    emp_info.v_sal:=5000;
    emp_info.v_hiredate:=TO_DATE ('2016-08-01', 'YYYY-MM-DD');
    --向数据库表中更新记录类型的值
    UPDATE emp SET ROW=emp_info WHERE empno=emp_info.v_empno;
EXCEPTION                                                         --异常处理块
   WHEN OTHERS
   THEN
      NULL;
END;

select * from emp where empno in(7997,7369);
delete from emp where empno=7997;
drop trigger t_verify_emptime;

--14.1.2 定义记录类型
--1. 使用%rowtype定义记录类型
--代码14.2 使用%rowtype定义记录类型
DECLARE
   --声明记录类型的变量,引用emp表中的行记录
   emp_info   emp%ROWTYPE;
BEGIN
   --从emp表中取出字段值赋给记录类型
   SELECT *
     INTO emp_info
     FROM emp
    WHERE empno = 7369;
    --为记录类型的变量更新新的值
    emp_info.empno:=7999;
    emp_info.ename:='李天思';
    emp_info.job:='职员';
    emp_info.sal:=5000;
    --向数据库表中更新记录类型的值
    INSERT INTO emp VALUES emp_info;
EXCEPTION    
   WHEN OTHERS
   THEN
       DBMS_OUTPUT.put_line('数据插入失败!');   --异常处理块;
END;

--代码14.3 使用%rowtype定义游标记录类型
DECLARE
  --定义一个游标类型
  CURSOR c_emp IS
    SELECT empno, ename, job, sal, comm, deptno FROM emp;
  --声明记录类型的变量,使用游标的SELECT列表作为记录成员
  emp_info c_emp%ROWTYPE;
BEGIN
  --从emp表中取出字段值赋给记录类型
  SELECT empno, ename, job, sal, comm, deptno
    INTO emp_info
    FROM emp
   WHERE empno = 7369;
  --为记录类型的变量更新新的值
  emp_info.ename := '李天思';
  emp_info.job   := '职员';
  emp_info.sal   := 5000;
  emp_info.deptno:= 30;
  emp_info.empno :=7997;
  --向数据库表中插入记录类型的值
  INSERT INTO emp
    (empno, ename, job, sal, comm, deptno)
  VALUES(emp_info.empno, emp_info.ename, emp_info.job, emp_info.sal, emp_info.comm, emp_info.deptno);
EXCEPTION
  --异常处理块
  WHEN OTHERS THEN
    RAISE;
END;


--2. 使用type record定义记录类型
--代码14.4 使用type record定义记录类型
DECLARE
  --定义记录类型
  TYPE t_dept IS RECORD(
    dept_id   dept.deptno%TYPE,
    dept_name VARCHAR2(30),
    dept_loc  VARCHAR2(30));
  --声明一个记录类型的变量
  rec_dept t_dept;
BEGIN
  --为记录类型的变量中的成员赋值
  rec_dept.dept_id   := 90;
  rec_dept.dept_name := '经济管理部';
  rec_dept.dept_loc  := '南宁';
  --输出记录类型成员的值
  DBMS_OUTPUT.put_line(rec_dept.dept_id || ' ' || rec_dept.dept_name || ' ' ||
                       rec_dept.dept_loc);
END;


--3. 使用%type基于其他记录类型定义记录类型
--代码14.5 使用%type引用其他变量的记录类型
DECLARE
  --定义记录类型
  TYPE t_dept IS RECORD(
    dept_id   dept.deptno%TYPE,
    dept_name VARCHAR2(30),
    dept_loc  VARCHAR2(30));
  --声明一个记录类型的变量
  rec_dept t_dept;
  dept_loc rec_dept%TYPE;       --定义一个基于rec_dept的记录类型
BEGIN
  --为记录类型的变量中的成员赋值
  dept_loc.dept_id   := 90;
  dept_loc.dept_name := '经济管理部';
  dept_loc.dept_loc  := '南宁';
  --输出记录类型成员的值
  DBMS_OUTPUT.put_line(dept_loc.dept_id || ' ' || dept_loc.dept_name || ' ' ||
                       dept_loc.dept_loc);
END;


--14.1.3 记录类型赋值
--代码14.6 定义记录类型并赋初始值
DECLARE
  --定义记录类型,并且指定NOT NULL约束和初始值
  TYPE t_dept IS RECORD (
    dept_id    NUMBER(4) NOT NULL := 10,
    dept_name  VARCHAR2(30) NOT NULL := '行政部',
    mgr_id     NUMBER(6) DEFAULT 7369,
    loc_id     NUMBER(4)
  ); 
  dept_rec t_dept;               --定义一个记录类型的变量
  dept_rec_2 dept_rec%TYPE;     --定义一个与dept_rec相同类型的记录变量  

BEGIN
  --输出dept_rec变量的成员值
  DBMS_OUTPUT.put_line('dept_rec:');
  DBMS_OUTPUT.put_line('---------');
  DBMS_OUTPUT.put_line('dept_id:   ' || dept_rec.dept_id);
  DBMS_OUTPUT.put_line('dept_name: ' || dept_rec.dept_name);
  DBMS_OUTPUT.put_line('mgr_id:    ' || dept_rec.mgr_id);
  DBMS_OUTPUT.put_line('loc_id:    ' || dept_rec.loc_id);
  --输出dept_rec_2变量的成员值
  DBMS_OUTPUT.put_line('-----------');
  DBMS_OUTPUT.put_line('dept_rec_2:');
  DBMS_OUTPUT.put_line('-----------');
  DBMS_OUTPUT.put_line('dept_id:   ' || dept_rec_2.dept_id);
  DBMS_OUTPUT.put_line('dept_name: ' || dept_rec_2.dept_name);
  DBMS_OUTPUT.put_line('mgr_id:    ' || dept_rec_2.mgr_id);
  DBMS_OUTPUT.put_line('loc_id:    ' || dept_rec_2.loc_id);
END;
/


--1.简单赋值
--代码14.7 使用简单赋值语法为记录变量赋值
DECLARE
  dept_rec dept%ROWTYPE;        --定义一个引用dept表行的记录变量
BEGIN
  --使用简单赋值方法为记录类型赋值 
  dept_rec.deptno:= 10;
  dept_rec.dname := '人事部';
  dept_rec.loc   :='嘉定'; 
  -- 输出记录中的部门信息
  DBMS_OUTPUT.put_line('部门编号:' || dept_rec.deptno);
  DBMS_OUTPUT.put_line('部门名称:' || dept_rec.dname);
  DBMS_OUTPUT.put_line('部门地址:' || dept_rec.loc); 
END;


--2.使用其他记录赋值
--代码14.8 使用其他记录变量为记录成员赋值
DECLARE
   --定义记录类型
   TYPE emp_rec IS RECORD (
      empno   NUMBER,
      ename   VARCHAR2 (20)
   );
   --定义与emp_rec具有相同成员的记录类型
   TYPE emp_rec_dept IS RECORD (
      empno   NUMBER,
      ename   VARCHAR2 (20)
   );
   
   emp_info1   emp_rec;      --声明2个emp_rec类型的记录变量
   emp_info2   emp_rec; 
   emp_info3   emp_rec_dept; --声明一个emp_rec_dept的记录变量
   
   --定义一个内嵌过程用来输出记录信息
   PROCEDURE printrec (empinfo emp_rec)
   AS
   BEGIN
      DBMS_OUTPUT.put_line ('员工编号:' || empinfo.empno);
      DBMS_OUTPUT.put_line ('员工名称:' || empinfo.ename);
   END;
   
BEGIN
   emp_info1.empno := 7369;    --为emp_info1记录赋值
   emp_info1.ename := '史密斯';
   DBMS_OUTPUT.put_line ('emp_info1的信息如下:');
   printrec (emp_info1);      --打印赋值后的emp_info1记录
   emp_info2 := emp_info1;    --正确的语句,将emp_info1记录变量直接赋给emp_info2
   DBMS_OUTPUT.put_line ('emp_info2的信息如下:');
   printrec (emp_info2);      --打印赋值后的emp_info2的记录
   --emp_info3:=emp_info1;    --错误的语句,不同记录类型的变量不能相互赋值
END;

--代码14.9 使用%rowtype定义的记录变量进行赋值
DECLARE
   --定义记录类型
   TYPE emp_rec IS RECORD (
      empno   emp.empno%TYPE,
      ename   emp.ename%TYPE
   );
   --定义一个游标,用来取emp表中的部分字段
  CURSOR c_emp IS
    SELECT empno, ename
    FROM emp;     
   
   emp_info1   emp_rec;       --声明2个emp_rec类型的记录变量
   emp_info2   emp_rec; 
   emp_info3   c_emp%ROWTYPE; --声明一个emp_rec_dept的记录变量
   
   --定义一个内嵌过程用来输出记录信息
   PROCEDURE printrec (empinfo emp_rec)
   AS
   BEGIN
      DBMS_OUTPUT.put_line ('员工编号:' || empinfo.empno);
      DBMS_OUTPUT.put_line ('员工名称:' || empinfo.ename);
   END;
   
BEGIN
   emp_info1.empno := 7369;    --为emp_info1记录赋值
   emp_info1.ename := '史密斯';
   DBMS_OUTPUT.put_line ('emp_info1的信息如下:');
   printrec (emp_info1);      --打印赋值后的emp_info1记录
   emp_info2 := emp_info1;    --正确的语句,将emp_info1记录变量直接赋给emp_info2
   DBMS_OUTPUT.put_line ('emp_info2的信息如下:');
   printrec (emp_info2);      --打印赋值后的emp_info2的记录
   emp_info3:=emp_info1;      --将emp_info1的值赋给emp_info3
   DBMS_OUTPUT.put_line ('emp_info3的信息如下:');   
   printrec (emp_info3);      --输出emp_info3变量的值
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值