【问题标题】:When No data found Oracle找不到数据时 Oracle
【发布时间】:2018-03-15 20:27:21
【问题描述】:
CREATE OR REPLACE PROCEDURE ADD_OFERTA(valorO IN NUMBER, ali IN VARCHAR,subast IN NUMBER) AS    

    fech DATE;  
    cedCompr INTEGER;
    reqpor INTEGER;
    reqmin INTEGER;
    inicial NUMBER;
    mejor NUMBER;
    tmp INTEGER;
    prueba NUMBER;                      
BEGIN    
fech := SYSDATE;

    select porcentaje into reqpor from requisito;
    select incremento into reqmin from requisito;
    select precioInicial INTO inicial FROM subasta Where fk_idofertaganadora is null and PK_idSubasta=subast;
  EXCEPTION
        WHEN NO_DATA_FOUND then
            INICIAL:=0;
SELECT pk_idParticipante into cedCompr from PARTICIPANTE p where p.FK_ALIASUSUARIO = ali;     

select o.valorOferta into mejor from subasta s inner join oferta o on(s.fk_idofertaganadora=o.pk_idoferta) where s.pk_idsubasta=subast; 


EXCEPTION     
        WHEN NO_DATA_FOUND THEN-- ERROR here
            INICIAL:=0;

select greatest((inicial),(mejor+reqmin),(mejor*(reqpor/100 + 1))) into prueba from dual;

 IF (valorO>=prueba) THEN

        INSERT INTO OFERTA(PK_idOferta,fecha,valoroferta,fk_idcomprador,fk_idsubasta) VALUES(ID_OFERTA.NEXTVAL,fech,valorO,cedCompr,subast);
        update subasta set FK_idofertaganadora=ID_OFERTA.CURRVAL where pk_idsubasta=subast;
    END IF;
END ADD_OFERTA;

我的问题是在第二个 Exeption Oracle 显示:

错误(19,5):PLS-00103:在预期以下情况之一时遇到符号“EXCEPTION”:(begin case declare end exit for goto if loop mod null pragma raise return select update when with

错误(28,15):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:结束而不是编译指示最终可实例化顺序覆盖静态成员构造函数映射

【问题讨论】:

  • 这些答案对你有用吗?如果是这样,您应该单击它旁边的绿色复选标记以表明问题已得到回答。您还可以投票任何有帮助的答案。

标签: sql oracle


【解决方案1】:

您不能在同一块中多次出现相同的异常。 AFAIK,EXCEPTION 语句就像整个块的错误捕获器一样工作,所以你想把你的 proc 分成两个不同的块,就像这样(我想,我自己从来没有这样做过):

CREATE OR REPLACE PROCEDURE ADD_OFERTA(valorO IN NUMBER, ali IN VARCHAR,subast IN NUMBER) AS    

    fech DATE;  
    cedCompr INTEGER;
    reqpor INTEGER;
    reqmin INTEGER;
    inicial NUMBER;
    mejor NUMBER;
    tmp INTEGER;
    prueba NUMBER;                      
BEGIN    
fech := SYSDATE;

  BEGIN
    select porcentaje into reqpor from requisito;
    select incremento into reqmin from requisito;
    select precioInicial INTO inicial FROM subasta Where fk_idofertaganadora is null and PK_idSubasta=subast;

    EXCEPTION
        WHEN NO_DATA_FOUND then
            INICIAL:=0;
  END

  BEGIN
    SELECT pk_idParticipante into cedCompr from PARTICIPANTE p where p.FK_ALIASUSUARIO = ali;     

    select o.valorOferta into mejor from subasta s inner join oferta o on(s.fk_idofertaganadora=o.pk_idoferta) where s.pk_idsubasta=subast; 

    EXCEPTION     
        WHEN NO_DATA_FOUND THEN-- ERROR here
            INICIAL:=0;
  END

  select greatest((inicial),(mejor+reqmin),(mejor*(reqpor/100 + 1))) into prueba from dual;

  IF (valorO>=prueba) THEN

        INSERT INTO OFERTA(PK_idOferta,fecha,valoroferta,fk_idcomprador,fk_idsubasta) VALUES(ID_OFERTA.NEXTVAL,fech,valorO,cedCompr,subast);
        update subasta set FK_idofertaganadora=ID_OFERTA.CURRVAL where pk_idsubasta=subast;
  END IF;
END ADD_OFERTA;

【讨论】:

    【解决方案2】:
    CREATE OR REPLACE PROCEDURE ADD_OFERTA(valorO IN NUMBER, ali IN VARCHAR,subast IN NUMBER) AS    
    
    fech DATE;  
    cedCompr INTEGER;
    reqpor INTEGER;
    reqmin INTEGER;
    inicial NUMBER;
    mejor NUMBER;
    tmp INTEGER;
    prueba NUMBER;                      
    BEGIN    
        fech := SYSDATE;
    
        select porcentaje into reqpor from requisito;
        select incremento into reqmin from requisito;
        select precioInicial INTO inicial FROM subasta Where fk_idofertaganadora is null and PK_idSubasta=subast;
    EXCEPTION
        WHEN NO_DATA_FOUND then
        BEGIN   
            INICIAL:=0;
            SELECT pk_idParticipante into cedCompr from PARTICIPANTE p where p.FK_ALIASUSUARIO = ali;     
    
            select o.valorOferta into mejor from subasta s inner join oferta o on(s.fk_idofertaganadora=o.pk_idoferta) where s.pk_idsubasta=subast; 
    
    
        EXCEPTION     
            WHEN NO_DATA_FOUND THEN-- ERROR here
                INICIAL:=0;
    
            select greatest((inicial),(mejor+reqmin),(mejor*(reqpor/100 + 1))) into prueba from dual;
    
            IF (valorO>=prueba) THEN
                INSERT INTO OFERTA(PK_idOferta,fecha,valoroferta,fk_idcomprador,fk_idsubasta) VALUES(ID_OFERTA.NEXTVAL,fech,valorO,cedCompr,subast);
                update subasta set FK_idofertaganadora=ID_OFERTA.CURRVAL where pk_idsubasta=subast;
            END IF;
        END;
    END ADD_OFERTA;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-19
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 2013-09-30
      相关资源
      最近更新 更多