PL/SQL函数FBIG求数字最大位的技术问询(输入47839)
找出数字最大数位的PL/SQL函数修正方案
看起来你想实现一个提取数字中最大数位的PL/SQL函数,但当前的FBIG代码逻辑存在问题,没法得到正确结果。咱们先拆解问题,再给出可行的修正方案。
原函数的核心问题
你的思路方向是对的——用MOD取最后一位、FLOOR截断末尾,但逻辑实现走偏了:
- 原代码里
S := GREATEST(R,M);是拿单个数位和剩余的完整数字比较,比如第一次循环时,R是9,M是4783,得到的S是4783,这显然不是你要的数位最大值。 - 另外
S没有初始化,PL/SQL中未赋值的变量默认是NULL,GREATEST遇到NULL会直接返回NULL,最终结果肯定不对。
修正后的函数实现
我们需要调整逻辑,让每次循环只比较数位和当前记录的最大值:
FUNCTION FBIG(N NUMBER) RETURN NUMBER IS R NUMBER; -- 存储当前提取的单个数位 M NUMBER; -- 存储待处理的剩余数字 S NUMBER := 0; -- 初始化最大数位为0,作为比较基准 BEGIN M := N; WHILE M > 0 LOOP R := MOD(M, 10); -- 提取当前数字的最后一位 S := GREATEST(R, S); -- 对比当前数位和已记录的最大值,更新最大值 M := FLOOR(M / 10); -- 去掉最后一位,继续处理剩余部分 END LOOP; RETURN S; END FBIG; /
关键逻辑解释
- 初始化
S为0:避免未赋值导致的NULL问题,同时给第一次比较提供基准值。 MOD(M,10):精准提取当前数字的最后一位(比如输入47839时,第一次得到9,第二次得到3,依此类推)。GREATEST(R, S):每次只对比单个数位和当前的最大值,确保S始终记录已处理数位中的最大数。FLOOR(M/10):截断末尾数字,比如47839除以10得到4783.9,取整后得到4783,进入下一轮循环直到M变为0。
测试验证
执行你的测试语句:
EXEC DBMS_OUTPUT.PUT_LINE(FBIG(47839));
输出结果为9,正好是47839中的最大数位,完美符合你的需求。
内容的提问来源于stack exchange,提问作者Coreen Stupka
相关产品推荐
相关产品推荐

