Oracle存储过程 - 根据可选参数动态生成select语句

时间:2012-12-14 17:49:26

标签: oracle stored-procedures plsql

create or replace
PROCEDURE get_txn_by_account_id(
p_ACCOUNT_ID IN txn.ACCOUNT_ID%TYPE DEFAULT NULL
) 

IS

BEGIN
FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID)
LOOP
    dbms_output.put_line(x.txn_ID || ', ' || x.txn_VER_NB);

END LOOP;
END get_txn_by_account_id;

我的存储过程根据一个输入发出一个选择作为搜索条件并输出搜索结果。我的意见是 帐户ID。我想添加4个额外的输入参数(param_a,param_b,param_c,param_d) - 其中至少有两个将是 可选的。

所以我可能会改变我的存储过程声明,如

PROCEDURE get_txn_by_account_id(
p_ACCOUNT_ID IN txn.ACCOUNT_ID%TYPE DEFAULT NULL,
p_PARAM_A IN txn.PARAM_A%TYPE DEFAULT NULL,
p_PARAM_B IN txn.PARAM_B%TYPE DEFAULT NULL,
p_PARAM_C IN txn.PARAM_C%TYPE DEFAULT NULL,
p_PARAM_D IN txn.PARAM_D%TYPE DEFAULT NULL
) 

因此,基于可选参数传递给存储的可选参数,我的SELECT可能具有不同数量的查询参数 PROC。

例如,

FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B, param_c=p_PARAM_C, param_d=p_PARAM_D)
FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_c=p_PARAM_C, param_d=p_PARAM_D)
FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B, param_d=p_PARAM_D)

FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B)

我遇到了问题 - 如何对我的存储过程进行编码,以便SELECT语句根据传递的可选参数进行更改 到存储过程 - 可能是一个字符串构建器,它根据传入proc的可选参数构建一个查询语句, 然后在查询中使用结果字符串?我不确定这是否可行。当然这是一个常见的问题 - 有人有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:3)

FOR x IN ( SELECT * 
           FROM txn 
           WHERE account_id=p_ACCOUNT_ID
             AND (p_PARAM_A is null or param_a=p_PARAM_A)
             AND (p_PARAM_B is null or param_b=p_PARAM_B)
             AND (p_PARAM_C is null or param_c=p_PARAM_C)
             AND (p_PARAM_D is null or param_d=p_PARAM_D) )

答案 1 :(得分:1)

您可以使用以下技巧:

select * from FOO
where
  COLUMN_1 = nvl(pParam1, COLUMN_1)
  and COLUMN_2 = nvl(pParam2, COLUMN_2)
  and ...

这可确保pParam1null时,您的条件始终评估为true。等等。