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

Pelajari Tentang Paket DBMS_OUTPUT di Oracle

Pada artikel ini, kita akan memeriksa DBMS_OUTPUT paket dalam beberapa detail. DBMS_OUTPUT paket di Oracle, seperti paket DBMS lainnya, dimiliki oleh pengguna Oracle SYS .

Script yang membuat DBMS_OUTPUT memberikan izin EXECUTE pada paket ke PUBLIC, dan membuat sinonim publik untuknya. Ini berarti bahwa setiap pengguna Oracle dapat memanggil rutinitas di DBMS_OUTPUT tanpa harus mengawali nama paket dengan SYS .

Bagaimana cara kerja DBMS_OUTPUT di Oracle?

Dua operasi dasar, GET dan PUT , diimplementasikan melalui prosedur dalam paket. Sebuah PUT operasi mengambil argumennya dan menempatkannya ke dalam buffer internal untuk penyimpanan.

Sebuah GET operasi membaca dari buffer ini dan mengembalikan konten sebagai argumen ke prosedur. Ada juga ENABLE prosedur yang menetapkan ukuran buffer.

Prosedur dalam Paket DBMS_OUTPUT

PUT rutinitas dalam paket adalah PUT , PUT_LINE , dan NEW_LINE . GET rutinitasnya adalah GET_LINE dan GET_LINES . AKTIFKAN dan NONAKTIFKAN kontrol buffer.

PUT dan PUT_LINE Sintaks untuk panggilan PUT dan PUT_LINE adalah:

PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);
PROCEDURE PUT(a VARCHAR2);
PROCEDURE PUT(a NUMBER);
PROCEDURE PUT(a DATE);

Di mana a adalah argumen yang akan ditempatkan di buffer. Perhatikan bahwa jenis parameter membebani prosedur ini. Karena tiga versi PUT yang berbeda dan PUT_LINE , buffer dapat berisi nilai tipe VARCHAR2 , NUMBER , dan DATE disimpan dalam buffer dalam format aslinya. Namun, GET_LINE dan GET_LINES ambil dari buffer dan kembalikan string Karakter saja.

Saat GET operasi dilakukan, isi buffer akan dikonversi ke string Karakter sesuai dengan aturan konversi tipe data default. Jika Anda ingin menentukan format untuk konversi, gunakan TO_CHAR secara eksplisit panggil PUT , daripada GET .

Buffer diatur ke dalam baris, yang masing-masing dapat memiliki maksimum 255 byte. PUT_LINE menambahkan Karakter baris baru setelah argumennya, menandakan akhir baris. PUT tidak. PUT_LINE sama dengan memanggil PUT lalu memanggil NEW_LINE .

NEW_LINE Sintaks untuk panggilan NEW_LINE adalah:

PROCEDURE NEW_LINE;

NEW_LINE menempatkan Karakter baris baru ke dalam buffer, menandakan akhir baris. Tidak ada batasan jumlah baris dalam buffer. Namun, ukuran total buffer terbatas pada nilai yang ditentukan dalam ENABLE.

GET_LINE Sintaks untuk GET_LINE adalah:

PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);

Dimana baris tersebut adalah karakter string yang akan berisi satu baris buffer, dan status menunjukkan apakah baris tersebut berhasil diambil. Panjang maksimum sebuah baris adalah 255 byte. Jika garis diambil, statusnya akan menjadi 0; jika tidak ada lagi baris di buffer, itu akan menjadi 1.

CATATAN

Meskipun ukuran maksimum garis penyangga adalah 255 byte, garis variabel keluaran bisa lebih dari 255 Karakter. Garis buffer dapat terdiri dari DATE nilai, misalnya.

Ini mengambil 7 byte penyimpanan di buffer tetapi biasanya dikonversi ke string Karakter dengan Panjang lebih besar dari 7.

GET_LINES

Prosedur GET_LINES memiliki argumen berupa tabel PL/SQL. Jenis tabel dan sintaksnya adalah

TYPE CHARARR IS TABLE OF VERCHAR2(255)
INDEX BY BINARY_INTEGER;

PROCEDURE GET_LINES(lines OUT CHARARR,
numlines IN OUT INTEGER);

Di mana baris adalah tabel PL/SQL akan berisi beberapa baris dari buffer, dan numlines menunjukkan berapa banyak baris yang diminta. Pada input ke GET_LINES, numlines menentukan jumlah baris yang diminta. Pada Output, numlines akan berisi jumlah baris yang sebenarnya dikembalikan, Yang akan kurang dari atau sama dengan jumlah yang diminta. GET_LINES dirancang untuk menggantikan beberapa panggilan ke GET_LINES.

CHARARR type juga didefinisikan dalam DBMS_OUTPUT kemasan. Oleh karena itu, jika Anda ingin memanggil GET_LINES secara eksplisit dalam kode Anda, Anda perlu mendeklarasikan variabel tipe DBMS_OUTPUT . CHARARR . Misalnya:

Create Table temp_table (char_col varchar2(4000))
/
DECLARE

/* Demonstrates using PUT_LINE and GET_LINE. */

v_Data DBMS_OUTPUT.CHARARR;

v_NumLines NUMBER;

BEGIN

-- Enable the buffer first.

DBMS_OUTPUT.ENABLE(1000000);

-- Put some data in the buffer first, so GET_LINES will

-- retrieve something.

