暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle-2-PLSQL数组

Coding On Road 2018-10-27
894


1、PLSQL声明数组

4.1、使用Table类型定义

 

1、使用type table声明数组

set serveroutput on;

declare

--定义一个表只有一个字段,

--必须要使用index by binary_integer指定下标类型

type NAMES is table of varchar(20) index by binary_integer;

array_names names;--然后再声明这个数自定义的数组类型

begin

    --然后进行赋值

    array_names(0):='Jack';

    array_names(1):='Jerry';

    --进行遍历

    for i in 0..1

    loop

       dbms_output.put_line(array_names(i));

    end loop;

end;

 

2、使用table定义未知长度的数组

set serveroutput on;

declare

   type tablearray is table OF varchar(10) index by BINARY_INTEGER;

   names tablearray;

begin

   for i in 1..5

   loop

      names(i):='Jack'||i;

   end loop;

   dbms_output.put_line('添加后数组长度为:'||names.count);

   for i in 1..names.count

   loop

      dbms_output.put_line('下标'||i||'的值为:'||names(i));

   end loop;

end;

示例输出:

PL/SQL 过程已成功完成。

添加后数组长度为:5

下标1的值为:Jack1

下标2的值为:Jack2

下标3的值为:Jack3

下标4的值为:Jack4

下标5的值为:Jack5

 

3、使用table定义多维数组

使用 of someTable%rowType可以定义一个表的类型。

declare

   --定义多维数组

   type studsarray is table of stud%rowType index by binary_integer;

   --使用 自定义数组定义变量

   vstud studsarray;

begin

  --批量查询数据并保存到vstud

  select * BULK COLLECT INTO vstud from stud;

  --现在开发遍历 - >这种遍历的过程,类似于游标了

  for i in 1..vstud.count loop

     dbms_output.put_line(vstud(i).id||'  '||vstud(i).name||'  '||vstud(i).age);

  end loop;

end;

测试结果:

1  Jack  23

2  Jerry  34

3  张三  32

 

4、使用create type 自定义类型定义数组

 

--自定义类型

create or replace type "arr" is table of varchar(20);

 

declare

  --使用上面的这个数组,由于上面的定义时,使用了"双引号,所以这儿也必须要使用

  a "arr":="arr"('Jack','Mary');

begin

 for i in 1..a.count loop

    dbms_output.put_line(a(i));

 end loop;

end;

 

删除自定义的类型:
drop type "arr";

  

 

4.2、直接使用Array定义固定长度的数组

使用array可以定义固定长度的数组。其中array(10)就是指定义长度为10的数组。

 

set SERVEROUT on;

declare

   --定义一个数组里面包含的都是varchar类型,这个数组的长度为10

   type strarray is array(10) of varchar(10);

   --直接赋值就可以了 - 且这儿必须要赋值否则就会抛出初始化失败的异常

   v_arr strarray :=strarray('Jack','Mary','Rose','Jerry');

begin

   --在这个数组中进行遍历

   for i in 1..v_arr.count

   loop

      dbms_output.put_line('name is:'||v_arr(i));

   end loop;

end;

 

--示例删除表空间:

set SERVEROUT on;

declare

   type str_array is array(10) of varchar(20);

   va str_array:=str_array('DATA0','DATA1');

   v_sql varchar(100);

begin

  for i in 1..va.count

  loop

      dbms_output.put_line(va(i));

      v_sql:='drop tablespace '||va(i)||' including contents and datafiles';

      EXECUTE IMMEDIATE v_sql;

  end loop;

end;

 

--通过定义数组,创建一组用户,表空间:

set serveroutput on;

declare

   type stringarray is array(10) of varchar(30);

   names stringarray:=stringarray('TBS01','TBS02');

   vsql varchar(400):='create tablespace ${name} datafile ''/orcl/datas/${name}_01.dbf'' size 10m AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;';

   vsql2 varchar(400);

   createUserSql varchar(400):='create user ${name} identified'||

                               ' by oracle default tablespace ${name}'||

                               ' temporary tablespace temp;';

   grantSql varchar(100):='grant connect,resource,unlimited tablespace,dba to ${name};';

begin

   for i in 1..names.count

   loop

       dbms_output.put_line('创建用户:'||names(i));

       vsql2:=replace(vsql,'${name}',names(i));

       dbms_output.put_line(vsql2);

       vsql2:=replace(createUserSql,'${name}',names(i));

       dbms_output.put_line(vsql2);

       vsql2:=replace(grantSql,'${name}',names(i));

       dbms_output.put_line(vsql2);

   end loop;

end;

 

 

declare

   type vv is varray(2) of varchar(20);

   vstr vv:=vv('Jack','Jerry');--最多只能两个元素

begin

   for i in 1..vstr.count loop

      dbms_output.put_line(vstr(i));

   end loop;

end;

 

 

 

 

4.3、定义Record类型

1、使用Record类型定义记录行类型

declare

  --定义Record类型,并指定具体字段

  type studrecord is RECORD(

     id int,

     name varchar(30)

  );

  --定义这个Record类型的数据类型

  type studtype is table of studrecord index by binary_integer;

  --定义这个变量

  vstud studtype;

begin

  --查询出数据,并将这个集合一次性写入到vv变量中

   select id,name BULK COLLECT into vstud from stud;

   for i in 1..vstud.count loop

      dbms_output.put_line(vstud(i).id||'  '||vstud(i).name);

   end loop;

end;

 

上面的类型与:type studsarray is table of stud%rowType index by binary_integer;定义记录集类型功能相同。

 

2、直接使用rowtype直接定义record类型

declare

  --定义Record类型,并指定具体字段

  type studRecordType is table of stud%rowType index by binary_integer;

  --定义这个变量

  vstud studRecordType;

begin

  --查询出数据,并将这个集合一次性写入到vv变量中

   select * BULK COLLECT into vstud from stud;

   for i in 1..vstud.count loop

      dbms_output.put_line(vstud(i).id||'  '||vstud(i).name);

   end loop;

end;

 

使用Rowtyperecord的区别在于 rowtype定义全表的类型,而record可以定义部分字段时很有用,毕竟我们不总是定义所有的字段类型。

 

 

 

 


文章转载自Coding On Road,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论