PL/SQL在輸入的字串有&符號的時候,每次執行都會跳出一個視窗問說要輸入的變數為何,一開始不懂他再問啥,到了後來才知道,原來是兩個單引號中間的字串有&符號,後來在判斷的時候會消失,我自己用奇怪的方法沒想到也解決了,就多加一個&上去就好了。另外,欄位內的字串如果出現半形的?,在使用PL/SQL或TOAD的時候,都會發現欄位裡的字串從?開始後面的都不見了。

如:
 1. 要在一個NEWS的table中找尋content的欄位裡,是否有以16進位表示(ex. &#xAE42)的跳脫字元。
  select  *  from  NEWS where content like '%&#x%'

 2. 需要多加一個&進去才能在PL/SQL裡面正常執行,如果使用的是TOAD就不會有這個問題
     select  *  from  NEWS where content like '%&&#x%'


  接著紀錄一下16進位轉10進位的function,在這邊看到的

CREATE OR REPLACE FUNCTION hex_to_dec ( pc$hex IN VARCHAR2 )
RETURN PLS_INTEGER
IS
  hexch  VARCHAR2(40) := UPPER( pc$hex) ;
  len PLS_INTEGER := LENGTH( hexch) ;
  res PLS_INTEGER := 0 ;
  pos PLS_INTEGER := 0 ;
  val PLS_INTEGER ;
  car VARCHAR2(1) ;
BEGIN

  FOR i IN REVERSE 1..len LOOP

    car := SUBSTR( hexch, i , 1 ) ;

 IF ASCII(car) > 57 THEN
       val := ASCII(car) - 55 ;
    ELSE
       val := ASCII(car) - 48 ;
    END IF ;

    res := res + (val * ( POWER(16,pos) ) ) ;

 pos := pos + 1 ;
 
  END LOOP ;

  RETURN( res ) ;
 
END;


執行範例:
SQL> SELECT hex_to_dec('FFFF') FROM dual


HEX_TO_DEC('FFFF')
------------------
             65535



  當然這寫完只是一個轉換的函式,其實在Oracle有更快的方法,是利用to_number這個已經有的function

執行範例:
SQL> SELECT
to_number('FFFF','XXXX') FROM dual

to_number('FFFF','XXXX')
------------------------
                  65535


  不過這都只是小技巧,真的要解決資料庫中原本儲存的16進位表示的跳脫字元,要轉換成10進位表示的跳脫字元時,之前同事有寫個還算不錯的方式,唯一的小缺憾是,當要Update的欄位裡面超過一個16進位跳脫字元時,就需要多執行一次,因為執行一次只能更換欄位中第一個找到的跳脫字元。

以在PL/SQL中作範例:
原本欄位替換成
  跳脫字元前面字串+ &# + 16進位轉10進位 + ; + 跳脫字元後面字串
arrow
arrow
    全站熱搜

    soarlin 發表在 痞客邦 留言(0) 人氣()