【问题标题】:Replace pair of % in oracle在 oracle 中替换一对 %
【发布时间】:2017-05-17 13:13:23
【问题描述】:

拜托,我在 Oracle 表中有这个文本(作为 2 条记录)

"Sample text with replace parameter %1%" "You reached 90% of your limit"

我需要用 Oracle 函数中输入参数中的特定文本替换 %1%。事实上,我可以有不止一个替换参数。我也用"Replace this %12% with real value"记录过

我已经编写了这个功能:

IF poc > 0 THEN
  FOR i in 1 .. poc LOOP
    p     := get_param(mString => mbody);
      mbody := replace(mbody,
      '%' || p || '%', parameters(to_number(p, '99')));
  END LOOP;
END IF;

但在这种情况下,我的文本编号 2 有问题。此功能也尝试替换“90%”,然后我收到此错误:

ORA-06502: PL/SQL: numeric or value error: NULL index table key value

可以避免尝试替换“90%”吗?非常感谢您的建议。

最好的问候

PS:Oracle版本:10g(OCI版本:10.2)

【问题讨论】:

  • 是否需要支持多个替换,例如No %1% exists for this %2%?

标签: regex oracle replace plsql


【解决方案1】:

正则表达式可以在这里工作。尝试以下操作并将它们构建到您的脚本中。

SELECT REGEXP_REPLACE( 'Sample text with replace parameter %1%',
                   '\%[0-9]+\%',
                   'db_size' )
FROM   DUAL

SELECT REGEXP_REPLACE( 'Sample text with replace parameter 1%',
                   '\%[0-9]+\%',
                   'db_size' )
FROM   DUAL

模式很简单;查找“%”后跟 1 个或多个数字后跟“%”的模式。

这里唯一的问题是,如果您在每个字符串中进行多个替换并且每个替换都不同。在这种情况下,您需要在每次替换下一个参数时循环字符串。为此,在替换字符串之后将位置和出现参数添加到 REGEXP_REPLACE,例如

REGEXP_REPLACE( 'Sample text with replace parameter %88888888888%','\%[0-9]+\%','db_size',0,1 )

【讨论】:

    【解决方案2】:

    您收到错误是因为parameters(to_number(p, '99'))。你能检查一下p的值吗?
    此外,如果 p=90 那么 REPLACE 将不会尝试替换“90%”。它将替换“%90%”。您如何确定它正在尝试替换“90%”?

    【讨论】:

    猜你喜欢
    • 2021-03-21
    • 2021-05-26
    • 2013-08-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 2010-09-10
    • 2019-10-12
    相关资源
    最近更新 更多