在另一个存储过程中获取存储过程的参数。
这可能更像是一个“最佳实践”问题,而不是真正的代码问题。在另一个存储过程中获取存储过程的参数。
我有一个存储过程来更新表,但需要从另一个表中的几个值。
前两个选项从表中获取值,然后用于更新语句中。
的选择statments:
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语句:
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语句检索的值总是相同的。所以他们可以通过代码本身传入。我不知道这会加快速度,只是让整个存储过程更好,更易于阅读。其次,如果“数值名称”应该改变,这个存储过程将会中断(这是可能的,但不经常)。
我在寻找任何有关这种情况的最佳做法的见解。
我个人总是声明我的变量,不要使用@vars。
@vars就像变种,他们不保护你免受错别字。
如果你使用明确声明的变量,MySQL会警告你反对错别字,你的变量将被打字,使你的意图更清晰,你的代码稍快。
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());
也许我失去了一些东西,但如果检索的值是真正不变的,为什么在通过他们或检索它们在所有?您可以简单地将它们硬编码。
在这种情况下,我倾向于这样做,因为它不仅消除了检索查询的开销,还消除了潜在的故障点(您提到的“值名称”更改问题)。
失败正是发生的事情。代码为这两个值传递一个0值,然后有一个额外的条件语句来获取这些值(如果需要的话)。条件不正确,因此值始终为0,导致外键异常。 –
你提出了一些我不知道你可以做的事情。太棒了!我看到使用函数的唯一问题是,如果名称更改,函数仍然会中断。 –
@Andy,为什么函数会中断?只要在失败时返回null,然后在函数中测试它。 – Johan
你是对的,他们不会失败。我在想,如果价值因任何原因而改变。但在这种情况下,该值永远不会改变下拉列表名称。 –