从Oracle中的Clob列中提取数据

时间:2019-10-07 15:13:13

标签: sql oracle

我在clob列中有如下数据:

$schedule->command('mycommand')->cron('0 17 3,5,7,22 * *');

现在我的要求是将其加载到目标表的3个单独的列中,如下所示:

:1A:CAD22021828,17
:1B:RECEIVE GENERAL IND
11 BEGUM ST 3-15A2
  VILL              AP IND 313 416
:1C:/000061071257      CC
RECEIVER GENERAL FOR IND
C/O PNBB MAIN BRANCH
11 BEGUM ST 3-15A2
AA HYD         APIND

有人可以建议我该怎么做。

这是oracle 11.2

我尝试了以下代码;

1A    - CAD22021828,17
1B    - RECEIVE GENERAL IND 
        11 BEGUM ST 3-15A2
        VILL              AP IND 313 416
1C    - /000061071257      CC
        RECEIVER GENERAL FOR IND
        C/O PNBB MAIN BRANCH
        11 BEGUM ST 3-15A2
        AA HYD         APIND

1 个答案:

答案 0 :(得分:1)

这是对捕获组使用REGEXP_SUBSTR的一种方法:

SELECT
    REGEXP_SUBSTR(mc_clob, ':1A:(.*):1B:', 1, 1, 'n', 1) AS code1A,
    REGEXP_SUBSTR(mc_clob,':1B:(.*):1C:', 1, 1, 'n', 1) AS code1B,
    REGEXP_SUBSTR(mc_clob,':1C:(.*)', 1, 1, 'n', 1) AS code1c
FROM tableA;

Screen capture of result set from demo

Demo

要了解其工作原理,请首先拨打REGEXP_SUBSTR

REGEXP_SUBSTR(mc_clob, ':1A:(.*):1B:', 1, 1, 'n', 1)

这表示要匹配:1A:(.*):1B:,捕获:1A::1B:标记之间的所有内容。第五个参数是n,它告诉Oracle让点在换行符之间匹配。也就是说,(.*)将捕获两个标记之间的所有内容,包括跨行。第六个参数是1,这意味着返回值将是第一个(也是唯一的)捕获组。类似的逻辑适用于对REGEXP_SUBSTR的第二次和第三次调用。