2012-05-03 161 views
51

當執行下面的代碼時,它只是說過程已完成,並不打印我想要的信息(firstName,lastName),然後從下表中的select查詢中選擇其他值。DBMS_OUTPUT.PUT_LINE not printing

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; 
/

當設置服務器的輸出,我得到

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

多次!

回答

115

在聲明「它只是說過程已完成」中的「it」是什麼?

默認情況下,大多數工具不會配置dbms_output的緩衝區來寫入,並且在代碼執行後不嘗試從該緩衝區讀取數據。另一方面,大多數工具都有能力這樣做。在SQL * Plus中,您需要使用命令set serveroutput on [size N|unlimited]。所以,你會做這樣

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

東西在SQL Developer中,你會去View | DBMS Output使DBMS輸出窗口,然後按下綠色加號圖標,使DBMS輸出特定會話。

此外,假設你不希望打印的每一行文字 「a.firstNamea.lastName」,你可能想

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

對不起,執行上述過程時,消息是PL/SQL過程已成功完成。我正在使用SQL plus – dexter

+6

@dexter - 確定。然後,只需在SQL * Plus中執行過程之前添加'set serveroutput on'命令。 –

+0

請看我的編輯 – dexter

12

這種說法

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

意味着打印字符串,因爲它是.. 刪除引號得到的值被printed.So正確的語法

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

所有這些都集中在for循環但如果我們使用正常循環,那麼我們必須使用遊標記錄變量。下面是修改後的代碼

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. 確保你有你的DBMS輸出窗口,通過在菜單欄的視圖選項打開。
  2. 點擊綠色的「+」號並添加數據庫名稱。
  3. 寫'DBMS_OUTPUT.ENABLE;'在你的程序中作爲第一行。 希望這可以解決您的問題。
+0

我不必做第3步。同樣感謝@Atul和@Usman! –