10.PL_SQL——PL_SQL中的复合数据类型之RECORDS
admin
2023-05-13 17:02:24
0

一、记录和集合概述

         目前为止所介绍的变量的数据类型都属于scalar,即标量,如×××,字符串,日期等等。任何一种编程语言都需要提供一些手段让用户创建更复杂的变量,PL/SQL也不例外,本章就来介绍一下PL/SQL中的复合型变量。

 

PL/SQL的复合型变量主要包括两类:

 

              1. Records:记录

              2. Collection集合。Collection又可以分为三种,

                              a. Associative  ArrayINDEXTBY table: 关联数组(或称索引表,和SQL中的INDEX OF TABLE不是一个概念)

                              b. Nested Table: 嵌套表

                              c. Varray: 可变长度列表。

 

二、记录和集合的区别

         Records可以形象的理解为一个容器,用来保存很多其他的数据类型,但每种数据类型只在记录中出现一次,例如一个记录中保存了如下数据类型:

 

PL/SQL Record

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

这个记录中保存了布尔型、日期型、字符型和BLOB型变量,且每个变量都只出现了一次,每个存放其他数据类型的空间称为域(Field


10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

SQL> edit

 

DECLARE

    TYPE myrecord IS RECORD

        (id number(8),

            name varchar2(20)default 'Wilson',

            birthday DATE

        ); 

       

        person myrecord;

BEGIN  

        person.id :=12345;

        person.birthday :=SYSDATE;

       

       DBMS_OUTPUT.PUT_LINE('Name: '|| person.name);

END;   

/

 

SQL> /

Name: Wilson

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

===============================

SQL> edit

 

DECLARE

    person employees%ROWTYPE

BEGIN

    SELECT * INTO person

    FROM employees WHEREemployee_id = 100;

   

    DBMS_OUTPUT.PUT_LINE('Name: '|| person.first_name);

END;

/

 

SQL> @notes/s37.sql

Name: Steven

 

PL/SQL procedure successfully completed.

===============================================

eg3.

 

SQL> edit

 

DECLARE

    TYPE t_rec IS RECORD

        (v_sal number(8),

         v_minsal number(8)default 1000,

         v_hire_dateemployees.hire_date%TYPE,

         v_reclemployees%ROWTYPE);

    v_myrec t_rec;

BEGIN

    v_myrec.v_sal := v_myrec.v_minsal+ 500;

    v_myrec.v_hire_date :=SYSDATE;

    SELECT * INTO v_myrec.v_recl

    FROM employees WHEREemployee_id = 100;

   DBMS_OUTPUT.PUT_LINE(v_myrec.v_recl.last_name || ' ' ||     TO_CHAR(v_myrec.v_hire_date) || ' '||     TO_CHAR(v_myrec.v_sal));

END;

/

 

SQL> @notes/s38.sql

King 24-AUG-14 1500

 

PL/SQL procedure successfully completed.

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

CREATE TABLE retired_emps (

        EMPNO NUMBER(4),

        ENAME VARCHAR2(25),

        JOB   VARCHAR2(9),

        MGR   NUMBER(4),

        HIREDATE DATE,

        LEAVEDATE DATE,

        SAL   NUMBER(7,2),

        COMM  NUMBER(7,2),

        DEPTNO NUMBER(2)

    );

 

SQL> @notes/s39.sql

 

Table created.

 

SQL> select * from retired_emps where empno = 124;

 

no rows selected

 

SQL> edit

 

DECLARE

    v_employee_number NUMBER :=124;

    v_emp_rec   employees%ROWTYPE;

BEGIN

    SELECT * INTO v_emp_rec FROMemployees

    WHERE employee_id =v_employee_number;

 

    INSERT INTOretired_emps(empno, ename, job, mgr,

                hiredate,leavedate, sal, comm, deptno)

    VALUES( v_emp_rec.employee_id,v_emp_rec.last_name,

            v_emp_rec.job_id,v_emp_rec.manager_id,

            v_emp_rec.hire_date,SYSDATE,

            v_emp_rec.salary,v_emp_rec.commission_pct,

           v_emp_rec.department_id);

    COMMIT;

END;

/

 

SQL> @notes/s40.sql

 

PL/SQL procedure successfully completed.

 

SQL> select * from retired_emps where empno = 124;

 

EMPNO ENAME         JOB              MGR HIREDATE  LEAVEDATE  SAL       COMM    DEPTNO

---------- ----------      --------------- --------- ------------------- ---------      ---------- ---------- ----------

       124 Mourgos     ST_MAN     100    16-NOV-07 24-AUG-14 5800                    50



=========================INSERT============================


SQL> edit

 

DECLARE

    v_employee_number NUMBER := 127;

    v_emp_rec retired_emps%ROWTYPE;

 

BEGIN

    SELECT employee_id, last_name, job_id,manager_id,

    hire_date, hire_date, salary,commission_pct,

    department_id INTO v_emp_rec

    FROM employees

    WHERE employee_id = v_employee_number;

 

    INSERT INTO retired_emps

    VALUES v_emp_rec;

                -- 将查询结果打包到v_emp_rec

END;

/

 

SELECT * FROMretired_emps;

 

SQL>@notes/s41.sql

 

PL/SQL proceduresuccessfully completed.

 

 

     EMPNO ENAME       JOB        MGR   HIREDATE  LEAVEDATE SAL       COMM     DEPTNO

----------------------------------- --------- ---------- --------- --------- -------------------- ----------

       124 Mourgos        ST_MAN 100   16-NOV-07  24-AUG-14  5800        50

       127 Landry           ST_CLERK  120  14-JAN-07  14-JAN-07     3200       50

 

=========================UPDATE============================

 

SQL> edit

 

SET VERIFY OFF

DECLARE

        v_employee_number NUMBER:= 127;

        v_emp_recretired_emps%ROWTYPE;

 

BEGIN

        SELECT *

        INTO v_emp_rec

        FROM retired_emps

        WHERE empno =v_employee_number;

        v_emp_rec.leavedate :=CURRENT_DATE;

 

        UPDATE retired_emps SETROW = v_emp_rec

        WHERE empno = v_employee_number;

END;

/

 

SELECT * FROM retired_emps;

 

 

SQL> @notes/s42.sql

 

PL/SQL procedure successfully completed.

 

 

     EMPNO ENAME     JOB              MGR HIREDATE  LEAVEDATE     SAL       COMM     DEPTNO

     ---------- --------------  ---------- --------- ---------- ------------------    ---------- ---------- ----------

       124 Mourgos      ST_MAN      100 16-NOV-07 24-AUG-14     5800                       50

       127 Landry        ST_CLERK      120 14-JAN-07 24-AUG-14      3200                    50


10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS


SQL> edit

 

DECLARE

    myrec employees%ROWTYPE;

BEGIN

    myrec := NULL;

END;

/

 

SQL> @notes/s43.sql

 

PL/SQL procedure successfully completed.


相关内容

热门资讯

以军士兵集体丢掉武器抗命,大喊... 据凤凰卫视报道,以色列国防军一军事基地7月30日发生士兵抗命事件,约120名士兵抗议指挥官做法,将武...
蒋成华任商务部副部长 国务院任免国家工作人员。任命蒋成华为商务部副部长。免去蒋成华的商务部国际贸易谈判副代表职务。
伊朗驻华大使:在军事威胁下,不... 新华社北京7月31日电(记者刁慧琳) 伊朗驻华大使法兹里7月28日表示,伊美回到谈判桌的前提是美国必...
伊朗革命卫队在霍尔木兹海峡击中... 当地时间31日,伊朗伊斯兰革命卫队发布声明称,革命卫队海军当天在霍尔木兹海峡击中并扣留了两艘违反禁令...
美媒:特朗普,遇到了一个更强硬... 据《纽约时报》7月29日报道,就在特朗普总统看似放弃战事升级计划几天后,美国再次与伊朗交火。上周末,...
女子做气管镜时不幸身亡,丈夫称... 7月29日,西安刘先生反映妻子在当地医院做支气管镜检查时死亡,看监控时发现医生疑有违规操作。刘先生表...
全网“帮卖西瓜”,然后呢? 近日,河南部分地区西瓜滞销的消息在网上热度很高。很多地方也伸出援手:有景区收购千斤西瓜、免费赠予游客...
美媒:乌克兰袭击伊朗船只,险引... 据《纽约时报》7月28日报道,据伊朗和西方官员称,伊朗曾考虑攻击乌克兰的一个港口,以报复乌克兰对一艘...
20年里,他只画美女,用东方风... 迈进KIM在上海的工作室,迎面是一整墙的美女们。她们像是刚从一场时髦的沙龙里退场,或倚或立,眉宇间是...
Google在港推出AI代理G... 观点网讯:7月29日,Google在香港推出AI代理Gemini Spark,该代理可全天候在后台运...