2011-08-29 211 views
0

这可能更像是一个“最佳实践”问题,而不是真正的代码问题。在另一个存储过程中获取存储过程的参数。

我有一个存储过程来更新表,但需要从另一个表中的几个值。

前两个选项从表中获取值,然后用于更新语句中。

的选择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语句检索的值总是相同的。所以他们可以通过代码本身传入。我不知道这会加快速度,只是让整个存储过程更好,更易于阅读。其次,如果“数值名称”应该改变,这个存储过程将会中断(这是可能的,但不经常)。

我在寻找任何有关这种情况的最佳做法的见解。

回答

1

我个人总是声明我的变量,不要使用@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

+0

你是对的,他们不会失败。我在想,如果价值因任何原因而改变。但在这种情况下,该值永远不会改变下拉列表名称。 –

0

也许我失去了一些东西,但如果检索的值是真正不变的,为什么在通过他们或检索它们在所有?您可以简单地将它们硬编码。

在这种情况下,我倾向于这样做,因为它不仅消除了检索查询的开销,还消除了潜在的故障点(您提到的“值名称”更改问题)。

+0

失败正是发生的事情。代码为这两个值传递一个0值,然后有一个额外的条件语句来获取这些值(如果需要的话)。条件不正确,因此值始终为0,导致外键异常。 –

相关问题