将整个列存储在存储过程中的变量中
问题描述:
我在包内部有一个复杂的存储过程。在这个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
我知道这是因为我想填充使用“进入整列“条款。但我不知道有任何其他的做法。
答
创建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;
答
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;
这听起来可怕像你正在试图做一些程序上按行对一些可以在一个sql语句中完成的事情进行逐行处理。 IF声明中发生了什么工作?如果您使用它来对表执行一些DML,那么逐行(又慢又慢)处理并不是实现这一点的最佳或最快的方式。 – Boneist