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;
脚本取自:
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8520577/viewspace-2120603/,如需转载,请注明出处,否则将追究法律责任。