【问题标题】:Custom "WHERE" in stored procedure (Informix)?存储过程(Informix)中的自定义“WHERE”?
【发布时间】: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 可能版本不支持它

标签: sql stored-procedures informix


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多