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;
使用Rowtype和record的区别在于 rowtype定义全表的类型,而record可以定义部分字段时很有用,毕竟我们不总是定义所有的字段类型。