create or replace procedure bbb_proc(v_mc varchar2 ,v_sal out bbb%rowtype)  as 
begin
  declare cursor b_cursor(v varchar2) is select * from bbb where mc=v_mc;
  open b_cursor(v_mc); loop 
   fetch b_cursor into v_sal;  --这里报错?           
  exit  when b_cursor%notfound;
  dbms_output.put_line(v_sal.mc||v_sal.sal);
  end loop;
  close b_cursor;
end bbb_proc;declare v_bsal varchar2(10);
begin  bbb_proc('c',v_bsal);
end;表 bbb 
mc  sal
a    10
a    20
b    10
b    20
b    30
c    30
 问题出在哪里? 

解决方案 »

  1.   

    SQL> set serveroutput on
    SQL> 
    SQL> CREATE OR REPLACE PROCEDURE bbb_proc(v_mc VARCHAR2, v_sal OUT bbb%ROWTYPE) AS
      2    CURSOR b_cursor(v VARCHAR2) IS
      3      SELECT * FROM bbb WHERE mc = v_mc;
      4  BEGIN
      5    OPEN b_cursor(v_mc);
      6    LOOP
      7      FETCH b_cursor
      8        INTO v_sal; --这里报错?
      9      EXIT WHEN b_cursor%NOTFOUND;
     10      dbms_output.put_line(v_sal.mc || v_sal.sal);
     11    END LOOP;
     12    CLOSE b_cursor;
     13  END bbb_proc;
     14  /
     
    Procedure created
     
    SQL> 
    SQL> DECLARE
      2    v_bsal bbb%ROWTYPE;
      3  BEGIN
      4    bbb_proc('c', v_bsal);
      5  END;
      6  /
     
    c30
     
    PL/SQL procedure successfully completed
     
    SQL> 
      

  2.   

    问个问题呀 为什么我在PLSQL中命令窗口中没有看到 显示的C30呢?
      8            INTO v_sal; --这里报错?
      9          EXIT WHEN b_cursor%NOTFOUND;
     10         dbms_output.put_line(v_sal.mc || v_sal.sal);
     11       END LOOP;
     12       CLOSE b_cursor;
     13     END bbb_proc;
     14  /
     
    Procedure created
     
    SQL> 
    SQL> DECLARE
      2  
      3       v_bsal bbb%ROWTYPE;
      4      BEGIN
      5        bbb_proc('c', v_bsal);
      6      END;
      7  /
     
    PL/SQL procedure successfully completed是在那个窗口进行操作的?
      

  3.   

    命令窗口.
    记得先执行set serveroutput on
    不然屏幕是不打印的
      

  4.   

    只要编译通过,你的procedure至少在语法上面是通过的!至于显示用serveroutput的属性即可,默认是off!