2015-07-03 124 views
0

我在包內部有一個複雜的存儲過程。在這個SP內部,我需要查詢一個表來獲取所有與一列相關的數據,然後用它來檢查「IF」語句中的其他條件。 下面是我在做什麼:將整個列存儲在存儲過程中的變量中

--declare a variable to store the holidays 
l_holidays MySchema. HolidayTable.DateColumn%TYPE 

-- populate this variable 
Select a.DateColumn into l_holidays 
from MySchema. HolidayTable a; 

-- using this variable inside an "IF" statement 
IF (current_Date IN l_holidays) 
THEN 
    -- do something 
ELSE 
    -- do something 
END IF; 

我每次運行它,我得到以下錯誤

ORA-01422: exact fetch returns more than requested number of rows 

我知道這是因爲我想填充使用「進入整列「條款。但我不知道有任何其他的做法。

+1

這聽起來可怕像你正在試圖做一些程序上按行對一些可以在一個sql語句中完成的事情進行逐行處理。 IF聲明中發生了什麼工作?如果您使用它來對錶執行一些DML,那麼逐行(又慢又慢)處理並不是實現這一點的最佳或最快的方式。 – Boneist

回答

1

創建collection和使用BULK COLLECT INTO

CREATE PROCEDURE my_proc (
    current_date IN MySchema.HolidayTable.DateColumn%TYPE 
) 
AS 
    TYPE date_tab IS TABLE OF MySchema.HolidayTable.DateColumn%TYPE; 
    l_holidays date_tab; 
BEGIN 
    SELECT DateColumn 
    BULK COLLECT INTO l_holidays 
    FROM MySchema.HolidayTable; 

    IF (current_Date MEMBER OF l_holidays) 
    THEN 
    NULL; -- do something 
    ELSE 
    NULL; -- do something 
    END IF; 
END; 

否則你只是在選擇測試:

CREATE PROCEDURE my_proc (
    current_date IN MySchema.HolidayTable.DateColumn%TYPE 
) 
AS 
    has_date NUMBER(1,0); 
BEGIN 
    SELECT CASE WHEN EXISTS (SELECT 'X' 
          FROM MySchema.HolidayTable 
          WHERE DateColumn = Current_Date) 
     THEN 1 
     ELSE 0 
     END 
    INTO has_date 
    FROM DUAL; 

    IF has_date = 1 
    THEN 
    NULL; -- do something 
    ELSE 
    NULL; -- do something 
    END IF; 
END; 
+0

我不完全相信,這回答了OP正在嘗試(和失敗)詢問的問題。我猜測OP會希望循環選擇語句返回的每個項目,而不是僅使用其中一個值。 – Boneist

+0

當我讀到它時--OP有一個值'current_date',並且想要查看它是否包含在列的值中。如果情況並非如此,OP希望澄清問題,那麼我會更新以反映 - 但在此之前... – MT0

+0

是的;我們必須等到OP完善他們的要求! – Boneist

0
Hello similarly you can use this query to fulfill your requirements 

SET serveroutput ON; 
SET sqlbl ON; 
DECLARE 
type l_holiday 
IS 
    TABLE OF DATE; 
    tab_holiday l_holiday; 
BEGIN 
    SELECT a.dt BULK COLLECT 
    INTO tab_holiday 
    FROM 
    (SELECT SYSDATE dt FROM DUAL 
    UNION 
    SELECT SYSDATE+1 dt FROM DUAL 
    UNION 
    SELECT SYSDATE+2 dt FROM DUAL 
    UNION 
    SELECT SYSDATE+3 FROM DUAL 
    )a; 
    IF tab_holiday.COUNT > 0 THEN 
    IF SYSDATE MEMBER OF tab_holiday THEN 
     dbms_output.put_line('yes working'); 
    ELSE 
     dbms_output.put_line('awsme working'); 
    END IF; 
    END IF; 
END;