存储过程(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:如何将单个参数中的多个值传递、使用和执行到存储过程

Informix:在 Java 中使用存储过程

将存储过程从 MS SQL Server 转换为 Informix

从 Informix 中的存储过程调用 Web 服务

Informix 存储过程通用异常处理

在 Informix 中创建 TEMP 存储过程