局部变量上的MySQL海象运算符?
Posted
技术标签:
【中文标题】局部变量上的MySQL海象运算符?【英文标题】:MySQL walrus operator on local variable? 【发布时间】:2020-09-16 19:18:17 【问题描述】:所以我有一个看起来像这样的程序
CREATE PROCEDURE slct()
BEGIN
DECLARE ttl INT DEFAULT 0;
SELECT NULL AS price, NULL AS account_id, NULL as max_amount, NULL as total
FROM sellers
UNION ALL
SELECT price, account_id, max_amount, ttl := ttl + max_amount
FROM (SELECT * FROM sellers ORDER BY price ASC) C where selling_currency_id = :buying and buying_currency_id = :buying_with and ttl < :quantity
END
由于这里的海象运算符,它给了我一个语法错误:ttl := ttl + max_amount
。如果这是一个用户变量 (@ttl
),那么该 walrus 运算符可以工作,但 @ttl 没有作用域这一事实会在我的查询中引入一些错误。
所以我想知道:我如何使 :=
工作/用等效的东西替换它?
编辑:
我发现了 INTO 关键字,现在我的查询看起来像这样。仍然说我有语法错误...
CREATE PROCEDURE select_buy(
IN buying BIGINT UNSIGNED,
IN buying_with BIGINT UNSIGNED,
IN quantity BIGINT UNSIGNED,
INOUT ttl BIGINT UNSIGNED
)
BEGIN
SELECT NULL AS price, NULL AS account_id, NULL as max_amount, NULL as total
FROM sellers
UNION ALL
SELECT price, account_id, max_amount, (SELECT (ttl + max_amount) INTO ttl) AS total
FROM (SELECT * FROM sellers ORDER BY price ASC) C where selling_currency_id = buying and buying_currency_id = buying_with and ttl < quantity
END
【问题讨论】:
只有用户定义的变量可以用作赋值运算符的目标,而不是局部变量。 @ttl 没有作用域的事实会在我的查询中引入一些错误。 ??这怎么可能?请提供一个建模小提琴。:buying
、:buying_with
和 :quantity
是什么?这些看起来像 PDO 占位符,但我认为您不能在过程中使用它们。
我想是因为并发?我认为@total 没有任何锁定?还是我完全错了? (是的,那些是占位符)
它们是会话变量,每个连接都有自己的变量。
您不必担心您的@total
会干扰别人的。
【参考方案1】:
我的代码无法使用@total,因为我没有重置@total(即使它看起来像)。我添加了SET @total = 0
,现在一切正常。
【讨论】:
以上是关于局部变量上的MySQL海象运算符?的主要内容,如果未能解决你的问题,请参考以下文章