您的位置:首页 > 数据库 > Oracle

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

2016-11-05 17:02 801 查看
记录:单行多列

集合:多行单列

这样说,确实简单明了啊


--第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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