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~