1.業務要求:
將oracle表a的整表的資料一次性匯入到表b中 , 以a_id為外來鍵關聯.
(*******如果開發環境和實際生產環境的資料一致,而且資料量比較小情況,可以直接手動新增資料;
********實際情況: 開發環境和生產環境資料不一致, 而且開發者沒有實際運算元據庫的許可權~所以通過提交sql指令碼來生成資料)
2.實現方式:
這裡用到oracle的語句塊,游標,以及for迴圈.
3.準備工作
新建表a和b,新增序列和a表的資料
--給表a新增一點資料:auto-generated definition
create
table
z_a(
id
number(10) not
null
constraint
z_a_pk
primary
key,
name
varchar2(50))
/comment
ontable 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
ontable z_b is
'測試用表,沒有實用'/
;--序列create
sequence seq_z_a
increment by1
start
with
1maxvalue
99999
cycle
nocache; --
序列create
sequence seq_z_b
increment by1
start
with
1maxvalue
99999
cycle
nocache;
5.sql指令碼
declare6.效果--宣告 b表序列id
b_seq
number(10
);
--查詢所有a表idcursorcur_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;
endloop;
commit
;end;
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(游標迴圈)
請參考:
上面使用的是游標迴圈,有點類似程式設計中的foreach~
Oracle語句塊PL SQL迴圈判斷
pl sql procedural language sql 被資料庫編譯儲存,由使用者呼叫 cuug本周五晚8點免費網路課程,大家趕緊報名去參加吧!程式塊 語法 declare 宣告變數 宣告變數 age int 沒有預設值的變數 age2 int 0 begin 寫正常的處理語句 dbms ou...
Oracle中使用語句新增或刪除字段
alter table 表名 add 新列名 資料型別 完整性約束 drop 完整性約束名 modify 列名 資料型別 for example alter table students add scome date 在students 表中插入型別為 date 的列 scome eg altert...
oracle使用語句建立使用者和表空間
用 寫了個建立表空間的demo,直接貼 先儲存在這兒啦 建立臨時表空間 drop tablespace user data including contents and datafiles 刪除表空間及對應檔案,不能手動停服務刪除檔案 create temporary tablespace supp...