正则表达式函数
正则表达式使用标准化的语法约定来指定匹配字符串的模式。在Oracle中,正则表达式通过一组允许用户搜索和操作字符串数据的SQL函数来实现。
DSC可迁移REGEXP_INSTR、REGEXP_SUBSTR和REGEXP_REPLACE正则表达式,详情如下:
- 不支持包含sub_expr参数的Regexp(REGEXP_INSTR和REGEXP_SUBSTR)。若输入脚本包含sub_expr,则DSC将为其记录为错误。
- Regexp(REGEXP_INSTR、REGEXP_SUBSTR和REGXP_REPLACE)使用match_param参数来设置默认的匹配行为。DSC中,该参数仅支持“i”值(匹配不区分大小写)和“c”值(匹配区分大小写),不支持其他值。
- Regexp(REGEXP_INSTR)使用return_option参数为regexp设置匹配的返回值。DSC仅支持此参数设为0,不支持其他值。
REGEXP_INSTR
REGEXP_INSTR扩展了INSTR函数的功能,支持搜索字符串的正则表达式模式。DSC可迁移含有2到6个参数的REGEXP_INSTR。
sub_expr参数(参数#7)在Oracle中可用,但不支持迁移。如果输入脚本包含sub_expr,DSC会将其记录为错误。
支持将return_option设为0,不支持其他值。
1 2 3 4 5 6 7 8 9 |
REGEXP_INSTR( string, pattern, [start_position,] [nth_appearance,] [return_option,] [match_param,] [sub_expr] ) |
Bulk操作
输入:REGEXP_INSTR
1 2 3 4 5 |
SELECT REGEXP_INSTR( 'TechOnTheNet is a great resource' ,'t' ) FROM dual ; |
输出:
1 2 3 4 5 6 7 8 |
SELECT MIG_ORA_EXT.REGEXP_INSTR ( 'TechOnTheNet is a great resource' ,'t' ) FROM dual ; |
输入:REGEXP_INSTR,使用7个参数(无效)
1 2 3 4 5 6 7 |
SELECT Empno ,ename ,REGEXP_INSTR( ename ,'a|e|i|o|u' ,1 ,1 ,0 ,'i' ,7 ) AS Dname FROM emp19 ; |
输出:
输入表达式含有7个参数,但MT仅允许REGEXP_INSTR包含2到6个参数,因此会记录错误 “Seven(7) arguments for REGEXP_INSTR function is not supported."。
1 2 3 4 5 6 7 |
SELECT Empno ,ename ,REGEXP_INSTR( ename ,'a|e|i|o|u' ,1 ,1 ,0 ,'i' ,7 ) AS Dname FROM emp19 ; |
BLogic操作
输入:REGEXP_INSTR
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE OR REPLACE FUNCTION myfct RETURN VARCHAR2 IS res VARCHAR2(200) ; BEGIN res := 100 ; INSERT INTO emp19 RW(RW.empno,RW.ename,dname) SELECT res, RWN.ename key , regexp_instr(ename ,'[ae]',4,2,0, 'i') as Dname FROM emp19 RWN ; RETURN res ; END ; / |
输出:
1 2 3 4 5 6 7 8 9 10 |
CREATE OR REPLACE FUNCTION myfct RETURN VARCHAR2 IS res VARCHAR2 ( 200 ) ; BEGIN res := 100 ; INSERT INTO emp19 ( empno ,ename ,dname ) SELECT res ,RWN.ename "KEY" ,MIG_ORA_EXT.REGEXP_INSTR ( ename ,'[ae]' ,4 ,2 ,0 ,'i' ) as Dname FROM emp19 RWN ; RETURN res ; END ; / |
REGEXP_SUBSTR
REGEXP_SUBSTR通过支持搜索字符串的正则表达式模式来扩展SUBSTR函数的功能。可迁移含有2到5个参数的REGEXP_SUBSTR。
sub_expr参数(参数#6)在Oracle中可用,但不支持迁移。如果输入脚本包含sub_expr,则DSC会将其记录为错误。
支持将match_param设为“i”(匹配不区分大小写)和“c”(匹配区分大小写),不支持其他值。
1 2 3 4 5 6 7 8 |
REGEXP_SUBSTR( string, pattern, [start_position,] [nth_appearance,] [match_param,] [sub_expr] ) |
Bulk操作
输入:REGEXP_SUBSTR
1 2 3 4 5 6 |
SELECT Ename ,REGEXP_SUBSTR( 'Programming' ,'(\w).*?\1' ,1 ,1 ,'i' ) FROM emp16 ; |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT Ename ,MIG_ORA_EXT.REGEXP_SUBSTR ( 'Programming' ,'(\w).*?\1' ,1 ,1 ,'i' ) FROM emp16 ; |
输入:REGEXP_SUBSTR
1 2 3 4 5 |
SELECT REGEXP_SUBSTR( '1234567890' ,'(123)(4(56)(78))' ,1 ,1 ,'i' ) "REGEXP_SUBSTR" FROM DUAL ; |
输出:
1 2 3 4 5 6 7 8 9 10 11 |
SELECT MIG_ORA_EXT.REGEXP_SUBSTR ( '1234567890' ,'(123)(4(56)(78))' ,1 ,1 ,'i' ) "REGEXP_SUBSTR" FROM DUAL ; |
输入:REGEXP_SUBSTR,使用6个参数(无效)
SELECT REGEXP_SUBSTR( '1234567890' ,'(123)(4(56)(78))' ,1 ,1 ,'i' ,1 ) "REGEXP_SUBSTR" FROM DUAL ;
输出:
输入表达式含有6个参数,但MT仅支持REGEXP_SUBSTR含有2到5个参数,所以会记录错误" Error message :Six(6) arguments for REGEXP_SUBSTR function is not supported."。
1 2 3 4 5 |
SELECT REGEXP_SUBSTR( '1234567890' ,'(123)(4(56)(78))' ,1 ,1 ,'i' ,1 ) "REGEXP_SUBSTR" FROM DUAL ; |
BLogic操作
输入:REGEXP_SUBSTR
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE OR REPLACE FUNCTION myfct RETURN VARCHAR2 IS res VARCHAR2(200) ; BEGIN res := 100 ; INSERT INTO emp19 RW(RW.empno,RW.ename,dname) SELECT res, RWN.ename key ,REGEXP_ SUBSTR ('TechOnTheNet', 'a|e|i|o|u', 1, 1, 'i') as Dname FROM emp19 RWN ; RETURN res ; END ; / |
输出:
1 2 3 4 5 6 7 8 9 10 11 |
CREATE OR REPLACE FUNCTION myfct RETURN VARCHAR2 IS res VARCHAR2 ( 200 ) ; BEGIN res := 100 ; INSERT INTO emp19 ( empno ,ename ,dname ) SELECT res ,RWN.ename "KEY" ,MIG_ORA_EXT.REGEXP_ SUBSTR ( 'TechOnTheNet' ,'a|e|i|o|u' ,1 ,1 ,'i' ) as Dname FROM emp19 RWN ; RETURN res ; END ; / |
支持将match_param设为“i”(匹配不区分大小写)和“c”(匹配区分大小写),不支持其他值。
1 2 3 4 5 6 7 8 |
REGEXP_REPLACE( string, pattern, [replacement_string,] [start_position,] [nth_appearance,] [match_param] ) |
Bulk操作
输入:REGEXP_REPLACE
1 2 3 4 5 6 7 8 |
SELECT testcol ,regexp_replace( testcol ,'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})' ,'(\1) \2-\3' ) RESULT FROM test WHERE LENGTH( testcol ) = 12 ; |
输出:
1 2 3 4 5 6 7 8 9 10 11 12 |
SELECT testcol ,MIG_ORA_EXT.REGEXP_REPLACE ( testcol ,'([[:digit:]]{3})\.([[:digit:]]{3})\. ([[:digit:]]{4})' ,'(\1) \2-\3' ) RESULT FROM test WHERE LENGTH( testcol ) = 12 ; |
输入:REGEXP_REPLACE
1 2 3 4 5 |
SELECT UPPER( regexp_replace ( 'foobarbequebazilbarfbonk barbeque' ,'(b[^b]+)(b[^b]+)' ) ) FROM DUAL ; |
输出:
1 2 3 4 5 |
SELECT UPPER( MIG_ORA_EXT.REGEXP_REPLACE ( 'foobarbequebazilbarfbonk barbeque' ,'(b[^b]+)(b[^b]+)' ) ) FROM DUAL ; |
输入:REGEXP_REPLACE,使用7个参数(无效)
1 2 3 4 5 |
SELECT REGEXP_REPLACE( 'TechOnTheNet' ,'a|e|i|o|u' ,'Z' ,1 ,1 ,'i' ,'(\1) \2-\3' ) AS First_Occurrence FROM emp ; |
输出:
输入表达式含有7个参数,但MT仅支持REGEXP_REPLACE含有2至6个参数,因此会记录错误“Too many arguments for REGEXP_REPLACE function [Max:6 argument(s) is/are allowed].”
1 2 3 4 5 |
SELECT REGEXP_REPLACE( 'TechOnTheNet' ,'a|e|i|o|u' ,'Z' ,1 ,1 ,'i' ,'(\1) \2-\3' ) AS First_Occurrence FROM emp ; |
BLogic操作
输入:REGEXP_REPLACE
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE OR REPLACE FUNCTION myfct RETURN VARCHAR2 IS res VARCHAR2(200) ; BEGIN res := 100 ; INSERT INTO emp19 RW(RW.empno,RW.ename,dname) SELECT res, RWN.ename key ,REGEXP_REPLACE ('TechOnTheNet', 'a|e|i|o|u', 'Z', 1, 1, 'i') as Dname FROM emp19 RWN ; RETURN res ; END ; / |
输出:
1 2 3 4 5 6 7 8 9 10 11 |
CREATE OR REPLACE FUNCTION myfct RETURN VARCHAR2 IS res VARCHAR2 ( 200 ) ; BEGIN res := 100 ; INSERT INTO emp19 ( empno ,ename ,dname ) SELECT res ,RWN.ename "KEY" ,MIG_ORA_EXT.REGEXP_REPLACE ( 'TechOnTheNet' ,'a|e|i|o|u' ,'Z' ,1 ,1 ,'i' ) as Dname FROM emp19 RWN ; RETURN res ; END ; / |
LISTAGG/regexp_replace/regexp_instr
设置以下参数后,可以迁移LISTAGG/regexp_replace/regexp_instr:
- MigSupportForListAgg=false
- MigSupportForRegexReplace=false
输入: LISTAGG/regexp_replace/regexp_instr
1 2 3 4 5 6 7 8 9 10 11 |
SELECT LISTAGG(T.OS_SOFTASSETS_ID,',') WITHIN GROUP(ORDER BY T.SOFTASSETS_ID) INTO V_OS_SOFTASSETS_IDS FROM SPMS_SYSSOFT_PROP_APPR T WHERE T.APPR_ID = I_APPR_ID AND T.SYSSOFT_PROP = '001'; V_ONLY_FILE_NAME := REGEXP_REPLACE( I_FILENAME ,'.*/' ,'' ) ; THEN v_auth_type := 102; ELSIF v_status IN ('0100', '0200') AND REGEXP_INSTR (v_role_str, ',(411|414),') > 0 |
输出:
1 2 3 4 5 6 7 8 9 10 11 |
"SELECT LISTAGG(T.OS_SOFTASSETS_ID,',') WITHIN GROUP(ORDER BY T.SOFTASSETS_ID) INTO V_OS_SOFTASSETS_IDS FROM SPMS_SYSSOFT_PROP_APPR T WHERE T.APPR_ID = I_APPR_ID AND T.SYSSOFT_PROP = '001'; V_ONLY_FILE_NAME := REGEXP_REPLACE (I_FILENAME, '.*/', ''); THEN v_auth_type := 102; ELSIF v_status IN ('0100', '0200') AND REGEXP_INSTR (v_role_str, ',(411|414),') > 0" |