您的位置:首页 > 数据库

源码-PL/SQL从入门到精通-第八章-记录与集合-Part 1

2016-07-19 13:30 429 查看
--第8章开始
--代码8.1 不使用记录的PL/SQL语句块示例

DECLARE
--定义保存字段值的变量
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);
BEGIN
--从emp表中取出字段值
SELECT empno, ename, job, mgr, hiredate, sal, comm, deptno
INTO v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno
FROM emp
WHERE empno = :empno;
--向emp_copy表中插入变量的值
INSERT INTO emp_copy
(empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES
(v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno);
EXCEPTION
--异常处理块
WHEN OTHERS THEN
NULL;
END;

--代码8.2 使用记录的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 = :empno;
--向emp_copy表中插入记录类型的值
INSERT INTO emp_copy
VALUES emp_info;
EXCEPTION
--异常处理块
WHEN OTHERS THEN
NULL;
END;

--代码8.3 声明记录类型
DECLARE

TYPE emp_rec IS RECORD(
dept_row dept%ROWTYPE, --声明来自dept表行的嵌套记录
empno NUMBER, --员工编号
ename VARCHAR(20), --员工名称
job VARCHAR(10), --职位
sal NUMBER(7, 2) --薪资
);
--声明记录类型的变量
emp_info emp_rec;
BEGIN
NULL;
END;

--代码8.5 为记录赋值并读取记录内容
DECLARE
TYPE emp_rec IS RECORD(
empname VARCHAR(12) := '李斯特', --员工名称,初始值李斯特
empno NUMBER NOT NULL DEFAULT 7369, --员工编号,默认值7369
hiredate DATE DEFAULT SYSDATE, --雇佣日期,默认值当前日期
sal NUMBER(7, 2) --员工薪资
);
--声明emp_rec类型的变量
empinfo emp_rec;
BEGIN
--下面的语句为empinfo记录赋值。
empinfo.empname := '施密斯';
empinfo.empno := 7010;
empinfo.hiredate := TO_DATE('1982-01-01', 'YYYY-MM-DD');
empinfo.sal := 5000;
--下面的语句输出empinfo记录的值
DBMS_OUTPUT.PUT_LINE('员工名称:' || empinfo.empname);
DBMS_OUTPUT.PUT_LINE('员工编号:' || empinfo.empno);
DBMS_OUTPUT.PUT_LINE('雇佣日期:' || TO_CHAR(empinfo.hiredate, 'YYYY-MM-DD'));
DBMS_OUTPUT.PUT_LINE('员工薪资:' || empinfo.sal);
END;

--代码8.6为记录类型赋记录类型的值
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;
emp_info2 emp_rec;
emp_info3 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 := 7890; --为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;

--代码8.7 %Rowtype定义的记录赋给标准记录类型
DESC dept;
DESC emp;
DECLARE
--定义一个与dept表具有相同列的记录
TYPE dept_rec IS RECORD(
deptno NUMBER(10),
dname VARCHAR2(30),
loc VARCHAR2(30));
--定义基于dept表的记录类型
dept_rec_db dept%ROWTYPE;
dept_info dept_rec;
BEGIN
--使用SELECT语句为记录类型赋值
SELECT *
INTO dept_rec_db
FROM dept
WHERE deptno = 20;
--将%ROWTYPE定义的记录赋给标准记录变量
dept_info := dept_rec_db;
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: