У меня есть пакет с двумя частными функциями и одной процедурой, которая их вызывает. Эти две функции возвращают в процедуру сроки (первая и последняя) объявленных платежей. Процедура возвращает эти даты вместе с именем и идентификатором донора.
CREATE OR REPLACE PACKAGE PLEDGE_PKG IS
PROCEDURE DD_PLIST_PP
(p_id IN DD_PLEDGE.IDPLEDGE%TYPE,
p_first DD_DONOR.FIRSTNAME%TYPE,
p_last DD_DONOR.LASTNAME%TYPE,
p_payfirst OUT DATE,
p_paylast OUT DATE);
END;
CREATE OR REPLACE PACKAGE BODY PLEDGE_PKG IS
-- Determines 1st Payment Due Date based on ID.
FUNCTION dd_paydate1_pf
(p_id IN dd_pledge.idpledge%TYPE)
RETURN DATE
IS
lv_pl_dat DATE;
lv_mth_txt VARCHAR2(2);
lv_yr_txt VARCHAR2(4);
BEGIN
SELECT ADD_MONTHS(pledgedate,1)
INTO lv_pl_dat
FROM dd_pledge
WHERE idpledge = p_id;
lv_mth_txt := TO_CHAR(lv_pl_dat,'mm');
lv_yr_txt := TO_CHAR(lv_pl_dat,'yyyy');
RETURN TO_DATE((lv_mth_txt || '-01-' || lv_yr_txt),'mm-dd-yyyy');
END dd_paydate1_pf;
-- Determines LAST Payment Due Date based on ID.
FUNCTION dd_payend_pf
(p_id IN dd_pledge.idpledge%TYPE)
RETURN DATE
IS
lv_pay1_dat DATE;
lv_mths_num dd_pledge.paymonths%TYPE;
BEGIN
SELECT dd_paydate1_pf(idpledge), paymonths - 1 -- LINE 28
INTO lv_pay1_dat, lv_mths_num
FROM dd_pledge
WHERE idpledge = p_id;
IF lv_mths_num = 0 THEN
RETURN lv_pay1_dat;
ELSE
RETURN ADD_MONTHS(lv_pay1_dat, lv_mths_num);
END IF;
END dd_payend_pf;
-- Displays Donor Name, ID, First, Last payment using Donor ID
PROCEDURE DD_PLIST_PP
(p_id IN DD_PLEDGE.IDPLEDGE%TYPE,
p_first DD_DONOR.FIRSTNAME%TYPE,
p_last DD_DONOR.LASTNAME%TYPE,
p_payfirst OUT DATE,
p_paylast OUT DATE)
AS
lv_first DD_DONOR.FIRSTNAME%TYPE;
lv_last DD_DONOR.LASTNAME%TYPE;
BEGIN
SELECT FIRSTNAME, LASTNAME
INTO lv_first, lv_last
FROM DD_DONOR
WHERE p_id = IDDONOR;
p_payfirst := PLEDGE_PKG.DD_PAYDATE1_PF(p_id);
p_paylast := PLEDGE_PKG.DD_PAYEND_PF(p_id);
END DD_PLIST_PP;
END;
Я получаю ошибку из второго блока.
LINE/COL ERROR
-------- -----------------------------------------------------------------
28/3 PL/SQL: SQL Statement ignored
28/10 PL/SQL: ORA-00904: : invalid identifier
28/10 PLS-00231: function 'DD_PAYDATE1_PF' may not be used in SQL
SO запрашивает больше текста и меньше кода. :) Моя проблема в том, что я хочу вызвать PLEDGE_PKG.DD_PLIST_PP и вернуть имя, а две даты назад. Надеюсь, это объяснение поможет, и спасибо за помощь.