在 oracle 中使用 REGEXPR_SUBSTR 的模式匹配条件

Pattern-matching Conditions using REGEXPR_SUBSTR in oracle

我有以下 clob 列,我需要使用 oracle 从下面的列中提取 RuleName。

Clob 列:

"声明 ABBaseTransKey AB_Base_Trans.Key%type := :P_KEY;hRowID RowID;TestMode varchar2(1) := :TESTING;Dummy varchar2(1);RuleName varchar2(1000);IncreaseRunLevel boolean := false;Begin If TestMode = 'N' then select RowID into hRowID from AB_Base_Trans where Key = ABBaseTransKey;end if; RuleName := 'HKG-MRG-UA-PRODUCT-CATEGORY/UA/UA01';update ab_base_trans set CC_PRODUCT_CATEGORY = 'CROSS DOCK' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 = 'TRANSLOAD') 或 (LOTTABLE_07 = 'UARESERVED'))); RuleName := 'HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK/UA/UA01';update ab_base_trans set CC_PRODUCT_CATEGORY = 'PICK PACK' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'A' AND ((LOTTABLE_07 <> 'TRANSLOAD') 和 (LOTTABLE_07 <> 'UARESERVED'))); RuleName := 'HKG-MRG-UA-RTN-RCPT/UA/UA01';update ab_base_trans set CC_BILLABLE_QUANTITY = ABS(BILLABLE_QUANTITY) 其中 Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA'和 Site_ID = 'UA01' 和 TestMode = 'N' 和(Doc_Type = 'J' 和 Doc_Sub_Type = 'RET'); RuleName := 'HKG-MRG-UA-SPECIAL-RATE-CODE/UA/UA01';update ab_base_trans set CC_Special_Rate_Code = 'SMS' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (((DOC_TYPE = 'A') OR (DOC_TYPE = 'N') OR (DOC_TYPE = 'P')) AND ((SUBSTR(LOTTABLE_01,1,1) = 'S') OR(SUBSTR(LOTTABLE_01,1,1) = 'M')) AND (END_DSTAMP BETWEEN (SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID='UA') AND (SELECT USER_DEF_DATE_2 来自客户端 CLIENT_ID='UA'))); RuleName := 'HKG-MRG-UA-SPECIAL-RATE-CODE-NA/UA/UA01';update ab_base_trans set CC_Special_Rate_Code = 'NA' where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (NOT( ((DOC_TYPE = 'A') OR (DOC_TYPE = 'N') OR (DOC_TYPE = 'P')) AND ((SUBSTR(LOTTABLE_01,1,1) = 'S') OR(SUBSTR( LOTTABLE_01,1,1) = 'M')) AND (END_DSTAMP BETWEEN (SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID='UA') AND (SELECT USER_DEF_DATE_2 来自客户端 CLIENT_ID='UA')) )); RuleName := 'HKG-MRG-UA-VAS-LABEL-COUNT-BASE/UA/UA01';update ab_base_trans set CC_LABEL_COUNT = Billable_Carton * R_LABEL_COUNT where Key = ABBaseTransKey and RowID = hRowID and Client_ID = 'UA' and Site_ID = 'UA01' and TestMode = 'N' and (DOC_TYPE = 'LABEL'); <> LibABBaseTransMergeRule.SetIncreaseRunLevel (IncreaseRunLevel);无效的;其他人然后 LibABBaseTransMergeRule.SetErrorCode (ABBaseTransKey, RuleName, 'UA', 'UA01', sqlerrm) 时的异常; LibABBaseTransMergeRule.SetIncreaseRunLevel(假);增加;结束;"

这不是一个 高科技 选项,但是 - 看看它是否有帮助。

  • t1 CTE returns 所有包含 "RuleName :=" 长度为 100 个字符的字符串的部分(是否足够长?)
  • 最后的 SELECT 然后是 returns 以斜杠结尾的子字符串

可能会有进一步的调整(是否总是 "RuleName"(字母大小写),是否总是在该名称和“=”之间只有一个 space,等等)但是 - 可能是好的作为第一步。

SQL> with t1 as
  2    (select substr(col, instr(col, 'RuleName :=', 1, level) + 13, 100) res1
  3     from a
  4     connect by level <= regexp_count(col, 'RuleName :=')
  5    )
  6  select substr(res1, 1, instr(res1, '/') - 1) result
  7  from t1;

RESULT
--------------------------------------------------------------------------------
HKG-MRG-UA-PRODUCT-CATEGORY
HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK
HKG-MRG-UA-RTN-RCPT
HKG-MRG-UA-SPECIAL-RATE-CODE
HKG-MRG-UA-SPECIAL-RATE-CODE-NA
HKG-MRG-UA-VAS-LABEL-COUNT-BASE

6 rows selected.

SQL>

不过,如果您只想知道某个 RuleName 是否存在于该列中,INSTR 就足够了:

SQL> select case when instr(col, 'HKG-MRG-UA-RTN-RCPT') > 0 then 'It exists'
  2              else 'It does not exist'
  3         end result
  4  from a;

RESULT
-----------------
It exists

SQL>