2015-07-03 128 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;