天天看點

Oracle動态SQL,拆分字元串,并加工拼接為所需SQL

  • 具體場景:在動态SQL中,我們需要把一段字元加工為我們所需要的SQL,這裡舉個例子,目前台傳入字元為 ‘a,b,c,d’ ,需要把該字元加工為 (‘a’,‘b’,‘c’,‘d’) ,作為in語句的條件才能使用。知道了怎麼拆分和拼接,就有了思路,其他場景的分割和拼接也就好做了。
  • 拆分并加工拼接SQL:
--輸入 'a,b,c,d'
--輸出 ('a','b','c','d')
FUNCTION splitAndHandleStr(
   piStr    IN  varchar2,  --需要加工的字元串
   piSymbol IN  varchar2   --用來做分割的字元
 ) Return Varchar2
 IS
   outStr        varchar2(200);--輸出字元
   surplusStr    varchar2(200);--剩餘字元
   idx           int;--分割符的位置标記
   cutStr        Varchar2(200);--截取分割位置前的字元
   handleStr     Varchar2(200);--拼接處理字元
 Begin
   surplusStr := piStr;

   --當剩餘字元裡沒有分割符時跳出循環
   While inStr(surplusStr,piSymbol) <> 0 Loop
     idx := inStr(surplusStr, piSymbol);
     cutStr := subStr(surplusStr, 1, idx - 1);
     handleStr := handleStr || '''' || cutStr || ''',' ;
     surplusStr := subStr(surplusStr, idx+1, length(surplusStr) - (length(cutStr)+1));
   End Loop;

   --當跳出循環後,如果剩餘字元不為空,說明還有字元,需進行拼接處理
   If is_not_null(surplusStr) = 1 And  surplusStr <> piSymbol Then
     handleStr := handleStr || '''' || surplusStr || ''',';
   End iF;

   --移除最後逗号,加工成最終輸出資料
   outStr := '(' || SubStr(handleStr, 1, Length(handleStr)-1) || ')';
   Return outStr;
 End;