oracle pl/sql之sql中的复合变量之记录类型

另计:chr(10)
        chr(13)
一个是换行,一个是回车

 

正文:

      标量变量只可以保存单个数值,在pl/sql中的与标量变量相对应的是复合变量。复合变量可以将不同数据类型的多个值存储在一个单元中。由于复合数据类型可以由用户自己根据需要定义结构所以复合数据类型又被称为自定义数据类型。
 
pl/sql提供了量中复合数据类型
 
    记录类型:记录类型中可以存储多个标量值,它的结构通常与数据库中的行相识
 
    记录表类型:该类型的变量允许用户在程序代码中使用”表“,以便存储多个行数据。它只只程序运行期间有效,非常类似于其他语言中的数组
 
 
记录类型:
 
      使用记录类型的变量时首先要使用type语句,在这个语句中指出将在记录中包含的字段及其数据类型。语法如下:
type recordname is record(
field1_name  date_type  [not null] [:=default_value],
field2_name  date_type  [not null] [:=default_value],
......
fieldn_name  date_type  [not null] [:=default_value],
 
);

程序演示:

     定义一个名为emp_recode的记录数据类型,并从emp中查出工号为7839的员工的所有信息放到此记录中最后打印出来

declare
type emp_record is record(
record_empno emp.empno%type,
record_ename emp.ename%type,
record_job emp.job%type,
record_mgr emp.mgr%type,
record_date emp.hiredate%type,
record_sal emp.sal%type,
record_comm emp.comm%type,
record_deptno emp.deptno%type
);
my_record emp_record;
begin
select * into my_record from emp where empno=7839;
dbms_output.put_line(my_record.record_empno);
dbms_output.put_line(my_record.record_ename);   //注意,此处只能一个一个的去读。而且record中的变量必须与emp表中的变量相对应
end;

 

 

复合变量之记录表类型:
 
 
记录表类型是对记录类型的扩张,它可以处理多个记录或多行数据,使用记录表类型和记录类型一样想,必须先创建一个记录表类型:
 
语法:type talbe_name is table of date_type [not null] index by binary_integer;
 
 
注意:因为记录类型不会存储在数据库中,所以data_type可以是任何合法的pl/sql数据类型。关键字index by binary_integer指示系统创建一个主键索引,以引用记录表变量中的特定行。

 

程序演示:


declare
type my_table is table of emp%rowtype index by binary_integer;
myfirst_table my_table;
begin
select * into myfirst_table(1) from emp where empno=7839;
dbms_output.put_line(myfirst_table(1).sal);
end;

 

注意:之前有说过记录表类型相当于其他语言中的数组,那么使用的时候自然要指定下标,但是,不同的是它的下标可以任意指定没有限制,而且下标可以为负数

 

记录表类型提供的方法:
1),count获得该变量中的记录数
2),delete并传递一个索引号可以将对应的记录删除
 
程序演示:

set serveroutput on;
declare
type my_table2 is table of varchar2(64) index by binary_integer;
mysecond_table my_table2;
begin
mysecond_table(1):='第一条记录';
mysecond_table(2):='第二条记录';
mysecond_table(3):='第三条记录';
mysecond_table(4):='第四条记录';
mysecond_table(5):='第五条记录';
dbms_output.put_line(mysecond_table.count);
mysecond_table.delete(1);
dbms_output.put_line(mysecond_table.count);
end;

 

结果:

5
4
PL/SQL procedure successfully completed

 

3),first方法返回记录表中的‘第一行’或者最小的索引
4),last方法返回记录表中的最后一条索引
5),next方法:返回下一个索引,使用的时候要传递一个索引值,这个方法将返回下一个较大的索引,如果传递的是最后一个索引,则next方法将返回null
 
 
程序演示:
 

set serveroutput on;
declare
type my_table2 is table of varchar2(64) index by binary_integer;
mysecond_table my_table2;
index_num binary_integer;
begin
mysecond_table(1):='第一条记录';
mysecond_table(2):='第二条记录';
mysecond_table(3):='第三条记录';
mysecond_table(9):='第四条记录';
mysecond_table(100):='第五条记录';
index_num:= mysecond_table.first;
loop
exit when index_num is null;
dbms_output.put_line(mysecond_table(index_num));
index_num:=mysecond_table.next(index_num);
end loop;

end;

 

结果是:

第一条记录
第二条记录
第三条记录
第四条记录
第五条记录
PL/SQL procedure successfully completed

 

 

posted @ 2015-10-20 17:13  逍遥鸣  阅读(366)  评论(0编辑  收藏  举报