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

标签 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 可能具有不同数量的查询参数,具体取决于传递给存储的可选参数 过程。

例如,

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 语句根据传递的可选参数进行更改 到存储过程 - 也许是一个字符串构建器,它根据传入过程的可选参数构建查询语句, 然后在查询中使用结果字符串?我不确定这是否可能。这肯定是一个常见问题—— 有人有什么建议吗?谢谢!

最佳答案

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) )

关于Oracle存储过程-根据可选参数动态生成选择语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13883794/

相关文章:

sql - Oracle - 如何使用 NLSParams 使用 TO_CHAR 函数强制更改语言?

python-3.x - 需要动态执行SQL查询

sql - Oracle数据库触发器编译问题

sql - 新的oracle用户无法访问表

c# - 在 .NET 中捕获存储过程打印输出(不同的模型!)

sql - 如何从 Crystal Reports 调用存储过程?

c# - 如何解决 "Procedure or function has too many arguments specified"异常?

xml - 如何在 PL/SQL 数据库中保存 XML 文件

oracle - 使用 PL\SQL Developer 7.0.2 调试 Oracle 触发器?

oracle - 连接多列且一列为空时的空格-Oracle