定义并操纵索引表

定义并操纵索引表

DECLARE

    TYPE idx_table IS TABLE OF VARCHAR2(12)
        INDEX BY PLS_INTEGER;
    v_emp  idx_table;
BEGIN
    v_emp(1) := '史密斯';
    v_emp(20):= '克拉克';
    v_emp(40):= '史瑞克';
    v_emp(-10):='杰瑞';
END;
上面的代码中,索引表存储的类型为VARCHAR2(12)字符串数据。语句中的INDEX BY
PLS_INTEGER,表示索引的下标类型为PLS_INTEGER整数类型,索引表的元素个数只
受PLS_INTEGER取值范围的限制。在代码执行块中,可以看到为索引表的赋值不是
连续进行的,只要在PLS_INTEGER许可范围之内即可。
在向索引表插入数据时,表所需要的内存也就被分配了,如果没有赋值,Oracle就
不会为索引表中的元素分配内存。由于没有分配内存,如果试图去访问某个元素,
Oracle将会抛出异常。例如下面的语句去访问未被赋值的v_emp(8)元素,则由于
该元素并未赋值,因此将抛出异常。
DBMS_OUTPUT.PUT_LINE(v_emp(8));--访问一个未分配内存的元素,将抛出异常
由于未分配的元素会触发异常,因此可以使用EXISTS语句检查索引表元素是否
存在值。
IF v_emp.EXISTS(8) THEN
    DBMS_OUTPUT.PUT_LINE(v_emp(8));

END IF;

使用VARCHAR2类型的索引键
DECLARE
--定义以VARCHAR2作为索引键的索引表
TYPE idx_deptno_table IS TABLE OF NUMBER(2)
INDEX BY VARCHAR2(20);
--声明记录类型的变量
v_deptno   idx_deptno_table;
BEGIN
    --为索引表赋值
    v_deptno('财务部'):= 10;
    v_deptno('研究部'):= 20;
    v_deptno('销售部'):= 30;
    --引用索引表的内容
    DBMS_OUTPUT.PUT_LINE('销售部编号为:'||v_deptno('销售部'));
END;
在使用VARCHAR2作为索引键时,必须为VARCHAR2指定一个大小,以便存放
合适的索引键。由代码可以看到使用了字符串类型的索引表与高级语言中
的哈希表非常相似。
使用%TYPE类型的索引键
DECLARE
    --定义记录类型那个的索引表,以dname作为索引键类型
    --dname是VARCHAR2(14)类型
    TYPE idx_dept_table IS TABLE OF dept%ROWTYPE;
    INDEX BY dept.dname%TYPE;
    --声明记录类型的变量
    v_dept  idx_dept_table;
    --定义一个游标,用来查询dept表
    CURSOR dept_cur
    IS
       SELECT *
         FROM dept;
BEGIN
    --使用游标FOR循环打开游标,检索数据
    FOR deptrow IN dept_cur
    LOOP
        --为索引表中的元素赋值
        v_dept(deptrow.dname) := deptrow;
        --输出部门的LOC列信息
        DBMS_OUTPUT.PUT_LINE(v_dept(deptrow.dname).loc);
    END LOOP;
END;
上述代码中,尽管使用了%TYPE引用类型,因为dept.dname是VARCHAR2(14)类型,
因此可以使用字符串来作为索引表的下标。在代码中使用了游标查询dept表中
所有行,因为索引表将存储dept行记录类型的值,在游标FOR循环中,将游标行
数据检索并赋给索引表,这相当于对dept表进行了一次复制,创建了dept表的一个
副本。
索引列名(下标).成员名称


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值