Oracle函数返回空?

时间:2017-05-24 18:56:00

标签: oracle

这开始让我发疯,我找不到这个为什么不起作用的原因!

表格上有触发器,因此cityID和postcodeID会自动填充。此功能的目的是查找具有相同名称的城市并返回其ID,否则将其添加到表中并返回新ID。

CREATE OR REPLACE FUNCTION resolveCity(cityNameIn IN VARCHAR2)
RETURN NUMBER AS
    cityIDOut NUMBER;
BEGIN
    SELECT cityID
    INTO cityIDOut
    FROM tblCities
    WHERE cityName = cityNameIn;

    IF cityIDOut IS NULL THEN
        -- Add this city to the list
        INSERT INTO tblCities (cityName)
        VALUES (cityNameIn)
        RETURNING cityID INTO cityIDOut;
    END IF;

    RETURN(cityIDOut);
END;
/

1 个答案:

答案 0 :(得分:2)

如果PL / SQL中的SELECT失败,则会引发NO_DATA_FOUND异常。在这种情况下,函数中没有处理程序,因此它被提升到外部处理程序 - 显然没有处理程序 - 因此它会被丢弃并丢失。

我建议您将函数重写为:

CREATE OR REPLACE FUNCTION resolveCity(cityNameIn IN VARCHAR2)
RETURN NUMBER AS
    cityIDOut NUMBER;
BEGIN
  BEGIN
    SELECT cityID
      INTO cityIDOut
      FROM tblCities
      WHERE cityName = cityNameIn;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      -- Add this city to the list
      INSERT INTO tblCities (cityName)
        VALUES (cityNameIn)
        RETURNING cityID INTO cityIDOut;
  END;

  RETURN(cityIDOut);
END;

祝你好运。