PL/SQLRECORD

记录是指数据库数据库中的一行数据,是表中单行数据的一个镜像
在PL/SQL中,有三种定义记录类型的方法:
(1)、使用--表名%ROWTYPE;例如:DUAL%ROWTYPE;
(2)、在PL/SQL中声明部分中显式的定义记录类型
(3)、将记录类型定义为数据库结构或者对象类型(OBJECT)
1、使用%ROWTYPE定义记录类型
%ROWTYPE可以引用包括表、视图对象,%ROWTYPE属性继承了这些对象的行定义,

创建测试表

1 CREATE TABLE TEST_EMP AS SELECT * FROM EMP E WHERE E.DEPTNO IS NULL
2 CREATE TABLE TEST_DEPT AS SELECT * FROM DEPT E WHERE E.DEPTNO IS NULL

定义一个ROWTYPE变量

 1 DECLARE
2 --定义一个ROWTYPE变量
3 EMP_RECORD TEST_dept%ROWTYPE;
4 BEGIN
5 --初始化变量中的值
6 EMP_RECORD.DEPTNO := 50;
7 EMP_RECORD.DNAME := '测试部门';
8 EMP_RECORD.LOC := '西安绿地';
9 --插入数据
10 INSERT
11 INTO TEST_dept VALUES
12 (EMP_RECORD.DEPTNO,EMP_RECORD.DNAME,EMP_RECORD.LOC);
13 --提交记录
14 COMMIT;
15 END;
16 DECLARE

显式的将记录定义为PL/SQL的结构

 1 DECLARE
2 --定义一个记录
3 TYPE DEPT_RECORD IS RECORD(
4 DEPTNO TEST_DEPT.DEPTNO%TYPE,
5 DNAME TEST_DEPT.DNAME%TYPE,
6 LOC TEST_DEPT.LOC%TYPE);
7 --定义该记录的一个变量
8 V_DEPT_RECORD DEPT_RECORD;
9 BEGIN
10 --初始化变量中的值
11 V_DEPT_RECORD.DEPTNO := 60;
12 V_DEPT_RECORD.DNAME := '测试部门1';
13 V_DEPT_RECORD.LOC := '西安绿地1';
14 --插入数据
15 INSERT INTO TEST_DEPT
16 VALUES
17 (V_DEPT_RECORD.DEPTNO, V_DEPT_RECORD.DNAME, V_DEPT_RECORD.LOC);
18 --提交记录
19 COMMIT;
20 END;

构造复合数据类型,只能使用显式定义的记录类型,不能使用ROWTYPE.基记录类型必须显式的定义

View Code
 1 DECLARE