DBMS_OUTPUT.PUT_LINE( 'Line' );

DBMS_OUTPUT.PUT_LINE( 'Line Two' );

DBMS_OUTPUT.PUT_LINE( 'Line Three' );

--Set the maximum number of lines that we want to retrieve.

v_NumLines := 3 ;

/* Get the contents of the buffer back. Note that v_DATA is

declared of type DBMS_OUTPUT. CHARARR, so that it matches

the declaration of DBMS_OUTPUT. GET_LINES. */

DBMS_OUTPUT.GET_LINES(v_DATA, v_NumLines);

/* Loop through the returned buffer, and insert the contents

into tem_table. */

For v_Counter IN 1.. v_NumLines Loop

INSERT INTO temp_table ( char_col )

VALUES ( v_Data ( v_Counter ));

END LOOP;

END;
/

AKTIFKAN dan NONAKTIFKAN

Sintaks untuk panggilan AKTIFKAN dan NONAKTIFKAN adalah:

PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000);

PROCEDURE DISABLE;

Di mana buffer_size adalah ukuran awal buffer internal, dalam byte. Ukuran defaultnya adalah 20.000 byte, dan ukuran maksimumnya adalah 1.000.000 byte.

Kemudian, argumen ke PUT atau PUT_LINE akan ditempatkan di buffer ini. Mereka disimpan dalam format internalnya, mengambil banyak ruang di buffer seperti yang ditentukan oleh strukturnya.

Jika DISABLE disebut, isi buffer adalah perintah strukturnya. Jika DISABLE dipanggil, isi buffer dibersihkan, dan panggilan berikutnya ke PUT dan PUT_LINE tidak mempengaruhi.

Menggunakan DBMS_OUTPUT

DBMS_OUTPUT paket itu sendiri tidak mengandung mekanisme apa pun untuk pencetakan. Pada dasarnya, ini hanya mengimplementasikan struktur data masuk pertama, keluar pertama.

Karena itu, bagaimana kita bisa menggunakan DBMS_OUTPUT untuk dicetak? SQL*Plus, SQL*DBA, dan Manager akan memiliki opsi yang dikenal sebagai SERVEROUTPUT . Selain itu, beberapa produk pihak ketiga (termasuk SQL-Station) memiliki opsi yang memungkinkan tampilan DBMS_OUTPUT data.

Dengan opsi ini, SQL*Plus akan secara otomatis memanggil DBMS_OUTPUT.GET_LINES ketika blok PL/SQL ditutup dan mencetak hasilnya, jika ada, ke layar.

Perintah SQL*Plus SET SERVEROUTPUT ON panggilan implisit, yang menyiapkan buffer internal. Secara opsional, Anda dapat menentukan ukuran dengan SET SERVEROUTPUT ON SIZE buffer_size  di mana beffer_size  akan digunakan sebagai ukuran awal buffer (argumen ke DBMS_OUTPUT.ENABLE ).

Dengan SERVEROUTPUT on , SQL*Plus akan memanggil DBMS_OUTPUT.GET_LINES setelah  blok PL/SQL telah selesai. Ini berarti bahwa output akan digaungkan ke layar saat blok telah selesai dan tidak  selama eksekusi blok. Ini biasanya tidak menjadi masalah saat  DBMS_OUTPUT digunakan untuk debugging.

PERHATIAN

DBMS_OUTPUT dirancang untuk digunakan terutama untuk debuging. Ini tidak dimaksudkan untuk pelaporan umum. Jika Anda perlu menyesuaikan output dari kueri Anda, lebih baik menggunakan alat seperti Oracle Reports daripada DBMS_OUTPUT dan SQL*Plus.

SET serveroutput on SIZE 1000000
BEGIN
    DBMS_OUTPUT.PUT_LINE('Before loop');
    FOR v_Counter IN 1..10 LOOP
      DBMS_OUTPUT.PUT_LINE('Inside loop, couter = ' || v_Counter);
     END LOOP;
     DBMS_OUPUT.PUT_LINE( 'After loop');
END;
/

Buffer internal memang memiliki ukuran maksimum (ditentukan dalam DBMS_OUTPUT.ENABLE ), dan setiap baris memiliki panjang maksimum 255 byte. Akibatnya, panggilan ke DBMS_OUTPUT.PUT , DBMS_OUTPUT.PUT_LINE , dan DBMS_OUTPUT.NEW_LINE dapat meningkatkan baik

ORA-20000: ORU-10027: buffer overflow,
           limit of <buf_limit> bytes.

Atau

ORA-20000: ORU-10028 line lenth overflow,
           limit of 255 bytes per line.

Pesan tergantung pada batas mana yang terlampaui.

Lihat juga:

  • Bagaimana Mengaktifkan DBMS_OUTPUT di Toad untuk Oracle?
  • Log Keluaran DBMS_OUTPUT.Put_Line Ke Tabel Di Oracle Dengan DBMS_OUTPUT.Get_Lines

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java - temukan penyebab pertama pengecualian

  2. Mengatur Parameter Bahasa Oracle untuk DG4ODBC

  3. Pengantar Pernyataan FORALL Dalam Database Oracle

  4. Urutan eksekusi kondisi dalam klausa 'di mana' SQL

  5. Menyalin baris dalam tabel yang sama tanpa harus mengetikkan 50+ nama kolom (sambil mengubah 2 kolom)