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 ...from...where id=vetID

现在我已经按预期显示了两行 vetID,但我不知道如何使用它。我不知道我是否说清楚了,因为英语不是我的第一语言。所以我将使用一个简单的例子来展示我想要做什么。

班级编号:0001 英语

     Student A    19
     Student B    21

班级编号:0004 数学

     Student A    19
     Student B    21

就像我得到了 CLASS ID 的行,然后对于每个 CLASS ID,我想用它作为选择名称,年龄来自 Student where....... 和 ID = CLASSID; 问题是我不知道 CLASS ID 是什么..

谢谢你。任何帮助,将不胜感激。

4

1 回答 1

0

据我了解,您想在循环内的其他查询中使用从第一个游标中获取的值。

在这种情况下,如果每个 vetId 的结果不超过一行,则在行后使用简单查询dbms_output

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

如果您期望更多行 - 使用带有参数的游标并循环遍历它(但循环内循环确实是个坏主意- 更好地从第一个和第二个查询的连接/左连接表中选择)。


编辑:参数化光标的情况:

  • 将 vetID 作为参数添加到 visitCursor
  • 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 回答