plsql学习:批量 SQL

-- THE INDICES OF OPTION
-- As stated previously, the INDICES OF option enables you to loop through a sparse collection.
-- Recall that such a collection may be a nested table or an associative array. The use of the
-- INDICES OF option is illustrated in the following example:
----------------------------------------------------------------------------
declare
--define collection types and variables
type row_num_type is table of number index by pls_integer;
type row_text_type is table of varchar2(10) index by pls_integer;

row_num_tab row_num_type;
row_text_tab row_text_type;

v_total number;
begin
--populate collections
for i in 1..10 loop
row_num_tab(i) := i;
row_text_tab(i) := 'row '||i;
end loop;

--delete 1,5, and 7 elements of collections
row_num_tab.delete(1);row_text_tab.delete(1);
row_num_tab.delete(5);row_text_tab.delete(5);
row_num_tab.delete(7);row_text_tab.delete(7);

--populate test table
forall i in indices of row_num_tab
insert into test (row_num,row_text)
values(row_num_tab(i),row_text_tab(i));
commit;

select count(*) into v_total from test;

dbms_output.put_line('there are'||v_total||'rows in the test table');
end;

======================================================================
-- THE VALUES OF OPTION
-- The VALUES OF option specifies that the values of the loop counter in the FORALL statement
-- are based on the values of the elements of the specified collection. Essentially, this collection is
-- a group of indexes that the FORALL statement can loop through. Furthermore, these indexes
-- do not need to be unique and can be listed in arbitrary order. The following example demonstrates
-- the use of the VALUES OF option:


DECLARE
-- Define collection types and variables
TYPE row_num_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE row_text_type IS TABLE OF VARCHAR2(11) INDEX BY PLS_INTEGER;
TYPE exc_ind_type IS TABLE OF PLS_INTEGER INDEX BY PLS_INTEGER;
row_num_tab row_num_type;
row_text_tab row_text_type;
exc_ind_tab exc_ind_type;
-- Define user-defined exception and associated Oracle
-- error number with it
errors EXCEPTION;
PRAGMA EXCEPTION_INIT(errors, -24381);
BEGIN
-- Populate collections
FOR i IN 1..10 LOOP
row_num_tab(i) := i;
row_text_tab(i) := 'row '||i;
END LOOP;
-- Modify 1, 5, and 7 elements of the V_ROW_TEXT collection
-- These rows will cause exception in the FORALL statement
row_text_tab(1) := RPAD(row_text_tab(1), 11, ' ');
row_text_tab(5) := RPAD(row_text_tab(5), 11, ' ');
row_text_tab(7) := RPAD(row_text_tab(7), 11, ' ');
-- Populate TEST table
FORALL i IN 1..10 SAVE EXCEPTIONS
INSERT INTO test (row_num, row_text)
VALUES (row_num_tab(i), row_text_tab(i));
COMMIT;
EXCEPTION
WHEN errors THEN
-- Populate V_EXC_IND_TAB collection to be used in the VALUES
-- OF clause
FOR i in 1.. SQL%BULK_EXCEPTIONS.COUNT LOOP
exc_ind_tab(i) := SQL%BULK_EXCEPTIONS(i).error_index;
END LOOP;
-- Insert records that caused exceptions in the TEST_EXC
-- table
FORALL i in VALUES OF exc_ind_tab
INSERT INTO test_exc (row_num, row_text)
VALUES (row_num_tab(i), row_text_tab(i));
COMMIT;
END;

###############################
# select * from test;
# ROW_NUM ROW_TEXT
# ---------- ----------
# 2 row 2
# 3 row 3
# 4 row 4
# 6 row 6
# 8 row 8
# 9 row 9
# 10 row 10
#
# 7 rows selected.
# select * from test_exc;
# ROW_NUM ROW_TEXT
# ---------- --------------------------------------------------
# 1 row 1
# 5 row 5
# 7 row 7
#############################################
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值