Oracle区分中文和英文,oracle中中英文段落划分实现
oracle中關(guān)于中文占用字節(jié)數(shù),不同的數(shù)據(jù)庫(kù)有不同的情況,有的占用兩個(gè)字節(jié)、有的占用三個(gè)字節(jié),現(xiàn)在測(cè)試環(huán)境的數(shù)據(jù)庫(kù)中文占用三個(gè)字節(jié),要實(shí)現(xiàn)由中英文組成的段落字符串,按照每行占用多少字節(jié)重新分段,具體應(yīng)用是在潤(rùn)乾報(bào)表展現(xiàn)。
由于中文字符占用三個(gè)字節(jié)一個(gè)字符,英文字符及數(shù)字占用一個(gè)字節(jié)一個(gè)字符,通過(guò)字符去判定一行多少字,最后會(huì)出現(xiàn)全部漢字的一行跟全部數(shù)字的一行無(wú)法對(duì)其的情況,所以最終考慮用字節(jié)去判定一行占用字節(jié)數(shù),最后段落劃分以及對(duì)齊都能滿(mǎn)足需求。
具體實(shí)例實(shí)現(xiàn):
一、數(shù)據(jù)庫(kù)中字段存儲(chǔ)的原始值
二、通過(guò)函數(shù)調(diào)用實(shí)現(xiàn)需求
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;--字符長(zhǎng)度
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;--回車(chē)
數(shù)量
V_COUNT_CH NUMBER;--中文占用字節(jié)數(shù)
V_COUNT_NUM NUMBER;--是否是漢字判斷
V_COUNT_CH_NUM NUMBER;--中文標(biāo)點(diǎn)
I NUMBER;
J NUMBER;
BEGIN
I :=1;
J :=1;
V_COUNT :=0;
--將字符串中回車(chē) 換成
--SELECT REPLACE(REPLACE(PSTR,CHR(10),'
'),' ','') INTO V_TEMP FROM DUAL;
SELECT REPLACE(PSTR,CHR(10),'
') INTO V_TEMP FROM DUAL;
--計(jì)算字符長(zhǎng)度
SELECT LENGTH(V_TEMP) INTO V_LENGTH FROM DUAL;
--計(jì)算中文占用字節(jié)數(shù)
SELECT LENGTHB('啊') INTO V_COUNT_CH FROM DUAL;
--循環(huán)判斷字符
WHILE I < V_LENGTH+1 LOOP
--獲取對(duì)應(yīng)位置字符
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
--如果是中文 (中文占用三個(gè)字節(jié))
if V_COUNT_CH > 0 then
--判斷當(dāng)前字符的下一個(gè)是不是
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
--判斷當(dāng)前字符的下一個(gè)是不是
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
--判斷當(dāng)前字符的下一個(gè)是不是
V_TEMP_CHAR_T:=SUBSTR(V_TEMP,I+1,1);
--判斷當(dāng)前字符的下下一個(gè)是不是
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
--判斷中文標(biāo)點(diǎn)
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;
三、通過(guò)函數(shù)轉(zhuǎn)換后查詢(xún)值
四、轉(zhuǎn)后字段在潤(rùn)乾中展現(xiàn)效果
總結(jié)
以上是生活随笔為你收集整理的Oracle区分中文和英文,oracle中中英文段落划分实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: oracle 数据执行计划,Oracle
- 下一篇: oracle 注册程序,oracle 静