2 --声明一个EMP的记录
3 TYPE EMP_RECORD IS RECORD(
4 EMPNO NUMBER(4),
5 ENAME VARCHAR2(10),
6 JOB VARCHAR2(9),
7 MGR NUMBER(4),
8 HIREDATE DATE,
9 SAL NUMBER(7, 2),
10 COMM NUMBER(7, 2),
11 DEPTNO NUMBER(2));
12 --声明一个DEPT的记录
13 TYPE DEPT_RECORD IS RECORD(
14 DEPTNO NUMBER(2),
15 DNAME VARCHAR2(14),
16 LOC VARCHAR2(13));
17 --分别定义记录的变量
18 TYPE V_EMP_DEPT_RECORD IS RECORD(
19 V_EMP_RECORD EMP_RECORD,
20 V_DEPT_RECORD DEPT_RECORD);
21 V_EMP__DEPT_RECORD V_EMP_DEPT_RECORD;
22 BEGIN
23 --分别初始化数值
24 V_EMP__DEPT_RECORD.V_EMP_RECORD.EMPNO := 1234;
25 V_EMP__DEPT_RECORD.V_EMP_RECORD.ENAME := '小明';
26 V_EMP__DEPT_RECORD.V_EMP_RECORD.JOB := 'BOSS';
27 -- V_EMP_RECORD.MGR
28 V_EMP__DEPT_RECORD.V_EMP_RECORD.HIREDATE := SYSDATE;
29 V_EMP__DEPT_RECORD.V_EMP_RECORD.SAL := 5000;
30 V_EMP__DEPT_RECORD.V_EMP_RECORD.COMM := 500;
31 V_EMP__DEPT_RECORD.V_EMP_RECORD.DEPTNO := 60;
32 -------------------------
33 V_EMP__DEPT_RECORD.V_DEPT_RECORD.DEPTNO := 60;
34 V_EMP__DEPT_RECORD.V_DEPT_RECORD.DNAME := '测试部门';
35 V_EMP__DEPT_RECORD.V_DEPT_RECORD.LOC := '西安绿地';
36 --插入数据
37 INSERT INTO TEST_DEPT
38 VALUES
39 (V_EMP__DEPT_RECORD.V_DEPT_RECORD.DEPTNO,
40 V_EMP__DEPT_RECORD.V_DEPT_RECORD.DNAME,
41 V_EMP__DEPT_RECORD.V_DEPT_RECORD.LOC);
42
43 INSERT INTO TEST_EMP
44 VALUES
45 (V_EMP__DEPT_RECORD.V_EMP_RECORD.EMPNO,
46 V_EMP__DEPT_RECORD.V_EMP_RECORD.ENAME,
47 V_EMP__DEPT_RECORD.V_EMP_RECORD.JOB,
48 V_EMP__DEPT_RECORD.V_EMP_RECORD.MGR,
49 V_EMP__DEPT_RECORD.V_EMP_RECORD.HIREDATE,
50 V_EMP__DEPT_RECORD.V_EMP_RECORD.SAL,
51 V_EMP__DEPT_RECORD.V_EMP_RECORD.COMM,
52 V_EMP__DEPT_RECORD.V_EMP_RECORD.DEPTNO);
53 COMMIT;
54 END;
55

以形参的形式定义和使用记录类型

View Code
 1 DECLARE
