这个版本的函数解决的问题零出现重复或不出现的问题当金额只有角或分的显示问题金额为整数时是否想要带 整 字CREATEORREPLACEFUNCTIONNUM_TO_CAPITAL(MONEYINNUMBER)RETURNVARCHAR2ISTYPESTRING_ARRAYISTABLEOFVARCHAR2(10);DIGIT_STR STRING_ARRAY :STRING_ARRAY(零,壹,贰,叁,肆,伍,陆,柒,捌,玖);V_NUM VARCHAR2(100);V_INT VARCHAR2(100);V_DEC VARCHAR2(10);V_RESULT VARCHAR2(300):;V_SECTION VARCHAR2(4);V_SEC_RES VARCHAR2(50):;V_I NUMBER :0;V_HAS_NUMBOOLEAN;V_PREV_SECTION_HAS_NUMBOOLEAN:FALSE;BEGIN-- 1. 空值处理IFMONEYISNULLTHENRETURN;ENDIF;-- 2. 负数处理IFMONEY0THENRETURN负||NUM_TO_CAPITAL(ABS(MONEY));ENDIF;-- 3. 金额上限IFMONEYPOWER(10,16)THENRAISE_APPLICATION_ERROR(-20001,金额超出转换范围);ENDIF;-- 4. 格式化V_NUM :TO_CHAR(ROUND(MONEY,2),FM9999999999999990.00);V_INT :SUBSTR(V_NUM,1,INSTR(V_NUM,.)-1);V_DEC :SUBSTR(V_NUM,INSTR(V_NUM,.)1);-- 5. 整数部分为 0 时不拼接零元直接处理小数IFV_INT!0THENV_PREV_SECTION_HAS_NUM :FALSE;WHILELENGTH(V_INT)0LOOPIFLENGTH(V_INT)4THENV_SECTION :SUBSTR(V_INT,LENGTH(V_INT)-3,4);V_INT :SUBSTR(V_INT,1,LENGTH(V_INT)-4);ELSEV_SECTION :LPAD(V_INT,4,0);V_INT :;ENDIF;V_SEC_RES :;V_HAS_NUM :FALSE;FORJIN1..4LOOPDECLAREDCHAR(1):SUBSTR(V_SECTION,J,1);U VARCHAR2(2):CASEJWHEN1THEN仟WHEN2THEN佰WHEN3THEN拾ELSEEND;BEGINIFD!0THENIFJ1ANDSUBSTR(V_SECTION,J-1,1)0THENV_SEC_RES :V_SEC_RES||零;ENDIF;V_SEC_RES :V_SEC_RES||DIGIT_STR(D1)||U;V_HAS_NUM :TRUE;ENDIF;END;ENDLOOP;IFV_HAS_NUMTHENCASEV_IWHEN1THENV_SEC_RES :V_SEC_RES||万;WHEN2THENV_SEC_RES :V_SEC_RES||亿;WHEN3THENV_SEC_RES :V_SEC_RES||万亿;ELSENULL;ENDCASE;V_RESULT :V_SEC_RES||V_RESULT;ELSIF V_I1ANDV_RESULTISNOTNULLTHEN-- 万位全为0但更高位有数字需要补零IFV_PREV_SECTION_HAS_NUMANDSUBSTR(V_RESULT,1,1)!零THENV_RESULT :零||V_RESULT;ENDIF;ENDIF;V_PREV_SECTION_HAS_NUM :V_HAS_NUM;V_I :V_I1;ENDLOOP;-- 去掉最高位多余的零IFLENGTH(V_RESULT)0ANDSUBSTR(V_RESULT,1,1)零THENV_RESULT :SUBSTR(V_RESULT,2);ENDIF;-- 整数部分收尾IFV_RESULTISNOTNULLTHENV_RESULT :V_RESULT||元;ENDIF;ENDIF;-- 6. 小数部分IFV_DEC!00THEN-- 角IFSUBSTR(V_DEC,1,1)!0THENV_RESULT :V_RESULT||DIGIT_STR(SUBSTR(V_DEC,1,1)1)||角;ELSIF SUBSTR(V_DEC,2,1)!0ANDV_RESULTISNOTNULLTHENV_RESULT :V_RESULT||零;ENDIF;-- 分IFSUBSTR(V_DEC,2,1)!0THENV_RESULT :V_RESULT||DIGIT_STR(SUBSTR(V_DEC,2,1)1)||分;ENDIF;ELSE-- 无小数时加整IFV_RESULTISNOTNULLTHENV_RESULT :V_RESULT||整;ENDIF;ENDIF;-- 7. 0 元 0 角 0 分IFV_RESULTISNULLORV_RESULTTHENRETURN零元;ENDIF;RETURNV_RESULT;ENDNUM_TO_CAPITAL;