Helpex - Trao đổi & giúp đỡ Đăng nhập

Tìm hiểu về Gói DBMS_OUTPUT trong Oracle

Trong bài viết này, chúng ta sẽ xem xét DBMS_OUTPUTgói phần mềm này một cách chi tiết. DBMS_OUTPUTgói trong Oracle, giống như các gói DBMS khác, do người dùng Oracle sở hữu SYS.

Tập lệnh tạo sẽ DBMS_OUTPUTcấ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_OUTPUTmà không cần phải thêm tiền tố vào tên gói SYS.

DBMS_OUTPUT hoạt động như thế nào trong Oracle?

Hai hoạt động cơ bản GETPUTđược thực hiện thông qua các thủ tục trong gói. Một PUTphép toán lấy đối số của nó và đặt nó vào một bộ đệm bên trong để lưu trữ.

Một GETthao tác đọ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 ENABLEthủ tục đặt kích thước của bộ đệm.

Các thủ tục trong Gói DBMS_OUTPUT

Các PUTthói quen trong gói là PUT, PUT_LINE, và NEW_LINE. Các GETthói quen là GET_LINEGET_LINES. BẬT và TẮT kiểm soát bộ đệm.

PUT và PUT_LINE

Cú pháp cho các cuộc 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. Bởi vì trong ba phiên bản khác nhau của PUTPUT_LINE, bộ đệm có thể chứa các giá trị của các loại VARCHAR2, NUMBERDATEđược lưu trữ trong bộ đệm ở định dạng ban đầu của họ. Tuy nhiên, GET_LINEvà chỉ GET_LINESlấy từ bộ đệm và trả về các chuỗi Ký tự.

Khi một GETthao tác đượ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 một định dạng cho chuyển đổi, hãy sử dụng một TO_CHARlệnh gọi rõ ràng 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_LINEthê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. PUTkhông làm. PUT_LINEtương đương với gọi PUTvà 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 bộ đệ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ự. DATEVí dụ, dòng đệm có thể bao gồm các giá trị. Chúng 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à numlinescho biết có bao nhiêu dòng được yêu cầu. Khi nhập vào GET_LINES, numlineschỉ định số dòng được yêu cầu. Trên Đầu ra, số dòng sẽ chứa số dòng thực tế được trả về, số dòng này sẽ nhỏ hơn hoặc bằng số dòng được yêu cầu. GET_LINES được thiết kế để thay thế nhiều cuộc gọi đến GET_LINES.

Các CHARARRloại cũng được định nghĩa trong DBMS_OUTPUTgói. Do đó, nếu bạn muốn gọi GET_LINESmột cách rõ ràng trong mã của mình, 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ố đến PUThoặc PUT_LINEsẽ được đặt trong vùng đệ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. Nếu DISABLEđược gọi, nội dung của bộ đệm sẽ bị xóa và các lệnh gọi tiếp theo đến PUTPUT_LINEkhông ảnh hưởng.

Sử dụng DBMS_OUTPUT

Bản DBMS_OUTPUTthân gói này không chứa bất kỳ cơ chế nào để 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 thế nào chúng ta có thể sử dụng DBMS_OUTPUTcho việc in ấn? SQL * Plus, SQL * DBA và Trình quản lý 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_OUTPUTdữ liệu.

Với tùy chọn này, SQL * Plus sẽ tự động gọi DBMS_OUTPUT.GET_LINESkhi 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 ONgọi ngầm, lệnh này thiết lập bộ đệm bên trong. Theo tùy chọn, bạn có thể chỉ định kích thước với SET SERVEROUTPUT ON SIZE buffer_size  trong đó beffer_size  sẽ được sử dụng làm kích thước ban đầu của bộ đệm (đối số là DBMS_OUTPUT.ENABLE).

Với SERVEROUTPUT on, SQL * Plus sẽ gọi DBMS_OUTPUT.GET_LINES sau khi  khối PL / SQL đã hoàn thành. Điều này có nghĩa là đầu ra sẽ được phản hồi đến màn hình khi khối kết thúc và không phải  trong quá trình thực thi khối. Điều này thường không phải là một 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ư Oracle Reports hơn là DBMS_OUTPUTSQL * 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. Kết quả là, các cuộc gọi đến DBMS_OUTPUT.PUT, DBMS_OUTPUT.PUT_LINEDBMS_OUTPUT.NEW_LINEcó thể tăng hoặc

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


Hoặc là

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á.

21 hữu ích 0 bình luận 26k xem chia sẻ

Có thể bạn quan tâm

loading