create or replace procedure test_2(
       in_id            IN NUMBER,
       in_first_name    IN VARCHAR2,
       in_last_name     IN VARCHAR2,
       in_major         IN VARCHAR2,
       Ret              OUT VARCHAR2,
       RetMo            OUT VARCHAR2
) is
var_major varchar(20);
begin
      select major into var_major from student_info where student_id = in_id;
      IF (var_major IS NULL) THEN
         RetMo := '查询没什么结果哦';
      ELSE
         RetMo := '查询结果是';
      END IF;
      EXCEPTION
      WHEN NO_DATA_FOUND THEN
           RetMo := '查询无结果';
      WHEN OTHERS THEN 
           RetMo := '查询失败';
end test_2;??????????????
为什么在查询时,如果表中没有记录,不进入我流程控制,而是直接抛出了异常啊
谁是要高手 ,快回答我啊,谢谢啊,救命的!!!

解决方案 »

  1.   

    没有记录时直接到
    EXCEPTION
    WHEN NO_DATA_FOUND THEN
            RetMo := '查询无结果';
    你可以把RetMo := '查询没什么结果哦';
    放在WHEN NO_DATA_FOUND THEN里
      

  2.   

    NO_DATA_FOUND是异常,当程序执行过程中出现该异常时就直接跳转到异常处理模块了,不会按照你定义的代码中去执行的。
      

  3.   

    难道就不可以在
    IF (var_major IS NULL) THEN
             RetMo := '查询没什么结果哦';
    里面做处理吗???
      

  4.   

    可以这样处理:
    select count(*) into tmp_num from student_info where student_id = in_id;
    if tmp_num = 0 then
       RetMo := '查询没什么结果哦';               
    else
       RetMo := '查询结果是';
    end if;
      

  5.   

    不用的,你在程序中
    EXCEPTION WHEN NO_DATA_FOUND THEN
        RetMo := '查询没什么结果哦';
    end;
    然后继续
    把你后面的
    WHEN NO_DATA_FOUND THEN
               RetMo := '查询无结果';
    去掉,这样试试。
    要是不行,那就先select count(*) into vcount from tablename,然后判断vcount>0来做
      

  6.   

    改一下:
    select count(*) into tmp_num from student_info where student_id = in_id;
    if tmp_num = 0 then
       RetMo := '查询没什么结果哦';
       return;
    else
       RetMo := '查询结果是';
    end if;
      

  7.   

    不用的,你在程序中
    EXCEPTION WHEN NO_DATA_FOUND THEN
        RetMo := '查询没什么结果哦';
    end;
    然后继续
    把你后面的
    WHEN NO_DATA_FOUND THEN
               RetMo := '查询无结果';
    去掉,这样试试。
    要是不行,那就先select count(*) into vcount from tablename,然后判断vcount>0来做
      

  8.   

    select max(major) into var_major from student_info where student_id = in_id;
      

  9.   

    在oracle中,NULL即不等于null,也不是不等于null,与其他数据库不同
      

  10.   

    create or replace procedure test_2(
           in_id            IN NUMBER,
           in_first_name    IN VARCHAR2,
           in_last_name     IN VARCHAR2,
           in_major         IN VARCHAR2,
           Ret              OUT VARCHAR2,
           RetMo            OUT VARCHAR2
    ) is
    var_major varchar(20);
    begin  
      begin  
       select major into var_major from student_info where student_id = in_id;
       EXCEPTION
        WHEN NO_DATA_FOUND THEN
          RetMo := '查询没什么结果哦';
          return;
       end
       RetMo := '查询结果是';
    end;
    试一下看这样应该可以的
      

  11.   

    create or replace procedure test_2(
           in_id            IN NUMBER,
           in_first_name    IN VARCHAR2,
           in_last_name     IN VARCHAR2,
           in_major         IN VARCHAR2,
           Ret              OUT VARCHAR2,
           RetMo            OUT VARCHAR2
    ) is
    var_major varchar(20);
    begin
          begin
              select major into var_major from student_info where student_id = in_id;
          exception
          WHEN NO_DATA_FOUND THEN
              var_major :=null;
          end
          IF (var_major IS NULL) THEN
             RetMo := '查询没什么结果哦';
          ELSE
             RetMo := '查询结果是';
          END IF;
          EXCEPTION
          WHEN OTHERS THEN 
               RetMo := '查询失败';
    end test_2;
      

  12.   

    如果查询无结果,直接跳到异常处理。
    所以此判断
      IF (var_major IS NULL) THEN
    根本不会走到,判断也不会发挥作用。
    直接合并进NO_DATA_FOUND就行了。