我正在为MySQL编写一个存储过程,它需要一个与表中字段同名的输入参数。我知道我可以将该字段称为tableName.fieldName
。但是,当在程序中查询该表时,如何以非模糊的方式引用变量?
Table files
+----+---------+---------+
| id | ownerId | content |
+----+---------+---------+
CREATE PROCEDURE getFilesOfOwner(IN ownerId INT)
BEGIN
SELECT * FROM files WHERE files.ownerId = ___________ <- ?
...
答案 0 :(得分:1)
如果过程参数的名称与表的字段名称相同,则在对该表的查询中使用该标识符将被MySQL解释为对变量的引用,即不正式需要限定符,但是这只是特定于供应商的冲突解决方案。
保持参数名称相同的解决方案是在过程范围内声明在范围内,但是在所需名称下将其公开给调用者:
CREATE PROCEDURE getFilesOfOwner(IN ownerId INT)
BEGIN
DECLARE _ownerId INT DEFAULT ownerId;
SELECT * FROM files WHERE files.ownerId = _ownerId
...
这需要一行额外的代码,但它使程序签名保持清洁,不受特定于实现的细节的影响。