博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PL/SQL数组 一
阅读量:2507 次
发布时间:2019-05-11

本文共 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/

你可能感兴趣的文章
centos 创建以日期为名的文件夹
查看>>
Java Timer触发定时器
查看>>
Page Object设计模式
查看>>
程序的基础知识
查看>>
在VIM中使用GDB调试 – 使用vimgdb
查看>>
python爬虫---从零开始(五)pyQuery库
查看>>
POJ2236(KB5-A)
查看>>
Centos MySQL数据库迁移详细步骤
查看>>
2初出茅庐--初级篇2.1
查看>>
新建 WinCE7.0 下的 Silverlight 工程
查看>>
腾讯的张小龙是一个怎样的人?
查看>>
jxl写入excel实现数据导出功能
查看>>
linux文件目录类命令|--cp指令
查看>>
.net MVC 404错误解决方法
查看>>
linux系统目录结构
查看>>
git
查看>>
btn按钮之间事件相互调用
查看>>
Entity Framework 4.3.1 级联删除
查看>>
codevs 1163:访问艺术馆
查看>>
冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱
查看>>