本帖最后由 yzncong 于 2011-09-24 08:01:37 编辑

解决方案 »

  1.   

    set serveroutput on;exec sp_get_student;代码没什么问题,不过 IF cur_student%FOUND 这个判断有点多余,因为上面已经有 exit 的判断,找不到记录就会跳出的
      

  2.   

    代码没错,而且层次也还挺清晰的,也挺规范,但后面要是在定义exception就会更好.
    我拿你代码测试多是可以通过的,或许是你student表没数据噢.仔细检查一下..
    下面是我更改过后的代码你对比一下,基本没什么变动,但我执行是可以有结果的.
    CREATE OR REPLACE PROCEDURE sp_get_ename IS
      CURSOR cur_emp IS
        SELECT ename, empno FROM emp;  c_name emp.ename%TYPE;
      c_eno  emp.empno%TYPE;BEGIN
      OPEN cur_emp;  LOOP
        FETCH cur_emp
          INTO c_name, c_eno;
      
        EXIT WHEN cur_emp%NOTFOUND;
      
         IF cur_emp%FOUND
        THEN DBMS_OUTPUT.put_line(c_name || '-->' || c_eno);
      END IF;
    END LOOP;
    CLOSE cur_emp;
    exception 
          when others then
            dbms_output.put_line(sqlcode||sqlerrm);
    END;begin
       sp_get_ename ;
    end;
      

  3.   

    代码没错,而且层次也还挺清晰的,也挺规范,但后面要是在定义exception就会更好.
    我拿你代码测试多是可以通过的,或许是你student表没数据噢.仔细检查一下..
    下面是我更改过后的代码你对比一下,基本没什么变动,但我执行是可以有结果的.
    CREATE OR REPLACE PROCEDURE sp_get_ename IS
      CURSOR cur_emp IS
        SELECT ename, empno FROM emp;  c_name emp.ename%TYPE;
      c_eno  emp.empno%TYPE;BEGIN
      OPEN cur_emp;  LOOP
        FETCH cur_emp
          INTO c_name, c_eno;
      
        EXIT WHEN cur_emp%NOTFOUND;
      
         IF cur_emp%FOUND
        THEN DBMS_OUTPUT.put_line(c_name || '-->' || c_eno);
      END IF;
    END LOOP;
    CLOSE cur_emp;
    exception 
          when others then
            dbms_output.put_line(sqlcode||sqlerrm);
    END;begin
       sp_get_ename ;
    end;
      

  4.   

    你在什么环境下执行的,这个环境有output界面吗?begin
     sp_get_ename ;
    end;去output界面里找
      

  5.   

    CREATE OR REPLACE PROCEDURE sp_get_student
    AS
       CURSOR cur_student
       IS
          SELECT no, name FROM student;   c_no     student.no%TYPE;
       c_name   student.name%TYPE;
    BEGIN
       OPEN cur_student;   LOOP
          FETCH cur_student
          INTO c_no, c_name;      EXIT WHEN cur_student%NOTFOUND;      IF cur_student%FOUND
          THEN
             DBMS_OUTPUT.PUT_LINE (c_no || '-->' || c_name);
          END IF;
       END LOOP;
    END;
    /自己又敲了一遍,可就是没有数据,直接执行SELECT * FROM student;可以查到数据的,比较郁闷
      

  6.   

    end loop;
    后面拉了句close cur_student;哪里的问题,郁闷了
      

  7.   

    是在Toad for Oracle 10中编码测试的,不晓得,是不是,哪里的服务没开,还是有什么关系
      

  8.   

     LOOP
          FETCH cur_student
          INTO c_name, c_no;      EXIT WHEN cur_student%NOTFOUND;
           
             DBMS_OUTPUT.put_line (cur_student.c_name || '-->' || cur_student.c_no);
       END LOOP;   CLOSE cur_student;
    END;这样修改试一下!!
      

  9.   

    是在PLSQL中?工具中这个输出是在输出的那个窗口,而不是SELECT出来的那个窗口
    如果是DOS窗口下,需要打开开关
    代码也可以简化成如下(游标可以定义,替代FOR后面括号里的内容):
    CREATE OR REPLACE PROCEDURE sp_get_student
    AS
    BEGIN
       for vc in (SELECT no, name FROM student) LOOP
          DBMS_OUTPUT.PUT_LINE (vc.no || '-->' || vc.name);
       END LOOP;
    END;
      

  10.   

    如果你是在pl/sql或dom中执行的话,
    把 set serveroutput on设定一下,就可以看到输出台了