一、PL/SQL记录:一条记录。

可简化单行多列的数据的处理。当使用pl/sql记录时,应用开发人员即可以自定义记录类型和记录变量,也可以使用%rowtype属性直接定义记录变量。

1、当使用自定义的pl/sql记录时,需要分别定义pl/sql记录类型和记录变量。

declare
type emp_record_type is record(
name emp.ename%type,salary emp.sal%type
);
emp_record emp_record_type;
begin
select ename,sal into emp_record from emp where empno=&no;
dbms_output.put_line('雇员名:'||emp_record.name);
dbms_output.put_line('雇员工资:'||emp_record.salary);
end;

2、使用%rowtype 属性定义记录变量

declare
emp_record emp%rowtype;
begin
select * into emp_record from emp where empno=&no;
dbms_output.put_line('姓名: '||emp_record.ename);
dbms_output.put_line('工资: '||emp_record.sal);
end;

二、PL/SQL表:一列数据。

用于处理单列多行数据。类似于一维数组。PL/SQL表的元素个数没有限制,且下表可为负数。

语法如下:

type 表类型  is table of  类型 
index by binary_integer;
表变量名 表类型;

index by binary_integer 子句代表以符号整数为索引,访问表类型变量中的数据方法就是“表变量名(索引符号整数)”。可以不按顺序赋值,但必须先赋值后使用。

1、使用PL/SQL表处理单列单行数据。

declare
type ename_table_type is table of emp.ename%type
index by binary_integer;
ename_table ename_table_type;
begin
select ename into ename_table(1) from emp where empno=&eno;
dbms_output.put_line('雇员名: '||ename_table(1));
end;

2、使用PL/SQL表处理单列多行数据。

declare
type ename_table_type is table of emp.ename%type
index by binary_integer;
ename_table ename_table_type;
begin
select ename bulk collect into ename_table from emp
where deptno=&dno;
for i in 1..ename_table.count loop
dbms_output.put_line('雇员名: '||ename_table(i));
end loop;
end;

三、PL/SQL记录表:多列多行表

用于处理多行多列数据。类似于多维数组。

定义记录表类型的语法如下:

TYPE table_name IS TABLE OF element_type [NOT NULL] 
INDEX BY [BINARY_INTEGER | PLS_INTEGER | VARRAY2];

记录表中的方法:

  • EXISTS(n):如果集合的第n个成员存在,则返回true
  • COUNT:返回已经分配了存储空间即赋值了的成员数量
  • FIRST:返回成员的最低下标值
  • LAST:返回成员的最高下标值
  • PRIOR(n):返回下标为n的成员的前一个成员的下标。如果没有则返回NULL
  • NEXT(N):返回下标为n的成员的后一个成员的下标。如果没有则返回NULL
  • TRIM:删除末尾一个成员
  • TRIM(n) :删除末尾n个成员
  • DELETE:删除所有成员
  • DELETE(n) :删除第n个成员
  • DELETE(m, n) :删除从n到m的成员
  • EXTEND:添加一个null成员
  • EXTEND(n):添加n个null成员
  • EXTEND(n,i):添加n个成员,其值与第i个成员相同
  • LIMIT:返回在varray类型变量中出现的最高下标值

例1:

declare
type emp_table_type is table of emp%rowtype
index by binary_integer;
emp_table emp_table_type;
begin
select * bulk collect into emp_table from emp where deptno=&dno;
for i in 1..emp_table.count loop
dbms_output.put_line('雇员名: '||emp_table(i).ename||',工资: '||emp_table(i).sal);
end loop;
end;

按一维数组使用表:

DECLARE
--定义记录表数据类型
TYPE reg_table_type IS TABLE OF varchar2(25)
INDEX BY BINARY_INTEGER;
--声明记录表数据类型的变量
v_reg_table REG_TABLE_TYPE; BEGIN
v_reg_table(1) := 'Europe';
v_reg_table(2) := 'Americas';
v_reg_table(3) := 'Asia';
v_reg_table(4) := 'Middle East and Africa';
v_reg_table(5) := 'NULL'; DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_table (1)||'、' ||v_reg_table (2)||'、' ||v_reg_table (3)||'、' ||v_reg_table (4));
DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_table(5));
END;

四、varry数据类型:数组

具有相同数据类型的一组成员的集合,每个成员都有一个唯一的下标。

定义VARRAY数据类型的语法如下:

TYPE VARRAY_NAME IS VARRAY(SIZE) OF ELEMENT_TYPE [NOT NULL];

VARRAY的使用举例:

