oracle-数组的创建和基本⽤法plsql数组,分为 固定长度数组和可变长数组。
declare
type v_ar is varray(10) of varchar2(30);
my_ar v_ar:=v_ar('g','m','d','龚','帅'); ----此声明需初始化
begin
for i _ar.count
loop
dbms_output.put_line(my_ar(i));
end loop;
end;
--可变数组
oracle四舍五入-
-⼀维数组
declare
type v_table is table of varchar2(30) index by binary_integer;
--类型可以是前⾯的类型定义,index by binary_integer⼦句代表以符号整数为索引,
--这样访问表类型变量中的数据⽅法就是“表变量名(索引符号整数)”。
my_table v_table; ----此声明⽅式,声明变量不需初始化
begin
for i in 1..20
loop
my_table(i):=i;
dbms_output.put_line(my_table(i));
end loop;
end;
--多维数组--多条记录
declare
type v_table is table of t_user%rowtype index by binary_integer;
my_table v_table;
begin
select * bulk collect into my_table from t_user;
for i _unt/10 --unt/10取到的值为四舍五⼊值
loop
dbms_output.put_line('suser--'||my_table(i).suser);
dbms_output.put_line('name---'||my_table(i).name);
dbms_output.put_line('sex----'||my_table(i).sex);
end loop;
end;
多维数组--单条记录
declare
type v_table is table of t_user%rowtype index by binary_integer;
my_table v_table;
begin
select * into my_table(9) from t_user where suser='admin';
--my_table(i) i可以为任意整数,但取值时必须保持以i⼀致;
dbms_output.put_line('--suser--'||my_table(9).suser||'--name--'||my_table(9).name);
end;
--⾃定义数组
create or replace type varray_list as varray(30) of varchar2(50);
--使⽤⾃定义数组
create or replace procedure show_list(p_varlist in varray_list)
is
v_str varchar2(50);
begin
for i in 1..unt
loop
v_str:=p_varlist(i);
dbms_output.put_line('v_str='||v_str);
dbms_output.put_line('p_varlist('||i||')='||p_varlist(i));
end loop;
end;
declare
my_var varray_list:=varray_list('g','m','d','龚','帅');
begin
show_list(my_var);
end;
关于ORACLE中的数组:记录同集合
集合可以有三种实现⽅式:
1 ⾃定义⼀个TYPE使⽤VARRAY来得到⼀个数组但只能对基本类型定义如:
CREATE TYPE 类型名 AS VARRAY OF VARCHAR2(20);
不能使⽤如下:
CREATE TYPE 类型名 AS VARRAY(52) OF 表名%ROWTYPE;
注意:使⽤VARRAY时⼀定要先指定数组⼤⼩
不然搞创建数组类型
2 内嵌表如:
TYPE 类型名 IS TABLE OF 具体类型如:(表名%ROWTYPE);
内嵌表数组分⼆种:Index_by表同嵌套表如上的就是嵌套表⽽Index_by表只要在其尾回上 INDEX BY
BINARY_INTEGER就可以了
例⼦:
declare
cursor cur_test is select id,mc from test;
type t_test1 is table of varchar2(60) index by binary_integer;
type t_test2 is table of test%rowtype index by binary_integer;
var_test1 t_test1;
var_test2 t_test2;
var_new t_test2;
begin
SELECT id,mc INTO var_test2(0) FROM test WHERE id='111';
dbms_output.put_line('var_test2(0):'||var_test2(0).id||'---'||var_test2(0).mc);
SELECT id,mc INTO var_test2(8) FROM test WHERE id='333';
dbms_output.put_line('var_test2(8):'||var_test2(8).id||'---'||var_test2(8).mc);
var_new := var_test2;
dbms_output.put_line('===== copy var_test2 to var_new =====');
dbms_output.put_line('var_new(0):'||var_new(0).id||'---'||var_new(0).mc);
dbms_output.put_line('var_new(8):'||var_new(8).id||'---'||var_new(8).mc);
end;
=================================================================================== DECLARE
TYPE t_test1 IS TABLE OF test.id%TYPE;
TYPE t_test2 IS VARRAY (10) OF test.id%TYPE;
var_test1 t_test1;
var_test2 t_test2;
begin
--var_test1(1) := ('test1.1'); --没有初始化不能赋值
var_test1 := t_test1('test1.1','test1.2','test1.3');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
var_test2 := t_test2('test2.1','test2.2','test2.3');
dbms_output.put_line('var_test2: '||var_test2(1)||','||var_test2(2)||','||var_test2(3));
var_test1(2) := 'test1.2_update';
dbms_output.put_line('==== 修改了var_test1(2) ====');
dbms_output.put_line('var_test1: '||var_test1(1)||','||var_test1(2)||','||var_test1(3));
dbms_output.put_line((3));
dbms_output.put_line('var_test2元素个数: '||var_test2.limit());
end;
嵌套表的元素可以是集合,注意赋值的时候是d_column := 的形式.
除了构造函数外,集合还有很多内建函数,按照⾯向对象编成的叫法称之为⽅法。
⽅法==========描述================使⽤限制
COUNT=========返回集合中元素的个数
DELETE========删除集合中所有元素
DELETE(x)=====删除元素下标为x的元素
===================================================
对VARRAY⾮法
DELETE(x,y)===删除元素下标从X到Y的元素
对VARRAY⾮法
EXIST(x)======如果集合元素x已经初始化,则返回TRUE, 否则返回FALSE
EXTEND========在集合末尾添加⼀个元素
对Index_by⾮法
EXTEND(x)=====在集合末尾添加x个元素
对Index_by⾮法
EXTEND(x,n)===在集合末尾添加元素n的x个副本
对Index_by⾮法
FIRST=========返回集合中的第⼀个元素的下标号,对于VARRAY集合始终返回1。
LAST==========返回集合中最后⼀个元素的下标号, 对于VARRAY返回值始终等于COUNT. LIMIT=========返回VARRY集合的最⼤的元素个数
Index_by集合和嵌套表⽆⽤
NEXT(x)=======返回在第x个元素之后及紧挨着它的元素的值,如果x是最后⼀个元素,返回null. PRIOR(x)======返回在第x个元素之前紧挨着它的元素的值,如果x是第⼀个元素,则返回null。 TRIM==========从集合末端开始删除⼀个元素
对于index_by不合法
TRIM(x)=======从集合末端开始删除x个元素
对index_by不合法
记录可以定义为:
TYPE 类型名 IS RECORDER (具休类型)
也可⽤:变量名 表名%ROWTYPE
例⼦:
declare
t_record1 test%rowtype;
cursor cur_test(v_id in varchar2) is
select id,mc from test
where id <= v_id;
t_record2 cur_test%rowtype;
begin
for row_test in cur_test('333') loop
t_record1.id := row_test.id;
:= ;
t_record2.id := row_test.id;
t_record2.id := row_test.id;
:= row_test.id;
dbms_output.put_line('t_record1:'||t_record1.id||'---'||);
dbms_output.put_line('t_record2:'||t_record2.id||'---'||);
dbms_output.put_line('row_test:'||row_test.id||'---'||);
dbms_output.put_line('================loop '||cur_test%rowcount||' times.');
end loop;
exception when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
======================================================================================
declare
type t_record is record
(
id test.id%type,
%type
);
var_record t_record;
counter number default 0;
begin
for row_test in (select id,mc from test) loop
counter := counter + 1;
var_record.id := row_test.id;
:= ;
dbms_output.put_line('var_record:'||var_record.id||'---'||);
dbms_output.put_line('row_test:'||row_test.id||'---'||);
dbms_output.put_line('================loop '||counter||' times.');
end loop;
exception when others then
dbms_output.put_line(sqlcode||sqlerrm);
end;
隐式定义记录中,我们不⽤描述记录的每⼀个域,在声明记录变量时使⽤%ROWTYPE命令定义与表,视图,游标有相同结构的记录。有⼀些PL/SQL指令在使⽤隐式定义记录时没有使⽤%ROWTYPE属性,⽐如游标FOR循环或中的:old
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论