本文共 4640 字,大约阅读时间需要 15 分钟。
当你想搜索某一个特定元素的值而不是整个数组的时候,PL/SQL关联数组对于名称-值对类型的数组是非常有用的。应用11g文档的话“它就像一个SQL表的简单版本,你可以基于主键的值来提取值”。
【IT专家网独家】当你想搜索某一个特定元素的值而不是整个数组的时候,PL/SQL关联数组对于名称-值对类型的数组是非常有用的。应用11g文档的话“它就像一个SQL表的简单版本,你可以基于主键的值来提取值”。在PL/SQL中,对于任何数组来说,当用在较少记录中时效率是最高的,例如简单查找表。如果你发现你加载成千上万的记录到数组中,那么你很可能是哪里做错了。
下面是一个典型的名称-值对的示例:
注意,我可以通过名称来简单地访问到一个元素,而不必进行循环。下一个例子显示了怎样对一个关联数组进行循环。这可能看起来与关联数组的意图相反,但是有可能有这种需求:
declare type assoc_arr is table of varchar2(255) index by varchar2(255); apollo_commanders assoc_arr; begin apollo_commanders('Apollo 11' := 'Neil Armstrong'; apollo_commanders('Apollo 12' := 'Pete Conrad'; apollo_commanders('Apollo 13' := 'James Lovell'; apollo_commanders('Apollo 14' := 'Alan Shepard'; apollo_commanders('Apollo 15' := 'David Scott'; apollo_commanders('Apollo 16' := 'John W. Young'; apollo_commanders('Apollo 17' := 'Eugene A. Cernan'; dbms_output.put_line(apollo_commanders('Apollo 11')); dbms_output.put_line(apollo_commanders('Apollo 14')); end; / – Results: – Neil Armstrong – Alan Shepard |
最后,一个更复杂的使用一个常用记录的例子:
declare type assoc_arr is table of varchar2(255) index by varchar2(255); apollo_commanders assoc_arr; l_current_mission varchar2(255); begin apollo_commanders('Apollo 11' := 'Neil Armstrong'; apollo_commanders('Apollo 12' := 'Pete Conrad'; apollo_commanders('Apollo 13' := 'James Lovell'; apollo_commanders('Apollo 14' := 'Alan Shepard'; apollo_commanders('Apollo 15' := 'David Scott'; apollo_commanders('Apollo 16' := 'John W. Young'; apollo_commanders('Apollo 17' := 'Eugene A. Cernan'; l_current_mission := apollo_commanders.first; loop exit when l_current_mission is null; dbms_output.put_line('Mission: '||l_current_mission||', Commander: '||apollo_commanders(l_current_mission)); l_current_mission := apollo_commanders.next(l_current_mission); end loop; end; / – Results: – Mission: Apollo 11, Commander: Neil Armstrong – Mission: Apollo 12, Commander: Pete Conrad – Mission: Apollo 13, Commander: James Lovell – Mission: Apollo 14, Commander: Alan Shepard – Mission: Apollo 15, Commander: David Scott – Mission: Apollo 16, Commander: John W. Young – Mission: Apollo 17, Commander: Eugene A. Cernan |
用type:
语法:type <类型名> is table of <数据类型> index by Binarry_integer;
set serveroutput on;
declare
type array_type is table of varchar2(20) index by binary_integer;
my_array array_type;
begin
for I in 1..10 loop
my_array(i):=i*2;
end loop;
for I in 1..10 loop
dbms_output.put_line(to_char(my_array(i)));
end loop;
end;
一个例子:
declare
stmt varchar2(200);
dept_no_array dbms_sql.Number_Table;
c number;
dummy number;
begin
dept_no_array(1) := 10; dept_no_array(2) := 20;
dept_no_array(3) := 30; dept_no_array(4) := 40;
dept_no_array(5) := 30; dept_no_array(6) := 40;
stmt := 'delete from emp where deptno = :dept_array';
c := dbms_sql.open_cursor;
dbms_sql.parse(c, stmt, dbms_sql.native);
dbms_sql.bind_array(c, ':dept_array', dept_no_array, 1, 4);
dummy := dbms_sql.execute(c);
dbms_sql.close_cursor(c);
exception when others then
if dbms_sql.is_open(c) then
dbms_sql.close_cursor(c);
end if;
raise;
end;
/
很久没用oracle了,今天遇到个问题,要读一串数据,实现批量的一个操作,在oracle最好能用数组,找了些资料,示例代码如下:
set serveroutput on;
declare
type mytype is table of varchar2(9);
ssn mytype;
begin
ssn:=mytype('000002204','000047355');
for i in 1..2 Loop
dbms_output.put_line('ssn('||to_char(i)||')='||ssn(i)||chr(13));
end loop;
end;
输出:
ssn(1)=000002204
ssn(2)=000047355
PL/SQL procedure successfully completed
赋值也可以在初始化时用ssn mytype:=mytype('000002204','000047355'); 实现。
实际上,PL/SQL使用一个无界的表来实现数组功能的
【IT168 】很长一段时间内,PL/SQL开发人员必须有一个“index-by表”才能创建某个指定数据类型的或者PL/SQL记录的表。因为他们只接受整型数据以从数组中提取数据,所以类型声明的末尾子句以“INDEX BY BINARY_INTEGER”结束。如果想以非整型值作为索引,要么你必须创建一个过程来扫描需要的值,要么你必须在一个单独的表上建立一个索引。 set serveroutput on
declare
type valrec is record(key varchar2(50),val varchar2(50));
type valtbl is table of valrec index by binary_integer;
mytbl valtbl;
begin
mytbl(1).key := 'foo';
mytbl(1).val := 'bar';
for i in 1..mytbl.count loop
if mytbl(i).key = 'foo' then
dbms_output.put_line(mytbl(i).val);
end if;
end loop;
end;
/
PL/SQL允许使用index-by表创建某个指定数据类型或者PL/SQL记录的表。然而,如果想以非整型值作为索引,要么你必须创建一个存储过程扫描你需要的值,要么你必须在一个单独的表上建立一个索引。Oracle9i扩展了index-by表的语法,允许字符串类型的索引,叫做关联数组。
有了字符串类型,你现在就可以快速访问元素,而不用再在每个元素间循环或者去知道它在数组中的位置:
set serveroutput on
declare
type valtbl is table of varchar2(50) index by varchar2(50);
mytbl valtbl;
begin
mytbl('foo'):='bar';
dbms_output.put_line(mytbl('foo'));
end;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12330444/viewspace-448414/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12330444/viewspace-448414/