Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

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_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, GETPUT , đượ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_LINENEW_LINE . GET thó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 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 PUTPUT_LINE , bộ đệm có thể chứa các giá trị kiểu VARCHAR2 , NUMBERDATE được lưu trữ trong bộ đệm ở định dạng ban đầu của chúng. Tuy nhiên, GET_LINEGET_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 PUTPUT_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_LINEDBMS_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
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hàm TAN () trong Oracle

  2. Làm thế nào để gỡ lỗi ORA-01775:lặp lại chuỗi từ đồng nghĩa?

  3. 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ị

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

  5. Cách tốt nhất để chạy các truy vấn Oracle định kỳ