0
create or replace 
PROCEDURE PAID_REPORT 
(
  PAYMENT_STATUS IN VARCHAR2  
) AS

linecount number(4);
linecounttwo number(4);
--animal varchar2 (12);
animaltype varchar2(12);
visitid number (6);

cursor vetCursor is 
select pb_vet.vetid,visitid,lastname,firstname
from pb_visit,pb_vet
where pb_visit.vetid = pb_vet.vetid
and pb_visit.status = PAYMENT_STATUS
order by lastname, firstname;
vetRow vetCursor%rowtype;

cursor visitCursor is
select visitid,name,lastname,firstname
from pb_client,pb_animal,pb_visit
where pb_client.cliEntid=pb_animal.clientid
and pb_visit.animalid=pb_animal.animalid
and status = PAYMENT_STATUS;
visitRow visitCursor%rowtype;

BEGIN
linecounttwo:=0;
open visitCursor;
loop
fetch visitCursor
into visitRow;
exit when visitCursor%notfound;
linecounttwo:=linecounttwo+1;

end loop;


  linecount:=0;
  open vetCursor;
  loop
  fetch vetCursor
  into vetRow;

  exit when vetCursor%notfound;
  dbms_output.put_line('Veterinarian ID: '||vetRow.vetid||'   '||vetRow.lastname||','||vetRow.firstname);  

   linecount:=linecount+1;
  end loop;
  close vetCursor;
END PAID_REPORT;

数行の VETID 情報が出力されます。私がやりたいことは、各 vetID の下で、この vetID を別の select 文で使用して、select ...from...where id=vetID のようなものを検索したいということです。

予想どおり 2 行の vetID が表示されましたが、使い方がわかりません。英語は私の母国語ではないので、自分自身を明確にしたかどうかはわかりません。そのため、簡単な例を使用して、やりたいことを示します。

CLASS ID: 0001 英語

     Student A    19
     Student B    21

CLASS ID: 0004 数学

     Student A    19
     Student B    21

CLASS ID の行を取得したようなものです。次に、各 CLASS ID に対して、それを選択名、学生からの年齢として使用したいと考えています。問題は、CLASS IDが何であるかわかりません..

ありがとうございました。任意の助けをいただければ幸いです。

4

1 に答える 1

0

私が理解している限り、ループ内の他のクエリで最初のカーソルからフェッチされた値を使用したいと考えています。

その場合、結果が各 vetId に対して 1 行以下になる場合は、行の直後に単純なクエリを使用しますdbms_output

select <columns> into <variables> from <2nd table> where id=vetRow.vetId;

より多くの行が予想される場合は、パラメーターを指定してカーソルを使用し、それをループします (ただし、ループ内のループは非常に悪い考えです。最初と 2 番目のクエリから結合/左結合されたテーブルから選択することをお勧めします)。


編集: パラメータ化されたカーソルの場合:

  • visitCursor のパラメーターとして vetID を追加しました
  • changet はFORバージョンにループします (慣習が好きな場合はOPEN ... FETCH ... INTO ... CLOSE、自由に変更してください。IMO この変更により、このループ内ループの例で読みやすさが向上しました)
  • 私の例に関係のない残りのコードを削除しました

だからあなたは試すことができます:

create or replace PROCEDURE PAID_REPORT (PAYMENT_STATUS IN VARCHAR2) AS

cursor vetCursor is 
select pb_vet.vetid,visitid,lastname,firstname
from pb_visit,pb_vet
where pb_visit.vetid = pb_vet.vetid
and pb_visit.status = PAYMENT_STATUS
order by lastname, firstname;
vetRow vetCursor%rowtype;

cursor visitCursor (p_vetID pb_visit.vetid%TYPE) is
select visitid,name,lastname,firstname
from pb_client,pb_animal,pb_visit
where pb_client.cliEntid=pb_animal.clientid
and pb_visit.animalid=pb_animal.animalid
and status = PAYMENT_STATUS
and pb_visit.vetid = p_vetID;
visitRow visitCursor%rowtype;

BEGIN

for vetRow in vetCursor loop
  dbms_output.put_line('Veterinarian ID: '||vetRow.vetid||'   '||vetRow.lastname||','||vetRow.firstname);
  -- other vet-related code here
  for visitRow in visitCursor(vetRow.vetid) loop
    dbms_output.put_line('Visit info:'||visitRow.visitid||'   '||visitRow.lastname||','||visitRow.firstname);
    -- other visit-related code here
  end loop;
end loop;

END PAID_REPORT;
于 2013-06-01T21:54:29.380 に答える