`
insertyou
  • 浏览: 906290 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

PL/SQL --> PL/SQL记录

 
阅读更多

--=======================

-- PL/SQL --> PL/SQL记录

--=======================

PL/SQL记录有着类似于表的数据结构,是一个或多个字段且拥有数据类型的集合体。定义了PL/SQL记录类型之后,可以定义PL/SQL记录变

量。声明一个PL/SQL记录变量相当于定义了多个标量变量,简化了变量的声明,从而大大节省了内存资源。多用于简化单行多列的数据处理。

一、定义PL/SQL记录

1.直接定义PL/SQL记录(首先定义记录类型,类型中包含的记录成员,其次是记录类型变量)

TYPE type_name IS RECORD --type_name用于指定自定义记录类型的名称

(field_name1 datatype1 [NOT NULL] [ := DEFAULT EXPRESSION], --定义记录的成员、数据类型及缺省值

field_name2 datatype2 [NOT NULL] [ := DEFAULT EXPRESSION],

...

field_nameN datatypeN [NOT NULL] [ := DEFAULT EXPRESSION]);

record_name TYPE_NAME; --定义记录变量名record_name

2.使用%rowtype定义PL/SQL记录

使用%rowtype时,记录成员名称和类型与所依赖对象(表,视图,游标)名称和类型完全相同

对于表和视图,游标所有列定义时,使用%rowtype定义将大大节省内存空间

record_name table_name%rowtype --基于不同的对象定义PL/SQL记录,此处为表

record_name view_name%rowtype

reocrd_name cursor_name%rowtype

二、PL/SQL记录的使用

1. SELECT INTO语句中使用

--使用PL/SQL记录变量

undefine no

DECLARE

TYPE emp_record_type IS RECORD

(

name emp.ename%TYPE,

salary emp.sal%TYPE,

dno emp.deptno%TYPE

);

emp_record emp_record_type;

BEGIN --下面的查询到的数据插入到记录变量,注意列之间的顺序与声明顺序保持一致

SELECT ename, sal, deptno INTO emp_record

FROM emp WHERE empno = &no;

dbms_output.put_line(emp_record.name); --输出时仅仅输出记录变量的一个成员emp_record.name

END;

Enter value for no: 7788

SCOTT

--使用PL/SQL记录成员

undefine no

DECLARE

TYPE emp_record_type IS RECORD

(

name emp.ename%TYPE,

salary emp.sal%TYPE,

dno emp.deptno%TYPE

);

emp_record emp_record_type;

BEGIN

SELECT ename, sal INTO emp_record.name, emp_record.salary --此处仅仅使用到了namesalary 成员

FROM emp WHERE empno = &no;

dbms_output.put_line(emp_record.name); --输出时仅仅输出记录变量的一个成员emp_record.name

END;

/

2.INSERT语句中使用记录变量及成员

--使用PL/SQL记录变量

DECLARE

dept_record dept%ROWTYPE;

BEGIN

dept_record.deptno := 50;

dept_record.dname := 'ADMINISTRATOR';

dept_record.loc := 'BEIJING';

INSERT INTO dept VALUES dept_record;

END;

/

scott@ORCL> select * from dept where deptno=50;

DEPTNO DNAME LOC

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

50 ADMINISTRATOR BEIJING

--使用PL/SQL记录成员

scott@ORCL> DECLARE

2 dept_record dept%ROWTYPE;

3 BEGIN

4 dept_record.deptno := 60;

5 dept_record.dname := 'SALES';

6 INSERT INTO dept(deptno, dname) VALUES(dept_record.deptno, dept_record.dname);

7 END;

8 /

PL/SQL procedure successfully completed.

scott@ORCL> select * from dept where deptno in (50,60);

DEPTNO DNAME LOC

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

50 ADMINISTRATOR BEIJING

60 SALES

3.UPDATE语句中使用记录变量及成员

--使用PL/SQL记录变量(使用ROW来更新整行)

DECLARE

dept_record dept%ROWTYPE;

BEGIN

dept_record.deptno := 50;

dept_record.dname := 'SERVICE';

dept_record.loc := 'GuangZhou';

UPDATE dept SET ROW = dept_record WHERE deptno = 50;--注意update时,使用ROW来表示整行

END;

/

--使用PL/SQL记录成员(使用成员记录更新单列或多列)

scott@ORCL> DECLARE

2 dept_record dept%ROWTYPE;

3 BEGIN

4 dept_record.loc:='ShangHai';

5 UPDATE dept SET loc=dept_record.loc WHERE deptno=60;

6 END;

7 /

4.DELETE语句中使用记录变量及成员

DECLARE

dept_record dept%ROWTYPE;

BEGIN

dept_record.deptno:=60;

DELETE FROM dept WHERE deptno=dept_record.deptno;

END;

/

三、PL/SQL记录使用时的几个问题

1.记录成员非空值的问题(非空值应当在初始化时赋值,而不是在使用时赋值)

scott@ORCL> DECLARE

2 TYPE ex_type IS RECORD

3 (col1 NUMBER(3),

4 col2 VARCHAR2(5) NOT NULL);

5 ex_record ex_type;

6 BEGIN

7 ex_record.col1:=15;

ex_record.col1:=TO_CHAR(ex_record.col1);

8 ex_record.col2:='John';

9 DBMS_OUTPUT.PUT_LINE('ex_record.col1 is '||ex_record.col1);

10 DBMS_OUTPUT.PUT_LINE('ex_record.col2 is '||ex_record.col2);

11 END;

12 /

col2 VARCHAR2(5) NOT NULL);

*

ERROR at line 4:

ORA-06550: line 4, column 6:

PLS-00218: a variable declared NOT NULL must have an initialization assignment--错误消息指出非空值应当在初始化时指定

DECLARE

TYPE ex_type IS RECORD(

col1 NUMBER(3),

col2 VARCHAR2(5) NOT NULL := 'John'); --注意对于非空值应当在初始化时赋值,而不是在使用时赋值

ex_record ex_type;

BEGIN

ex_record.col1 := 15;

ex_record.col1 := TO_CHAR(ex_record.col1);

--ex_record.col2:='John';

DBMS_OUTPUT.PUT_LINE('ex_record.col1 is ' || ex_record.col1);

DBMS_OUTPUT.PUT_LINE('ex_record.col2 is ' || ex_record.col2);

END;

ex_record.col1 is 15

ex_record.col2 is John

2.记录变量之间的赋值问题

下面的例子中两个PL/SQL变量name_rec1name_rec2尽管具有表面上相同的定义,但两者之间不能相互赋值

DECLARE

TYPE ex_type1 IS RECORD(

first_name VARCHAR2(15),

last_name VARCHAR2(30));

TYPE ex_type2 IS RECORD(

first_name VARCHAR2(15),

last_name VARCHAR2(30));

ex_rec1 ex_type1;

ex_rec2 ex_type2;

BEGIN

ex_rec1.first_name := 'Robinson';

ex_rec1.last_name := 'Cheng';

ex_rec2 := ex_rec1; -- 不合理的赋值方式

END;

ex_rec2 := ex_rec1;

*

ERROR at line 13:

ORA-06550: line 13, column 25:

PLS-00382: expression is of wrong type

ORA-06550: line 13, column 3:

PL/SQL: Statement ignored

具有相同的记录类型时,不同记录变量之间可以相互赋值

DECLARE

TYPE ex_type1 IS RECORD(

first_name VARCHAR2(15),

last_name VARCHAR2(30));

ex_rec1 ex_type1;

ex_rec2 ex_type1;

BEGIN

ex_rec1.first_name := 'Robinson';

ex_rec1.last_name := 'Cheng';

ex_rec2 := ex_rec1;

DBMS_OUTPUT.PUT_LINE('ex_rec1 is '||ex_rec1.first_name||' '||ex_rec1.last_name);

DBMS_OUTPUT.PUT_LINE('ex_rec2 is '||ex_rec2.first_name||' '||ex_rec2.last_name);

END;

ex_rec1 is Robinson Cheng

ex_rec2 is Robinson Cheng

3.基于表,基于游标,基于自定义PL/SQL记录的综合使用

DECLARE

CURSOR dept_cur IS --声明游标

SELECT * FROM dept WHERE deptno = 30;

TYPE dept_type IS RECORD( --声明一个自定义的PL/SQL记录类型

deptno NUMBER(2),

dname VARCHAR2(14),

loc VARCHAR2(13));

dept_rec1 dept%ROWTYPE; --声明基于表dept的记录变量

dept_rec2 dept_cur%ROWTYPE; --声明基于游标dept_cur的记录变量

dept_rec3 dept_type; --声明基于自定义dept_type的记录变量

BEGIN

SELECT * INTO dept_rec1 FROM dept WHERE deptno = 30; --将查询的结果插入到基于表dept的记录变量中

OPEN dept_cur;

LOOP

FETCH dept_cur

INTO dept_rec2; --将游标的内容插入到游标记录变量中

EXIT WHEN dept_cur%NOTFOUND;

END LOOP;

dept_rec1 := dept_rec2;

dept_rec3 := dept_rec2;

DBMS_OUTPUT.PUT_LINE(dept_rec1.deptno || ' ' || dept_rec1.dname);

DBMS_OUTPUT.PUT_LINE(dept_rec2.deptno || ' ' || dept_rec2.dname);

DBMS_OUTPUT.PUT_LINE(dept_rec3.deptno || ' ' || dept_rec3.dname);

END;

30 SALES

30 SALES

30 SALES

四、更多参考

有关SQL请参考

SQL 基础--> 子查询

SQL 基础-->多表查询

SQL基础-->分组与分组函数

SQL 基础-->常用函数

SQL 基础--> ROLLUP与CUBE运算符实现数据汇总

SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)

有关PL/SQL请参考

PL/SQL --> 语言基础

PL/SQL --> 流程控制

PL/SQL --> 存储过程

PL/SQL --> 函数

PL/SQL --> 游标

PL/SQL -->隐式游标(SQL%FOUND)

PL/SQL --> 异常处理(Exception)

PL/SQL --> PL/SQL记录

PL/SQL --> 包的创建与管理

PL/SQL --> 包重载、初始化

PL/SQL --> DBMS_DDL包的使用

PL/SQL --> DML 触发器

PL/SQL --> INSTEAD OF 触发器

分享到:
评论

相关推荐

    pl/sql-64bit

    pl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bitpl/sql-64bit

    pl/sql-7.1.5

    PL/SQL Developer是一种集成的开发环境,专门用于开发、测试、调试和优化Oracle PL/SQL存储程序单元,比如触发器等。PL/SQL Developer功能十分全面,大大缩短了程序员的开发周期。强大的PL/SQL编辑器,完善的Debugger...

    Oracle-PL/SQL-windows-32位-客户端

    这个压缩包“Oracle-PL/SQL-windows-32位-客户端”包含了Oracle数据库32位客户端所需的组件,主要用于在Windows环境下进行数据库管理和开发工作。 1. **Oracle Instant Client**: `instantclient_11_2`是Oracle ...

    PL/SQL-必看-基础教程(入门经典)

    PL/SQL-必看-基础教程(入门经典)不以理论为主,以实例为主! PL/SQL-必看-基础教程(入门经典)不以理论为主,以实例为主!

    oracle10g_pl/sql

    Oracle 10g PL/SQL 是Oracle数据库系统中用于创建和管理存储过程、函数、触发器等数据库对象的编程语言。本教程旨在为初学者提供一个全面的学习平台,同时也为经验丰富的开发者提供参考资料。PL/SQL是Oracle特有的...

    Web pl/sql报表制作过程

    charset=gb2312" /><title>无标题文档</title></head><body><table width="740" border="1">----------表头区域-------------- <tr> <td>姓名</td> <td>年龄</td> <td>性别</td> <td>部门</td> <td>工资</td> </tr>...

    pl/sql最新中文手册

    1. **PL/SQL基础**:手册可能会从基础开始,介绍PL/SQL的基本结构,包括声明变量、常量、游标、记录类型等。还会讲解如何编写存储过程、函数和触发器。 2. **控制流程语句**:这包括条件判断(IF-THEN-ELSIF-ELSE)...

    pl/SQL---Oracle帮助文档

    Oracle技术文档,Pl/SQl 的使用说明书

    一个对数据库的操作工具PL/SQLpl/sqL工具

    PL/SQL是Oracle公司开发的一种过程化语言,全称为Procedural Language/Structured Query Language,它是SQL的一个扩展,专门用于处理Oracle数据库系统。这个“PL/SQL工具”显然是一个用于辅助管理和操作Oracle数据库...

    PL/SQL 基本知识

    PL/SQL是Oracle数据库系统中的一个核心组件,全称为“Procedural Language/Structured Query Language”,它是SQL的扩展,增加了编程元素,使得开发者能够编写存储过程、函数、触发器等数据库应用程序。这篇博客主要...

    Oracle PL/SQL实战(待续)

    同时,PL/SQL支持多种数据类型,包括数值类型(NUMBER)、字符类型(VARCHAR2, CHAR)、日期类型(DATE)等,以及复合类型如记录(RECORD)和表类型(TABLE)。 此外,PL/SQL的包(PACKAGE)概念是将相关的过程和...

    Oracle资料学习PL/SQL必备

    2. **数据类型**:PL/SQL支持多种数据类型,包括数值类型(如NUMBER)、字符串类型(如VARCHAR2、CHAR)、日期时间类型(如DATE)、布尔类型(BOOLEAN)以及复合数据类型(如记录和数组)。 3. **变量声明和赋值**...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    《Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发》是一本深入探讨Oracle数据库中的PL/SQL编程的专业书籍。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库...

    Oracle PL/SQL程序设计(第5版)(上下册)

    - **集合与记录**:学习如何使用PL/SQL中的集合和记录类型,这些结构可以帮助更高效地处理数据集。 - **游标**:介绍游标的使用方法,包括隐式游标和显式游标,以及如何利用游标遍历查询结果。 #### 四、PL/SQL中的...

    pl/sql developer11.0

    PL/SQL Developer是一款由Allround Automations公司开发的专业Oracle数据库开发工具,专为编写、调试、测试和管理PL/SQL代码而设计。标题中的“pl/sql developer11.0”指的是该软件的第11个主要版本。在本文中,我们...

    oracle 9i pl/sql程序设计笔记

    ### Oracle 9i PL/SQL程序设计笔记精要 #### PL/SQL基础知识概览 **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。...

    pl-sql-dev-8-setup PL/SQL developer 8 的安装文件

    pl-sql-dev-8-setup PL/SQL developer 的安装文件 另外还有它的注册机 和 简体中文包 都在我的资源中 我的刚解决 所以免费贴出来和大家分享

    ORACLE PL/SQL从入门到精通

    ORACLE PL/SQL是从入门到精通的专业知识,涵盖了数据库开发与管理的多个方面,包括触发器、过程、函数、软件包、异常处理、游标、循环、分支、变量使用、数据库安装等关键知识点。 触发器是数据库中用来保证数据...

    PL/SQL VCS插件安装包+PL/SQL

    PL/SQL VCS插件是为开发者提供的一种增强工具,它与PL/SQL Developer整合,目的是为了更好地管理和控制Oracle数据库中的SQL脚本和存储过程的版本。这个安装包结合了Version Control System (VCS)的功能,如Visual ...

    oracle pl/sql从入门到精通 配套源代码

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...

Global site tag (gtag.js) - Google Analytics