问题: 创建一个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;
答案 0 :(得分:0)
尝试下面的代码
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;
答案 1 :(得分:0)
您不需要在循环中重置标志,您已在程序开始时将其初始化为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 vs 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
时才会执行(即查询未找到任何行)。
答案 2 :(得分: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;