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

PL/SQL LOOP使用CURSOR实现输出大小写混合字符串问题咨询

PL/SQL 交替大小写输出实现问题修复

现有代码问题整理

  • 冗余声明:变量aa_未被使用,开头初始化的bb_、cc_属于无效赋值,内层循环的bb_是独立的循环变量,会覆盖外层初始值
  • 输出逻辑错误:
    1. 进入字符处理循环前先调用dbms_output.put_line(rec_.namn)会先打印原始姓名,属于多余输出
    2. 内层循环中每轮先执行一次字符输出,再根据奇偶判断输出第二次,导致单个位置重复输出两个字符,完全不符合交替大小写的逻辑
    3. 偶数位分支中SUBSTR(rec_.namn,cc_,1)的下标cc_值为0,Oracle字符串下标从1开始,此处只会取到空值
    4. 奇数位分支直接输出LOWER(SUBSTR(rec_.namn,2)),等于第一轮循环就把第2位开始的所有剩余字符全部小写输出,后续循环完全失效
  • 功能不全:仅处理了first_name字段,未处理last_name,不符合姓名全称输出的需求

修正后代码

DECLARE
    CURSOR cur_ IS
        SELECT first_name namn, last_name efternamn FROM person_info;
    v_processed VARCHAR2(2000);
    v_char CHAR(1);
BEGIN
    FOR rec_ IN cur_ LOOP
        -- 重置处理后的字符串
        v_processed := '';
        -- 处理first_name
        FOR i IN 1..LENGTH(rec_.namn) LOOP
            v_char := SUBSTR(rec_.namn, i, 1);
            IF MOD(i, 2) = 1 THEN
                v_processed := v_processed || UPPER(v_char);
            ELSE
                v_processed := v_processed || LOWER(v_char);
            END IF;
        END LOOP;
        -- 加空格分隔名和姓
        v_processed := v_processed || ' ';
        -- 处理last_name
        FOR i IN 1..LENGTH(rec_.efternamn) LOOP
            v_char := SUBSTR(rec_.efternamn, i, 1);
            IF MOD(i, 2) = 1 THEN
                v_processed := v_processed || UPPER(v_char);
            ELSE
                v_processed := v_processed || LOWER(v_char);
            END IF;
        END LOOP;
        -- 输出最终结果
        DBMS_OUTPUT.PUT_LINE(v_processed);
    END LOOP;
END;
/

逻辑说明

修正后的代码逐位遍历姓和名的每个字符,奇数位置字符转大写,偶数位置转小写,空格不影响计数,最终输出的格式刚好符合你要求的JoHn DoE类交替大小写效果,同时保留了要求的游标写法。

内容的提问来源于stack exchange,提问作者AmNotBot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:45:03