Невозможно вызвать функцию, которая определена в пакете PL / SQL - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть этот пакет PL / SQL:

create or replace package palindrome as
    function check_palindrome(num int) return int;
end palindrome;


create or replace package body palindrome as
    function check_palindrome(num int) return int as 
        ans int;
        z int;
        r int;
        rev int;
    begin
        z := num;

        while z > 0 loop
            r := mod(z,10);
            rev := rev*10+r;
            z := floor(z/10);
        end loop;

        if rev=num then
            dbms_output.put_line('the no '||num ||' is a palindrome ');
        else
             dbms_output.put_line('the no '||num ||' is not a palindrome ');
        end if;     
     end check_palindrome;
end palindrome;

Я создал вышеупомянутый пакет, который имеет одну функцию check_palindrome(), но когда я пытаюсь вызвать функцию, используя

begin
    palindrome.check_palindrome(343);
end;

Я получаю эту ошибку

Error report -
ORA-06550: line 2, column 5:
PLS-00221: 'CHECK_PALINDROME' is not a procedure or is undefined
ORA-06550: line 2, column 5:
PL/SQL: Statement ignored

Почему я получаю эту ошибку?Тело пакета скомпилировано успешно, но я получаю эту ошибку при вызове функции.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Ваша программа на самом деле ничего не возвращает, и, кажется, нет смысла исправлять это, поскольку вы просто отображаете результат на экране.Вместо этого вы должны превратить его в процедуру:

create or replace package palindrome as
    procedure check_palindrome(num int) ;
end palindrome;


create or replace package body palindrome as
    procedure check_palindrome(num int)  as 
        ans int;
        z int;
        r int;
        rev int;
    begin
        z := num;

        while z > 0 loop
            r := mod(z,10);
            rev := rev*10+r;
            z := floor(z/10);
        end loop;

        if rev=num then
            dbms_output.put_line('the no '||num ||' is a palindrome ');
        else
             dbms_output.put_line('the no '||num ||' is not a palindrome ');
        end if;     
     end check_palindrome;
end palindrome;

Затем вы можете успешно вызвать ее:

begin
    palindrome.check_palindrome(343);
end;
0 голосов
/ 17 ноября 2018

Вы объявили ФУНКЦИЮ, которая ВОЗВРАЩАЕТ значение, но вы назвали его как ПРОЦЕДУРУ, поэтому вам нужно:

DECLARE
  the_val INT;
BEGIN
  the_val := PALINDROME.check_palindrome(343);
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...