您的位置:首页 > 数据库

PL/SQL--RECORD

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

创建测试表

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


定义一个ROWTYPE变量

DECLARE
--定义一个ROWTYPE变量
EMP_RECORD TEST_dept%ROWTYPE;
BEGIN
--初始化变量中的值
EMP_RECORD.DEPTNO := 50;
EMP_RECORD.DNAME := '测试部门';
EMP_RECORD.LOC := '西安绿地';
--插入数据
INSERT
INTO TEST_dept VALUES
(EMP_RECORD.DEPTNO,EMP_RECORD.DNAME,EMP_RECORD.LOC);
--提交记录
COMMIT;
END;
DECLARE


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

DECLARE
--定义一个记录
TYPE DEPT_RECORD IS RECORD(
DEPTNO TEST_DEPT.DEPTNO%TYPE,
DNAME  TEST_DEPT.DNAME%TYPE,
LOC    TEST_DEPT.LOC%TYPE);
--定义该记录的一个变量
V_DEPT_RECORD DEPT_RECORD;
BEGIN
--初始化变量中的值
V_DEPT_RECORD.DEPTNO := 60;
V_DEPT_RECORD.DNAME  := '测试部门1';
V_DEPT_RECORD.LOC    := '西安绿地1';
--插入数据
INSERT INTO TEST_DEPT
VALUES
(V_DEPT_RECORD.DEPTNO, V_DEPT_RECORD.DNAME, V_DEPT_RECORD.LOC);
--提交记录
COMMIT;
END;


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

View Code

DECLARE
--定义记录类型
TYPE DEPT_RECORD IS RECORD(
DEPTNO NUMBER(2),
DNAME  VARCHAR2(14),
LOC    VARCHAR2(13));
TYPE EMP_RECORD IS RECORD(
EMPNO    NUMBER(4),
ENAME    VARCHAR2(10),
JOB      VARCHAR2(9),
MGR      NUMBER(4),
HIREDATE DATE,
SAL      NUMBER(7, 2),
COMM     NUMBER(7, 2),
DEPTNO   NUMBER(2));
--定义复合记录类型
TYPE DEPT_EMP_RECORD IS RECORD(
V_DEPT_RECORD DEPT_RECORD,
V_EMP_RECORD  EMP_RECORD);
--定义类型的变量
V_DEPT_EMP_RECORD DEPT_EMP_RECORD;

--定义DEPT存储过程
PROCEDURE INSERT_DEPT(I_DEPT_RECORD DEPT_RECORD) IS
BEGIN
INSERT INTO TEST_DEPT
VALUES
(I_DEPT_RECORD.DEPTNO, I_DEPT_RECORD.DNAME, I_DEPT_RECORD.LOC);
--提交
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('插入TEST_DEPT表出错,请检查');
ROLLBACK;
END INSERT_DEPT; --DEPT存储过程结束
--定义EMP存储过程
PROCEDURE INSERT_EMP(I_EMP_RECORD EMP_RECORD) IS
BEGIN
INSERT INTO TEST_EMP
VALUES
(I_EMP_RECORD.EMPNO,
I_EMP_RECORD.ENAME,
I_EMP_RECORD.JOB,
I_EMP_RECORD.MGR,
I_EMP_RECORD.HIREDATE,
I_EMP_RECORD.SAL,
I_EMP_RECORD.COMM,
I_EMP_RECORD.DEPTNO);
--提交
COMMIT;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('插入EMP表出错,请检查');
ROLLBACK;
END INSERT_EMP; --DEPT存储过程结束
BEGIN
--初始化dept数据
V_DEPT_EMP_RECORD.V_DEPT_RECORD.DEPTNO := 60;
V_DEPT_EMP_RECORD.V_DEPT_RECORD.DNAME  := '测试数据1';
V_DEPT_EMP_RECORD.V_DEPT_RECORD.LOC    := '西安市';
--初始话emp数据
V_DEPT_EMP_RECORD.V_EMP_RECORD.EMPNO    := 8788;
V_DEPT_EMP_RECORD.V_EMP_RECORD.ENAME    := '小明';
V_DEPT_EMP_RECORD.V_EMP_RECORD.JOB      := '小头目';
V_DEPT_EMP_RECORD.V_EMP_RECORD.MGR      := 7899;
V_DEPT_EMP_RECORD.V_EMP_RECORD.HIREDATE := SYSDATE;
V_DEPT_EMP_RECORD.V_EMP_RECORD.SAL      := 6000;
V_DEPT_EMP_RECORD.V_EMP_RECORD.COMM     := 80;
V_DEPT_EMP_RECORD.V_EMP_RECORD.DEPTNO   := 60;
--调用dept过程
INSERT_DEPT(V_DEPT_EMP_RECORD.V_DEPT_RECORD);
INSERT_EMP(V_DEPT_EMP_RECORD.V_EMP_RECORD);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('程序出错,请检查');
ROLLBACK;
END;


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

/*
将记录作为函数返回值的定义和使用方法
*/
DECLARE
--定义一个记录
TYPE EMP_RECORD IS RECORD(
DEPTNO NUMBER(2),
DNAME  VARCHAR2(14),
LOC    VARCHAR2(13));
--定义记录的变量
V_EMP_RECORD EMP_RECORD;
--定义函数
FUNCTION GET_ROW(I_DEPTNO NUMBER) RETURN EMP_RECORD IS
--定义一个游标用来返回记录行
CURSOR DEPT_CURSOR(I_DEPTNO_CURSOR NUMBER) IS
SELECT * FROM DEPT D WHERE D.DEPTNO = I_DEPTNO_CURSOR;
BEGIN
--通过循环得到要返回的唯一行
FOR IDX IN DEPT_CURSOR(I_DEPTNO) LOOP
--返回行
RETURN IDX;
END LOOP;
END GET_ROW;
BEGIN
--得到函数的返回值,打印出来
V_EMP_RECORD := GET_ROW(10);
--输出结果
DBMS_OUTPUT.PUT_LINE('DEPTNO:' || V_EMP_RECORD.DEPTNO || ' DNAME:' ||
V_EMP_RECORD.DNAME || ' LOC:' || V_EMP_RECORD.LOC);
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: