cari
Rumahpangkalan datatutorial mysqlOracle案例:利用存储过程进行表数据分离

某客户有个需求,有2张业务表,数据量比较大,有2000W行,现在的需求是把这2张表中的一部分记录,根据一定的where条件分离出去,

某客户有个需求,有2张业务表,数据量比较大,有2000W行,现在的需求是把这2张表中的一部分记录,根据一定的where条件分离出去,创建到另外的归档表中,即做表记录的迁移操作。最后得到的结果是:未满足筛选条件的记录留在原表中,满足筛选条件的表要插入到归档表中,并且要在原表中删除这些插入到归档表中的全部记录,最后满足:新表记录+归档记录=原表记录数

下面我来模拟一下这个过程:
由于没有拿到具体的建表语句,这里把表的内容最简化,只留2个列,作为最基本的演示


--连接到测试用户,创建测试表
SQL> conn zlm/zlm
Connected.
SQL> select * from cat;


no rows selected
SQL> create table tabhdr(tabhdrid number(10),status number(10));


Table created.


SQL> create table tabdet(tabhdrid number(10));


Table created.


SQL> create table arch_tabdet as select * from tabdet;


Table created.


SQL> create table arch_tabhdr as select * from tabhdr;


Table created.


--创建操作日志表
SQL> create table arch_log(
  2        archbegintime char(19),
  3        archmiddletime char(19),
  4        archendtime  char(19),
  5        archinscount1    number,
  6        archdelcount1    number,
  7        archinscount2    number,
  8        archdelcount2    number,
  9        archstatus    varchar2(20),
 10        archerrorcode varchar2(20),
 11        archerrormsg  varchar2(1000));


Table created.


操作日志表字段说明:
archbegintime->archimiddletime    //第一次迁移操作(insert+delete)的时间
archimiddletime->archendtime    //第二次迁移操作(insert+delete)的时间
archcount1    //第一次迁移操作(insert+delete)的数据量
archcount2    //第二次迁移操作(insert+delete)的数据量
archstatus    //操作状态(success/failure)
archerrorcode    //报错代码
archerrormsg    //报错信息


--插入测试数据(每个表插入10W条记录,仅测试功能没必要用很大的数据)
SQL> begin
  2  for i in 1..100000
  3  loop
  4  insert into tabhdr values(i,9);
  5  insert into tabdet values(i);
  6  end loop;
  7  commit;
  8  end;
  9  /


PL/SQL procedure successfully completed.


--创建存储过程detach_pro
SQL> create or replace procedure detach_pro
  2  is
  3    maxrows number default 10000;
  4    rowid_table dbms_sql.Urowid_Table;
  5    i number;
  6    cursor cur_1 is SELECT a.rowid FROM tabdet a WHERE tabhdrid IN(SELECT tabhdrid FROM tabhdr WHERE STATUS=9)  order by a.rowid;
  7    cursor cur_2 is SELECT a.rowid FROM tabhdr a WHERE status=9 order by a.rowid;
  8   
  9    v_begintime char(19):=to_char(sysdate,'yyyy-mm-dd hh:mi:ss');
 10    v_middletime char(19);
 11    v_inscount1  number:=0;
 12    v_delcount1  number:=0;
 13    v_inscount2  number:=0;
 14    v_delcount2  number:=0;
 15    v_errcode varchar2(100);
 16    v_errerrm varchar2(1000);
 17   
 18  begin
 19    open cur_1;
 20    loop   
 21      exit when cur_1%notfound;
 22      fetch cur_1 bulk collect into rowid_table limit maxrows;
 23     
 24      forall i in 1 .. rowid_table.count
 25      insert into arch_tabdet select * from tabdet where rowid = rowid_table(i);
 26      commit;
 27      v_inscount1:=v_inscount1+rowid_table.count;
 28      forall i in 1 .. rowid_table.count
 29      delete from tabdet where rowid = rowid_table(i);
 30      commit;
 31      v_delcount1:= v_delcount1+rowid_table.count;
 32    end loop;
 33    close cur_1;
 34    v_middletime:=to_char(sysdate,'yyyy-mm-dd hh:mi:ss');
 35    open cur_2;
 36    loop 
 37      exit when cur_2%notfound;
 38      fetch cur_2 bulk collect    into rowid_table limit maxrows;
 39     
 40      forall i in 1 .. rowid_table.count
 41      insert into arch_tabhdr select * from tabhdr where rowid = rowid_table(i);
 42      commit;
 43      v_inscount2:=v_inscount2+rowid_table.count;
 44      forall i in 1 .. rowid_table.count
 45      delete from tabhdr where rowid = rowid_table(i);
 46      commit;
 47      v_delcount2:= v_delcount2+rowid_table.count;
 48    end loop;
 49    close cur_2; 
 50    insert into arch_log values (v_begintime,v_middletime,to_char(sysdate,'yyyy-mm-dd hh:mi:ss'), v_inscount1,v_delcount1,v_inscount2,v_delcount2,'success',null,null);
 51    commit;
 52  exception
 53    when others then
 54        v_errcode :=sqlcode;
 55        v_errerrm :=sqlerrm;
      insert into arch_log values (v_begintime,v_middletime,to_char(sysdate,'yyyy-mm-dd hh:mi:ss'),  v_inscount1,v_delcount1,v_inscount2,v_delcount2,'failure',v_errcode,v_errerrm);
 57        commit;
 58  end;
 59  /


