【问题标题】:How to set a default value for a query that returns no rows?如何为不返回行的查询设置默认值?
【发布时间】:2012-12-29 22:19:44
【问题描述】:

我已经创建了一个带有 select 语句的触发器,我想说如果这个 select 语句没有返回任何行,那么在变量“辅助”中放置一个 0。我尝试使用 NVL(auxiliar,0) 但它不起作用。我该怎么做?

SELECT NVL(salary,0) INTO auxiliar FROM BILL WHERE code=:NEW.code;

[更新]我的触发代码:

IF preCondicio THEN
        KMpendents:=coalesce(SELECT rev_pendent_km
            INTO KMpendents
            FROM REV_PENDENT
            WHERE rev_pendent_vehicle_codi=:NEW.lloguer_vehicle_codi,0);
        IF KMtotals+KMpendents>=15000 THEN
            SELECT venedor_codi 
            INTO venedorCodi 
            FROM venedor 
            WHERE venedor_alta=(
                SELECT MAX(venedor_alta) 
                FROM venedor 
                WHERE venedor_delegacio_codi=(
                    SELECT venedor_delegacio_codi
                    FROM venedor
                    WHERE venedor_codi=:NEW.lloguer_venedor_codi));
            INSERT INTO REVISIONS VALUES(:NEW.lloguer_vehicle_codi,:NEW.lloguer_dataf,KMtotals+KMpendents,venedorCodi);
            IF KMpendents!=0 THEN
                DELETE FROM REV_PENDENT 
                WHERE rev_pendent_vehicle_codi=:NEW.lloguer_vehicle_codi;
            END IF;
        ELSE
            IF KMpendents!=0 THEN
                UPDATE REV_PENDENT SET rev_pendent_km=KMtotals+KMpendents WHERE rev_pendent_vehicle_codi=:NEW.lloguer_vehicle_codi;
            ELSE INSERT INTO REV_PENDENT VALUES(:NEW.lloguer_vehicle_codi,KMtotals,:NEW.lloguer_dataf);
            END IF;
        END IF;
    END IF;

变量KMpendents等价于我更新前讲的变量auxiliar。但是 Oracle 向我显示了这些错误:

PLS-00103:在期待其中一个时遇到符号“,” 下列的: 。 ( * @ % & - + ; / at for mod 余数 rem and or group 有相交减序开始联合在哪里连接||指标 多集

【问题讨论】:

  • dbms? MySQL、SQL Server、Oracle,...?
  • 可以显示触发码吗?
  • 使用触发代码更新问题

标签: sql oracle triggers default rows


【解决方案1】:

如果 select 子句只包含聚合函数,那么总会返回至少一行。

SELECT coalesce(sum(salary),0)
INTO   auxiliar
FROM   BILL
WHERE  code=:NEW.code;

【讨论】:

【解决方案2】:
BEGIN
 SELECT NVL(salary,0) INTO auxiliar FROM BILL WHERE code=:NEW.code;
EXCEPTION
  WHEN NOTFOUND THEN
      auxiliar := 0;
END;

或者您也可以使用SQL%NOTFOUND 来检查语句是否返回no rows

CREATE or REPLACE TRIGGER trigger_name
BEFORE INSERT
   ON table_name
   [ FOR EACH ROW ]

DECLARE
   -- variable declarations

BEGIN
    ....
    ....
    BEGIN
     SELECT NVL(salary,0) INTO auxiliar FROM BILL WHERE code=:NEW.code;
    EXCEPTION
      WHEN NOTFOUND THEN
          auxiliar := 0;
    END;
    --Yes, this is possible and valid.

EXCEPTION
   WHEN ...
   -- exception handling

END;

【讨论】:

  • 失去“当其他人为空时”......这是一个等待发生的问题。
  • 感谢您的回答,但这对我没有帮助,因为当触发器进入 EXCEPTION 时它将停止,我希望触发器继续。
  • @albert 您不必将其放在触发器的异常上,而是将整个块放在触发器主体中。更新答案
  • @Annjawn 我不知道我可以开始一个过程。真的很管用,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 2019-12-02
  • 2011-12-01
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
相关资源
最近更新 更多