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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle PL/SQLOracleSQL
- oracle PL/SQL示例OracleSQL
- oracle pl/sql programmingOracleSQL
- Oracle PL/SQL編寫PL/SQL程式碼的注意事項OracleSQL
- ORACLE之常用FAQ:SQL&PL/SQLOracleSQL
- Oracle PL/SQL塊簡介OracleSQL
- Oracle PL/SQL中EXCEPTION用法OracleSQLException
- Oracle PL/SQL 之 函式OracleSQL函式
- PL/SQL Developer 連線 OracleSQLDeveloperOracle
- oracle INDEX BY Pl/sql陣列OracleIndexSQL陣列
- 【PL/SQL】oracle建立dblinkSQLOracle
- Oracle PL/SQL之GROUP BY CUBEOracleSQL
- Oracle PL/SQL迴圈示例OracleSQL
- 【Oracle】--PL/SQL匯入Oracle sql指令碼"傻瓜教程"OracleSQL指令碼
- Oracle 的PL/SQL語言使用OracleSQL
- Oracle PL/SQL之 Package介紹OracleSQLPackage
- oracle PL/SQL中的過載OracleSQL
- Oracle PL/SQL語言基礎OracleSQL
- 【Oracle】Windows安裝pl/sql developerOracleWindowsSQLDeveloper
- oracle dbms_profiles分析pl/sqlOracleSQL
- Oracle 11g系列:SQL Plus與PL/SQLOracleSQL
- Oracle PL/SQL 優化與調整 – PL/SQL Native Compilation 說明OracleSQL優化
- 使用profiler測試Oracle PL/SQL效能OracleSQL
- Oracle Pl/SQL 之 儲存過程OracleSQL儲存過程
- Oracle之PL/SQL基礎學習OracleSQL
- Oracle PL/SQL語言基礎(轉)OracleSQL
- 【SQL/PLUS】Oracle PL/SQL程式設計用set serveroutput onSQLOracle程式設計Server
- PL/SQLSQL
- Oracle PL/SQL程式碼中的註釋OracleSQL
- Oracle PL/SQL 關於遊標的介紹OracleSQL
- Oracle PL/SQL 自治事務的說明OracleSQL
- 【PL/SQL】Oracle--樹的使用(Connect By)SQLOracle
- SQL&PL/SQL (轉)SQL
- PL/SQL 宣告SQL
- PL/SQL cursorSQL
- PL/SQL打包SQL
- PL/SQL DEVSQLdev
- 「Oracle」客戶端 PL/SQL DEVELOPER 安裝使用Oracle客戶端SQLDeveloper