这可能更像是一个“最佳实践”问题,而不是真正的代码问题。
我有一个更新表的存储过程,但需要来自另一个表的几个值。
前两个选择从表中获取值,然后在update语句中使用。
选择陈述:
Select @iStatusDropDownValueID = iDropDownValueID
From DropDownValue
Inner Join DropDownValueType On DropDownValue.iDropDownValueTypeID = DropDownValueType.iDropDownValueTypeID
Where DropDownValueType.vchDropDownValueTypeName = 'Status'
AND DropDownValue.vchDropDownValueName = 'Scheduled'
AND DropDownValue.tiRecordStatus = 1
And DropDownValueType.tiRecordStatus = 1
Select @iLastStatusDropDownValueID = iDropDownValueID
From DropDownValue
Inner Join DropDownValueType On DropDownValue.iDropDownValueTypeID = DropDownValueType.iDropDownValueTypeID
Where DropDownValueType.vchDropDownValueTypeName = 'Status'
AND DropDownValue.vchDropDownValueName = 'CriticalErrorOccurred'
AND DropDownValue.tiRecordStatus = 1
And DropDownValueType.tiRecordStatus = 1
更新声明:
Update Schedule
Set
iStatusDropDownValueID = @iStatusDropDownValueID,
iLastStatusDropDownValueID = @iLastStatusDropDownValueID,
iCurrentLogID = @iCurrentLogID,
dtNextDate = @dtNextDate,
dtLastDate = @dtLastDate,
iRetryCount = @iRetryCount,
iFailedCount = @iFailedCount,
iBusyRetryCount = @iBusyRetryCount,
vchUpdateBy = @vchUpdateBy,
dtUpdateDate = @dtLastDate
WHERE
iScheduleID = @iScheduleID
首先,前两个select语句检索的值始终相同。所以它们可以通过代码本身传递。我不知道这会加快速度,只需使整个存储过程更好,更容易阅读。
其次,如果“值名称”应该更改,则此存储过程将中断(这是可能的,但不常见)。
我正在寻找有关这种情况的最佳实践的任何见解。
答案 0 :(得分:1)
我个人总是声明我的变量而不使用@vars @vars就像变种一样,它们不能保护你免受错别字的侵害 如果您使用显式声明的变量,MySQL将警告您不要打字错误,您的vars将被输入,使您的意图更清晰,您的代码稍快一些。
CREATE PROCEDURE (IN a INTEGER)
BEGIN
DECLARE var1 INTEGER;
DECLARE var2 INTEGER;
DECLARE initialized_var INTEGER DEFAULT 0;
SET var = 1; //to just set a var.
SELECT myfield INTO var2 FROM atable WHERE a <> atable.b ORDER BY b LIMIT 1;
//Always use `limit 1` here.
//use `select into ...order by .. limit 1` to make you queries repeatable.
//The limit 1 also speeds up things a bit.
//make sure to test SELECT INTO vars against `null`
IF var2 IS NULL THEN .....
如果需要使用一个存储过程的结果,为什么不创建存储函数。
CREATE FUNCTION pi RETURNS float
BEGIN
RETURN 3.14;
END $$
然后你可以写一个像这样的查询:
INSERT INTO atable (math_constants) VALUES (pi());
答案 1 :(得分:0)
也许我在这里遗漏了一些东西,但是如果要检索的值真的是不变的,为什么要在或中检索它们呢?你可以简单地对它们进行硬编码。
在这种情况下,我倾向于这样做,因为它不仅消除了检索查询的开销,而且消除了潜在的失败点(您在问题中提到的“值名称”更改)。