pl/sql 包函数未返回正确的值

问题描述 投票:0回答:2

我正在学习 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;

完美运行

有什么解决办法吗?

oracle plsql package
2个回答
0
投票

那是因为你在调用封装函数时错误地使用了参数。

注释行是你的;未注释的是我的,它有效:

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>

0
投票

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;
/
© www.soinside.com 2019 - 2024. All rights reserved.