You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:48