广州明生堂生物科技有限公司


Oracle初学者笔记终结篇--集合和成员函数

网络编程 Oracle初学者笔记终结篇--集合和成员函数 06-22

集合

PL/SQL表

       在PL/SQL块中临时使用,象数组一样的对象,但不会用来定义表中的字段;

       包含一列和一个主键;不能对列和主键进行命名;

       列可以是任何标量数据类型;

       主键必须是binary_integer类型;

       大小没有限制;

定义PL/SQL表的步骤:

1, 定义表的类型;type typename is table of col_def index by binary_integer;

2, 声明该类型的一个PL/SQL表;tablename typename;

引用PL/SQL表:

       使用主键值引用PL/SQL表中的行;

       Tablename(key_value)

给PL/SQL表的某行赋值:

       Tablename(key_value):=expression;

一个例子:

declare

    type  student_type is table of varchar(10) index by binary_integer;

    stu1 student_type;

begin

     stu1(1):='Tom';

     stu1(2):='fuck';

     for i in 3..10 loop

       stu1(i):='com.'||i;

     end loop;

     for i in 1..10 loop

       dbms_output.put_line('The '||i||' is : '||stu1(i));

     end loop;    

end;

/

PL/SQL表自带了集合函数.delete(i)可以按索引删除第I个元素;

可以不按顺序赋值;

可变数组的宽度是一定的,PL/SQL是无限的,可称为快表;

记录

为什么使用记录?我们知道%rowtype类型可以使我们获得一个行级变量存放整个行;但是为了获得更大的灵活性,我们希望能够定义一个包括了某几个我们需要的字段的变量而不是整个行的所有字段都被包括的变量;这时候我们用记录;

定义类型:type typename is recode(列定义…..);

声明一个该类型的记录变量:recordtype typename;

引用字段:recordname.columnname

赋值:

例子:

declare

       type stuRecordType is record

       (

              id student.stuid%type,

              name student.stuname%type,

              se student.se%type

       );

       stuRec stuRecordType;

begin

       select stuid,stuname,se into stuRec from student

              where stuid='101';

       dbms_output.put_line(sturec.id||' '||sturec.name||' '||sturec.se);

exception

       when no_data_found then

              dbms_output.put_line('no data');

end;

/

一个记录内部可以嵌套其他的记录;

批量绑定:

       对PL/SQL变量的赋值;

       一次绑定一个集合

       提高DML的性能;

       Forall关键字用于要在发送到SQL引擎之前对输入集合进行批量绑定;

成员函数和过程

抽象数据类型中定义成员函数和过程;类似Java类中的方法;

构造函数你已经使用过了,它无须显式定义,与对象类型同名;

定义带有函数和过程的对象类型时声明和主体的定义仍然是分开的;

例子:

声明:

create or replace type person_type as object

(

   id  int,

   name varchar(20),

   member function getid return int,

   member procedure setid(pid int),

   member function getname return varchar,

   member procedure setname(pname varchar)

) not final;

主体定义:/

create or replace type body person_type as

  member function getid return int  is

  begin

      return id;

  end getid;

  member procedure setid(pid int) as

  begin

      id:=pid;

  end setid;

  member function getname return varchar is

  begin

      return name;

  end getname;

  member procedure setname(pname varchar) is

  begin

      name:=pname;

  end setname;

end;

/

使用:

  1  declare

  2     p person_type;

  3  begin

  4     p:=person_type(1001,'com');

  5     dbms_output.put_line('id: '||p.getid);

  6     dbms_output.put_line('name: '||p.name);

  7     p.setid(1002);

  8     p.setname('mike');

  9     dbms_output.put_line('id: '||p.getid);

 10     dbms_output.put_line('name: '||p.name);

 11* end;

id: 1001

name: com

id: 1002

name: mike

其实当我们有了p这个变量后就可以直接访问id:  p.id;

我们需要清醒的是这里的类型不是一个表,而是将来可以成为一个表中一个行的类型控制描述;用构造函数构造的只是一个表的一行而不是一个表;当然我们可以用这个类型来定义一个对象表,这样的话,我没什么说的了,因为我已经不明白了;

create table persontable of person_type;

因为对对象表来说我们有两种插入的方法:

insert into persontable values(2001,'fuck');

或构造一个对象插进去:

insert into persontable values(person_type(2002,'me'))

/


编辑:广州明生堂生物科技有限公司

标签:定义,类型,变量,函数,赋值