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 daripadaDBMS_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