我是按照书上的例题做的存储过程,为什么数据查不出来呢?
存储过程:create or replace procedure emp_proc (empno number) 
       as
          empname varchar2(20);
       begin
          select ename into empname from emp where empno = empno;
          dbms_output.put_line('雇员姓名是:' || empname);
       exception
          when no_data_found then
               dbms_output.put_line('雇员编号未找到');
       end emp_proc;
/执行后:
SQL> execute emp_proc(7900);
BEGIN emp_proc(7900); END;*
ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "MICHAEL.EMP_PROC", line 5
ORA-06512: at line 1出现了这个问题,在书上是可以把结果显示出来的,是不是在建存储过程的时候还要授权?......真的是不太明白
请各位高手帮帮我啊!

解决方案 »

  1.   

    select   ename   into   empname   from   emp   where   empno   =   empno;查查这个sql语句是不是会返回多行纪录的,如果返回的纪录大于一行,那么就不能用一个变量来存储了。可以考虑用游标...
      

  2.   

    应该不会返回多行挖,EMP表里只有一条7900这个记录啊~~
    书上的例子都能运行出来的,到了我机器上就不行了,是不是还要在配置一下?>
      

  3.   

    我的表结构就是SCOTT下的EMP表,我建了个同义词到MICHAEL下
    EMP表下没有多条重复的记录啊
      

  4.   

    建议如果有用到隐性游标如:
    select       ename       into       empname       from       emp       where       empno       =       empno; 
    建议用法如下:
    select       ename       into       empname       from       emp       where       empno       =       empno and rownum<2; 
    确保返回值唯一,如果要多行返回,可以直接用显示游标来循环输出
      

  5.   

    你在MICHAEL用户下,执行一次检索,结果放出来看看呢?
      

  6.   

    捕捉TOO_MANY_ROWS错误,你会得到这个错误的.
      

  7.   

    select   ename   into   empname   from   emp   where   empno   =   empno; 
    这个语句有问题,系统无法区分出empno是变量,而是把它当作字段名处理了。你需要修改过程,把变量empno改名如v_empno。
      

  8.   

    一个小错误折腾了偶半天,是我的错,不怪出版商,呵呵~~~
    总结:
    我在SQLPLUS里直接用EXECUTE命令执行不可以,显示不出结果来
    必须要在前面加上SET SERVEROUTPUT ON 才可以
    我在PLSQL里执行EXECUTE命令不可以
    要用begin 
           .......
        end 这个语法格式才可以把结果显示出来
    我不得不承认我是一个菜鸟!