Eu queria uma função que retornasse vários valores para o meu programa. Então escrevi uma função que retorna valor em um tipo de registro. Posso compilar o pacote sem problemas. E também funciona bem quando chamado a partir do código. Mas quando uso um bloco anônimo para recuperar os valores retornados pela função recebo um erro. Qual é o problema?
[Erro] Execução (60: 20): ORA-06550: linha 11, coluna 20: PLS-00382: expressão é do tipo errado ORA-06550: linha 11, coluna 3: PL/SQL: Instrução ignorada
ESPECIFICAÇÕES DO PACOTE
CREATE OR REPLACE package cust_wfm_budget
is
TYPE cap_details_rec IS RECORD (
cap_month VARCHAR2(55),
overcap_per NUMBER,
undercap_per NUMBER
);
function get_cap_month_fringes (
p_sal_distribution_id IN NUMBER,
p_cap_limit IN NUMBER
)
return cap_details_rec;
end cust_wfm_budget;
CORPO DA EMBALAGEM
CREATE OR REPLACE package body cust_wfm_budget
is
l_cap_details cap_details_rec;
FUNCTION get_cap_month_fringes (
p_sal_distribution_id IN NUMBER,
p_cap_limit IN NUMBER
)
RETURN cap_details_rec
IS
lv_return VARCHAR2(55):='TEST'; -- Keep as string
l_overcap_per NUMBER := 0; -- Assign numeric values directly
l_undercap_per NUMBER := 0;
BEGIN
-- Replace this logic with actual calculations for overcap_per and undercap_per
-- l_overcap_per := /* Calculate overcap percentage */;
-- l_undercap_per := /* Calculate undercap percentage */;
RETURN cap_details_rec(lv_return, l_overcap_per, l_undercap_per);
END get_cap_month_fringes;
end cust_wfm_budget;
/
COMPROMETER-SE;
BLOCO ANÔNIMO
DECLARE
TYPE cap_details_rec IS RECORD (
cap_month VARCHAR2(55),
overcap_per NUMBER,
undercap_per NUMBER
);
l_cap_details cap_details_rec;
BEGIN
l_cap_details := cust_wfm_budget.get_cap_month_fringes(1, 1);
-- Do something with l_cap_details
END;
O problema é que você não está usando o mesmo tipo que seu pacote espera. Só porque você declarou o tipo em seu bloco anônimo com a mesma estrutura do pacote não significa que você pode trocá-los.
Em vez disso, tudo que você precisa fazer é usar o tipo declarado na especificação do pacote em vez de criar um novo tipo, por exemplo:
Isso é demonstrado neste db<>fiddle .