具有可变查询运算符的Mysql函数

具有可变查询运算符的Mysql函数,mysql,function,parameters,Mysql,Function,Parameters,我正在mysql(8.0.18)中创建一个函数,有两个参数(\u id&\u operator)。其中,\u id是需要处理的记录id,\u操作员是要执行的操作 此代码运行良好。但是,它非常大而且重复: 分隔符$$ 删除函数(如果存在)`deleteSubscriber`$$ 创建函数'deleteSubscriber'(\u id INTEGER,\u运算符VARCHAR(2))返回CHAR 开始 如果(_运算符='='或ISNULL(_运算符)=TRUE),则 从'subscribers'中

我正在mysql(8.0.18)中创建一个函数,有两个参数(\u id&\u operator)。其中,
\u id
是需要处理的记录id,
\u操作员
是要执行的操作

此代码运行良好。但是,它非常大而且重复:

分隔符$$
删除函数(如果存在)`deleteSubscriber`$$
创建函数'deleteSubscriber'(\u id INTEGER,\u运算符VARCHAR(2))返回CHAR
开始
如果(_运算符='='或ISNULL(_运算符)=TRUE),则
从'subscribers'中删除,其中'id`=\u id;
从'subscriber\u packages'中删除,其中'id`=\u id;
...
ELSEIF(_运算符='>=')然后
从'subscribers'中删除,其中'id`>=\u id;
从'subscriber\u packages'中删除,其中'id`>=\u id;
...
ELSEIF(_operator='用于相同的

CREATE PROCEDURE `deleteSubscriberData`(IN `_id` INT, IN `_operator` VARCHAR(2)) 
BEGIN
    SET @s = CONCAT('DELETE FROM subscribers WHERE id ', _operator, ' ', _id);
    PREPARE stmt1 FROM @s;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    
    SET @s = CONCAT('DELETE FROM subscriber_packages WHERE id ', _operator, ' ', _id);
    PREPARE stmt2 FROM @s;
    EXECUTE stmt2;
    DEALLOCATE PREPARE stmt2;
END
CREATE函数`deleteSubscriber`(\u id INTEGER,\u运算符VARCHAR(2))返回CHAR
开始
删除
来自“订阅者”
当'>='时的情况_运算符,然后是'id`>=\u id

感谢@JitendraYadav,这里是我的最终代码

分隔符$$
删除过程(如果存在)`deleteSubscriber`$$
创建过程'deleteSubscriber'(\u id INTEGER,\u运算符VARCHAR(2))
开始
#删除订户
设置@subscribers=CONCAT('DELETE FROM subscribers WHERE id',_操作符,,_id);
从@subscribers准备deleteSubscribers;
执行删除订阅;
取消分配订户;
#删除订阅程序包
设置@subscriberPackages=CONCAT('DELETE FROM subscriber\u packages WHERE subscriber\u id'、\u operator'、\u id);
从@subscriberPackages中准备deleteSubscriberPackages;
执行删除订阅包;
取消分配并准备删除订阅包;
...
结束$$
定界符;

我得到了以下信息:错误代码:1336
存储函数或触发器中不允许使用动态SQL
您可以将其设置为
过程
而不是
函数
。请查看我的更新答案。确保
过程
没有任何返回类型。因此,请删除该
返回
语句。好的,让我试试。
CREATE FUNCTION `deleteSubscriber`(_id INTEGER, _operator VARCHAR(2)) RETURNS CHAR
BEGIN
    DELETE 
    FROM `subscribers` 
    WHERE CASE _operator WHEN '>=' THEN `id` >= _id
                         WHEN '<=' THEN `id` <= _id
                         WHEN '!=' THEN `id` != _id
                         ELSE           `id`  = _id
                         END;

-- the same for another tables

        RETURN NULL;
END