oracle 生命变量,Oracle 中使用的%TYPE和%ROWTYPE类型的变量和复合变量

Oracle

中使用的%TYPE和%ROWTYPE类型的变量和复合变量

在定义变量时处理可以使用oracle规定的数据类型外,还可以使用%TYPE和%ROWTYPE来定义变量.

%TYPE类型的变量是专门为存储在数据列中检索到的值而创建的.对于使用%TYPE创建的变量,其数据类型由系统根据检索的数据列的数据类型决定.

%ROWTYPE类型的变量,它可以一次存储从数据库检索的一行数据。

当你不知道表中的数据类型是什么时候?那你就考虑%TYPE来解决此问题。

%TYPE

SQL> declare

2 empno emp.empno%TYPE; //声明的时候一定要加上表的中列

3 ename emp.ename%TYPE;

4 job emp.job%TYPE;

5 begin

6 select empno,ename,job into empno,ename,job from emp where

empno='7369';

7 dbms_output.put_line(empno||'/'||ename||'/'||job);

8 end;

9 /

7369/SMITH/CLERK

emp.empno%TYPE; 解析:首先它到emp表中去查找empno列

%TYPE返回其数据的数据类型。

%TYPE的好处:

1、 可移植性高(当我们对表的数据类型发生改变时,用户不必考虑定义变量类型)

2、 用户不必查看数据类型就可以定义变量能够存储检索的数据。

%ROWTYPE

SQL> declare

2 row_data emp%ROWTYPE;

3 begin

4 select * into row_data from emp where empno='7369';

5

dbms_output.put_line(row_data.empno||'/'||row_data.ename||'/'||row_data.job);

6 end;

7 /

注意:如果定义了%rowtype类型的变量,该变量的结构与定义表的结构完全相同,查询时必须使用*或者列举全部的字段信息。

复合变量

复合变量可以将不同的数据类型的多个值存储在一个单元中.由于复合数据类型可以有用户根据需要定义其结构,所以复合数据类型也称为自定义数据类型。

PL/SQL提供了两种类型的复合数据类型:

1、

记录类型

在记录类型中可以存储多个标量值,与数据库中的行相似

2、

记录表类型

允许用户在程序代码中使用”表”,以便存储多个行的数据。它只在程序运行期间有效。类似于程序代码中集合|数组。

记录类型:

必须使用TYPE语句定义记录类型的语法声明如下:

TYPE

record_name is record(

Field_name

data_type[not null, :=default value]

………

);

与%Rowtype不同之处是

1、%rowtype查询的是全部数据

2、记录类型必须使用type语法格式声明

//案例

SQL> declare

2 type empinfo is record( //声明一个记录类型

3 empno number(4),

4 ename varchar2(10),

5 job varchar2(9)

6 );

7

8 emp_data empinfo; //声明一个记录类型的变量

9 begin

10 select empno,ename,job into emp_data from emp where

empno=7369; //查询的结果赋值给定义的变量

11

dbms_output.put_line(emp_data.empno||'/'||emp_data.ename||'/'||emp_data.job);

12 end;

13 /

记录表类型

它可以处理多个记录或多个行记录。

1、

为什么使用记录表类型呢?

因为我们查询的数据的往往需要返回多行记录,所以需要记录表类型。

2、

定义记录表类型

TYPE

table_name is table of data_type[not null]

Index

by binary_integer;//主键的索引

declare

type table_emp

is table of emp%rowtype //创建一个表 此表的类型与emp表的类型一致

index by

binary_integer;

type table_text

is table of varchar2(20) //创建一个表 此表具有一个varchar2列的简单表

index by

binary_integer;

empt table_emp;

//声明记录表类型的变量

tabtext

table_text;

begin

案例:

SQL> declare

2 type table_emp is table of emp%rowtype

3 index by binary_integer;

4 empt table_emp;

5 begin

6 empt(1).ename:='wangyi';

7 dbms_output.put_line(empt(1).ename);

8 end;

9 /

//返回总记录

SQL> declare

2 type table_emp is table of emp%rowtype

3 index by binary_integer;

4 empt table_emp;

5 begin

6 dbms_output.put_line(empt.count);

7 end;

8 /

0 //没有记录

//删除的操作

表名.Delete(记录数);

//检索记录变量

First:获取第一个的索引

Next:下一个的索引

但是必须有参数

Last:最后一个的索引

SQL> declare

2 type table_emp is table of emp%rowtype

3 index by binary_integer;

4 empt table_emp;

5 i number(2):=1;

6 begin

7 while i<10

8 loop

9 empt(i).ename:='wangyi';

10 i:=i+1;

11 end loop;

12

13 dbms_output.put_line(empt.count);

14

15 empt.delete(2);

16

17 dbms_output.put_line(empt.count);

18

19 dbms_output.put_line(empt.first);

20 dbms_output.put_line(empt.next(2));

21 dbms_output.put_line(empt.last);

22 end;

23 /

9

8

1

3

9

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值