Oracle函数返回Null?

Oracle函数返回Null?,oracle,Oracle,这开始让我发疯了,我找不到这不起作用的原因 这些表上有触发器,因此cityID和postcodeID会自动填充。此函数的目的是查找具有相同名称的城市并返回其ID,否则将其添加到表中并返回新ID CREATE OR REPLACE FUNCTION resolveCity(cityNameIn IN VARCHAR2) RETURN NUMBER AS cityIDOut NUMBER; BEGIN SELECT cityID INTO cityIDOut FROM

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

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

如果PL/SQL中的选择失败,则会引发“未找到数据”异常。在本例中,函数中没有处理程序,因此它被提升到外部处理程序-显然没有,因此它会掉在地板上并丢失

我建议您将函数改写为:

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;

祝您好运。

如果PL/SQL中的选择失败,将引发“找不到数据”异常。在本例中,函数中没有处理程序,因此它被提升到外部处理程序-显然没有,因此它会掉在地板上并丢失

我建议您将函数改写为:

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;

祝您好运。

触发器是在插入之前还是在插入之后?在插入之前,它从Sequences填充主键是在插入之前还是在插入之后?在插入之前,它从Sequences填充主键谢谢您的回答,不幸的是,这返回了我:ORA-14551:无法在查询中执行DML操作ORA-06512:在“S.RESOLVECITY”,第13行ORA-01403:找不到数据您如何调用此函数?是否可以使用合并并返回新id?插入tblCustomerAddresses(userID、defaultAddress、addressLine1、addressLine2、addressLine3、cityID、postcodeID、countryCode)值(userIDout、1、sAddressLine1、sAddressLine2、sAddressLine3、RESOLVECITY(sAddressCity),resolvePostcode(sAddressPostcode),sAddressCountry);我将尝试使用合并,只需要查找-感谢您的建议!感谢您的回答,不幸的是,这返回我:ORA-14551:无法在查询中执行DML操作ORA-06512:在“S.RESOLVECITY”“,第13行ORA-01403:找不到数据您如何调用此函数?是否可以使用合并并返回新id?插入tblCustomerAddresses(userID、defaultAddress、addressLine1、addressLine2、addressLine3、cityID、postcodeID、countryCode)值(UserIout、1、sAddressLine1、sAddressLine2、sAddressLine3、resolveCity(sAddressCity),resolvePostcode(sAddressPostcode),sAddressCountry);我将尝试使用合并,只需查找它-感谢您的建议!