我有以下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 '然后从AB_Base_Trans中选择RowID到hRowID,其中Key = ABBaseTransKey; end if; 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')或(LOTTABLE_07 ='UARESERVED'))); RuleName:= 'HKG-MRG-UA-PRODUCT-CATEGORY-PIKPAK / UA / UA01';更新ab_base_trans设置CC_PRODUCT_CATEGORY ='PICK PACK'其中Key = ABBaseTransKey和RowID = hRowID和Client_ID ='UA'和Site_ID ='UA01'和TestMode = 'N'和(DOC_TYPE ='A'AND((LOTTABLE_07 <>'TRANSLOAD')和(LOTTABLE_07 <>'UARESERVED'))); RuleName:='HKG-MRG-UA-RTN-RCPT / UA / UA01' ;更新ab_base_trans设置CC_BILLABLE_QUANTITY = ABS( BILLABLE_QUANTITY)其中Key = ABBaseTransKey和RowID = hRowID和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 BETWEEN(选择USER_DEF_DATE_1来自客户端,其中CLIENT_ID ='UA')和(选择USER_DEF_DATE_2来自客户端,其中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 BETWEEN(选择USER_DEF_DATE_1来自客户端,其中CLIENT_ID ='UA')和(选择USER_DEF_DATE_2来自客户端,其中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);提高;结束;”
这个不是高科技的选择,但是 - 看它是否有帮助。
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>