是否可以使用函数进行 regexp_replace ?

2024-01-03

我想对字符串中的值进行一些计算,最后替换它们。 Oracle 正则表达式似乎很好,但 \1 在所有计算结束时都会被评估。所以我想知道在将其传递给函数之前是否可以进行评估?

set serveroutput on

declare
  l_foo varchar2(4000);

  function f_test(i_t varchar2) return varchar2
  is
  begin
    dbms_output.put_line('given parameter: ' || i_t);
    return upper(i_t);
  end;
begin
  l_foo := regexp_replace(
    'http://www.scoach.com/${asset_type}/${ISIN}?eventtarget=${target}ANDeventvalue=${target_value}'
   ,'\$\{([[:alpha:]_]+)\}'
   ,f_test('\1')
  );

  dbms_output.put_line(l_foo);
end;

给你一个像这样的结果:

given parameter: \1
http://www.scoach.com/asset_type/ISIN?eventtarget=targetANDeventvalue=target_value
PL/SQL procedure successfully completed.

看起来将反向引用传递到 reg ex 函数中的函数中是行不通的(至少在我的测试中,并且找不到任何可以正常工作的东西(尽管有这个)link http://database.itags.org/oracle/190340/但很难称之为参考)

但你可以这样做,但处理速度会很慢,但它应该可以工作。我基于这个样本link http://www.adp-gmbh.ch/blog/2005/december/22.html

将服务器输出设置为打开

declare
  l_foo varchar2(4000);

  searchString varchar2(4000) ;
  searchPattern varchar2(4000) ;

  /*type matchItem is object(
       position number ,
         matchedPattern varchar2(4000));*/
  type matched is table of varchar2(100);


  l_foo2 matched;

  function f_test(i_t varchar2) return varchar2
  is
  begin
    dbms_output.put_line('given parameter: ' || i_t);
    return upper(i_t);
  end f_test;

function getNMatch(
      str    in varchar2, 
     pat    in varchar2,
      occr   in number , 
     flags in varchar2 := null
) return varchar2 is
    pos_match_begin  number;
    pos_match_end    number;
     str_used         varchar2(4000);
begin

         pos_match_begin := regexp_instr (
            str,   -- 
            pat, 
            1,     -- start position
            occr,     -- occurance
            0,     -- return option
            flags
         );

         pos_match_end   := regexp_instr (
            str,   -- 
            pat, 
            1,     -- start position
            occr,     -- occurance
            1,     -- return option
            flags
         );
         if (pos_match_begin >= 0 and pos_match_end > 0) THEN 
            str_used := substr(str, pos_match_begin, pos_match_end - pos_match_begin);
         ELSE
           str_used := null;
         end if;
         return str_used ; 

end getNMatch;

 function match (
     str    in varchar2, 
     pat    in varchar2, 
     flags in varchar2 := null) return matched is 

    ret matched;

    i number ;
     regCount number ;

      begin
        regCount :=  regexp_count(str, pat) ;
      ret := matched();

       for i in 1 .. regCount LOOP
             ret.extend() ;
              ret(i) := getNMatch(str, pat , i, flags); 
       END LOOP;

         return ret;
     end match;

 function reMatch (
     str    in varchar2, 
     pat    in varchar2, 
     flags in varchar2 := null) return varchar2
      is
      ret matched;
      str_out varchar2(4000);
      begin
      str_out := str;
        ret := match(str,pat,flags);

         for i in REVERSE 1..ret.count loop
             str_out  := regexp_replace(str_out, pat, f_test(ret(i)),1, i);
         end loop;
         return str_out ;--ret;      
      end reMatch;

begin
   searchString := 'http://www.scoach.com/${asset_type}/${ISIN}?eventtarget=${target}ANDeventvalue=${target_value}';
   searchPattern:= '\$\{([[:alpha:]_]+)\}';

    l_foo := reMatch( searchString,
     searchPattern);
    --this example will call a custom function that will auto-change the entire string as defined by you
    dbms_output.put_line(l_foo);

   --here is another example that will 'allow' you to use the count of the table's position as a pseudo backreference to pull out your items and scrub them as desired
   l_foo2 :=  match(searchString ,searchPattern);
  dbms_output.put_line('\4/\3,\2: \1 || ' || f_test(l_foo2(4)) || '/' || l_foo2(3) || ',' || l_foo2(2) || ': ' || l_foo2(1));
end;

这导致

given parameter: ${target_value}
given parameter: ${target}
given parameter: ${ISIN}
given parameter: ${asset_type}
http://www.scoach.com/${ASSET_TYPE}/${ISIN}?eventtarget=${TARGET}ANDeventvalue=${TARGET_VALUE}
given parameter: ${target_value}
\4/\3,\2: \1 || ${TARGET_VALUE}/${target},${ISIN}: ${asset_type}

这是在 11gR1 中完成的。您可以看到,我只是循环执行此操作并将结果放入 varchar2 表中,然后使用函数结果从那里进行逐行替换。 (请注意,可能有更有效的方法可以做到这一点,我并不是在追求效率,而是只是为了让它发挥作用)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以使用函数进行 regexp_replace ? 的相关文章

  • 在 Oracle SQL 中执行 MERGE 时,如何更新 SOURCE 中不匹配的行?

    我有一个main数据库和一个report数据库 我需要同步一个表main into report 但是 当项目在main数据库 我只想设置一个IsDeleted标志在report数据库 执行此操作的优雅方法是什么 我目前正在使用 MERGE
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • 如何在sql中提取周数

    我有一个 varchar2 类型的转换列 其中包含以下主菜 01 02 2012 01 03 2012 etc 我使用 to date 函数将其转换为另一列中的日期格式 这是我得到的格式 01 JAN 2012 03 APR 2012 当我
  • 如何在可能为空值的字段上创建唯一索引(Oracle 11g)?

    这是包含 3 列的示例表 ID UNIQUE VALUE UNIQUE GROUP ID 我希望可以允许以下记录 1 NULL NULL 2 NULL NULL or 3 NULL 7 4 123 7 or 注意 此条件不允许unique
  • sqlldr.exe 不适用于 Windows 10

    我最近通过自定义安装安装了 Oracle 数据库客户端 12 1 0 2 0 winx64 并仅选择包括 SQL Loader 等在内的数据库实用程序 但是当我尝试执行 sqlldr exe 时 出现以下错误 在网上搜索后 我从所有站点 即
  • ORACLE:未找到数据——但数据存在

    调试包过程 当实际上有数据时却找不到数据 仅测试 SELECT SELECT trim trailing from GL SECURITY as DUMMY FROM b2k user b2k WHERE sms username FUCH
  • 在 Toad 中调试 PLSQL

    我一直在使用 PL SQL 为 Oracle db 创建包 并且我正在尝试找到一种在不使用 put line 命令的情况下调试 PL SQL 包的好方法 是否有人对如何成功调试Toad 或 SQLPlus 上的 PL SQL 包 根据 TO
  • 如何在Oracle中从表中选择列,*?

    我正在创建很多脚本 有时为了检查表是否根据我的需要进行更新 我会即时编写几个 SELECT 语句 在 SQL SERVER 中你可以这样写 SELECT Column1 FROM MY TABLE 出于可见性原因 这很有用 但是这似乎在 O
  • Hibernate 本机查询 - char(3) 列

    我在 Oracle 中有一个表 其中列 SC CUR CODE 是 CHAR 3 当我做 Query q2 em createNativeQuery select sc cur code sc amount from sector cost
  • 如何计算选择查询的最佳获取大小

    在 JDBC 中 默认获取大小为 10 但我想当我有一百万行时 这不是最佳获取大小 据我所知 获取大小太低会降低性能 但如果获取大小太高也会降低性能 我怎样才能找到最佳尺寸 这对数据库端有影响吗 它会占用大量内存吗 如果您的行很大 请记住
  • 如何更新 pl/sql 中嵌套表的列? [复制]

    这个问题在这里已经有答案了 我正在尝试在表中创建一个可以存储多个值的列 如下所示 我有一个学生id std和一个名为marks可以采用几个值 例如2 3 4 我想更新此列表以添加另一个标记2 3 4 5但我不知道怎么做 我如何更新专栏mar
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • Oracle即时客户端和Oracle客户端之间的区别

    Oracle即时客户端和Oracle客户端有什么区别 你能给我解释一下吗 谢谢 Oracle 客户端附带一个安装程序和许多可执行文件 例如 sqlplus tnsping 很完整而且很大 Oracle Instant 客户端是一个基本的轻量
  • 根据由另一列分组的不同列的最大值获取值[重复]

    这个问题在这里已经有答案了 我想根据由另一列分组的不同列的最大值来获取列的值 我有这张表 KEY NUM VAL A 1 AB B 1 CD B 2 EF C 2 GH C 3 HI D 1 JK D 3 LM 并想要这样的结果 KEY V
  • 存储过程错误 PLS-00201:必须声明标识符“UTL_HTTP”

    我正在尝试创建一个从服务请求一些 XML 数据的存储过程 我在网上找到了几个示例 它们都指向使用这个 UTL HTTP 包 但是 每次我尝试用它来编译我的存储过程时 我都会收到错误 PLS 00201 identifier UTL HTTP
  • 执行 `EXECUTE IMMEDIATE ` Oracle 语句出现错误

    我是 Oracle 的新手 当我执行以下语句时 BEGIN EXECUTE IMMEDIATE SELECT FROM DUAL END 我得到错误为 命令中从第 2 行开始出错 立即开始执行 从双选择 结尾 错误报告 ORA 00911
  • 如何使用 ADO 连接字符串以 SYS 身份连接到 Oracle 数据库?

    我正在尝试这个 Provider MSDASQL 1 Persist Security Info False User ID sys Password pwd Initial Catalog DATABASE Data Source Odb
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • Oracle SQL PLS-00049:错误的绑定变量

    我收到此错误 这似乎是列拼写问题 然而 我 99 确信我拼写的所有内容都是正确的 但我看不出有任何理由会出现我所犯的错误 这是来源 CREATE OR REPLACE TRIGGER update qoh trigger AFTER INS
  • 在 sqlplus 会话中的 pl/sql 代码块中切换用户

    我有一个 pl sql 脚本 我从 sqlplus 会话中作为 sysdba 运行 在执行脚本期间 我想切换到另一个用户 以便我可以为该用户创建一些数据库链接 完成此操作后 脚本应返回 sysdba 进行一些完成 我尝试使用以下内容 BEG

随机推荐

  • MVC 4:验证失败时返回引导模式内部的部分视图

    我正在使用 MVC 4 和 SimpleMembership 用于帐户处理 当用户登录网页时 我正在使用 Boostrap V3 2 0 模式 模态工作正常 甚至通过 Ajax BeginForm 处理 Modelstate 验证我遇到的问
  • 设计控制器导轨

    我在 ruby 1 8 7 上使用 Rails 3 并用于身份验证 设计 1 1 3 但这是我正在构建的一个相当大的社区网站 因此我有一个用于配置文件的表和一个用于用户的表 每次用户注册时 它也应该生成一个配置文件 但在设计中我不允许使用控
  • SCons 无法选择编译器(MinGW)[重复]

    这个问题在这里已经有答案了 我有一个简单的 SConstruct 文件 其中包含以下代码 path C MinGW bin env Environment ENV PATH path Program target myprogram sou
  • 在 Kivy 中显示 numpy/opencv/matplotlib 图像

    如何在 Kivy 中以标准 numpy opencv matplotlib 格式显示图像 Kivy 使用不同的图像内存布局 我不知道是哪一种 下面的代码完全可以正常工作 图像是使用 cv2 VideoCapture 捕获的 我认为图像是BG
  • Windows XP 上的 Vb6 http post 请求

    我在使用 VB6 发送 POST 请求时遇到问题 下面的代码在 Windows7 上运行正常 但在 Windows XP 上运行时没有任何运行时错误 并且发送数据包 但看起来没有在数据包中附加发布数据 我的代码是这样的 Set xmlhtt
  • 如何在 Windows 上设置 Python 2.6 的安装工具?

    有没有办法在 Windows 中安装 Setuptools for Python 2 6 而无需 exe 安装程序 目前还没有构建这个工具 Setuptools 的维护者表示 他可能需要一段时间才能实现它 有谁知道安装它的方法吗 第一个选项
  • 获取StorageFolder中的文件数量

    我正在使用 Windows Phone 8 1 RT 应用程序 我想知道如何获取StorageFolder 内的文件数量 我知道我们可以使用StorageFolder GetFilesAsync 然后检查返回的列表的计数 但由于此方法花费的
  • SSIS 配置连接字符串

    我的一些包裹遇到了问题 基本布局是连接字符串存储在数据库中的 SSIS 配置表中 我最近注意到 oledb 连接的服务器名称似乎保持静态 我看到过将包从一个环境移动到另一个环境时验证失败的情况 如果我将密码更改为第一个环境中使用的密码 它将
  • 获取一个返回两个整数的函数

    我正在编写一个函数 我希望它返回两个整数作为结果 但是 我无法让它做到这一点 有人可以帮助我吗 这是我最好的镜头 public static int calc int s int b int c int d int g if s g ret
  • 如何打印悬空指针以进行演示?

    我试图向某人解释为什么他们有一个悬空指针以及 free 实际上是如何工作的 指针是值 因此是按值传递的 但为此我认为我需要一种打印指针的方法t 不确定 就像这样printf p ptr memcpy 可以解决这个问题吗 char buf1
  • 警告消息:在文件中(文件,“rt”)[重复]

    这个问题在这里已经有答案了 我在尝试着将 CSV 文件导入到项目图表中 我在用着RMac OS X 上的 2 15 2 第一种方式尝试过 我尝试运行以导入 CSV 文件的脚本是这样的 group4 lt read csv XXXX csv
  • hbase 作为 Web 应用程序中的数据库

    关于在真实的 Web 应用程序中使用 hadoop 或相关技术的一个大问题 我只是想了解 Web 应用程序如何使用 hbase 作为其数据库 我的意思是 这是大数据应用程序所做的事情 还是他们使用普通数据库并仅使用这些技术进行分析 拥有一个
  • 从 C# 代码中访问 $(SolutionDir) 和 $(DevEnvDir) 等预构建宏的简单方法是什么?

    现在我正在考虑在预构建事件中写入文件的路径 然后在代码中读取该文件 但我想知道是否有更简单更优雅的方法 编辑 这是一种后续行动帮助一步构建所有项目 安装程序 NET WiX https stackoverflow com questions
  • 使用seaborn包关闭jointplot上的边际分布轴

    我喜欢这个特定的绘图以及将函数传递给 stat func 关键字以快速绘制和可视化变量之间关系的能力 但有一点 如何 关闭 或不绘制边际分布轴 它看起来不错 但有时我不想要这个功能 例如使用以下代码 import numpy as np i
  • 用于插入的 Guava 缓存侦听器

    我们会发现拥有一个非常有用AddListener补充RemovalListener在谷歌番石榴中 有没有合适的替代品AddListener这将补充RemovalListener 您可以自己提供 只需将您的自定义侦听器传递到您的计算即可Fun
  • TTimer.OnTimer 事件处理程序是可重入的吗?

    我的应用程序中有一个 TTimer 每 2 秒触发一次并调用我的事件处理程序 HandleTimerEvent HandleTimerEvent 函数会修改共享资源 并且在返回之前可能需要 10 秒的时间来执行 此外 我有时会在事件处理程序
  • 我可以将一个枚举限制为另一个枚举的某些情况吗?

    假设我有一家面包店和原料库存 enum Ingredient case flower 1 case sugar 2 case yeast 3 case eggs 4 case milk 5 case almonds 6 case choco
  • 应用商店连接操作错误资产验证失败

    您好 我在使用 xCode 上传存档时遇到此错误 有人以前遇到过这个错误吗 谢谢 我从 Organizer 导出 IPA 并使用运输车 https apps apple com tr app transporter id1450874784
  • 如何使用 Zend\Form\Factory 在 ZF2 字段集中设置过滤器和验证器?

    我使用 Zend Form Factory 在 zend Framework2 中创建表单 factory new Zend Form Factory factory gt createForm array elements gt arra
  • 是否可以使用函数进行 regexp_replace ?

    我想对字符串中的值进行一些计算 最后替换它们 Oracle 正则表达式似乎很好 但 1 在所有计算结束时都会被评估 所以我想知道在将其传递给函数之前是否可以进行评估 set serveroutput on declare l foo var