Procedure created.


--开始第1次测试
SQL> select count(*) from tabdet;


  COUNT(*)
----------
    100000


SQL> select count(*) from tabhdr;


  COUNT(*)
----------
    100000

 


SQL> select count(*) from arch_tabdet;


  COUNT(*)
----------
        0


SQL> select count(*) from arch_tabdet;


  COUNT(*)
----------
        0


SQL> exec detach_pro;


PL/SQL procedure successfully completed.


SQL> select count(*) from tabdet;


  COUNT(*)
----------
        0


SQL> select count(*) from tabhdr;


  COUNT(*)
----------
        0


SQL> select count(*) from arch_tabdet;


  COUNT(*)
----------
    100000


SQL> select count(*) from arch_tabhdr;


  COUNT(*)
----------
    100000


SQL> select * from arch_log;

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Mysql: Kemahiran penting untuk pemula untuk menguasaiMysql: Kemahiran penting untuk pemula untuk menguasaiApr 18, 2025 am 12:24 AM

MySQL sesuai untuk pemula untuk mempelajari kemahiran pangkalan data. 1. Pasang alat pelayan dan klien MySQL. 2. Memahami pertanyaan SQL asas, seperti SELECT. 3. Operasi data induk: Buat jadual, masukkan, kemas kini, dan padam data. 4. Belajar Kemahiran Lanjutan: Fungsi Subquery dan Window. 5. Debugging dan Pengoptimuman: Semak sintaks, gunakan indeks, elakkan pilih*, dan gunakan had.

MySQL: Data berstruktur dan pangkalan data hubunganMySQL: Data berstruktur dan pangkalan data hubunganApr 18, 2025 am 12:22 AM

MySQL dengan cekap menguruskan data berstruktur melalui struktur jadual dan pertanyaan SQL, dan melaksanakan hubungan antara meja melalui kunci asing. 1. Tentukan format data dan taip apabila membuat jadual. 2. Gunakan kunci asing untuk mewujudkan hubungan antara jadual. 3. Meningkatkan prestasi melalui pengindeksan dan pengoptimuman pertanyaan. 4. Secara kerap sandaran dan memantau pangkalan data untuk memastikan pengoptimuman keselamatan data dan prestasi.

MySQL: Ciri dan keupayaan utama dijelaskanMySQL: Ciri dan keupayaan utama dijelaskanApr 18, 2025 am 12:17 AM

MySQL adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pembangunan web. Ciri -ciri utamanya termasuk: 1. Menyokong pelbagai enjin penyimpanan, seperti InnoDB dan Myisam, sesuai untuk senario yang berbeza; 2. Menyediakan fungsi replikasi master-hamba untuk memudahkan pengimbangan beban dan sandaran data; 3. Meningkatkan kecekapan pertanyaan melalui pengoptimuman pertanyaan dan penggunaan indeks.

