在 delphi 查询中使用 @variables:= 不起作用

Posted

技术标签:

【中文标题】在 delphi 查询中使用 @variables:= 不起作用【英文标题】:Using @variables:= in delphi query does not work 【发布时间】:2011-04-11 19:30:40 【问题描述】:

我有以下问题。

ZQuery1.SQL.Text:= 
  ' SELECT                                                  '+
  '   IF(q.rank2 = 1, @rank:= 1, @rank:= @rank + 1) AS rank '+
  '   ,q.* FROM (                                            '+
  '   SELECT groep.id - MinGroepId(groep.id) AS rank2       '+
  '     ,groep.otherfields                                  '+
  '   FROM groep                                            '+
  '   ORDER BY rank2 ) q;                                   ';
ZQuery.Open;

当我运行此代码时,我在 ZQuery1 中得到一个异常 Incorrect token followed by ":"。 我该如何解决?我需要使用 Delphi,因为我无法将此选择放入 mysql 过程中。 Zeos 6 不支持返回结果集的 MySQL 过程。

附言 我将 Delphi 2007 和 MySQL 5.1 与 ZEOS 6.6.6 一起使用。 虽然我很确定版本无关紧要。 我不愿意切换版本,因为我对项目的了解太远了。

【问题讨论】:

那是有效的 MySQL 吗? (我不使用 MySQL,但是关于 IF 的一些东西似乎...关闭;MySQL CLI 可以理解吗?) 是的,错误输入了“,”为“;” (现已修复),但除此之外是。 你在AS rankq.* FROM之间漏掉了一个逗号, 破解了一个解决方案,如果有人知道任何更清洁的东西会很棒。感谢大家感谢您抽出时间提供帮助。 【参考方案1】:

这个不行,只能参数化值。 你能做的最好的就是 SQL.Text := StringReplace() 但你会失去准备查询的速度。

【讨论】:

只要我激活查询,它仍然会报错。或者我错过了什么。顺便说一句,我并不担心准备查询的速度,这个查询处理的数据集总是很小。【参考方案2】:

MySQL 具有引用 @ 的用户变量(基于会话)的能力(所以我讨厌说 LaKraven 有点离题)。 我在工作中使用 Dac for MySQL (http://www.microolap.com/products/connectivity/mysqldac/) 时遇到了同样的问题。他们通过特殊检查来纠正,以查看“:”之后的字符是否为“=”,如果是,则不会发生参数替换。

我对 Zeos 组件知之甚少,所以我唯一能建议的就是你追踪执行路径并查看异常发生的位置并修补代码以处理 ' 的字符序列: ='

【讨论】:

是的,试过了,但是代码非常复杂,而且我的补丁似乎没有任何作用。 +1 确实是个好主意,只要我足够聪明/有耐心来弄清楚 ZEOS 代码。【参考方案3】:

我不知道这里是否是这种情况,但是您的 SQL 中有错误:IF 中的分号应替换为逗号,AS rank 后缺少逗号,group 是保留字所以当用作表名时,应在 `` 中引用。

【讨论】:

查询实际上是荷兰语,我为了大众的利益翻译了一些东西,没有意识到我会与组发生冲突,将代码修复回荷兰语:-)跨度> 反正这不是问题,只是orig查询是long,所以我把它压缩了。【参考方案4】:

尝试将 TZQuery.ParamCheck 设置为 False。当 ':' 是参数标记时,这将禁用自动创建参数。

【讨论】:

我认为这是 ZEOS 造成的,没有 ParamCheck 它只是跳过参数它的事实然后在参数上失败,但它仍然无法理解 @x:= @y。【参考方案5】:

好的,我破解了一个解决方案。 但它确实很丑,但它仍然有效(排序)。

编辑,这个在 dbForge-MySQL 和 Delphi 中工作

首先,我在 MySQL 中创建了一个存储函数“ranking”,它在@rank 中存储了一个值和/或偏移量。

CREATE DEFINER = 'root'@'localhost'
FUNCTION MyDatabase.Ranking(NewRank INT, Addition INT)
  RETURNS int(11)
BEGIN
  IF NOT(NewRank IS NULL) THEN SET @rank:= NewRank; END IF;
  IF NOT(Addition IS NULL) THEN SET @rank:= @rank + Addition; END IF;
  RETURN @rank;   
END

接下来,我将 ZQuery1 更改为如下内容:

select ranking(null,1) as rank
  ,groep.*
  from groep
join (select ranking(0,null)) r

这行得通,Delphi 中完整的复杂代码也行得通。(-_-') 再次战胜邪恶机器

所以回顾一下。 @varname 是持久的存储过程中(当然是在单个连接中)。 在 select 语句和存储过程之间交换 @varname 在 dbForge 中有效,但在 Delphi 中失败

【讨论】:

您确定问题出在类似@ 的名称上而不是:= 上吗? 你误会了,delphi中的问题是:=,但是会话之间的问题是@variable。

以上是关于在 delphi 查询中使用 @variables:= 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

问题-Delphi2007跟踪变量时提示“E2171 Variable 'APolygon' inaccessible here due to optimization”

mysql中使用show variables同时查询多个参数值?show variables的使用?

语法错误。在查询表达式中-Delphi

在 Delphi 中获取 Advantage Database 查询的进度

MariaDB:使用 SET @variable 从查询创建视图

将 SQL 查询的结果存储在 PHP $variable 中