中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > 数据库综合
ABOUT : 字符数组
作者:未知 时间:2005-07-27 23:41 出处:CSDN 责编:chinaitpower
              摘要:ABOUT : 字符数组

很长一段时间内,PL/SQL开发人员必须有一个“index-by表”才能创建某个指定数据类型的或者PL/SQL记录的表。
因为他们只接受整型数据以从数组中提取数据,所以类型声明的末尾子句以“INDEX BY BINARY_INTEGER”结束。
如果想以非整型值作为索引,要么你必须创建一个存储过程来扫描需要的值,要么你必须在一个单独的表上建立一个索引。

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表的语法,允许字符串类型的索引,叫做关联数组。
有了字符串类型,你现在就可以快速访问元素,而不用再在每个元素间循环或者去知道它在数组中的位置:

declare
    type valtbl is table of varchar2(50) index by varchar2(50);
    mytbl valtbl;
begin
    mytbl('zhao1') := 'apple';
    mytbl('zhao2'):= 'orange';
    dbms_output.put_line(mytbl('zhao1'));
    dbms_output.put_line(mytbl('zhao2'));
end;

使用字符串索引的关联数组的一个有趣的特性是它们自动地通过当前的国际语言支持(NLS)设置排序。
FIRST和LAST函数返回数组中以字典序排列的第一个和最后一个健值。NEXT和PRIOR允许你以字典序获取下一个和前一个键。

declare
    type valtbl is table of varchar2(50) index by varchar2(50);
    mytbl valtbl;
    key varchar2(50);
begin
    mytbl('b') := 'two';
    mytbl('a') := 'one';
    mytbl('c') := 'three';
    key := mytbl.first;
    while key is not null loop
        dbms_output.put_line(mytbl(key));
        key := mytbl.next(key);
    end loop;
end;

因为Oracle可以自动地将任何的数据类型转换为字符串类型,所以能以字符串作为索引意味着可以以任何数据类型作为索引。
你可以使用这个方法把日期、浮点值、行二进制值和对象引用作为索引。

declare
    type timetbl is table of integer index by varchar2(8);
    mytbl timetbl;
    key varchar2(50);
begin
    for row in (select * from emp) loop
        key := to_char(row.hiredate,'YYYYMMDD');
        if not mytbl.exists(key) then
            mytbl(key) := 0;
        end if;
        mytbl(key) := mytbl(key) + 1;
    end loop;
    dbms_output.put_line('hiring barchart:');
    dbms_output.put_line('----------------');
    key := mytbl.first;
    while key is not null loop
        dbms_output.put_line(
            to_char(to_date(key,'YYYYMMDD'),'DD MON, YYYY')
            ||': '||rpad('#',mytbl(key),'#'));
        key := mytbl.next(key);
    end loop;
end;

键值必须是唯一的并且是大小写敏感的。在运行时改变NLS值可能会产生运行时错误。
对于关联数组的每一个操作NLS设置必须保持相同。
关联数组必须在PL/SQL代码中手工建立。
其它的程序开发语言和接口不能把主机数组绑定到并联数组,所以你就不能用字符串索引的关联数组使用BULK COLLECT。



关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有