plsql sqlplus - DBMS_OUTPUT.PUT_LINE無法打印




no show (5)

所有這些都集中在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;
    / 

執行以下代碼時,它只是說過程已完成,並且不會打印我想要的信息(firstName,lastName),然後打印下表中select查詢的其他值。

 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

多次!


這個說法

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

意味著按原樣打印字符串.. 刪除引號以獲取要打印的值。所以正確的語法是

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

什麼是“它”在聲明“它只是說程序完成”?

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

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

在SQL Developer中,您將轉到View | DBMS Output View | DBMS Output以啟用DBMS輸出窗口,然後按綠色加號圖標以啟用特定會話的DBMS輸出。

另外,假設您不想為每一行打印文字“a.firstNamea.lastName”,您可能想要

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

  1. 確保通過菜單欄中的視圖選項打開“Dbms輸出”窗口。
  2. 單擊綠色的“+”符號並添加您的數據庫名稱。
  3. 寫'DBMS_OUTPUT.ENABLE;' 在你的程序中作為第一行。 希望這能解決你的問題。

CREATE OR REPLACE FUNCTION is_number(N IN VARCHAR2) RETURN NUMBER IS
  BEGIN
    RETURN CASE regexp_like(N,'^[\+\-]?[0-9]*\.?[0-9]+$') WHEN TRUE THEN 1 ELSE 0 END;
END is_number;

請注意,它不會將45e4視為數字,但您可以隨時更改正則表達式來完成相反的操作。