Oracle PL/SQL INDICES

abstractcyj發表於2016-06-21
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章