Membuat file CSV per Loop | Pengembang Oracle SQL PLSQL

Diperbarui

Teman-teman!

TL;DR

Perlu kode yang berfungsi untuk menelusuri daftar semua tabel saya yang ada yang akan membuat file CSV dengan memilih 100 baris teratas setiap tabel. Ada variabel yang diatur untuk menangkap nama tabel yang akan digunakan secara dinamis, memanggil tabel untuk memilih dan memberi nama file. Harus dilakukan melalui PLSQL dan SQLDeveloper. Tahukah kamu, wae?

Inilah situasinya:

  • Harus mengumpulkan semua tabel (tabel dasar tidak sementara) dan jumlah baris (jumlah baris>0)
  • Buat loop untuk memilih(*) 100 baris teratas dari daftar tabel
  • Ambil hasil kueri dan letakkan di file CSV

Masalah:

  • Mendeklarasikan Variabel
  • Menggunakan Mulai dan Akhir
  • Menggunakan nama dinamis untuk menghasilkan file CSV unik

Ini Kode saya:

CREATE GLOBAL TEMPORARY TABLE NameRow (nom VARCHAR2(100), rowc INTEGER)
  on commit delete ROWS;
  insert into NameRow(nom, rowc) select table_name, num_rows from user_tables where temporary = 'N' and num_rows > 0;
    --select * from namerow;
    --select count(nom) from namerow;
    --drop table namerow;
    --no need for the row count > 0 because that was already done above
 declare
  counter number := 0;
  totalrecords number := 0;
  nmbre varchar2(100);
 BEGIN

    Select count(nom) into totalrecords from namerow;
    WHILE counter <= totalrecords LOOP
      select nom into nmbre from NameRow where rownum =1;
    SET SPOOL ON
    SPOOL c:\Users\l.r.enchaustegui\Documents\reporepo\||nmbre||.csv
    select /*csv*/ * from HR.nmbre;
    SET SPOOL OFF 
        delete from namerow where rownum=1;
        counter := counter + 1;
    End loop;
 END;

Kode Dijelaskan:

  • Tabel sementara dibuat dengan kolom varchare dan integer untuk mencatat semua tabel di DB dengan RowCountnya
  • Nama Tabel yang dimasukkan ke dalam tabel sementara harus bersifat non-sementara dan mempunyai jumlah baris lebih dari 0

Segmen selanjutnya

  • Mendeklarasikan 3 variabel: 2 bilangan bulat dan varchar
  • 2 Integer: 1 adalah counter untuk loop. 1 mencatat total baris dalam tabel Temp yang akan berfungsi sebagai iterasi maksimal dalam loop.
  • Varchar: Nmbre akan mencatat nama nama tabel pertama dalam tabel temp.

Segmen Berikutnya

  • Gabungkan ke jalur berikut, menggunakan variabel Nmbre untuk memberi nama file CSV secara dinamis
  • Spool Query menggunakan variabel Nmbre untuk memilih tabel secara dinamis
  • Hapus baris pertama dari tabel temp [berfungsi untuk memutar ke nama tabel berikutnya]
  • Kumparan
  • Lingkaran
  • Lingkaran akhir; Akhir;

Dimana saya salah? Juga, saya mendapatkan kesalahan ini:

Putaran Bonus: Terbatas untuk Pengembang SQL


person ThereIsLeo    schedule 20.02.2018    source sumber
comment
Bisakah Anda menggunakan SQLcl yang merupakan inti sqldev sebagai baris cmd?   -  person Kris Rice    schedule 20.02.2018
comment
Anda tidak dapat menempelkan perintah sqlplus yang tertanam dalam pernyataan sql. Opsi lainnya adalah menggunakan UTL_FILE untuk file i/o, namun file tersebut kemudian dibuat di server, bukan di workstation Anda.   -  person OldProgrammer    schedule 20.02.2018
comment
@KrisRice Saya yakin saya bisa. Solusi apa yang Anda lihat sedang terjadi?   -  person ThereIsLeo    schedule 20.02.2018
comment
@OldProgrammer Saya minta maaf, saya cukup baru mengenal PLSQL, perintah SQLPLUS apa yang saya sematkan? Bagaimana Anda memvisualisasikan solusi menggunakan UTL_FILE?   -  person ThereIsLeo    schedule 20.02.2018
comment
Apakah ini pekerjaan rumah?   -  person Stilgar    schedule 20.02.2018
comment
Perintah spool adalah SQL*Plus.   -  person William Robertson    schedule 20.02.2018
comment
dengan sqlcl Anda dapat mencampurkan lebih banyak lagi. Kalau tidak, sebagai @OldProgrammer Anda memiliki campuran kode klien di plsql, itu tidak akan berhasil   -  person Kris Rice    schedule 20.02.2018
comment
@Stilgar itu negatif. Melakukan pekerjaan ringan (kotor) dalam tim yang melakukan ETL. Saya cukup baru mengenal PLSQL dan telah menghabiskan banyak sumber daya untuk mencoba memecahkan teka-teki ini.   -  person ThereIsLeo    schedule 20.02.2018
comment
Saya masih mendapati diri saya tidak mampu menyelesaikan ini. :(   -  person ThereIsLeo    schedule 21.02.2018


Jawaban (1)


Inilah opsi menggunakan SQLcl. SQLcl adalah inti dari SQLDEV tetapi dibungkus menjadi baris cmd. Juga sebagai java, kemampuan skrip inti java juga tersedia. Ini menggunakan JavaScript sebagai mesin skrip.

Kami memiliki beberapa dokumen dan banyak contoh bagaimana semua ini berjalan di github di sini: https://github.com/Oracle/Oracle-db-tools/tree/master/sqlcl

script
 var binds = {};

// get complete list of tables
 var tables = util.executeReturnList("select table_name from user_tables", binds);

 for (i = 0; i < tables.length; i++) {
   // get count of rows
    var rows = util.executeReturnOneCol('select count(1)  from ' +  tables[i].TABLE_NAME );
    ctx.write( tables[i].TABLE_NAME + ">>"  + rows + " \n" ) ;

    // if more than zero dump to a csv file
    if ( rows > 0 ){
        sqlcl.setStmt("set sqlformat csv ")
        sqlcl.run();
        sqlcl.setStmt("spool " + tables[i].TABLE_NAME + ".csv")
        sqlcl.run();

        sqlcl.setStmt("select * from  " + tables[i].TABLE_NAME )
        sqlcl.run();
        sqlcl.setStmt("spool off")
        sqlcl.run();

    }
 }
/
person Kris Rice    schedule 20.02.2018
comment
Terima kasih Kris, aku akan mencoba memahami hal ini. - person ThereIsLeo; 21.02.2018
comment
Tentu. Hal ini berbeda terutama karena penambahan aliran kontrol klien merupakan perubahan besar dari 100% PLSQL - person Kris Rice; 21.02.2018
comment
Terlepas dari ketidakmampuan saya saat ini, terima kasih atas kontribusi Anda! - person ThereIsLeo; 21.02.2018
comment
Untuk itulah kami ada di sini :) - person Kris Rice; 21.02.2018