Требуется обходной путь MySQL для передачи переменной \ параметра в поле зрения?

Я хотел бы передать переменную \ параметр в представление для фильтрации по диапазону дат. Поскольку я группирую в представлении, я не могу поместить предложение where за пределы представления.

Я прочитал кучу сообщений по этому поводу, но пока не могу заставить его работать. Большинство обходных путей, которые я видел для передачи параметра в представление, включают использование функции для возврата значения, и именно здесь я застреваю.

/* My current view that I want to pass in start and end dates */
CREATE VIEW Total_Sales_By_Product_Num AS
SELECT products_all_fields.*,
    Sum(<a bunch of code removed for this sample>) AS Item_Qty_Requested_Total, 
    Sum(<a bunch of code removed for this sample>) AS Item_Qty_Accepted_Total,  
    Sum(<a bunch of code removed for this sample>) AS Total_Sales_Dollars
FROM products_all_fields
    LEFT OUTER JOIN (web_orders_items
        INNER JOIN web_orders_header
            ON  web_orders_items.Web_Order_Num = web_orders_header.Web_Order_Num )
        ON  products_all_fields.Product_Num = web_orders_items.Product_Num
WHERE web_orders_header.Order_Date BETWEEN fn_GetStartDate() AND fn_GetEndDate()
GROUP BY products_all_fields.Product_Num
ORDER BY products_all_fields.Description

Функции для возврата параметров в представление:

CREATE FUNCTION fn_GetStartDate ()
    RETURNS DATE
    DETERMINISTIC NO SQL
BEGIN
    RETURN @StartDate;
END

CREATE FUNCTION fn_GetEndDate ()
    RETURNS DATE
    DETERMINISTIC NO SQL
BEGIN
    RETURN @EndDate;
END

Это не работает, не возвращает данных, я знаю, что делаю глупость

set @fn_StartDate := '2012-01-01';
set @fn_EndDate := '2012-02-01';
select * from Total_Sales_By_Product_Num

Спасибо за любую помощь!


person LukeS    schedule 24.01.2013    source источник


Ответы (3)


Аааа !!! Я заставил это работать, я чувствую себя идиотом, но у меня были двойные кавычки, а не одинарные кавычки в одном из моих назначений дат. Вроде работает сейчас. Я оставлю этот пост для будущих людей, которые будут искать, как это сделать.

person LukeS    schedule 24.01.2013
comment
Мелани, у меня были двойные кавычки для одного из моих операторов присваивания, набора @fn_StartDate: = '2012-01-01; команда. Один я исправил, что это сработало. Так что весь код в первом посте должен работать. - person LukeS; 25.01.2013
comment
Итак, вы можете передавать параметры в представление? Когда это стало возможным? Я пропустил записку. ;) - person Melanie; 25.01.2013
comment
Вы не можете напрямую передавать параметры в представление, вам нужно немного взломать обходной путь. Не самое чистое, но работает. - person LukeS; 25.01.2013

Это должно работать, как показано ниже:

set @StartDate := '2012-01-01';
set @EndDate := '2012-02-01';
select * from Total_Sales_By_Product_Num;
person monsur.hoq    schedule 17.07.2019

Тебе нужно

SET @fn_StartDate = fn_GetStartDate('2012-01-01')

то же самое с @fn_EndDate

а затем на ваш взгляд

WHERE web_orders_header.Order_Date BETWEEN @fn_StartDate.....

Однако это всего лишь синтаксис вызова функции. Вы все еще пытаетесь передать параметр в представление, что, насколько мне известно, невозможно. Вместо этого попробуйте поместить всю свою логику просмотра в функцию.

person Melanie    schedule 24.01.2013
comment
Что такое dbo? Это имя схемы? - person LukeS; 25.01.2013
comment
Да, извините, я предполагаю схему dbo. Не следовало этого делать. Теперь его нет. - person Melanie; 25.01.2013
comment
Перенести все в функцию кажется более разумным! - person funder7; 22.03.2021