zoukankan      html  css  js  c++  java
  • 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. 我相信我们成为怎样的人是我们自己的选择。没有人会来拯救你,你必须要自己拯救自己。
  • 相关阅读:
    MVC总结
    Python在Linux | Windows中输出带颜色的文字的方法
    flushdns
    linux配置java环境变量(详细)
    ELK
    sed 时间段
    如何让root用户能直接进行ssh登录?
    rsync有两种常用的认证方式,另外一种则是ssh。
    windows rsync server
    awk
  • 原文地址:https://www.cnblogs.com/caroline/p/2284240.html
Copyright © 2011-2022 走看看