DBMS_OUTPUT.PUT_LINE không in


93

Khi thực thi đoạn mã sau, nó chỉ cho biết thủ tục đã hoàn tất và không in thông tin tôi muốn (FirstName, lastName) và sau đó là các giá trị khác từ truy vấn chọn trong bảng bên dưới.

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
AS
CURSOR quote_recs IS
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
rolequote rq, actor a, movie m
where
rq.quoteID = q.quoteID
AND
rq.roleID = r.roleID
 AND
r.actorID = a.actorID
AND
r.movieID = m.movieID
AND
 a.actorID = id_actor;
BEGIN
FOR row IN quote_recs LOOP
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');

end loop;
END PRINT_ACTOR_QUOTES;
/ 

Khi bật đầu ra máy chủ, tôi nhận được

a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName

nhiều lần!

Câu trả lời:


191

"Nó" là gì trong câu "nó chỉ cho biết thủ tục đã hoàn thành"?

Theo mặc định, hầu hết các công cụ không cấu hình bộ đệm dbms_outputđể ghi vào và không cố gắng đọc từ bộ đệm đó sau khi mã thực thi. Mặt khác, hầu hết các công cụ đều có khả năng làm như vậy. Trong SQL * Plus, bạn cần sử dụng lệnh set serveroutput on [size N|unlimited]. Vì vậy, bạn sẽ làm một cái gì đó giống như

SQL> set serveroutput on size 30000;
SQL> exec print_actor_quotes( <<some value>> );

Trong SQL Developer, bạn sẽ đi đến View | DBMS Output phải bật cửa sổ Đầu ra DBMS, sau đó nhấn biểu tượng dấu cộng màu xanh lục để bật Đầu ra DBMS cho một phiên cụ thể.

Ngoài ra, giả sử rằng bạn không muốn in chữ "a.firstNamea.lastName" cho mỗi hàng, bạn có thể muốn

FOR row IN quote_recs
LOOP
  DBMS_OUTPUT.PUT_LINE( row.firstName || ' ' || row.lastName );
END LOOP;

Xin lỗi, khi thực hiện thủ tục trên thông báo là thủ tục PL / SQL đã hoàn tất thành công. Tôi đang sử dụng SQL plus
dexter

8
@dexter - Được. Sau đó, bạn chỉ cần thêm set serveroutput onlệnh trước khi thực hiện thủ tục trong SQL * Plus.
Justin Cave

@dexter - Đúng. Xem bình luận của tôi ở cuối-- nếu bạn không muốn chữ đó cho mọi hàng, có thể bạn sẽ muốn cú pháp tôi đã đăng ở cuối câu trả lời của mình.
Justin Cave

Ok vì vậy bây giờ nó hiển thị các tên chính xác nhưng giống như 100 lần. làm cách nào để hiển thị tiêu đề, năm, tên vai trò, trích dẫn trong bảng bên dưới thay vì 100 tên xuất hiện
dexter

1
@dexter - Tôi xin lỗi, tôi không hiểu. Bạn nói rằng bạn đã nhập SELECTcâu lệnh tại dấu nhắc lệnh SQL Plus, câu lệnh SQL được thực thi, dữ liệu được trả về, nhưng dữ liệu không được hiển thị trong SQL Plus? Điều đó có vẻ khó xảy ra trừ khi bạn đang chơi với autotracecác cài đặt, trong trường hợp đó bạn có thể đã thấy kế hoạch truy vấn và thống kê thực thi hơn là kết quả truy vấn. Tuy nhiên, chúng tôi đang bắt đầu đi khá xa so với câu hỏi ban đầu của bạn.
Justin Cave

21
  1. Đảm bảo rằng bạn đã mở cửa sổ Đầu ra Dbms thông qua tùy chọn xem trong thanh menu.
  2. Nhấp vào dấu '+' màu xanh lá cây và thêm tên cơ sở dữ liệu của bạn.
  3. Viết 'DBMS_OUTPUT.ENABLE;' trong thủ tục của bạn như dòng đầu tiên. Hy vọng điều này sẽ giải quyết vấn đề của bạn.

Những hướng dẫn này dành cho ứng dụng nào?
osullic

14

tuyên bố này

DBMS_OUTPUT.PUT_LINE ('a.firstName' || 'a.lastName');

nghĩa là in ra chuỗi như nó vốn có .. bỏ dấu ngoặc kép để in ra các giá trị.Vì vậy, cú pháp đúng là

DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);

13

Đặt Truy vấn như bên dưới ở dòng đầu tiên

SET SERVEROUTPUT ON 

thậm chí không làm việc .. Vui lòng cung cấp bất kỳ thay thế khác của nó
Lova Chittumuri

Chỉ để thêm rõ ràng. Dòng mà Sreenath S đã đề xuất đi đầu tiên và nằm ngoài tất cả các khối mã như DECLARE và BEGIN / END. Tôi đã thử tạo nó trước trong khối DECLARE không hoạt động. Tôi đang sử dụng SQL * Plus.
Grant Johnson

2

Tôi đang sử dụng Oracle SQL Developer,

Trong công cụ này, tôi phải bật đầu ra DBMS để xem kết quả được in bởi dbms_output.put_line

Bạn có thể tìm thấy tùy chọn này trong ngăn kết quả nơi các kết quả truy vấn khác được hiển thị. vì vậy, trong ngăn kết quả, tôi có 7 tab. Tab đầu tiên có tên là Kết quả, tab tiếp theo là Đầu ra tập lệnh, v.v. Ngoài ra, bạn có thể tìm thấy một tab có tên là "Đầu ra DBMS", chọn tab này, sau đó biểu tượng đầu tiên (trông giống như biểu tượng hộp thoại) là Bật Đầu ra DBMS . Nhấp vào biểu tượng này. Sau đó, bạn thực thi PL / SQL, sau đó chọn "tab Đầu ra DBMS, bạn sẽ có thể xem kết quả ở đó.


0

Tất cả chúng đều tập trung vào vòng lặp for nhưng nếu chúng ta sử dụng một vòng lặp bình thường thì chúng ta phải sử dụng biến bản ghi con trỏ. Sau đây là mã sửa đổi

 CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
    AS
    CURSOR quote_recs IS
    SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,   
    rolequote rq, actor a, movie m
    where
    rq.quoteID = q.quoteID
    AND
    rq.roleID = r.roleID
     AND
    r.actorID = a.actorID
    AND
    r.movieID = m.movieID
    AND
     a.actorID = id_actor;
    recd quote_recs%rowtype;
    BEGIN
    open quote_recs;
    LOOP
    fetch quote_recs into recs;
    exit when quote_recs%notfound;
    DBMS_OUTPUT.PUT_LINE(recd.firstName||recd.lastName);
    end loop;
    close quote_recs;
    END PRINT_ACTOR_QUOTES;
    / 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.