动态存储过程 - 如果像这样动态构建,如何在like子句中插入%?

时间:2014-03-14 21:55:56

标签: sql oracle dynamic

我需要这个程序的帮助。这是一个片段。

基本上,基于输入参数,我需要动态定义sql - 选择值以及要包含的条件。

我只是在这里包含keyID,但计划有一堆不同的参数重新定义(添加)到where子句。

问题 - 如何在输入参数末尾插入%?

为什么我提出这个问题的理由:

这是一个内联网应用程序,所以我不关心恶意SQL注入。

我不关心可扩展性。

我这样做的原因是我需要知道如何在一个过程中做一个动态的SQL。

在我的特定情况下,我将根据提供给我的其他信息运行两个单独的查询。

所以我的选择是制作大量的IF ELSE条件(可能是16个不同的查询),或者根据输入参数进行更简单的动态查询。

请告知。

create or replace
PACKAGE BODY PK_SEARCH AS
 PROCEDURE DELETEME_SP_SEARCH(keyID IN varchar2, keyID2 IN varchar2,
       c_dbuser OUT SYS_REFCURSOR)  
IS
   query_str VARCHAR2(10000);

BEGIN

  query_str := 'select * '
  || 'from customer '
  || 'where key like :a ';  --PROBLEM

   IF keyID2 IS NOT NULL THEN
    query_str := query_str || 'and key2 like :b ';
   END IF;   

    OPEN c_dbuser FOR
         query_str USING keyID, keyID2;
END;


END PK_SEARCH

1 个答案:

答案 0 :(得分:0)

首先,为什么需要在查询中添加通配符?为什么不将它添加到绑定变量?像

这样的东西
 OPEN c_dbuser 
  FOR query_str
USING keyID || '%', keyID2 || '%';

当然,您无法使用您发布的代码段执行此操作。如果keyID2NULL,则您正在组装的SQL语句中只有一个绑定变量,因此您只需要在USING部分中传递一个变量EXECUTE IMMEDIATE声明。我不知道您是否无意中遗漏了ELSE条款,该条款会在keyID2 IS NULL添加备用谓词,以便您可以使用可变数量的USING参数,或者如果您确实需要使用dbms_sql