2017-05-24 196 views
0

這開始讓我瘋狂,我無法找到爲什麼這不起作用的原因!Oracle函數返回Null?

表格上有觸發器,所以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; 
/
+0

觸發器BEFORE插入或插入後? – Stilgar

+0

之前,它從序列 – BartWD

回答

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; 

好運。

+0

填充主鍵感謝您的答案,不幸的是,這返回給我:ORA-14551:不能在查詢ORA-06512內執行DML操作:在「S.RESOLVECITY」,第13行ORA-01403 :沒有找到數據 – BartWD

+0

你是如何調用這個功能的? –

+2

你可以使用合併並返回新的ID? – Stilgar