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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 11:24:03