PL/SQL LOOP使用CURSOR实现输出大小写混合字符串问题咨询
PL/SQL 交替大小写输出实现问题修复
现有代码问题整理
- 冗余声明:变量
aa_未被使用,开头初始化的bb_、cc_属于无效赋值,内层循环的bb_是独立的循环变量,会覆盖外层初始值 - 输出逻辑错误:
- 进入字符处理循环前先调用
dbms_output.put_line(rec_.namn)会先打印原始姓名,属于多余输出 - 内层循环中每轮先执行一次字符输出,再根据奇偶判断输出第二次,导致单个位置重复输出两个字符,完全不符合交替大小写的逻辑
- 偶数位分支中
SUBSTR(rec_.namn,cc_,1)的下标cc_值为0,Oracle字符串下标从1开始,此处只会取到空值 - 奇数位分支直接输出
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
相关产品推荐
相关产品推荐

