十、PL/SQL之批量SQL


PL/SQL引擎会向SQL引擎发送SQL语句,后者会向PL/SQL引擎返回结果。PL/SQL和SQL引擎之间的通信称为上下文切换。这种上下文存在一定的性能负载。PL/SQL有大量的特性,可以降低这种性能负载,其中之一就是批量SQL(Bulk SQL)。如果某SQL语句影响4行或者更多的数据,使用批量SQL一般能提升性能。批量SQL支持SQL语句及其结果的批量处理。它有两个特性:FORALL语句和BULKCOLLECT子句。

一、FORALL语句

FORALL语句会从PL/SQL引擎向SQL引擎批量发送INSERT、UPDATE、或者DELETE语句,而不每次发送一条语句
如下FOR循环会10次迭代执行INSERT语句:

FOR i IN 1..10 LOOP
    INSERT INTO table_name
    VALUES(......);
END LOOP;

该INSERT语句会从PL/SQL炸群发送到SQL引擎10次,也就是说会发生10次上下文切换。如果使用FORALL语句替换这个FOR循环,只需要发送一次INSERT语句,但是会执行10次。在这种情况下,在PL/SQL和SQL之间只会发生一次上下文切换。
FORALL语句具有如下结构:

FORALL loop_counter IN bounds_clause
    SQL_STATEMENT [SAVE EXCEPTIONS];
--其中,bounds_clause(边界子句)是下面形式之一:
lower_limit...upper_limit
INDICES OF collection_name BETWEEN lower_limit..upper_limit
VALUES OF collection_name

FORALL实例:

-- 建一张表
CREATE TABLE test (t_num NUMBER,t_text VARCHAR2(10));
DECLARE
    --PLS_INTEGER是PLSQL环境中的一个特殊的数字类型,
    --这种类型的值是通过硬件平台原生整数格式来表示的
    TYPE t_num_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
    TYPE t_text_type IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
    
    t_num_tab t_num_type;
    t_text_tab t_text_type;
    
    v_total NUMBER;
BEGIN
    FOR i IN 1..10 LOOP
        t_num_tab(i) := i;
        t_text_tab(i) := 'row'||i;
    END LOOP;
    FORALL i IN 1..10</
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永恒的宁静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值