有点不明白,想将一个字段中的中文数据插入另一个表,并转化拼音。
CREATE OR REPLACE FUNCTION GET_PINYIN_FIRST_LETTER(STR VARCHAR(255))
RETURN VARCHAR(255)
IS
V_RESULT VARCHAR(255) := '';
V_LEN INT := 0;
V_POS INT := 1;
V_CHAR VARCHAR(4); -- 改为VARCHAR(4)以兼容特殊字符
V_CODE INT;
V_RAW RAW(4); -- 增加RAW缓冲区大小
BEGIN
V_LEN := LENGTH(STR);
WHILE V_POS <= V_LEN LOOP
-- 获取单个字符(兼容4字节UTF-8字符)
V_CHAR := SUBSTR(STR, V_POS, 1);
-- 跳过非中文字符
IF LENGTHB(V_CHAR) > 1 THEN -- 只处理多字节字符
V_RAW := UTL_RAW.CAST_TO_RAW(V_CHAR);
-- 仅处理双字节字符(GB2312范围)
IF LENGTHB(V_CHAR) = 2 THEN
-- 计算GBK编码
V_CODE := ASCII(SUBSTR(V_CHAR, 1, 1)) * 256 + ASCII(SUBSTR(V_CHAR, 2, 1));
-- 拼音首字母映射
V_RESULT := V_RESULT ||
CASE
WHEN V_CODE BETWEEN 45217 AND 45252 THEN 'A' -- B0A1-B0C4
WHEN V_CODE BETWEEN 45253 AND 45760 THEN 'B' -- B0C5-B2C0
WHEN V_CODE BETWEEN 45761 AND 46317 THEN 'C' -- B2C1-B4ED
WHEN V_CODE BETWEEN 46318 AND 46825 THEN 'D' -- B4EE-B6E9
WHEN V_CODE BETWEEN 46826 AND 47009 THEN 'E' -- B6EA-B7A1
WHEN V_CODE BETWEEN 47010 AND 47296 THEN 'F' -- B7A2-B8C0
WHEN V_CODE BETWEEN 47297 AND 47613 THEN 'G' -- B8C1-B9FD
WHEN V_CODE BETWEEN 47614 AND 48118 THEN 'H' -- B9FE-BBF6
WHEN V_CODE BETWEEN 48119 AND 49061 THEN 'J' -- BBF7-BFA5
WHEN V_CODE BETWEEN 49062 AND 49323 THEN 'K' -- BFA6-C0AB
WHEN V_CODE BETWEEN 49324 AND 49895 THEN 'L' -- C0AC-C2E7
WHEN V_CODE BETWEEN 49896 AND 50370 THEN 'M' -- C2E8-C4C2
WHEN V_CODE BETWEEN 50371 AND 50613 THEN 'N' -- C4C3-C5B5
WHEN V_CODE BETWEEN 50614 AND 50621 THEN 'O' -- C5B6-C5BD
WHEN V_CODE BETWEEN 50622 AND 50905 THEN 'P' -- C5BE-C6D9
WHEN V_CODE BETWEEN 50906 AND 51386 THEN 'Q' -- C6DA-C8BA
WHEN V_CODE BETWEEN 51387 AND 51445 THEN 'R' -- C8BB-C8F5
WHEN V_CODE BETWEEN 51446 AND 52217 THEN 'S' -- C8F6-CBF9
WHEN V_CODE BETWEEN 52218 AND 52697 THEN 'T' -- CBFA-CDD9
WHEN V_CODE BETWEEN 52698 AND 52979 THEN 'W' -- CDDA-CEF3
WHEN V_CODE BETWEEN 52980 AND 53688 THEN 'X' -- CEF4-D1B8
WHEN V_CODE BETWEEN 53689 AND 54480 THEN 'Y' -- D1B9-D4D0
WHEN V_CODE BETWEEN 54481 AND 55289 THEN 'Z' -- D4D1-D7F9
ELSE '' -- 非GB2312汉字不处理
END;
END IF;
END IF;
V_POS := V_POS + 1;
END LOOP;
RETURN V_RESULT;
END;
最后的转化的结果中得到的数据是没有中文的。
https://eco.dameng.com/document/dm/zh-cn/faq/FAQ_FUNCTION#%E9%80%9A%E8%BF%87%E6%95%B0%E6%8D%AE%E5%BA%93%E5%B0%86%E4%B8%AD%E6%96%87%E8%BD%AC%E6%8D%A2%E4%B8%BA%E6%8B%BC%E9%9F%B3
您可以参考一下这个资料.