2 --定义记录类型
3 TYPE DEPT_RECORD IS RECORD(
4 DEPTNO NUMBER(2),
5 DNAME VARCHAR2(14),
6 LOC VARCHAR2(13));
7 TYPE EMP_RECORD IS RECORD(
8 EMPNO NUMBER(4),
9 ENAME VARCHAR2(10),
10 JOB VARCHAR2(9),
11 MGR NUMBER(4),
12 HIREDATE DATE,
13 SAL NUMBER(7, 2),
14 COMM NUMBER(7, 2),
15 DEPTNO NUMBER(2));
16 --定义复合记录类型
17 TYPE DEPT_EMP_RECORD IS RECORD(
18 V_DEPT_RECORD DEPT_RECORD,
19 V_EMP_RECORD EMP_RECORD);
20 --定义类型的变量
21 V_DEPT_EMP_RECORD DEPT_EMP_RECORD;
22
23 --定义DEPT存储过程
24 PROCEDURE INSERT_DEPT(I_DEPT_RECORD DEPT_RECORD) IS
25 BEGIN
26 INSERT INTO TEST_DEPT
27 VALUES
28 (I_DEPT_RECORD.DEPTNO, I_DEPT_RECORD.DNAME, I_DEPT_RECORD.LOC);
29 --提交
30 COMMIT;
31 EXCEPTION
32 WHEN OTHERS THEN
33 DBMS_OUTPUT.PUT_LINE('插入TEST_DEPT表出错,请检查');
34 ROLLBACK;
35 END INSERT_DEPT; --DEPT存储过程结束
36 --定义EMP存储过程
37 PROCEDURE INSERT_EMP(I_EMP_RECORD EMP_RECORD) IS
38 BEGIN
39 INSERT INTO TEST_EMP
40 VALUES
41 (I_EMP_RECORD.EMPNO,
42 I_EMP_RECORD.ENAME,
43 I_EMP_RECORD.JOB,
44 I_EMP_RECORD.MGR,
45 I_EMP_RECORD.HIREDATE,
46 I_EMP_RECORD.SAL,
47 I_EMP_RECORD.COMM,
48 I_EMP_RECORD.DEPTNO);
49 --提交
50 COMMIT;
51 EXCEPTION
52 WHEN OTHERS THEN
53 DBMS_OUTPUT.PUT_LINE('插入EMP表出错,请检查');
54 ROLLBACK;
55 END INSERT_EMP; --DEPT存储过程结束
56 BEGIN
57 --初始化dept数据
58 V_DEPT_EMP_RECORD.V_DEPT_RECORD.DEPTNO := 60;
59 V_DEPT_EMP_RECORD.V_DEPT_RECORD.DNAME := '测试数据1';
60 V_DEPT_EMP_RECORD.V_DEPT_RECORD.LOC := '西安市';
61 --初始话emp数据
62 V_DEPT_EMP_RECORD.V_EMP_RECORD.EMPNO := 8788;
63 V_DEPT_EMP_RECORD.V_EMP_RECORD.ENAME := '小明';
64 V_DEPT_EMP_RECORD.V_EMP_RECORD.JOB := '小头目';
65 V_DEPT_EMP_RECORD.V_EMP_RECORD.MGR := 7899;
66 V_DEPT_EMP_RECORD.V_EMP_RECORD.HIREDATE := SYSDATE;
67 V_DEPT_EMP_RECORD.V_EMP_RECORD.SAL := 6000;
68 V_DEPT_EMP_RECORD.V_EMP_RECORD.COMM := 80;
69 V_DEPT_EMP_RECORD.V_EMP_RECORD.DEPTNO := 60;
70 --调用dept过程
71 INSERT_DEPT(V_DEPT_EMP_RECORD.V_DEPT_RECORD);
72 INSERT_EMP(V_DEPT_EMP_RECORD.V_EMP_RECORD);
73 EXCEPTION
74 WHEN OTHERS THEN
75 DBMS_OUTPUT.PUT_LINE('程序出错,请检查');
76 ROLLBACK;
77 END;

 

将记录作为函数返回值的定义和使用方法

 1 /*
2 将记录作为函数返回值的定义和使用方法
3 */
4 DECLARE
5 --定义一个记录
6 TYPE EMP_RECORD IS RECORD(
7 DEPTNO NUMBER(2),
8 DNAME VARCHAR2(14),
9 LOC VARCHAR2(13));
10 --定义记录的变量
11 V_EMP_RECORD EMP_RECORD;
12 --定义函数
13 FUNCTION GET_ROW(I_DEPTNO NUMBER) RETURN EMP_RECORD IS
14 --定义一个游标用来返回记录行
15 CURSOR DEPT_CURSOR(I_DEPTNO_CURSOR NUMBER) IS
16 SELECT * FROM DEPT D WHERE D.DEPTNO = I_DEPTNO_CURSOR;
17 BEGIN
18 --通过循环得到要返回的唯一行
19 FOR IDX IN DEPT_CURSOR(I_DEPTNO) LOOP
20 --返回行
21 RETURN IDX;
22 END LOOP;
23 END GET_ROW;
24 BEGIN
25 --得到函数的返回值,打印出来
26 V_EMP_RECORD := GET_ROW(10);
27 --输出结果
28 DBMS_OUTPUT.PUT_LINE('DEPTNO:' || V_EMP_RECORD.DEPTNO || ' DNAME:' ||
29 V_EMP_RECORD.DNAME || ' LOC:' || V_EMP_RECORD.LOC);
30 END;



I believe that we are who we choose to be. Nobody‘s going to come and save you, you‘ve got to save yourself. 我相信我们成为怎样的人是我们自己的选择。没有人会来拯救你,你必须要自己拯救自己。
原文地址:https://www.cnblogs.com/caroline/p/2284240.html