在where子句中具有动态参数的Oracle PL / SQL查询

时间:2018-10-19 08:52:46

标签: oracle plsql

我正在尝试编写一个动态查询,该查询可能具有不同数量的不同类型的参数。我唯一遇到的问题是如果值是一个字符串,因此需要用单引号引起来。我正在使用名为key_ref_的字段的值来确定我的where子句将是什么样。一些示例是:

LINE_NO=1^ORDER_NO=P6002277^RECEIPT_NO=1^RELEASE_NO=1^

PART_NO=221091^PART_REV=R02^

此刻,我将'^'替换为'和',如下所示:

REPLACE( key_ref_, '^' ,' and ' );

然后我正在尝试创建动态查询,如下所示:

EXECUTE IMMEDIATE
'select '||column_name_||' into column_ from '||base_table_||' where '||
 key_ref_ || 'rownum = 1';

这在值不是数字的情况下将不起作用。

我也只添加了“ rownum = 1”来处理多余的“ and”,而不是删除最后一次出现的情况。

1 个答案:

答案 0 :(得分:1)

如果输入中没有波浪符号(〜),则可以尝试以下代码。 如果输入有倾斜,则可以将其替换为输入

中不应存在的其他值

考虑示例中提供的输入。

LINE_NO=1^ORDER_NO=P6002277^RECEIPT_NO=1^RELEASE_NO=1^PART_NO=221091^PART_REV=R02^

使用以下代码

replace(replace(replace('LINE_NO=1^ORDER_NO=P6002277^RECEIPT_NO=1^RELEASE_NO=1^PART_NO=221091^PART_REV=R02^','^','~ and '),'=','=~'),'~',q'[']')

结果将是

LINE_NO='1' and ORDER_NO='P6002277' and RECEIPT_NO='1' and RELEASE_NO='1' and PART_NO='221091' and PART_REV='R02' and 

系统将键入强制转换为数字的字段,这样就不会有任何问题。