Ошибка при вызове функции из процедуры из того же пакета - PullRequest
1 голос
/ 10 октября 2019

Я новичок в oracle. Я создал пакет со спецификацией и телом.

Его заголовок:

CREATE OR REPLACE PACKAGE OT.PK_TEST IS
FUNCTION PRNT_STRNG RETURN VARCHAR2;
PROCEDURE PR_SUPERHERO(F_NAME VARCHAR2,L_NAME VARCHAR2);
END PK_TEST;
/

Его тело:

CREATE OR REPLACE PACKAGE BODY OT.PK_TEST IS
FUNCTION PRNT_STRNG 
RETURN VARCHAR2
IS
BEGIN
RETURN 'ASHWIN';
END PRNT_STRNG;
PROCEDURE PR_SUPERHERO(F_NAME VARCHAR2,L_NAME VARCHAR2) 
IS
BEGIN
OT.PK_TEST.PRNT_STRNG;
DBMS_OUTPUT.PUT_LINE(F_NAME);
DBMS_OUTPUT.PUT_LINE(L_NAME);
END PR_SUPERHERO;
END PK_TEST;
/

Я хотел проверить, может ли функция вызываться из тела процедуры или нет. Итак, я добавил:

OT.PK_TEST.PRNT_STRNG;

для вызова функции, возвращающей varchar. Но я получил ошибку:

[Warning] ORA-24344: success with compilation error
11/1    PLS-00221: 'PRNT_STRNG' is not a procedure or is undefined
11/1    PL/SQL: Statement ignored
 (1: 0): Warning: compiled but with compilation errors

Можно ли вызвать функцию из процедуры того же пакета или нет? Кроме того, я могу вызвать функцию другого пакета?

Ответы [ 2 ]

3 голосов
/ 10 октября 2019

Вызов функции вернул бы вывод. Вам необходимо присвоить функцию переменной, например:

some_var = OT.PK_TEST.PRNT_STRNG;

Вы можете только вызывать процедуры напрямую

1 голос
/ 10 октября 2019

Да, вы можете вызывать функцию / процедуру в том же пакете. Вы также можете вызвать другую функцию из другого пакета или другой схемы, вам просто нужно сослаться на нее. Единственное, чего вам не хватает, - это присвоения переменной для возврата вызванной вами функции.

Вы должны сделать это так:

v_temp VARCHAR2(32 CHAR);

BEGIN
    v_temp := OT.PK_TEST.PRNT_STRNG;
    DBMS_OUTPUT.PUT_LINE(v_temp );
    DBMS_OUTPUT.PUT_LINE(F_NAME);
    DBMS_OUTPUT.PUT_LINE(L_NAME);
END PR_SUPERHERO;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...