Trong bài viết này, chúng ta sẽ xem xét DBMS_OUTPUT
gói trong một số chi tiết. DBMS_OUTPUT
gói trong Oracle, giống như các gói DBMS khác, được sở hữu bởi người dùng Oracle SYS
.
Tập lệnh tạo DBMS_OUTPUT
cấp quyền THỰC HIỆN trên gói cho PUBLIC và tạo một từ đồng nghĩa công khai cho nó. Điều này có nghĩa là bất kỳ người dùng Oracle nào cũng có thể gọi các quy trình trong DBMS_OUTPUT
mà không cần phải đặt tiền tố tên gói bằng SYS
.
DBMS_OUTPUT hoạt động như thế nào trong Oracle?
Hai thao tác cơ bản, GET
và PUT
, được thực hiện thông qua các thủ tục trong gói. A PUT
hoạt động lấy đối số của nó và đặt nó vào bộ đệm nội bộ để lưu trữ.
A GET
hoạt động đọc từ bộ đệm này và trả về nội dung dưới dạng đối số cho thủ tục. Ngoài ra còn có một ENABLE
thủ tục đặt kích thước của bộ đệm.
Các thủ tục trong Gói DBMS_OUTPUT
PUT
các quy trình trong gói là PUT
, PUT_LINE
và NEW_LINE
. GET
thói quen là GET_LINE
và GET_LINES
. BẬT và TẮT kiểm soát bộ đệm.
PUT và PUT_LINE Cú pháp cho các lệnh gọi PUT và PUT_LINE là:
PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE); PROCEDURE PUT(a VARCHAR2); PROCEDURE PUT(a NUMBER); PROCEDURE PUT(a DATE);
Trong đó a là đối số được đặt trong vùng đệm. Lưu ý rằng kiểu tham số làm quá tải các thủ tục này. Do ba phiên bản khác nhau của PUT
và PUT_LINE
, bộ đệm có thể chứa các giá trị kiểu VARCHAR2
, NUMBER
và DATE
được lưu trữ trong bộ đệm ở định dạng ban đầu của chúng. Tuy nhiên, GET_LINE
và GET_LINES
truy xuất từ bộ đệm và chỉ trả về các chuỗi Ký tự.
Khi một GET
hoạt động được thực hiện, nội dung của bộ đệm sẽ được chuyển đổi thành một chuỗi Ký tự theo các quy tắc chuyển đổi kiểu dữ liệu mặc định. Nếu bạn muốn chỉ định định dạng cho chuyển đổi, hãy sử dụng TO_CHAR
rõ ràng gọi trên PUT
, thay vì GET
.
Bộ đệm được tổ chức thành các dòng, mỗi dòng có thể có tối đa 255 byte. PUT_LINE
thêm một Ký tự dòng mới sau đối số của nó, báo hiệu sự kết thúc của một dòng. PUT
không làm. PUT_LINE
tương đương với cách gọi PUT
và sau đó gọi NEW_LINE
.
NEW_LINE Cú pháp cho cuộc gọi NEW_LINE là:
PROCEDURE NEW_LINE;
NEW_LINE
đặt một Ký tự dòng mới vào vùng đệm, báo hiệu sự kết thúc của một dòng. Không có giới hạn về số dòng trong bộ đệm. Tuy nhiên, tổng kích thước của bộ đệm được giới hạn ở giá trị được chỉ định trong ENABLE.
GET_LINE Cú pháp cho GET_LINE là:
PROCEDURE GET_LINE(line OUT VARCHAR2, status OUT INTEGER);
Trong đó dòng là một chuỗi Ký tự sẽ chứa một dòng của bộ đệm và trạng thái cho biết dòng đó có được truy xuất thành công hay không. Độ dài tối đa của một dòng là 255 byte. Nếu dòng được truy xuất, trạng thái sẽ là 0; nếu không còn dòng nào trong bộ đệm, nó sẽ là 1.
LƯU Ý
Mặc dù kích thước tối đa của dòng đệm là 255 byte, dòng biến đầu ra có thể nhiều hơn 255 Ký tự. Dòng đệm có thể bao gồm
DATE
giá trị chẳng hạn.Các chuỗi này chiếm 7 byte dung lượng lưu trữ trong bộ đệm nhưng thường được chuyển đổi thành chuỗi Ký tự có Độ dài lớn hơn 7.
GET_LINES
Thủ tục GET_LINES có đối số là bảng PL / SQL. Loại bảng và cú pháp là
TYPE CHARARR IS TABLE OF VERCHAR2(255) INDEX BY BINARY_INTEGER; PROCEDURE GET_LINES(lines OUT CHARARR, numlines IN OUT INTEGER);
Trong đó các dòng là một bảng PL / SQL sẽ chứa nhiều dòng từ bộ đệm và numlines
cho biết có bao nhiêu dòng được yêu cầu. Khi nhập vào GET_LINES, numlines
chỉ định số dòng được yêu cầu. Trên Đầu ra, các số sẽ chứa số lượng dòng thực tế được trả về, Số dòng này sẽ nhỏ hơn hoặc bằng số lượng được yêu cầu. GET_LINES được thiết kế để thay thế nhiều cuộc gọi đến GET_LINES.
CHARARR
loại cũng được xác định trong DBMS_OUTPUT
bưu kiện. Do đó, nếu bạn muốn gọi GET_LINES
rõ ràng trong mã của bạn, bạn cần phải khai báo một biến kiểu DBMS_OUTPUT
. CHARARR
. Ví dụ:
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; /
BẬT và TẮT
Cú pháp cho cuộc gọi BẬT và TẮT là:
PROCEDURE ENABLE (buffer_size IN INTEGER DEFAULT 20000); PROCEDURE DISABLE;
Trong đó buffer_size là kích thước ban đầu của bộ đệm bên trong, tính bằng byte. Kích thước mặc định là 20.000 byte và kích thước tối đa là 1.000.000 byte.
Sau đó, các đối số cho PUT
hoặc PUT_LINE
sẽ được đặt trong bộ đệm này. Chúng được lưu trữ ở định dạng bên trong, chiếm nhiều không gian trong bộ đệm khi cấu trúc của chúng ra lệnh.
Nếu DISABLE
được gọi, nội dung của bộ đệm là cấu trúc của chúng ra lệnh. Nếu DISABLE
được gọi, nội dung của bộ đệm được xóa và các lệnh gọi tiếp theo tới PUT
và PUT_LINE
không ảnh hưởng.
Sử dụng DBMS_OUTPUT
DBMS_OUTPUT
gói chính nó không chứa bất kỳ cơ chế để in. Về cơ bản, nó chỉ thực hiện cấu trúc dữ liệu nhập trước, xuất trước.
Đã nói rằng, làm cách nào chúng ta có thể sử dụng DBMS_OUTPUT
Để in? SQL * Plus, SQL * DBA và Manager sẽ có một tùy chọn được gọi là SERVEROUTPUT
. Ngoài ra, một số sản phẩm của bên thứ ba (bao gồm SQL-Station) có tùy chọn cho phép hiển thị DBMS_OUTPUT
dữ liệu.
Với tùy chọn này, SQL * Plus sẽ tự động gọi DBMS_OUTPUT.GET_LINES
khi một khối PL / SQL kết thúc và in kết quả, nếu có, ra màn hình.
Lệnh SQL * Plus SET SERVEROUTPUT ON
các cuộc gọi ngầm, thiết lập bộ đệm bên trong. Theo tùy chọn, bạn có thể chỉ định kích thước bằng SET SERVEROUTPUT ON SIZE
buffer_size ở đâu beffer_size sẽ được sử dụng làm kích thước ban đầu của bộ đệm (đối số cho DBMS_OUTPUT.ENABLE
).
Với SERVEROUTPUT on
, SQL * Plus sẽ gọi DBMS_OUTPUT.GET_LINES
sau khối PL / SQL đã hoàn thành. Điều này có nghĩa là đầu ra sẽ được lặp lại với màn hình khi khối kết thúc và không trong quá trình thực thi khối. Đây thường không phải là vấn đề khi DBMS_OUTPUT
được sử dụng để gỡ lỗi.
THẬN TRỌNG
DBMS_OUTPUT
được thiết kế để sử dụng chủ yếu để gỡ lỗi. Nó không dành cho báo cáo chung. Nếu bạn cần tùy chỉnh kết quả đầu ra từ các truy vấn của mình, tốt hơn nên sử dụng các công cụ như Báo cáo Oracle hơn làDBMS_OUTPUT
và 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; /
Bộ đệm bên trong có kích thước tối đa (được chỉ định trong DBMS_OUTPUT.ENABLE
), và mỗi dòng có độ dài tối đa là 255 byte. Do đó, các cuộc gọi đến DBMS_OUTPUT.PUT
, DBMS_OUTPUT.PUT_LINE
và DBMS_OUTPUT.NEW_LINE
có thể nâng cao
ORA-20000: ORU-10027: buffer overflow, limit of <buf_limit> bytes.
Hoặc
ORA-20000: ORU-10028 line lenth overflow, limit of 255 bytes per line.
Thông báo phụ thuộc vào giới hạn nào bị vượt quá.
Xem thêm:
- Cách bật DBMS_OUTPUT trong Toad cho Oracle?
- Ghi đầu ra DBMS_OUTPUT.Put_Line vào bảng trong Oracle với DBMS_OUTPUT.Get_Lines
-
Hàm TAN () trong Oracle
-
Làm thế nào để gỡ lỗi ORA-01775:lặp lại chuỗi từ đồng nghĩa?
-
Ngày mới cho các kỳ thi cấp chứng chỉ miễn phí trên Oracle Cloud và Cơ sở dữ liệu tự trị
-
Nhóm các bản ghi từng giờ hoặc từng ngày và lấp đầy khoảng trống bằng 0 hoặc rỗng
-
Cách tốt nhất để chạy các truy vấn Oracle định kỳ