DECLARE
--定义一个最多保存5个VARCHAR(25)数据类型成员的VARRAY数据类型
TYPE reg_varray_type IS VARRAY(5) OF VARCHAR(25);
--声明一个该VARRAY数据类型的变量
v_reg_varray REG_VARRAY_TYPE; BEGIN
--用构造函数语法赋予初值
v_reg_varray := reg_varray_type
('中国', '美国', '英国', '日本', '法国'); DBMS_OUTPUT.PUT_LINE('地区名称:'||v_reg_varray(1)||'、'
||v_reg_varray(2)||'、'
||v_reg_varray(3)||'、'
||v_reg_varray(4));
DBMS_OUTPUT.PUT_LINE('赋予初值NULL的第5个成员的值:'||v_reg_varray(5));
--用构造函数语法赋予初值后就可以这样对成员赋值
v_reg_varray(5) := '法国';
DBMS_OUTPUT.PUT_LINE('第5个成员的值:'||v_reg_varray(5));
END;

PL/SQL复合类型的更多相关文章

  1. pl/sql属性类型

    pl/sql 属性类型 %TYPE - 引用变量和数据库列的数据类型 %ROWTYPE - 提供表示表中一行的记录类型 显示输出scott.emp表中的部分数据 declare emp_number ...

  2. C#(在WeBAPI)获取Oracle(在PL/SQL)游标类型的存储过程(用到了RefCursor)

    需求:WebAPI服务端,通过Oracle数据库的存储过程,获取数据. 在PL/SQL 建立存储过程:(先来最简单的,就是把整个表都查出来) create or replace procedure S ...

  3. Oracle的pl/sql变量类型

    pl/sql定义 sql是结构化查询语言.sql是不是一个编程语言?编程语言一般都能够声明变量,写条件判断,循环.sql不具备这些特征,所有sql不是一门编程语言.我们在实际的开发中,有这种需要,把s ...

  4. PL/SQL变量和类型

    变量 在定义变量时一定要为其指定一个类型,类型可以是PL/SQL类型或SQL语言的类型,一旦变量的类型确定,那么变量中所能存储的值也就确定了,因此尽管变量的值会经常改变,但是值的类型是不可以变化的. ...

  5. Oracle pl/sql 记录、表类型

    一.PL/SQL记录 定义: TYPE <类型名> IS RECORD <列名1 类型1,列名2 类型2,...列名n 类型n,> [NOT NULL] <列的类型> ...

  6. Oracle PL/SQL随堂笔记总结

    1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...

  7. PL/SQL Block Structure

    [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORAC ...

  8. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  9. Oracle PL/SQL中如何使用%TYPE和%ROWTYPE

    1. 使用%TYPE 在许多情况下,PL/SQL变量可以用来存储在数据库表中的数据.在这种情况下,变量应该拥有与表列相同的类型.例如,students表的first_name列的类型为VARCHAR2 ...

随机推荐

  1. 查询SQL时间段内执行过的哪些SQL语句

    QS.creation_time, ) , (( ) ) AS statement_text, ST.text, QS.total_worker_time, QS.last_worker_time, ...

  2. mysql索引 多个单列索引和联合索引的区别详解

    背景: 为了提高数据库效率,建索引是家常便饭:那么当查询条件为2个及以上时,我们是创建多个单列索引还是创建一个联合索引好呢?他们之间的区别是什么?哪个效率高呢?我在这里详细测试分析下. 一.联合索引测 ...

  3. linux ubuntu 网卡配置---固定IP

    需要修改/etc/network/interfaces和/etc/resolvconf/resolv.conf.d/base两个文件. 1) /etc/network/interfaces文件: 首先 ...

  4. Deepin安装前分区总结

    linux的分区的概念应该这么理解,为某个目录创建/挂载分区,比如为/home创建/挂载到某个分区上: 1.需要/boot分区,1.5G: 2./分区,100G:[会自动创建其他目录如/srv,/ro ...

  5. 怎么对10亿数据量级的mongoDB作高效的全表扫描

    转自:http://quentinxxz.iteye.com/blog/2149440 一.正常情况下,不应该有这种需求 首先,大家应该有个概念,标题中的这个问题,在大多情况下是一个伪命题,不应该被提 ...

  6. uwsgi03----直接部署

    1.http 和 http-socket的使用上有一些区别: http: 自己会产生一个http进程(可以认为与nginx同一层)负责路由http请求给worker, http进程和worker之间使 ...

  7. C++中的const的简单用法

    一.符号常量的声明 常量声明的语句的形式: const +  数据类型说明符 + 常量名 =  常量值     数据类型说明符  + const + 常量名 =  常量值       注意: 符号常量 ...

  8. Python07之分支和循环2(if...else、if...elif...else)

    一:if语句具体语法: if 表达式: 语句块 (表达式可以是一个布尔值或变量,也可以为一个逻辑表达式或比较表达式,表达式为真(即不为0即可,见下方实例),则运行语句块:表达式为假,则跳过语句块,继续 ...

  9. QT加载自带字体

    #include <QCoreApplication> #include <QStringList> #include <QFontDatabase> #inclu ...

  10. P1777 帮助_NOI导刊2010提高(03)

    也许更好的阅读体验 \(\mathcal{Description}\) Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30 ...