set serveroutput on
declare 
   type refcursor is ref cursor;
   cursor dept_cursor(no number) is
     select a.dname,cursor(select ename,sal from emp 
       where deptno=a.deptno)
     from dept a where a.deptno=no;
   empcur refcursor;
   v_dname dept.dname%type;
   v_ename emp.ename%type;
   v_sal emp.sal%type;
   no number:=&no;
begin
   open dept_cursor(no);
   loop
     fetch dept_cursor into v_dname,empcur;
     exit when dept_cursor%notfound;
     dbms_output.put_line('部门名:'||v_dname);
     loop
       fetch empcur into v_ename ,v_sal;
       exit when empcur%notfound;
       dbms_output.put_line('雇员名:'||v_ename||',工资:'||v_sal);
     end loop;
    end loop;
    close dept_cursor;
    
end;
/
    问题:为什么不等我输入就直接往下执行了,错误如下
输入 no 的值:      
原值   11:    no number:=&no;
新值   11:    no number:=    ;
   no number:=    ;
                  *
第 11 行出现错误:
ORA-06550: 第 11 行, 第 19 列:
PLS-00103: 出现符号 ";"在需要下列之一时:

解决方案 »

  1.   

    no number 应该是no_number吧,标识符不能有空格的
      

  2.   

    SQL> set serveroutput on
    SQL> DECLARE
      2    TYPE refcursor IS REF CURSOR;
      3    CURSOR dept_cursor(no NUMBER) IS
      4      SELECT a.dname, CURSOR (SELECT ename, sal FROM emp WHERE deptno = a.deptno)
      5        FROM dept a
      6       WHERE a.deptno = no;
      7    empcur    refcursor;
      8    v_dname   dept.dname%TYPE;
      9    v_ename   emp.ename%TYPE;
     10    v_sal     emp.sal%TYPE;
     11    no number := &no;
     12  BEGIN
     13    OPEN dept_cursor(no);
     14    LOOP
     15      FETCH dept_cursor
     16        INTO v_dname, empcur;
     17      EXIT WHEN dept_cursor%NOTFOUND;
     18      dbms_output.put_line('部门名:' || v_dname);
     19      LOOP
     20        FETCH empcur
     21          INTO v_ename, v_sal;
     22        EXIT WHEN empcur%NOTFOUND;
     23        dbms_output.put_line('雇员名:' || v_ename || ',工资:' || v_sal);
     24      END LOOP;
     25    END LOOP;
     26    CLOSE dept_cursor;
     27  END;
     28  /
    输入 no 的值:  30
    原值   11:   no number := &no;
    新值   11:   no number := 30;
    部门名:SALES
    雇员名:ALLEN,工资:1600
    雇员名:WARD,工资:1250
    雇员名:MARTIN,工资:1250
    雇员名:BLAKE,工资:2850
    雇员名:TURNER,工资:1500
    雇员名:JAMES,工资:950PL/SQL 过程已成功完成。SQL> 
      

  3.   

    &no就是代入字符,如果沒有輸入,那麽解析器就認爲是
    no number:=    ;
    這個解析器當然報錯了。