需要一个替代oracle查询的解决方案吗?不使用(flag)变量



问题:创建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;
  1. 您不需要在循环中重置标志,您已经在过程开始时将其初始化为0

  2. 你不需要检查c1%found,因为你在循环中根据定义找到了一条记录,否则它不会进入循环代码。

  3. 您的光标应该使用提供的变量,而不是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;

最新更新