Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

CHAMAR FUNCTION EM UMA PROCEDURE

Boa tarde , fiz uma tabela numq com 3 valores numbers , n1, n2 e n3 . Que são três número onde n3 vai ser a soma de n1 com n2.

Primeiro fiz a function para receber n1 :

create or replace  function n1 (f_n1 numq.n1%type)
return numq.n1%type
is
begin
insert into numq (n1) values (f_n1);
return f_n1;
end;
`

Agora a procedure para chamar a função e somar

create or replace procedure somaq (p_n1 in numq.n1%type , p_n2 in numq.n2%type)
is
p_n3 numq.n3%type;
chamaf numq.n1%type; -- variavel para receber o valor da function

begin
chamaf := n1(p_n1);
p_n3 := chamaf + p_n2;
insert into numq (n1,n2,n3) values (chamaf , p_n2 , p_n3);
end;

Quando dou o select :

execute somaq (1,1)
select * from numq
n1 n2 n3
1   null null
1  1        2
`

pq ele cria duas linhas ? uma com dois valores null e outra certa ?

Obrigado

Rafa

4 respostas
solução!

Rafael, boa noite, blz?

Ele está criando a linhas com valores NULL porque na FUNCTION n1 você faz o INSERT só do campo n1, nesse momento ele já cria a linha n1 NULL NULL.

Depois na PROCEDURE somaq você faz um novo INSERT, uma nova linha é criada, com todos os valores já calculados.

Espero ter ajudado.

Bons estudos!

Bacana Diego, eu não tinha percebido isso .

Vou tentar mudar essa query

insert into numq (n1) values (f_n1);

por

select n1 from numq into (f_n1)

ainda não testei , se der certo eu posto ..

Obrigado Diego :)

Opa mudei o código :

create or replace function n1 (f_n1 numq.n1%type , f_n2 numq.n2%type)
return numq.n3%type
is
f_n3 numq.n3%type;
begin
f_n3 := f_n1 + f_n2;
INSERT INTO NUMQ (n1,n2,n3) VALUES (f_n1, f_n2, f_n3);
return f_n3;
commit;
end;
create or replace procedure somaq (p_n1 in numq.n1%type , p_n2 in numq.n2%type)
is
p_n3 numq.n3%type;
chamaf numq.n3%type;
begin
chamaf := n1(p_n1,p_n2);
end;

Teria como colocar o n1 pela function sem que o n2 e n3 sejam nulls ?

Obrigado

opa consegui resolver , somente retornando o f_n1

create or replace function n1 (f_n1 numq.n1%type)
return numq.n1%type
is
begin
return (f_n1);
end;
create or replace procedure somaq (p_n1 in numq.n1%type , p_n2 in numq.n2%type)
is
p_n3 numq.n3%type;
chamaf numq.n1%type;
begin
chamaf := n1(p_n1);
p_n3 := chamaf + p_n2;
insert into numq (n1, n2 , n3) values (chamaf , p_n2 , p_n3);
end;