web-dev-qa-db-ja.com

DBMS_OUTPUT.PUT_LINEが印刷されない

次のコードを実行すると、プロシージャが完了し、必要な情報(firstName、lastName)を出力せず、下の表の選択クエリからの他の値を出力しません。

 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

複数回!

74
dexter

「手順が完了したというだけ」という文の「それ」とは何ですか?

デフォルトでは、ほとんどのツールは、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;
156
Justin Cave
  1. メニューバーの表示オプションを使用して、Dbms出力ウィンドウが開いていることを確認してください。
  2. 緑色の「+」記号をクリックして、データベース名を追加します。
  3. 「DBMS_OUTPUT.ENABLE;」と書き込みます手順の最初の行として。これで問題が解決することを願っています。
16
Atul Patel

この文

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

文字列をそのまま印刷することを意味します。引用符を削除して、値を印刷します。したがって、正しい構文は

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

最初の行でクエリを以下のように設定します

SET SERVEROUTPUT ON 
5
Sreenath S

Oracle SQL Developerを使用していますが、

このツールでは、dbms_output.put_lineによって出力された結果を表示するためにDBMS出力を有効化する必要がありました

このオプションは、他のクエリ結果が表示される結果ペインにあります。そのため、結果ウィンドウには7つのタブがあります。結果という名前の最初のタブ、次のタブはスクリプト出力などです。この中から「DBMS Output」という名前のタブを選択してこのタブを選択すると、最初のアイコン(ダイアログアイコンのように見える)はDBMS出力を有効にするです。このアイコンをクリックしてください。次に、PL/SQLを実行し、「DBMS出力」タブを選択すると、そこに結果が表示されるはずです。

1
John Prawyn

それらはすべて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;
    / 
0
Smart003