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

一、记录和集合概述

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

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

1. Records:记录

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

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

b. Nested Table: 嵌套表

c. Varray: 可变长度列表。

二、记录和集合的区别

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

PL/SQL Record

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

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

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

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.

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

SQL> edit

DECLARE

myrec employees%ROWTYPE;

BEGIN

myrec := NULL;

END;

/

SQL> @notes/s43.sql

PL/SQL procedure successfully completed.

时间: 2024-10-12 20:09:00

10.PL_SQL——PL_SQL中的复合数据类型之RECORDS的相关文章

11.PL_SQL——PL_SQL中的复合数据类型之COLLECTION(联合数组(Associative Arrays))

SQL> edit DECLARE TYPE list_of_names_t IS TABLEOF employees.first_name%TYPE INDEX BY PLS_INTEGER; happyfamily list_of_names_t; l_row PLS_INTEGER; BEGIN happyfamily(2020202020) :='Eli'; happyfamily(-15070) :='Steven'; happyfamily(-90900) :='Chris'; ha

oracle中的复合数据类型

1)显示定义记录类型: declare --显示定义一个record类型myrec type myrec is RECORD ( combine_no VARCHAR2(10), department_code VARCHAR2(11) ); -- 声明一个myrec类型的变量rcd: rcd myrec; begin select nr.combine_no,nr.department_code  into rcd from rate_combine_nr nr where nr.combin

【PLSQL】PLSQL中复合数据类型

1,常见的操作数据库的技术有那些 jdbc     使用java 访问数据库的技术    PLSQL  (procedure  过程化sql) 在数据库内部操作数据的技术    proc/c++    c 和 c++ 访问数据库的技术    ODBC      微软提供访问数据库的技术    OCI          oracle  底层的连接接口 2,Oracle中的复合数据类型 Oracle中的复合数据类型record,table,cursor 2.1 record类型 2.1.1 语法 /

7.PL_SQL——在PL_SQL程序中内嵌查询语句、DML语句和事物处理语句

在PL/SQL中可以使用的SQL语句主要有以下几类: SELECT 查询语句,DML语句,Transaction 事物处理语句,本文将对这几类语句在PL/SQL中的用法逐一介绍. 一.查询语句-SELECT SELECT 语句用来查询一条或多条语句.虽然SELECT 语句也属于DML语句,但SELECT是只读的,所以单独列出. 在PL/SQL中使用SELECT 语句的格式如下:   SELECT select_list INTO {variable_name[,variable_name]...

ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套

这是ElasticSearch 2.4 版本系列的第六篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 ElasticSearch入门 第三篇:索引 ElasticSearch入门 第四篇:使用C#添加和更新文档 ElasticSearch入门 第五篇:使用C#查询文档 ElasticSearch入门 第六篇:复合数据类型——数组,对象和嵌套 在ElasticSearch中,使用JSON结构来存储数据,

JAVA中分为基本数据类型及引用数据类型

一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数

[.net 面向对象编程基础] (3) 基础中的基础——数据类型

[.net 面向对象编程基础] (3) 基础中的基础——数据类型 关于数据类型,这是基础中的基础. 基础..基础..基础.基本功必须要扎实. 首先,从使用电脑开始,再到编程,电脑要存储数据,就要按类型存储,就跟我们买来衣服一样,裤子,上衣,冬天的,夏天的,总要分个类再放进衣柜中一样.越是高级的编程语言,数据类型分的越详细. 问题来了,这么多数据类型,我们是不是要一一记住,这真不是个省心的事情,不用怕,不用怕,不用怕,重要的事情说三遍. 重点:C#就15种数据类型. 准确来说,是15种预定义类型,

Oracle PL/SQL复合数据类型

复合数据类型大致可以分为两类.一类是记录类型,适用于处理单行多列数据,有点类似于java中的VO:一类是集合类型,适用于处理单列多行的数据,类似java中的List,以下实验在11.2.0.1.0版本下做的. 1.记录类型 drop table test purge; create table test ( id number(2), name varchar2(60) ); insert into test values(1,'aaa'); insert into test values(2,

oracle常用的复合数据类型 : BULK COLLECT(成批聚合类型)和数组集合type类型is table of 表%rowtype index by binary_integer

例1: 批量 查询部门号为 "10" 号的并把它们打印出来 . DECLARE TYPE emp_table_type IS TABLE OF my_emp%ROWTYPE INDEX BY BINARY_INTEGER; v_emp_table emp_table_type; BEGIN SELECT * BULK COLLECT INTO v_emp_table FROM my_emp WHERE deptno=&deptno; FOR i IN 1..v_emp_tabl