我正在学习 pl/sql,我正在开始使用包,所以基本上我正在尝试查找字符串中有多少个字符的实例,我正在使用 Oracle 的实时 SQL 来执行查询等。 ..但是当编写在包体中时在块外完美工作的函数将无法工作
CREATE OR REPLACE PACKAGE string_manipulator IS
FUNCTION char_occurrences(input_char IN VARCHAR2, input_string VARCHAR2) RETURN NUMBER;
END string_manipulator;
CREATE OR REPLACE PACKAGE BODY string_manipulator IS
FUNCTION char_occurrences(input_char IN VARCHAR2, input_string 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;
这始终返回 0。
但是当我做类似的事情时
DECLARE
input_string VARCHAR2(50) := 'test';
char_to_find VARCHAR2(50):= 'e';
char_found_var NUMBER;
BEGIN
SELECT REGEXP_COUNT(UPPER(input_string), UPPER(char_to_find))
INTO char_found_var
FROM dual;
DBMS_OUTPUT.PUT_LINE(char_found_var || ' char found ');
END;
完美运行
有什么解决办法吗?
那是因为你在调用封装函数时错误地使用了参数。
注释行是你的;未注释的是我的,它有效:
SQL> DECLARE
2 input_string VARCHAR2 (50) := 'test';
3 char_to_find VARCHAR2 (50) := 'e';
4 char_found_var NUMBER;
5 BEGIN
6 -- char_found_var := string_manipulator.char_occurrences (input_string, char_to_find);
7 char_found_var := string_manipulator.char_occurrences (char_to_find, input_string);
8 DBMS_OUTPUT.PUT_LINE (char_found_var || ' char found ');
9 END;
10 /
1 char found
PL/SQL procedure successfully completed.
SQL>
PL/SQL 允许通过两种方式将参数传递给函数或过程:位置表示法和命名表示法。您的代码使用位置表示法(正如您所注意到的......您的顺序错误)更容易出错。使用命名表示法,顺序并不重要,出错的可能性较小,并且代码更具可读性:
DECLARE
input_string VARCHAR2(50) := 'test';
char_to_find VARCHAR2(50):= 'e';
char_found_var NUMBER;
BEGIN
v_char_found_var := string_manipulator.char_occurrences
(input_char => v_char_to_find,
input_string => v_input_string );
DBMS_OUTPUT.PUT_LINE(v_char_found_var || ' char found ');
END;
/