2012-05-03 16 views
51

Khi thực thi mã sau, nó chỉ nói quy trình được hoàn thành và không in thông tin tôi muốn 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 .DBMS_OUTPUT.PUT_LINE không in

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 cài đặt đầu ra máy chủ trên, tôi nhận được

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

nhiều lần!

Trả lời

115

"Điều gì" trong tuyên bố "nó chỉ nói quy trình đượ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 cho dbms_output để ghi vào và không cố gắng đọc từ bộ đệm đó sau khi thực thi mã. Hầu hết các công cụ, mặt khác, 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 muốn làm điều gì đó như

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

Trong SQL Developer, bạn muốn đi đến View | DBMS Output để cho phép cửa sổ Output DBMS, sau đó đẩy biểu tượng dấu cộng màu xanh lá cây để cho phép DBMS Output cho một phiên đặc biệt.

Thêm vào đó, giả định rằng bạn không muốn in "a.firstNamea.lastName" đen cho mỗi hàng, có thể bạn muốn

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

Xin lỗi, khi thực hiện quy trình 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 cộng – dexter

+6

@dexter - OK. Sau đó, bạn chỉ cần thêm lệnh 'set serveroutput on' trước khi thực hiện thủ tục trong SQL * Plus. –

+0

vui lòng xem chỉnh sửa của tôi – dexter

12

tuyên bố này

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

nghĩa để in các chuỗi vì nó là .. loại bỏ các dấu ngoặc kép để có được những giá trị được printed.So cú pháp chính xác được

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

Tất cả trong số họ đang tập trung vào các 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; 
    /
10
  1. Đảm bảo rằng bạn có cửa sổ Output DBMS của bạn mở thông qua các tùy chọn xem trong thanh menu.
  2. Nhấp vào ký hiệu '+' màu xanh lục 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 là dòng đầu tiên. Hy vọng điều này sẽ giải quyết được vấn đề của bạn.
+0

Tôi không phải làm bước 3. Ngoài ra cảm ơn @Atul và @Usman! –