PL/SQL存储过程如何获取字符串所有子串的长度
PL/SQL按空格拆分获取所有子串长度的存储过程实现
原代码存在的核心问题
- 分隔符判断完全失效:Oracle 语法里,VARCHAR2类型的空字符串(单引号中间无任何内容的
'')和NULL完全等价,写substr(value, x, 1) = ''的判断永远不会触发命中——因为NULL和任何值做等值比较的结果都是未知的,不会进入if分支。实际要找的分隔符是输入字符串里的空格,应该匹配长度为1的空格字符' ',而不是空串。 - 循环提前退出:原代码一旦触发分隔符判断,就直接用
exit跳出整个循环,根本不会继续读取后面的字符,哪怕把判断条件改对,也只会输出第一个子串的长度,后面的内容完全遍历不到。 - 语法编译报错:代码里写的
cont: = x;使用了未声明的变量cont,存储过程创建阶段就会编译失败,根本没法运行。
修正后的可运行代码
set serveroutput on; create or replace procedure pr_size (value varchar2) as -- 临时存储当前拼接的子串 answer varchar2(300) := ''; -- 记录子串序号,方便对应输出 v_sub_idx number := 0; -- 存储当前遍历到的单个字符 v_current_char varchar2(1); begin -- 边界处理:输入为空时直接返回 if value is null then dbms_output.put_line('输入字符串为空,无有效子串'); return; end if; for x in 1 .. length(value) loop v_current_char := substr(value, x, 1); -- 遇到空格分隔符,说明已拼接完成一个子串 if v_current_char = ' ' then v_sub_idx := v_sub_idx + 1; dbms_output.put_line('第' || v_sub_idx || '个子串长度:' || length(answer)); -- 清空临时变量,准备拼接下一个子串 answer := ''; else -- 非分隔符,将字符拼接到临时变量 answer := answer || v_current_char; end if; end loop; -- 循环结束后,处理最后一个无后续分隔符的子串 if answer is not null then v_sub_idx := v_sub_idx + 1; dbms_output.put_line('第' || v_sub_idx || '个子串长度:' || length(answer)); end if; end; / -- 调用存储过程 call pr_size('Word size calculation test');
运行输出示例
第1个子串长度:4
第2个子串长度:4
第3个子串长度:11
第4个子串长度:4
内容的提问来源于stack exchange,提问作者heferpi
相关产品推荐
相关产品推荐

