Jump to content

Função/Procedimento


Feups
 Share

Recommended Posts

Queria queria uma função e um procedimento para a BD que é para simular um jogo.

Tenho duas tabelas(Jogadores(ID_JOGADOR,PONTOS,NOME), Aldeias(ID_ALDEIA,NOME,PONTOS,JOGADOR_ID_JOGADOR)), onde cada jogador pode ter 1 ou mais aldeias. A função é para somar os pontos da(s) aldeia(s) de cada jogador e return o valor da somas dos pontos. O procedimento era para fazer um update na tabela jogador para alterar o numero de pontos total da aldeia ou das aldeia.

Função

CREATE OR REPLACE FUNCTION conta_pontos_aldeias(
p_aldeia NUMBER)
RETURN NUMBER
IS
v_pontos NUMBER(9);
BEGIN
SELECT SUM(aldeia.pontos)
INTO v_pontos
FROM ALDEIA
GROUP BY JOGADOR_ID_JOGADOR;
RETURN(v_pontos);

END;
/

Procedimento

create or replace PROCEDURE conta_total_pontos(
 p_aldeia NUMBER)
IS
v_pontos NUMBER(9);
BEGIN
 UPDATE jogador
 set pontos = v_pontos;


v_pontos :=conta_pontos_aldeias(p_aldeia);
DBMS_OUTPUT.PUT_LINE(' Existem '||v_pontos||' pontos em '||p_aldeia|| ' aldeia');


END;

Ambos compilam, mas quando chamo o procedimento dá erro.

begin
CONTA_TOTAL_PONTOS(2);
end;
/

ERRO:

Error starting at line : 1 in command -

begin

CONTA_TOTAL_PONTOS;

end;

Error report -

ORA-06550: line 2, column 1:

PLS-00306: wrong number or types of arguments in call to 'CONTA_TOTAL_PONTOS'

ORA-06550: line 2, column 1:

PL/SQL: Statement ignored

06550. 00000 - "line %s, column %s:\n%s"

*Cause: Usually a PL/SQL compilation error.

*Action:

Edited by Feups
Link to comment
Share on other sites

bom dia,

no procedimento estás a fazer um update à tabela para atribuir os pontos a um jogador, mas não estás a indicar a que jogador se refere.

devias primeiro fazer selecionar os pontos do jogador, e depois fazias o update à tabela.

Eu copiei o procedimento e a função e comentei a parte do update (no procedimento) e do select (na função)

create or replace PROCEDURE conta_total_pontos(
	 p_aldeia NUMBER)
IS
 v_pontos NUMBER(9);
BEGIN
/*
	 UPDATE jogador
	 set pontos = v_pontos;
    */

 v_pontos := conta_pontos_aldeias(p_aldeia);
 DBMS_OUTPUT.PUT_LINE(' Existem '||v_pontos||' pontos em '||p_aldeia|| ' aldeia');

END;

CREATE OR REPLACE FUNCTION conta_pontos_aldeias(
p_aldeia NUMBER)
RETURN NUMBER
IS
v_pontos NUMBER(9);
BEGIN
v_pontos := 1;
 /*
 SELECT SUM(aldeia.pontos)
 INTO v_pontos
 FROM ALDEIA
 GROUP BY JOGADOR_ID_JOGADOR;
 */
RETURN(v_pontos);
END;

e obtive o seguinte resultado : Existem 1 pontos em 2 aldeia

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.