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
相关产品推荐
相关产品推荐

