问题:创建Doctor表(Docname、Qualification、Specialization、Working_shift)。使用参数化光标检查特定专业医生的可用性以及为患者提供服务的一天工作班次
我只是在学习数据库,所以如果这个问题看起来微不足道,我很抱歉。
在输入值时获得所需的输出,但我需要一种替代方法来解决问题,而不使用标志变量(这样我就可以获得异常)。。。如果我不使用标志,它会打印异常以及文档名和资格
我正在使用oracle(普通pl/sql块中的游标)来执行这个查询。
解决方案:
--table creation
create table doctor
(
docname varchar2(20),
qualification varchar2(20),
specialization varchar2(20),
shift varchar2(20)
)
我的解决方案
declare
cursor c1 (specialization varchar2,shift varchar2) is select docname,qualification from doctor
where specialization='&sp' and shift='&shift'
sp doctor.specialization%type;
shift doctor.shift%type;
flag number(10);
begin
flag:=0;
for r1 in c1(sp,shift)
loop
if c1%found then
flag:=1;
dbms_output.put_line('Doctor is available');
dbms_output.put_line('Docname: '||r1.docname);
dbms_output.put_line('qualification: '||r1.qualification);
else
flag:=0;
end if;
end loop;
if flag=0 then
dbms_output.put_line('Invalid specialization/shift');
end if;
end;
尝试给定以下代码
declare
cursor c1 (specialization varchar2,shift varchar2)
is
select docname,qualification
from doctor
where specialization='&sp'
and shift='&shift'
sp doctor.specialization%type;
shift doctor.shift%type;
flag number(10);
begin
flag:=0;
for r1 in c1(sp,shift)
loop
if c1%found then
flag:=1;
dbms_output.put_line('Doctor is available');
dbms_output.put_line('Docname: '||r1.docname);
dbms_output.put_line('qualification: '||r1.qualification);
else
raise;
end if;
end loop;
exception
when others then
dbms_output.put_line('Invalid specialization/shift');
end;
-
您不需要在循环中重置标志,您已经在过程开始时将其初始化为
0
。 -
你不需要检查
c1%found
,因为你在循环中根据定义找到了一条记录,否则它不会进入循环代码。 -
您的光标应该使用提供的变量,而不是SQL*Plus替换变量,例如:
cursor c1 (specialization varchar2,shift varchar2) is select docname,qualification from doctor where doctor.specialization=c1.specialization and doctor.shift=c1.shift;
如果你不想使用所有这些别名,你可以使用命名约定来区分不同的标识符(shift和shift),例如:
cursor c1 (i_specialization varchar2, i_shift varchar2) is select docname,qualification from doctor where specialization=i_specialization and shift=i_shift;
另外请注意,您在查询末尾遗漏了一个分号。
最后:
如果你按如下方式更改循环,它应该可以正常工作:
for r1 in c1(&sp,&shift)
loop
flag:=1;
dbms_output.put_line('Doctor is available');
dbms_output.put_line('Docname: '||r1.docname);
dbms_output.put_line('qualification: '||r1.qualification);
end loop;
现在,你的最后一点代码:
if flag=0 then
dbms_output.put_line('Invalid specialization/shift');
end if;
将正常工作-只有当标志仍然是0
(即查询未找到行)时才会执行。
如果你不在"c1"光标中使用参数,你就不需要它…
DECLARE
CURSOR c1 IS
SELECT docname, qualification
FROM doctor
WHERE specialization = '&sp'
AND shift = '&shift';
TYPE c1_ntt IS TABLE OF c1%ROWTYPE;
l_c1 c1_ntt;
BEGIN
OPEN c1;
FETCH c1 BULK COLLECT INTO l_c1;
CLOSE c1;
IF l_c1.COUNT = 0 THEN
RAISE_APPLICATION_ERROR(-20000, 'Invalid specialization/shift');
END IF;
FOR indx IN l_c1.FIRST..l_c1.LAST LOOP
DBMS_OUTPUT.PUT_LINE('Doctor is available');
DBMS_OUTPUT.PUT_LINE('Docname: ' || l_c1(indx).docname);
DBMS_OUTPUT.PUT_LINE('qualification: ' || l_c1(indx).qualification);
END LOOP;
END;