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

PL/SQL包内char_occurrences函数返回值异常问题求助

问题原因与解决方案

问题核心是参数顺序不匹配:

  • 包中函数char_occurrences的定义是先接收要查找的字符(input_char),再接收目标字符串(input_string)
  • 但调用函数时,你把目标字符串(input_string)放在了第一个参数位置,要查找的字符(char_to_find)放在了第二个位置,导致参数完全错位。此时REGEXP_COUNT实际是在查找input_string这个字符串在char_to_find中的出现次数,自然返回0。

修复方案二选一:

方案1:调整调用时的参数顺序

保持包和包体的定义不变,修改调用代码的参数传递顺序,先传要查找的字符,再传目标字符串:

DECLARE 
    input_string VARCHAR2(50) := 'test';
    char_to_find VARCHAR2(50):= 'e';
    char_found_var NUMBER;
BEGIN
    char_found_var := string_manipulator.char_occurrences(char_to_find, input_string);
    DBMS_OUTPUT.PUT_LINE(char_found_var || ' char found ');
END;

方案2:调整函数定义的参数顺序

修改包和包体的函数参数顺序,让定义与调用逻辑一致(先目标字符串,再要查找的字符):

CREATE OR REPLACE PACKAGE string_manipulator IS
    FUNCTION char_occurrences(input_string VARCHAR2, input_char IN VARCHAR2) RETURN NUMBER;
END string_manipulator;

CREATE OR REPLACE PACKAGE BODY string_manipulator IS
    FUNCTION char_occurrences(input_string IN VARCHAR2, input_char IN VARCHAR2) RETURN NUMBER IS
        char_found_var NUMBER;
        BEGIN
            SELECT REGEXP_COUNT(UPPER(input_string), UPPER(input_char))
            INTO char_found_var
            FROM dual;
        RETURN char_found_var;
    END char_occurrences;
END string_manipulator;

-- 调用代码无需修改
DECLARE 
    input_string VARCHAR2(50) := 'test';
    char_to_find VARCHAR2(50):= 'e';
    char_found_var NUMBER;
BEGIN
    char_found_var := string_manipulator.char_occurrences(input_string, char_to_find);
    DBMS_OUTPUT.PUT_LINE(char_found_var || ' char found ');
END;

独立PL/SQL块能正常运行,是因为块中直接使用变量时参数顺序没有错位,REGEXP_COUNT的两个参数传递正确,所以得到了预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:33:24