今天上课的时候看到了一个这样的问题:、
    利用游标显示工资最搞的前三名雇员的名称和工资。我们这一节讲的是游标这个概念,在书中的实例的解答方法如下:
set serveroutput on
declare
v_ename varchar2(10);
v_sal number(5);
cursor emp_cursor is select ename, job from emp order by sal desc;
begin
open emp_cursor;
for I in 1..3 loop
FETCH emp_cursor into v_ename,v_sal;
dbms_output.put_line(v_ename||','||v_sal);
end loop;
close emp_cursor;
end;
我自己联系了好几遍,可是老是出现:
第一行出现错误:
ORA-00922  选项缺失活无效,这是怎么回事?请大侠帮忙解决!谢谢!

解决方案 »

  1.   

    set serveroutput on 
    declare 
    v_ename varchar2(10); 
    v_sal number(5); 
    cursor emp_cursor is select ename, sal from emp order by sal desc; 
    begin 
    open emp_cursor; 
    for I in 1..3 loop 
    FETCH emp_cursor into v_ename,v_sal; 
    dbms_output.put_line(v_ename||','||v_sal); 
    end loop; 
    close emp_cursor; 
    end; 
      

  2.   

    1. scott 用户下 emp 表中, job 字段为varchar2(9)不是number(5);
    2. set serveroutput on 这个指令要在 SQLPLUS 中执行,如果你是使用 PL/SQL 工具,新建了一个 SQL Windows 这要把这个命令去掉, 或者新建一个 Commond Windows 执行.
      

  3.   

    SQL> select * from emp;ENAME                       SAL
    -------------------- ----------
    zhongguo                     20SQL> set serveroutput on;
    SQL> declare
      2  v_ename varchar2(10);
      3  v_sal number(5);
      4  cursor emp_cursor is select ename, sal from emp order by sal desc;
      5  begin
      6  open emp_cursor;
      7  for I in 1..3 loop
      8  FETCH emp_cursor into v_ename,v_sal;
      9  dbms_output.put_line(v_ename||','||v_sal);
     10  end loop;
     11  close emp_cursor;
     12  end;
     13  /
    zhongguo,20
    zhongguo,20
    zhongguo,20PL/SQL 过程已成功完成。SQL>
      

  4.   

    set serveroutput on 
    declare 
    v_ename varchar2(10); 
    v_sal number(5); 
    cursor emp_cursor is select ename, job from emp order by sal desc; 
    begin 
    open emp_cursor; 
    for I in 1..3 loop 
    FETCH emp_cursor into v_ename,v_sal; 
    dbms_output.put_line(v_ename||','||v_sal); 
    end loop; 
    close emp_cursor; 
    end; 
    文中带红色的两个字体表示的对象的数据类型不一样吧!
      

  5.   

    SQL> set serveroutput on
    SQL> declare
      2  v_ename varchar2(10);
      3  v_sal number(5);
      4  cursor emp_cursor is select ename, job from emp order by sal desc;
      5  begin
      6  open emp_cursor;
      7  for I in 1..3 loop
      8  FETCH emp_cursor into v_ename,v_sal;
      9  dbms_output.put_line(v_ename||','||v_sal);
     10  end loop;
     11  close emp_cursor;
     12  end;
     13  /
    declare
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at line 8--正确写法如下
    SQL> set serveroutput on
    SQL> declare
      2  v_ename varchar2(10);
      3  v_sal number(5);
      4  cursor emp_cursor is select ename, sal from emp order by sal desc;
      5  begin
      6  open emp_cursor;
      7  for I in 1..3 loop
      8  FETCH emp_cursor into v_ename,v_sal;
      9  dbms_output.put_line(v_ename||','||v_sal);
     10  end loop;
     11  close emp_cursor;
     12  end;
     13  /
    KING,5000
    FORD,3000
    SCOTT,3000PL/SQL procedure successfully completed.
      

  6.   

    不过我报的错好像和你不太一样
    你的错误信息我上网差下了 内容如下
    ORA-00922: missing or invalid option 
    Cause: An invalid option was specified in defining a column or storage clause. The valid option in specifying a column is NOT NULL to specify that the column cannot contain any NULL values. Only constraints may follow the datatype. Specifying a maximum length on a DATE or LONG datatype also causes this error. 
    Action: Correct the syntax. Remove the erroneous option or length specification from the column or storage specification.  
      

  7.   

    SQL> set serveroutput on
    SQL>
    SQL> /
    KING,5000
    FORD,3000
    SCOTT,3000
      

  8.   

    我将上面的 set serveroutput on 去掉后之后就显示 过程已经成功完成。之后在输入set serveroutput
    on 此时就把详细的数据显示出来了,我不知道它的原理是什么那位大侠可以解答下我的疑问?
      

  9.   

    set serveroutput on
    打开sqlplus的 DBMS_OUTPUT.PUT_LINE的输出。
    你那里去掉就可以,是因为你没把这句最后加分号,它跟declare连起来了
    你加个分号。命令行下,这句随便什么时候都可以用来打开的。
      

  10.   

    SQL> set serveroutput on
    SQL> declare
      2  v_ename varchar2(10);
      3  v_sal number(5);
      4  cursor emp_cursor is select ename, sal from emp order by sal desc;
      5  begin
      6  open emp_cursor;
      7  for I in 1..3 loop
      8  FETCH emp_cursor into v_ename,v_sal;
      9  dbms_output.put_line(v_ename||','||v_sal);
     10  end loop;
     11  close emp_cursor;
     12  end;