Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana melakukan operasi batch menggunakan pl/sql

Saya hanya akan mengatakan ini menjijikkan sebelum saya mulai. Jika Anda membuat skrip yang mengotomatiskan pembuatan basis data, saya akan membuang kueri di bawah ini dan hanya menyalin/menempelkan karena ini sangat mengerikan sehingga TIDAK termasuk dalam skrip penerapan basis data Anda.

Permintaan

DECLARE
    CURSOR TABLES IS SELECT * FROM USER_TABLES
                     WHERE 0 = (SELECT COUNT(*)
                                FROM USER_CONSTRAINTS
                                WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
                                AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
                               );
BEGIN
    FOR T IN TABLES LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
        EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
        EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
        EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
                          ||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
                          ||'FOR EACH ROW '||CHR(10)
                          ||'BEGIN '||CHR(10)
                          ||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
                          ||'END; ';
    END LOOP;
END;
/

Apa fungsinya?

Pada dasarnya, ia mendapat daftar tabel dan secara dinamis membangun SQL untuk melakukan berbagai tugas yang terlibat. EXECUTE IMMEDIATE mengambil string tempat kami membangun SQL dan menjalankannya. CHR(10) nastiness adalah baris baru. Saya ingin spasi putih di sana karena saya tidak tahu bagaimana membiarkannya keluar akan memengaruhi penguraian Oracle. Perhatikan bahwa di beberapa tempat kami menggabungkan nama tabel secara langsung ke beberapa teks lain untuk menghasilkan urutan atau nama batasan PK.

Ini mungkin atau mungkin tidak kesalahan jika Anda mengutip nama tabel Anda selama pembuatan dan menggunakan beberapa karakter huruf kecil. Jika TIDAK error, perlu diingat bahwa setiap pernyataan melibatkan komit. Kesalahan akan berarti prosesnya setengah selesai. Itu juga gagal jika skema bukan pengguna saat ini. (Anda harus mengubah USER_TABLES ke ALL_TABLES dan tambahkan filter yang sesuai di klausa where dan tambahkan skema di depan nama tabel saat membuat SQL untuk membuatnya berfungsi pada skema lain.)

SQLFiddle yang sebenarnya berfungsi:http://sqlfiddle.com/#!4/b67fc/1 (Saya tidak percaya ini benar-benar bekerja pada SQLFiddle.) Dalam hal ini, kueri yang kami minati sudah berakhir dalam definisi skema karena SQL Fiddle hanya mengizinkan SELECT dalam kueri.

Semoga beruntung. Anda akan membutuhkannya. Jangan tembak kaki Anda sendiri.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Terapkan fungsi COUNT pada subgrup grup

  2. PreparedStatement adalah null dalam klausa Where tanpa if conditional (query dinamis) atau nilai-nilai omong kosong

  3. EKSEKUSI SEGERA di plsql

  4. Pengikatan Parameter OracleCommand SQL

  5. Cara mengekspor teks yang dapat dicetak saja (atau properti paket lainnya) di wireshark