簡體   English   中英

在mysql的存儲過程中使用函數

[英]use function in stored procedure in mysql

我已經在mysql中創建了一個存儲過程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_PublicationsByDate`(IN _DateS DATE, IN _DateF DATE)
BEGIN

    SELECT 
        CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date)) AS date, 
        count(CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date))) AS count
    FROM 
        applications
    WHERE
        filed_date between _DateS and _DateF
    GROUP BY
        CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date))
    ORDER BY
        CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date));

END

我想替換長代碼

CONCAT(EXTRACT(YEAR FROM filed_date), " Q", EXTRACT(QUARTER FROM filed_date))

函數調用(為方便起見,在偽C ++中為示例):

char* func(char* date)
{
return CONCAT(EXTRACT(YEAR FROM date), " Q", EXTRACT(QUARTER FROM date))
}

由於這些長表達式可能會根據外部參數(偽代碼)而有所不同:

DECLARE F FUNCTION;

IF (_Type = 0)
    SET F = Func1;
ELSE
    SET F = Func2;
END IF;

SELECT F(filed_date), count(F(filed_date))...

我如何在mysql中創建它?

CREATE FUNCTION決定我的問題。

可惜的是,外部的功能

CREATE DEFINER=`root`@`localhost` FUNCTION `prepare_ScaleCondition`(_Scale VARCHAR(16), _Date DATE) RETURNS varchar(64) CHARSET utf8
BEGIN
    DECLARE _ScaleCondition VARCHAR(128) DEFAULT EXTRACT(YEAR FROM _Date);

    CASE _Scale
        WHEN 'quarter' THEN SET _ScaleCondition = CONCAT(EXTRACT(YEAR FROM _Date), ' Q', EXTRACT(QUARTER FROM _Date));
        WHEN 'year' THEN SET _ScaleCondition = EXTRACT(YEAR FROM _Date);
        WHEN 'month' THEN SET _ScaleCondition = CONCAT(EXTRACT(YEAR FROM _Date), ' M', EXTRACT(MONTH FROM _Date));
        WHEN 'week' THEN SET _ScaleCondition = CONCAT(EXTRACT(YEAR FROM _Date), ' W', EXTRACT(WEEK FROM _Date));
    END CASE;

    RETURN _ScaleCondition;
END

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_PublicationsByDate`(IN _DateS DATE, IN _DateF DATE)
BEGIN

    SELECT 
        prepare_ScaleCondition(filed_date) AS date, 
        count(prepare_ScaleCondition(filed_date)) AS count
    FROM 
        applications
    WHERE
        filed_date between _DateS and _DateF
    GROUP BY
        prepare_ScaleCondition(filed_date)
    ORDER BY
        prepare_ScaleCondition(filed_date);

END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM