DBMS_OUTPUT.PUT_LINEが印刷されない


93

次のコードを実行すると、手順が完了し、必要な情報(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

複数回!

回答:


191

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

デフォルトでは、ほとんどのツールは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;

上記のプロシージャを実行すると、PL / SQLプロシージャが正常に完了したというメッセージが表示されます。私はSQL plusを使用しています
dexter

8
@dexter-OK。次にset serveroutput on、SQL * Plusでプロシージャを実行する前に、コマンドを追加する必要があります。
ジャスティンケイブ

@dexter-そうです。最後に私のコメントを参照してください。すべての行にそのリテラルが必要ない場合は、おそらく私の回答の最後に投稿した構文が必要になります。
ジャスティンケイブ

わかりましたので、正しい名前を表示しますが、100回のように表示されます。表示される名前の100の代わりに、タイトル、年、ロール名、引用を次の表にどのように表示しますか
dexter

1
@dexter-すみません、わかりません。あなたが入力したことを言っているSELECTSQLで文のプロンプトPlusのコマンドを実行されたSQL文は、データが返されましたが、データはSQLには表示されませんでしたプラス?autotraceクエリ結果ではなくクエリプランと実行統計が表示されている可能性がある設定で遊んでいない限り、それはありそうにありません。ただし、元の質問とはかけ離れています。
ジャスティンケイブ

21
  1. メニューバーの表示オプションから[Dbms出力]ウィンドウを開いていることを確認してください。
  2. 緑色の「+」記号をクリックして、データベース名を追加します。
  3. 「DBMS_OUTPUT.ENABLE;」と書き込みます。手順の最初の行として。これで問題が解決することを願っています。

これらの指示はどのアプリケーションを対象としていますか?
osullic

14

この文

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

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

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

13

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

SET SERVEROUTPUT ON 

それでも機能しない..他の代替手段を提供してください
Lova Chittumuri '10

ただ明確にするために。Sreenath Sが最初に提案した行は、DECLAREやBEGIN / ENDなどのすべてのコードブロックの外側にあります。機能しないDECLAREブロックで最初に作成してみました。SQL * Plusを使用しています。
グラントジョンソン

2

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

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

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


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;
    / 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.