需要替代解决这个oracle查询?不使用(flag)变量

时间:2013-08-21 15:51:45

标签: oracle plsql cursor

问题: 创建一个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;

3 个答案:

答案 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)

  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 vs shift),例如:

    cursor c1 (i_specialization varchar2, i_shift varchar2) is
      select docname,qualification
      from doctor
      where specialization=i_specialization
      and shift=i_shift;
    

    另请注意,您在查询结束时错过了分号。

  4. 最后:

    如果您按如下方式更改循环,它应该可以正常工作:

    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;