tomy_125: Note

tomy_125 の個人的なメモ

Oracle PL/SQL 中のカーソルの読み取り一貫性

PL/SQL の読取り一貫性を確認

script 1 (cursorでselect)

t2の全行を 1秒おきに1行 fetchすることを、3回ループする

[oracle@db01 20220702]$ cat loop_in_cursor.sql

set line 200 pages 1000 tab off time on timing on serveroutput on
drop table t2 purge;
create table t2 (c1 number(10), c2 varchar2(40));

insert into t2
select level, to_char(sysdate , 'yyyy/mm/dd hh24:mi:ss')
from dual connect by level <= 10;
commit;

declare
        vSQL varchar2(200);
        vC1 number(19);
        vC2 varchar2(40);
        cursor c is
                select
                        c1,
                        c2
                from
                        t2
                ;
begin
        for i in 1..3 loop
                dbms_output.put_line('---- loop ' || to_char(i));
                open c;
                        loop
                                fetch c into vC1, vC2;
                                exit when c%notfound;
                                        dbms_output.put_line(to_char(vC1) || ', ' || vC2);
                                dbms_session.sleep(1);
                        end loop;
                close c;
        end loop;
end;
/

quit;

script 2 (update)

t2 を1行ずつ、1秒間隔で、全行更新するまでループする

[oracle@db01 20220702]$ cat loop_update.sql

set line 200 pages 1000 tab off time on timing on serveroutput on
begin
        for i in 1..20 loop

                update t2 set c2 = to_char(sysdate,'yyyy/mm/dd hh24:mi:ss') where c1 = i;
                commit;
                dbms_session.sleep(1);

        end loop;
end;
/

結果

script 実行中に、script 2を実行する。 script 1 のloop 1回目は、最初に投入したデータを表示 script 1 のloop 2回目は、script 2 が t2 を途中まで更新したデータを表示 script 1 のloop 3回目は、script 2 が t2 を最後まで表示したデータを表示

→ カーソルがオープンしたタイミングのデータが表示される

  • script 1 結果
[oracle@db01 20220702]$ sqlplus inserter/oracle@pdb1 @loop_in_cursor.sql

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jul 2 06:21:12 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Sat Jul 02 2022 06:20:11 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


Table dropped.

Elapsed: 00:00:00.01

Table created.

Elapsed: 00:00:00.01

10 rows created.

Elapsed: 00:00:00.00

Commit complete.

Elapsed: 00:00:00.00
---- loop 1
1, 2022/07/02 06:21:12
2, 2022/07/02 06:21:12
3, 2022/07/02 06:21:12
4, 2022/07/02 06:21:12
5, 2022/07/02 06:21:12
6, 2022/07/02 06:21:12
7, 2022/07/02 06:21:12
8, 2022/07/02 06:21:12
9, 2022/07/02 06:21:12
10, 2022/07/02 06:21:12
---- loop 2
1, 2022/07/02 06:21:16
2, 2022/07/02 06:21:17
3, 2022/07/02 06:21:18
4, 2022/07/02 06:21:19
5, 2022/07/02 06:21:20
6, 2022/07/02 06:21:21
7, 2022/07/02 06:21:22
8, 2022/07/02 06:21:12
9, 2022/07/02 06:21:12
10, 2022/07/02 06:21:12
---- loop 3
1, 2022/07/02 06:21:16
2, 2022/07/02 06:21:17
3, 2022/07/02 06:21:18
4, 2022/07/02 06:21:19
5, 2022/07/02 06:21:20
6, 2022/07/02 06:21:21
7, 2022/07/02 06:21:22
8, 2022/07/02 06:21:23
9, 2022/07/02 06:21:24
10, 2022/07/02 06:21:25

PL/SQL procedure successfully completed.

Elapsed: 00:00:30.74
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@db01 20220702]$
  • script 2 結果
[oracle@db01 20220702]$ sqlplus inserter/oracle@pdb1 @loop_update.sql

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Jul 2 06:21:16 2022
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Last Successful login time: Sat Jul 02 2022 06:21:12 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0


PL/SQL procedure successfully completed.

Elapsed: 00:00:20.48
06:21:36 SQL>