在oracle

时间:2019-02-25 05:10:17

标签: oracle plsql oracle10g

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

Clob列:

“声明ABBaseTransKey AB_Base_Trans.Key%type:=:P_KEY; hRowID RowID; TestMode varchar2(1):=:TESTING;虚拟varchar2(1); RuleName varchar2(1000); IncreaseRunLevel布尔值布尔值==否;从TestMode开始='N',然后从AB_Base_Trans中将RowID选择为hRowID,其中Key = ABBaseTransKey;如果结束,则结束; RuleName :='HKG-MRG-UA-PRODUCT-CATEGORY / UA / UA01';更新ab_base_trans设置CC_PRODUCT_CATEGORY ='CROSS DOCK'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'并且Site_ID ='UA01'和TestMode ='N'和(DOC_TYPE ='A'AND(((LOTTABLE_07 ='TRANSLOAD')OR((LOTTABLE_07 ='UARESERVED')))); RuleName :='HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK / UA / UA01';更新ab_base_trans设置CC_PRODUCT_CATEGORY ='PICK PACK',其中键= ABBaseTransKey和RowID = hRowID,Client_ID ='UA '和Site_ID ='UA01'和TestMode ='N'和(DOC_TYPE ='A'AND(((LOTTABLE_07 <>'TRANSLOAD')AND(LOTTABLE_07 <>'UARESERVED')))); RuleName:='HKG-MRG-UA-RTN-RCPT / UA / UA01';更新ab_base_trans设置CC_BILLABLE_QUANTITY = ABS(BILLABLE_QUANTITY)其中Key = ABBaseTransKey和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';更新ab_base_trans设置CC_Special_Rate_Code ='SMS'其中Key = ABBaseTransKey和RowID = hRowID且Client_ID ='UA'和Site_ID ='UA01'和TestMode ='N'和((((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在(SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID ='UA')和(SELECT USER_DEF_DATE_2 FROM CLIENT WHERE CLIENT_ID ='UA')之间)); RuleName :='HKG-MRG-UA-SPECIAL-RATE-CODE-NA / UA / UA01';更新ab_base_trans设置CC_Special_Rate_Code ='NA'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID =' UA'和Site_ID ='UA01'并且TestMode ='N'和(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在(SELECT USER_DEF_DATE_1 FROM CLIENT WHERE CLIENT_ID ='UA')和(SELECT USER_DEF_DATE_2 FROM CLIENT WHERE CLIENT_ID = 'UA')))); RuleName :='HKG-MRG-UA-VAS-LABEL-COUNT-BASE / UA / UA01';更新ab_base_trans设置CC_LABEL_COUNT = Billable_Carton * R_LABEL_COUNT其中Key = ABBaseTransKey且RowID = hRowID和Client_ID =' UA'和Site_ID ='UA01'和TestMode ='N'和(DOC_TYPE ='LABEL'); <> LibABBaseTransMergeRule.SetIncreaseRunLevel(IncreaseRunLevel);空值;当其他人然后使用LibABBaseTransMergeRule.SetErrorCode(ABBaseTransKey,RuleName,'UA','UA01',sqlerrm)时发生异常; LibABBaseTransMergeRule.SetIncreaseRunLevel(false);提高;结束;”

1 个答案:

答案 0 :(得分:1)

该选项不是高科技选项,但是-看看是否有帮助。

  • t1 CTE返回所有包含“ RuleName:=“字符串的部分,其长度为100个字符(足够长吗?)
  • 最后的SELECT返回以斜杠结尾的子字符串

可能会有进一步的调整(是否总是“ RuleName”(字母大小写),该名称和“ =”之间始终只有一个空格等),但是-第一步可以。

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>