具有可变查询运算符的Mysql函数
我正在mysql(8.0.18)中创建一个函数,有两个参数(\u id&\u operator)。其中,具有可变查询运算符的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'中
\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