我需要这个程序的帮助。这是一个片段。
基本上,基于输入参数,我需要动态定义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
答案 0 :(得分:0)
首先,为什么需要在查询中添加通配符?为什么不将它添加到绑定变量?像
这样的东西 OPEN c_dbuser
FOR query_str
USING keyID || '%', keyID2 || '%';
当然,您无法使用您发布的代码段执行此操作。如果keyID2
为NULL
,则您正在组装的SQL语句中只有一个绑定变量,因此您只需要在USING
部分中传递一个变量EXECUTE IMMEDIATE
声明。我不知道您是否无意中遗漏了ELSE
条款,该条款会在keyID2 IS NULL
添加备用谓词,以便您可以使用可变数量的USING
参数,或者如果您确实需要使用dbms_sql
。