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

Oracle存储过程-基于可选参数动态生成select语句,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我的存储过程基于一个输入发出一个select作为搜索条件,并输出搜索结果。我的意见是 帐户ID。我想添加4个额外的输入参数(参数a、参数b、参数c、参数d)-其中至少有两个是 可选 因此,我可能会更改我的存储过程声明,如 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 t

我的存储过程基于一个输入发出一个select作为搜索条件,并输出搜索结果。我的意见是 帐户ID。我想添加4个额外的输入参数(参数a、参数b、参数c、参数d)-其中至少有两个是 可选

因此,我可能会更改我的存储过程声明,如

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;
因此,我的SELECT可能有不同数量的查询参数,这取决于传递给存储库的可选参数 过程

比如说,

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-可能是一个字符串生成器,它基于传递给proc的可选参数构建查询语句, 然后在查询中使用结果字符串?我不确定这是否可能。当然,这是一个普遍的问题-
有人有什么建议吗?谢谢

您可以使用以下技巧:

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

这可确保如果
pParam1
null
,则您的状况总是评估为
true
。等等。

您可以使用以下技巧:

FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B)
select * from FOO
where
  COLUMN_1 = nvl(pParam1, COLUMN_1)
  and COLUMN_2 = nvl(pParam2, COLUMN_2)
  and ...

这可确保如果
pParam1
null
,则您的状况总是评估为
true
。等等。

为什么
p\u账户ID
是可选的?或者换句话说,如果未提供
p\u ACCOUNT\u ID
,您希望返回什么?在这种情况下,我将返回一个空集为什么
p\u ACCOUNT\u ID
是可选的?或者换句话说,如果未提供
p_ACCOUNT_ID
,您希望返回什么?在这种情况下,我将返回一个空集,问题是-例如,如果未将参数A传递到存储过程中-我不一定要搜索作为连接一部分的参数A为null的位置,我只是不想把PARAM_A作为一个查询参数。让优化者注意:p_PARAM_A的结果为null在编译时是已知的。或者我误解了你:如果你使用我的查询,你不是在连接中搜索
PARAM_A is null
,您正在搜索
p_PARAM_A为null
,这在编译时在本例中是正确的。问题是-例如,如果PARAM_A没有传递到存储的进程中-我不一定要在连接中搜索PARAM_A为null的位置,我只是不想把PARAM_A作为一个查询参数。让优化者注意:p_PARAM_A的结果为null在编译时是已知的。或者我误解了你:如果你使用我的查询,你不是在连接中搜索
PARAM_A is null
,您正在搜索
p_PARAM_A为null
,这在编译时在本例中是正确的。
select * from FOO
where
  COLUMN_1 = nvl(pParam1, COLUMN_1)
  and COLUMN_2 = nvl(pParam2, COLUMN_2)
  and ...