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

来源:互联网 发布:excel vba sql查询 编辑:程序博客网 时间:2024/06/11 10:35

记录:单行多列

集合:多行单列

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

--第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;

0 0
原创粉丝点击