2017-07-03 52 views
0

我想創建一個內聯oracle函數,該函數將引用正在提取的當前行的列值並根據我的條件返回一個值。我通過將ROWID傳入函數來嘗試,並且函數體中的當前行將使用ROWID獲取並操作值。如何將當前行傳遞給oracle用戶定義的函數

CREATE FUNCTION CHECK_STATUS(P_ROWID) RETURN VARCHAR2 IS 
    V_ROW MY_TBL%TYPE 
BEGIN 
    SELECT * INTO V_ROW FROM MY_TBL WHERE ROWID=P_ROWID; 
    IF V_ROW.COL1 IS NOT NULL AND 
     V_ROW.COL2 IS NOT NULL AND 
     V_ROW.COL3 IS NOT NULL THEN 

     RETURN 'OK'; 
    ELSE 
     RETURN 'INCOMPLETE'; 
    END IF; 
END; 

此功能在不同的地方還呼籲爲

SELECT A.*,CHECK_STATUS(ROWID) FROM MY_TBL A; 

它的工作原理,但會減慢查詢不好過千的記錄,因爲每個讀取的行功能將再次做一個選擇查詢用於獲取列值。我知道,這也可以做到

CREATE FUNCTION CHECK_STATUS(COL1,COL2,COL3) RETURN VARCHAR2 IS 

這裏的問題是,我想幾乎檢查功能9倍的值,它看起來很奇怪的函數的每次調用期間寫的列名。我懷疑是否有該功能可以參考當前行被獲取,而無需通過參數類似接收ROWID /列

回答

0

你可以添加對這個virtual column任何方法(THIS.COL1,THIS.COL2,THIS.COL3)使用CASE表達式,而不是有一個函數都:

alter table my_tbl add (status generated always as 
    (case when column1 is null or column2 is null or column3 is null 
    -- etc., all 9 columns or whatever else you want to check 
    then 'INCOMPLETE' else 'OK' end) virtual); 

然後,您可以用查詢它:

select column1, column2, ..., status from my_tbl 

您也可以在虛擬列添加一個索引,如果這對你如何有用會使用它。

如果您願意,您仍然可以使用(確定性)函數,並且所有列值均被傳入 - 「看起來奇怪」的部分將隱藏在DDL中,因此查詢不會看到它。聽起來不像使用函數會在這種情況下增加很多。

+0

謝謝......你是對的......虛擬專欄的目的......沒有想到,因爲我們剛剛從10g轉移到11g ..將很快嘗試.. – Mahesh

相關問題