各位大侠,有一个问题,请帮忙呀!!! ( 积分: 14 )

  • 主题发起人 主题发起人 xinyuan7910
  • 开始时间 开始时间
X

xinyuan7910

Unregistered / Unconfirmed
GUEST, unregistred user!
我自定义了一个函数,用来更新数据库中每条记录中的小写金额转化成大写金额,例子如下,但是不执行,请你们百忙中给予帮助!!
自定义函数名字为:Xxzdx();
Query1.close;
Query1.Sql.clear;
Query1.Sql.add('Update 表名 set 大写金额字段:=Xxzdx(小写金额字段)');
就算上面语句运行,也不更新数据
(我要求的是数据库中每条记录中的小写金额转化大写金额)
谢谢大家!!!!
 
自定义函数必须弄到数据库里边。
 
这是for oracle 的 PL/SQL 版本的
对楼上的稍微做下改动就可以了啊,楼主要看懂代码就不是什么难事。

CREATE OR REPLACE FUNCTION smalltobig(smallmoney VARCHAR2)
RETURN VARCHAR2 IS
BigWrite VARCHAR2(54); --用于返回大写的钱数
Bignum VARCHAR2(2); --用于存放每一个阿拉伯数字对应的汉字
RMB VARCHAR2(2); --用于存放人民币单位
moneyplace NUMBER; --用于确定人民币的精度,最多只能精确到分
dotplace NUMBER; --确定小数点的位置
moneynum NUMBER; --人民币的位数
myexception EXCEPTION; --自定义异常
BEGIN
/*用内置函数INSTR确定小数点的位置*/
dotplace:=INSTR(smallmoney,'.');
/*判断是否超出本函数定义的精度范围,
如果是则引发自定义异常myexception*/
IF (LENGTH(smallmoney)>14)
OR((LENGTH(smallmoney)>12)AND(dotplace=0)) THEN
RAISE myexception;
END IF;
/*确定人民币的精度,如果小数点位置为0则精度只精确到元否则按小数点的 位置来确定人民币的精度*/
IF dotplace=0 THEN
moneyplace:=0;
ELSE
moneyplace:=dotplace-LENGTH(smallmoney);
END IF;
/*确定人民币的精确,如果小数点位置为0则精度只精确到元否则按小数点的 位置来确定人民币的精度*/

/*通过一个FOR循环将smallmoney中的阿拉伯数字逐一去出来,注意该FOR循 环是按照降序循环的*/
BigWrite :='';
FOR moneynum in REVERSE 1..LENGTH(smallmoney) LOOP
/*如果位置在小数点的位置则不做任何动作*/
IF moneynum<>dotplace THEN
/*CASE循环将smallmoney里对应的阿拉伯数字用汉语来表示*/
CASE SUBSTR(smallmoney,moneynum,1)
WHEN '1' THEN Bignum:='壹';
WHEN '2' THEN Bignum:='贰';
WHEN '3' THEN Bignum:='叁';
WHEN '4' THEN Bignum:='肆';
WHEN '5' THEN Bignum:='伍';
WHEN '6' THEN Bignum:='陆';
WHEN '7' THEN Bignum:='柒';
WHEN '8' THEN Bignum:='捌';
WHEN '9' THEN Bignum:='玖';
WHEN '0' THEN Bignum:='零';
END CASE;
/*CASE循环来设置smallmoney里对应的阿拉伯数字的相应的精度*/
CASE moneyplace
WHEN '-2' THEN RMB:='分';WHEN '-1' THEN RMB:='角';
WHEN '0' THEN RMB:='元';WHEN '1' THEN RMB:='拾';
WHEN '2' THEN RMB:='佰';WHEN '3' THEN RMB:='仟';
WHEN '4' THEN RMB:='萬';WHEN '5' THEN RMB:='拾';
WHEN '6' THEN RMB:='佰';WHEN '7' THEN RMB:='仟';
WHEN '8' THEN RMB:='亿';WHEN '9' THEN RMB:='拾';
WHEN '10' THEN RMB:='佰';WHEN '11' THEN RMB:='仟';
END CASE;
moneyplace:=moneyplace+1;
--IF BigWrite IS NULL THEN
--BigWrite:=Bignum||RMB;
--ELSE
BigWrite:=Bignum||RMB||BigWrite;
--END IF;
END IF;
END LOOP;
RETURN BigWrite;
EXCEPTION --异常处理部分
WHEN myexception THEN
return ('该函数只能转换长度不大于14位后整数位不大于12位的钱数!');
WHEN OTHERS THEN
return ('不是有效的钱数!');
END;
 
这个是SQL Server 版本:
CREATE FUNCTION [dbo].[f_num_chn] (@num numeric(14,2))
RETURNS varchar(100) WITH ENCRYPTION
AS
BEGIN
--版权所有:pbsql
DECLARE @n_data VARCHAR(20),@c_data VARCHAR(100),@n_str VARCHAR(10),@i int

SET @n_data=RIGHT(SPACE(14)+CAST(CAST(ABS(@num*100) AS bigint) AS varchar(20)),14)
SET @c_data=''
SET @i=1
WHILE @i<=14
BEGIN
SET @n_str=SUBSTRING(@n_data,@i,1)
IF @n_str<>' '
BEGIN
IF not ((SUBSTRING(@n_data,@i,2)='00') or
((@n_str='0') and ((@i=4) or (@i=8) or (@i=12) or (@i=14))))
SET @c_data=@c_data+SUBSTRING('零壹贰叁肆伍陆柒捌玖',CAST(@n_str AS int)+1,1)
IF not ((@n_str='0') and (@i<>4) and (@i<>8) and (@i<>12))
SET @c_data=@c_data+SUBSTRING('仟佰拾亿仟佰拾万仟佰拾圆角分',@i,1)
IF SUBSTRING(@c_data,LEN(@c_data)-1,2)='亿万'
SET @c_data=SUBSTRING(@c_data,1,LEN(@c_data)-1)
END
SET @i=@i+1
END
IF @num<0
SET @c_data='(负数)'+@c_data
IF @num=0
SET @c_data='零圆'
IF @n_str='0'
SET @c_data=@c_data+'整'
RETURN(@c_data)
END
GO
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
923
SUNSTONE的Delphi笔记
S
后退
顶部