oracle中關于中文占用字節數,不同的數據庫有不同的情況,有的占用兩個字節、有的占用三個字節,現在測試環境的數據庫中文占用三個字節,要實現由中英文組成的段落字符串,按照每行占用多少字節重新分段,具體應用是在潤乾報表展現。
由于中文字符占用三個字節一個字符,英文字符及數字占用一個字節一個字符,通過字符去判定一行多少字,最后會出現全部漢字的一行跟全部數字的一行無法對其的情況,所以最終考慮用字節去判定一行占用字節數,最后段落劃分以及對齊都能滿足需求。
具體實例實現:
一、數據庫中字段存儲的原始值
二、通過函數調用實現需求
select? FUN_STR_SPLIT(k.COMMENTS)? as text_COMMENTS_first? from table_name k;
CREATE OR REPLACE FUNCTION FUN_STR_SPLIT(pStr IN VARCHAR2)
RETURN VARCHAR2 AS
V_LENGTH NUMBER;--字符長度
V_STR VARCHAR2(4000);
V_STR_T VARCHAR2(4000);
V_STR_RET VARCHAR2(4000);
V_TEMP VARCHAR2(4000);
V_TEMP_CHAR VARCHAR2(20);
V_TEMP_CHAR_T VARCHAR2(20);
V_TEMP_CHAR_W VARCHAR2(20);
V_COUNT NUMBER;--回車
數量
V_COUNT_CH NUMBER;--中文占用字節數
V_COUNT_NUM NUMBER;--是否是漢字判斷
V_COUNT_CH_NUM NUMBER;--中文標點
I NUMBER;
J NUMBER;
BEGIN
I :=1;
J :=1;
V_COUNT :=0;
--將字符串中回車 換成
--SELECT REPLACE(REPLACE(PSTR,CHR(10),'
'),' ','') INTO V_TEMP FROM DUAL;
SELECT REPLACE(PSTR,CHR(10),'
') INTO V_TEMP FROM DUAL;
--計算字符長度
SELECT LENGTH(V_TEMP) INTO V_LENGTH FROM DUAL;
--計算中文占用字節數
SELECT LENGTHB('啊') INTO V_COUNT_CH FROM DUAL;
--循環判斷字符
WHILE I < V_LENGTH+1 LOOP
--獲取對應位置字符
V_TEMP_CHAR:=SUBSTR(V_TEMP,I,1);
--判斷是否是中文
select instr('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*();:/?,<>',upper(V_TEMP_CHAR)) into V_COUNT_CH from dual;
if j < 72 then
--如果是中文 (中文占用三個字節)
if V_COUNT_CH > 0 then
--判斷當前字符的下一個是不是
V_TEMP_CHAR_T:=SUBSTR(V_TEMP,I+1,1);
if V_TEMP_CHAR_T = '
V_TEMP_CHAR:=SUBSTR(V_TEMP,I,5);
V_STR :=V_STR||V_TEMP_CHAR;
J :=1;
I :=I+5;
V_COUNT :=V_COUNT+1;
else
V_STR :=V_STR||V_TEMP_CHAR;
i :=i+1;
j :=j+1;
end if;
else
--判斷當前字符的下一個是不是
V_TEMP_CHAR_T:=SUBSTR(V_TEMP,I+1,1);
if V_TEMP_CHAR_T = '
V_TEMP_CHAR:=SUBSTR(V_TEMP,I,5);
V_STR :=V_STR||V_TEMP_CHAR;
J :=1;
I :=I+5;
V_COUNT :=V_COUNT+1;
else
V_STR :=V_STR||V_TEMP_CHAR;
i :=i+1;
j :=j+3;
end if;
end if;
else
--判斷當前字符的下一個是不是
V_TEMP_CHAR_T:=SUBSTR(V_TEMP,I+1,1);
--判斷當前字符的下下一個是不是
V_TEMP_CHAR_W:=SUBSTR(V_TEMP,I+2,1);
if V_TEMP_CHAR_T = '
V_TEMP_CHAR:=SUBSTR(V_TEMP,I,5);
V_STR :=V_STR||V_TEMP_CHAR;
J :=1;
I :=I+5;
V_COUNT :=V_COUNT+1;
elsif V_TEMP_CHAR_T = chr(13) then
if V_TEMP_CHAR_W = '
V_TEMP_CHAR:=SUBSTR(V_TEMP,I,5);
V_STR :=V_STR||V_TEMP_CHAR;
J :=1;
I :=I+5;
V_COUNT :=V_COUNT+1;
end if;
else
--判斷中文標點
select instr('。,?!.',upper(V_TEMP_CHAR_T)) into V_COUNT_CH_NUM from dual;
if V_COUNT_CH_NUM > 0 then
V_STR :=V_STR||V_TEMP_CHAR||V_TEMP_CHAR_T||'
';
J:=1;
I :=I+2;
V_COUNT :=V_COUNT+1;
else
V_STR :=V_STR||V_TEMP_CHAR||'
';
J:=1;
I :=I+1;
V_COUNT :=V_COUNT+1;
end if;
end if;
end if;
END LOOP;
RETURN(V_STR);
END FUN_STR_SPLIT;
三、通過函數轉換后查詢值
四、轉后字段在潤乾中展現效果