PL/SQL在輸入的字串有&符號的時候,每次執行都會跳出一個視窗問說要輸入的變數為何,一開始不懂他再問啥,到了後來才知道,原來是兩個單引號中間的字串有&符號,後來在判斷的時候會消失,我自己用奇怪的方法沒想到也解決了,就多加一個&上去就好了。另外,欄位內的字串如果出現半形的?,在使用PL/SQL或TOAD的時候,都會發現欄位裡的字串從?開始後面的都不見了。
如:
1. 要在一個NEWS的table中找尋content的欄位裡,是否有以16進位表示(ex. 깂)的跳脫字元。
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 ;
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進位 + ; + 跳脫字元後面字串
留言列表