存储过程(Informix)中的自定义“WHERE”?
Posted
技术标签:
【中文标题】存储过程(Informix)中的自定义“WHERE”?【英文标题】:Custom "WHERE" in stored procedure (Informix)? 【发布时间】:2009-12-21 02:51:27 【问题描述】:我正在为必须在 WHERE 子句中搜索具有不同条件的表的应用程序进行规范。
例如(不是实际的表格):
类型 1
select name from employees where active = true;
或输入 2
select name from employees where idBoss = 3;
我宁愿创建一个带有参数“type”的存储过程,也不愿创建两个带有相同代码和不同“where”子句的存储过程。
这可能吗?
注意:我有 2 个程序员;一个人只知道 Informix,一个人只知道 .NET。为了尽量减少问题,我使用存储过程对数据库进行所有调用,这样 db 程序员和 .net 程序员就不必相互依赖了。
【问题讨论】:
我在 PREPARE 上有一个错误...我有 informix 11 可能版本不支持它 【参考方案1】:您可以在 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;
【讨论】:
.mmm 如何定义和返回stmt? 这比存储过程更好,因为您对底层 SQL 数据库的依赖较少。如果查询的任何部分可能来自不受信任的来源,还要提防 SQL 注入攻击 (en.wikipedia.org/wiki/SQL_injection)。 从 Informix 11.5 开始,在存储过程中准备好的 SQL 可用。 这取决于你想用“返回的 stmt”做什么。如果您的意思是,如何执行语句并获得结果,那么您可以使用 INTO 子句将结果分配给变量并使用 RETURN 来返回它们(可能使用 WITH RESUME 来返回许多结果)。您还可以使用 FOREACH 循环(或者,在 11.50 之前的情况下,使用一对 FOREACH 循环)来生成结果。如果要返回查询字符串,则将查询分配给 CHAR 或 VARCHAR(或 LVARCHAR)变量并将其返回给调用者。【参考方案2】:为什么要为这么短的东西创建存储过程?
考虑使用 Linq。 where 只是一个过滤器,它接受一个返回 true/false 的 lambda/function。
【讨论】:
以上是关于存储过程(Informix)中的自定义“WHERE”?的主要内容,如果未能解决你的问题,请参考以下文章
Informix:如何将单个参数中的多个值传递、使用和执行到存储过程