Tujuan SQL: Berinteraksi dengan Pangkalan Data MySQLTujuan SQL: Berinteraksi dengan Pangkalan Data MySQLApr 18, 2025 am 12:12 AM

SQL digunakan untuk berinteraksi dengan pangkalan data MySQL untuk merealisasikan penambahan data, penghapusan, pengubahsuaian, pemeriksaan dan reka bentuk pangkalan data. 1) SQL Melaksanakan operasi data melalui Pilih, Masukkan, Kemas kini, Padam Penyataan; 2) Gunakan pernyataan membuat, mengubah, drop untuk reka bentuk dan pengurusan pangkalan data; 3) Pertanyaan kompleks dan analisis data dilaksanakan melalui SQL untuk meningkatkan kecekapan membuat keputusan perniagaan.

Mysql for Beginners: Bermula dengan Pengurusan Pangkalan DataMysql for Beginners: Bermula dengan Pengurusan Pangkalan DataApr 18, 2025 am 12:10 AM

Operasi asas MySQL termasuk membuat pangkalan data, jadual, dan menggunakan SQL untuk melakukan operasi CRUD pada data. 1. Buat pangkalan data: createdatabasemy_first_db; 2. Buat Jadual: CreateTableBooks (Idintauto_IncrementPrimaryKey, Titlevarchar (100) NotNull, Authorvarchar (100) NotNull, Published_yearint); 3. Masukkan Data: InsertIntoBooks (Tajuk, Pengarang, Published_year) VA

Peranan MySQL: Pangkalan Data dalam Aplikasi WebPeranan MySQL: Pangkalan Data dalam Aplikasi WebApr 17, 2025 am 12:23 AM

Peranan utama MySQL dalam aplikasi web adalah untuk menyimpan dan mengurus data. 1.MYSQL dengan cekap memproses maklumat pengguna, katalog produk, rekod urus niaga dan data lain. 2. Melalui pertanyaan SQL, pemaju boleh mengekstrak maklumat dari pangkalan data untuk menghasilkan kandungan dinamik. 3.MYSQL berfungsi berdasarkan model klien-pelayan untuk memastikan kelajuan pertanyaan yang boleh diterima.

MySQL: Membina pangkalan data pertama andaMySQL: Membina pangkalan data pertama andaApr 17, 2025 am 12:22 AM

Langkah -langkah untuk membina pangkalan data MySQL termasuk: 1. Buat pangkalan data dan jadual, 2. Masukkan data, dan 3. Pertama, gunakan pernyataan CreatedataBase dan createtable untuk membuat pangkalan data dan jadual, kemudian gunakan pernyataan InsertInto untuk memasukkan data, dan akhirnya gunakan pernyataan PILIH untuk menanyakan data.

MySQL: Pendekatan mesra pemula untuk penyimpanan dataMySQL: Pendekatan mesra pemula untuk penyimpanan dataApr 17, 2025 am 12:21 AM

MySQL sesuai untuk pemula kerana mudah digunakan dan berkuasa. 1.MYSQL adalah pangkalan data relasi, dan menggunakan SQL untuk operasi CRUD. 2. Ia mudah dipasang dan memerlukan kata laluan pengguna root untuk dikonfigurasi. 3. Gunakan Masukkan, Kemas kini, Padam, dan Pilih untuk Melaksanakan Operasi Data. 4. Orderby, di mana dan menyertai boleh digunakan untuk pertanyaan yang kompleks. 5. Debugging memerlukan memeriksa sintaks dan gunakan Jelaskan untuk menganalisis pertanyaan. 6. Cadangan pengoptimuman termasuk menggunakan indeks, memilih jenis data yang betul dan tabiat pengaturcaraan yang baik.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

Muat turun versi mac editor Atom

Muat turun versi mac editor Atom

Editor sumber terbuka yang paling popular

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.