create or replace procedure gzrz_count is
c varchar2(1000);
d number;
begin
  select zzjgdm,count(id) into c,d from gzrz group by zzjgdm;
end gzrz_count;ORA-01422: 实际返回的行数超出请求的行数
ORA-06512: 在"BZGL.GZRZ_COUNT", line 5
ORA-06512: 在line 1

解决方案 »

  1.   

    这不是存储过程的问题,是into的问题
    单行结果可以用into接收,在多行结果时需要使用cursorr_cur sys_refcursor;
    begin
    open r_cur for select zzjgdm,count(id) from gzrz group by zzjgdm;
      

  2.   

    楼主你不能一个人娶多个媳妇的,法律上只能有一个;
    变量c,d都只能用来存储内存中的一个值,而你的select语句返回多行,所以oracle不清楚该将那个结果赋给你的变量。
    你必须保证select返回且只返回一行create or replace procedure gzrz_count is
    c varchar2(1000);
    d number;
    begin
    select zzjgdm,count(id) into c,d from gzrz group by zzjgdm】
    where rownum =1;
    exception
      when others then --如果select语句返回0行,也会出错
        select 'zzjgdm','count' into c,d from dual;
    end gzrz_count;
      

  3.   

    您好,我改成了如下形式
    create or replace procedure gzrz_count is
    r_cur sys_refcursor;
    begin
      open r_cur for select zzjgdm,count(id) from gzrz group by zzjgdm;
    end gzrz_count;用c#的sqldatasource调用时出现错误<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SCGL %>"
                ProviderName="<%$ ConnectionStrings:SCGL.ProviderName %>" 
                SelectCommand="GZRZ_COUNT" SelectCommandType="StoredProcedure">
            </asp:SqlDataSource>system.data.oracleclient提供程序不支持为存储过程派生参数
      

  4.   

    --返回游标数据集(可以多行)
    CREATE OR REPLACE PROCEDURE gzrz_count(o OUT SYS_REFCURSOR) IS
      c VARCHAR2(1000);
      d NUMBER;
    BEGIN
      OPEN o FOR
        SELECT zzjgdm, COUNT(id) cnt FROM gzrz GROUP BY zzjgdm;
    END gzrz_count;--返回多个参数值(只能一行)
    CREATE OR REPLACE PROCEDURE gzrz_count(c OUT VARCHAR2, d OUT NUMBER) IS
    BEGIN
      SELECT zzjgdm, COUNT(id) INTO c, d FROM gzrz GROUP BY zzjgdm WHERE rownum < 2;
    END gzrz_count;