【问题标题】:ORA-01422: exact fetch returns more than requested number of rows errorORA-01422: 精确提取返回超过请求的行数错误
【发布时间】:2015-09-24 19:57:45
【问题描述】:

我想在 where 子句中将 exch_name 传递给主查询 但它给出了错误

ORA-01403: no data found

问题 2:

出于测试目的,我传递了硬编码值而不是 exch_name MV_sum.exch = 'ASX' 但它给出错误

ORA-01422: exact fetch returns more than requested number of rows

请指导我...

DECLARE
  exch_name     VARCHAR2(200);
  v_exch        VARCHAR2(1000);
  output        VARCHAR2(4000);
  abc           VARCHAR2(4000);
  v_str         VARCHAR2(4000);
  err_code      VARCHAR2 (4000);
  err_msg       VARCHAR2 (4000);

  CURSOR tbl IS
    SELECT DISTINCT MV_sum.exch
      into exch_name
      FROM LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum,
           EXCHANGE_MAPPING ex_map
      WHERE MV_SUM.EXCH = ex_map.agora_exchange
      ORDER BY 1;
BEGIN
  DBMS_OUTPUT.PUT_LINE (exch_name);

  for x in tbl loop
    EXIT WHEN tbl%NOTFOUND;

   select 'ICTO-10510' ||','|| MV_sum.exch ||','|| 
          to_char(to_date(MV_sum.TRADEDATE, 'yymmdd'), 'dd-Mon-yyyy')  ||
          ','|| '' ||','|| 'TDV' ||','|| MV_sum.new ||','|| "NEW"  ||
          ','|| '' || ','|| ''
     into abc  
     from LLDMA.MERCAUDIT_VOLUME_AGG_SUMMARY MV_sum ,
          EXCHANGE_MAPPING ex_map
     where (TRADEDATE between TO_CHAR  (sysdate-545, 'YYMMDD')
                          and TO_CHAR  (sysdate, 'YYMMDD') ) and
           MV_SUM.EXCH = ex_map.agora_exchange and
           MV_sum.exch = 'ASX' ---Passing hardcoded value for testing
           --and MV_sum.exch = exch_name --If I uncomment this "ORA-01403: no data found"error is coming
     group by MV_sum.exch,
              to_char(to_date(MV_sum.TRADEDATE, 'yymmdd'), 'dd-Mon-yyyy' ),
              MV_sum.new;

    EXECUTE IMMEDIATE abc into output;

    DBMS_OUTPUT.PUT_LINE (output);
  end loop;
EXCEPTION
  WHEN OTHERS THEN
    err_code := SQLCODE;
    err_msg := SUBSTR(SQLERRM, 1, 200);

    DBMS_OUTPUT.PUT_LINE  (err_code || err_msg);
END;

【问题讨论】:

  • 需要查看您的数据才能真正提供帮助,这些消息暗示数据不是您所期望的
  • 正如@davegreen100 所说,在不知道您的数据是什么的情况下很难提供帮助。一些cmets:1)“NEW”应该是“NEW”; 2) 你写了EXECUTE IMMEDIATE abc,但看起来abc 不会包含有效的SQL 语句; 3)您将光标提取到名为x 的行变量中,但是您永远不会在任何地方使用结果。我想需要问的问题是你想在这里完成什么?
  • 你确定查询 "select 'ICTO-10510' ||','|| MV_sum.exch ||','|| to_char(to_date(MV_sum.TRADEDATE, 'yymmdd'), 'dd-Mon-yyyy') || ','|| ''||','|| 'TDV' ||','|| MV_sum.new ||','|| "NEW" || ' ,'|| '' || ','|| '' into abc ..." 总是为游标中的每条记录返回一行?

标签: oracle plsql oracle11g oracle10g


【解决方案1】:

这是一个工作示例:http://sqlfiddle.com/#!4/4a42e9/9。注意我是如何使用光标的:c.a不仅仅是c

上例代码:

create table t (a int)
;
insert into t values(1)
;
insert into t values(2)
;
create table dbmsoutput (
  pos int,
  mes varchar2(4000)
);

declare
  b NUMBER(4);
  procedure put_line(p_mes in varchar2) is
     v_pos int; 
  begin  
     select count(0) into v_pos from dbmsoutput;  
     insert into dbmsoutput (pos, mes) values (v_pos, p_mes);
  end;

begin
  for c in (select a from t) loop
    put_line  (c.a);
  end loop;
end;
/

SELECT mes FROM dbmsoutput order by pos

【讨论】:

  • DBMS_OUTPUT.PUT_LINE 不会抛出 no data foundexact fetch returns more than requested number of rows 异常。这些纯粹是光标错误。根据包 cmets,PUT_LINE 可以引发的唯一异常是 buffer overflowline length overflow。谢谢。
  • 是的 :) 你自己发现问题在于@ashwini 使用了exch_name VARCHAR2(200),而他应该使用corsor x。我只是不能用英语表达它
猜你喜欢
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-15
相关资源
最近更新 更多