【问题标题】:Oracle Function Returning Null?Oracle 函数返回空值?
【发布时间】:2017-05-24 18:55:59
【问题描述】:

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

表格上有触发器,因此 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;
/

【问题讨论】:

  • 触发器是插入前还是插入后?
  • 之前,它从序列中填充主键

标签: oracle


【解决方案1】:

如果 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;

祝你好运。

【讨论】:

  • 感谢您的回答,不幸的是,这返回了我:ORA-14551:无法在查询中执行 DML 操作 ORA-06512:在“S.RESOLVECITY”,第 13 行 ORA-01403:没有数据找到
  • 你是如何调用这个函数的?
  • 你可以使用 MERGE 并返回新的 id 吗?
  • INSERT INTO tblCustomerAddresses (userID, defaultAddress, addressLine1, addressLine2, addressLine3, cityID, postcodeID, countryCode) VALUES(userIDout, 1, sAddressLine1, sAddressLine2, sAddressLine3, resolveCity(sAddressCity), resolvePostcode(sAddressPostcode), sAddressCountry);
  • 我将尝试使用 MERGE,只需要查找它 - 感谢您的建议!
猜你喜欢
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 2017-06-07
  • 1970-01-01
相关资源
最近更新 更多