2009-12-21 30 views
1

我正在做的必須在WHERE子句中搜索具有不同條件的表的應用程序的規範。在存儲過程(Informix)中自定義「WHERE」?

例如(不是實際的表):

類型1

select name from employees where active = true; 

或2型

select name from employees where idBoss = 3; 

我寧願創建一個參數 「類型」 多於一個的存儲過程使用相同的代碼和不同的「where」子句創建兩個存儲過程。

這可能嗎?

注:我有2個程序員;人們只知道Informix,只知道.NET。爲了最大限度地減少問題,我使用存儲過程完成了對數據庫的所有調用,因此db程序員和.net程序員不必彼此需要。

+0

我在上準備一個錯誤......我已經INFORMIX 11也許版本不支持它 – sergiogx 2009-12-21 04:18:03

+0

是的,不支持到11.5 :( – sergiogx 2009-12-21 04:43:05

回答

2

您可以在informix中使用動態SQL - 有關更多詳細信息,請參見this link

DEFINE v_sql VARCHAR(250); 

LET v_sql = "select name from employees"; 

IF IN_PARAMETER = 1 THEN 
    LET v_sql = v_sql || " WHERE active = true" 
ELSE 
    LET v_sql = v_sql || " WHERE idboss = 3" 
END IF; 

PREPARE stmt FROM v_sql; 
EXECUTE stmt; 

FREE stmt; 

如果您不能使用動態SQL,未來最好的事情是:

IF IN_PARAMETER = 1 THEN 
    select name from employees WHERE active = true; 
ELSE 
    select name from employees WHERE idboss = 3; 
END IF; 
+0

.mmm我該如何定義並返回stmt? – sergiogx 2009-12-21 04:04:13

+2

這比存儲過程更好,因爲你更少依賴底層的SQL數據庫,還要防範SQL注入攻擊(http://en.wikipedia.org/wiki/SQL_injection)如果您的查詢的任何部分可能來自不受信任的來源 – 2009-12-21 04:39:48

+0

準備存儲過程中的紅色SQL自Informix 11.5起可用。 – RET 2009-12-21 06:31:53

1

爲什麼要爲這個事情很短的存儲過程?

考慮使用LINQ。哪裏只是一個過濾器,它需要一個返回true/false的lambda /函數。