次のコードを実行すると、プロシージャが完了し、必要な情報(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
複数回!
「手順が完了したというだけ」という文の「それ」とは何ですか?
デフォルトでは、ほとんどのツールは、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;
この文
DBMS_OUTPUT.PUT_LINE( 'a.firstName' || 'a.lastName');
文字列をそのまま印刷することを意味します。引用符を削除して、値を印刷します。したがって、正しい構文は
DBMS_OUTPUT.PUT_LINE(a.firstName || a.lastName);
最初の行でクエリを以下のように設定します
SET SERVEROUTPUT ON
Oracle SQL Developerを使用していますが、
このツールでは、dbms_output.put_lineによって出力された結果を表示するためにDBMS出力を有効化する必要がありました
このオプションは、他のクエリ結果が表示される結果ペインにあります。そのため、結果ウィンドウには7つのタブがあります。結果という名前の最初のタブ、次のタブはスクリプト出力などです。この中から「DBMS Output」という名前のタブを選択してこのタブを選択すると、最初のアイコン(ダイアログアイコンのように見える)はDBMS出力を有効にするです。このアイコンをクリックしてください。次に、PL/SQLを実行し、「DBMS出力」タブを選択すると、そこに結果が表示されるはずです。
それらはすべて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;
/