Oracle PL/SQL INDICES

Indices关键字主要用于处理稀疏数组的处理。
FORALL..IN 1..array.count, 当array稀疏时,会提示错误,某个元素不存在。
这个时候,使用indices可以跳过此影响。indices关键字在FORALL中表示引用数组下标
  FORALL i IN INDICES OF l_tab
    INSERT INTO forall_test VALUES l_tab (i);

测试脚本:

DECLARE
  TYPE t_forall_test_tab IS TABLE OF forall_test%ROWTYPE;


  l_tab t_forall_test_tab := t_forall_test_tab();
BEGIN
  FOR i IN 1 .. 1000 LOOP
    l_tab.extend;
  
    l_tab(l_tab.last).id := i;
    l_tab(l_tab.last).code := to_char(i);
    l_tab(l_tab.last).description := 'Description: ' || to_char(i);
  END LOOP;


  -- Make collection sparse.


  l_tab.delete(301);
  l_tab.delete(601);
  l_tab.delete(901);
  
  dbms_output.put_line('l_tab.count = '||l_tab.count);


  EXECUTE IMMEDIATE 'truncate TABLE forall_test';


  dbms_output.put_line('start forall');
  BEGIN
  
    -- This will fail due to sparse collection.
  
    FORALL i IN l_tab.first .. l_tab.last
      INSERT INTO forall_test VALUES l_tab (i);
  EXCEPTION
    WHEN OTHERS THEN
      dbms_output.put_line(SQLERRM);
  END;


  EXECUTE IMMEDIATE 'truncate TABLE forall_test';


  dbms_output.put_line('start FORALL INDICES of');


  -- This works fine with sparse collections.
  FORALL i IN INDICES OF l_tab
    INSERT INTO forall_test VALUES l_tab (i);
   
  --这里会抛错,提示index[301]元素不存在
  /*FORALL i IN 1..l_tab.count
    INSERT INTO forall_test VALUES l_tab (i);*/
END;

脚本输出:

l_tab.count = 997
start forall
ORA-22160: element at index [301] does not exist
start FORALL INDICES of

另有VALUES OF,表示引用数组的值。
DECLARE
  TYPE t_forall_test_tab IS TABLE OF forall_test%ROWTYPE;
  TYPE t_idx_tab IS TABLE OF BINARY_INTEGER;


  l_tab     t_forall_test_tab := t_forall_test_tab();
  l_idx_tab t_idx_tab := t_idx_tab();
BEGIN
  FOR i IN 1 .. 1000 LOOP
    l_tab.extend;
  
    l_tab(l_tab.last).id := i;
    l_tab(l_tab.last).code := to_char(i);
    l_tab(l_tab.last).description := 'Description: ' || to_char(i);
    IF MOD(i, 100) = 0 THEN
      l_idx_tab.extend;
      l_idx_tab(l_idx_tab.last) := i;
    END IF;
  END LOOP;


  EXECUTE IMMEDIATE 'truncate TABLE forall_test';


  -- This works fine with sparse collections.


 FORALL i IN VALUES OF l_idx_tab
    INSERT INTO forall_test VALUES l_tab (i);
    
  /* 
  FORALL i IN  1..l_idx_tab.count
    INSERT INTO forall_test VALUES l_tab (i);*/
END;



脚本取自:
http://www.dba-oracle.com/plsql/t_plsql_sparse.htm

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8520577/viewspace-2120603/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8520577/viewspace-2120603/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值