Oracle使用語句塊之循環插入數據


1.業務要求: 

  將oracle表A的整表的數據一次性導入到表B中 , 以A_ID為外鍵關聯.

  (*******如果開發環境和實際生產環境的數據一致,而且數據量比較小情況,可以直接手動添加數據;

       ********實際情況: 開發環境和生產環境數據不一致, 而且開發者沒有實際操作數據庫的權限~所以通過提交sql腳本來生成數據)

2.實現方式:

  這里用到oracle的語句塊,游標,以及for循環.

3.准備工作

  新建表A和B,添加序列和A表的數據

-- auto-generated definition
create table Z_A
(
    ID   NUMBER(10) not null
        constraint Z_A_PK
            primary key,
    NAME VARCHAR2(50)
)
/

comment on table Z_A is '測試用表,沒有實用'
/ ;

-- auto-generated definition
create table Z_B
(
    ID     NUMBER(10) not null
        constraint Z_B_PK
            primary key,
    NAME   VARCHAR2(50),
    A_NAME VARCHAR2(50),
    A_ID   NUMBER(10)
)
/

comment on table Z_B is '測試用表,沒有實用'
/


;
-- 序列
create sequence SEQ_Z_A
increment by 1
start with 1
maxvalue 99999
cycle
nocache;
 -- 序列
create sequence SEQ_Z_B
increment by 1
start with 1
maxvalue 99999
cycle
nocache;

 

 

給表A添加一點數據:

 

 

 5.SQL腳本

declare
    --聲明 B表序列ID
    B_SEQ number(10);
    --查詢所有A表ID
    cursor cur_A is select ID, NAME
                    from Z_A ;
begin

    for a in cur_A
        loop
            -- 查詢B表序列ID
            select SEQ_Z_B.nextval into B_SEQ from dual;
            --  插入B表數據
            INSERT INTO Z_B (ID, NAME, A_NAME, A_ID)
            VALUES (B_SEQ, '測試B', a.NAME, a.ID);
            -- commit;
        end loop;
    commit;
end;

 

 6.效果

 

 7.總結

  1.聲明: declare 關鍵字

    可以用來聲明一個變量, 比如上面的 B_SEQ作為 B表序列ID,當然也可以在后面的for里面直接使用 SEQ_Z_B.nextval 填充賦值, 這里是示范一下變量;

    具體變量使用可以網上找一下資料,有點類似編程中的定義變量, 變量的類型還有字符串類型,Table類型等;

  2.游標: cursor 關鍵字

    游標是SQL的一個內存工作區,由系統或用戶以變量的形式定義。游標的作用就是用於臨時存儲從數據庫中提取的數據塊。

    在某些情況下,需要把數據從存放在磁盤的表中調到計算機內存中進行處理,最后將處理結果顯示出來或最終寫回數據庫。

    這樣數據處理的速度才會提高,否則頻繁的磁盤數據交換會降低效率;

    上面使用 cur_A將A表的ID和NAME暫時存放到游標中,在下面for循環中使用;

  3.for循環:

    聽說有5中循環方式: Exit When、Loop、While、For(普通循環)、For(游標循環)

    請參考: https://blog.csdn.net/qq_42305423/article/details/80753725

    上面使用的是游標循環,有點類似編程中的foreach~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM