Função para inserir usuario, verificar se existe e retornar uma password

12 respostas
Mariana.Vecci
Oii gente! tenho uma tabela Usuário:
CREATE TABLE Usuario (
  cod_u serial NOT NULL PRIMARY KEY,
  nome_u VARCHAR(30) NOT NULL,
  nick_u VARCHAR(10) NOT NULL,
  email_u VARCHAR(20) NOT NULL,
  pass_u VARCHAR(8) NOT NULL
);

e quero fazer uma função (uso o postgresql) para que insira um novo usuário, mas que verifique se o mesmo exista e retorne a password dele,
estou com dúvidas quanto aos parâmetros, pois o código é serial, ai não sei se devo passar ele ou não na função.

CREATE OR REPLACE FUNCTION inserir_usuario (varchar(30), varchar(10), varchar(20), varchar(8))
 RETURNS integer AS
$body$
BEGIN
 insert into Usuario values ($1,$2,$3,$4);
END;
$body$

LANGUAGE 'plpgsql';

Obrigadinha!

12 Respostas

drsmachado

Se o banco mesmo gerencia esse código, não há necessidade de passar o código.
Eu, particularmente, nunca coloco o código como parâmetro, deixo que o BD faça isso.

luizfelipetx

Você quer fazer essa programação direto no plsql mesmo ?

abcs

Mariana.Vecci

drsmachado: Se eu deixar somente 4 campos na função (um a menos por causa do codigo) ele dá erro
luizfelipetx: Sim quero fazer essa função no plpgsql.

Obrigadinha queridos!

drsmachado

Isso por que a query

insert into Usuario values ($1,$2,$3,$4);

indica que todas as colunas receberão algum valor.
Você precisa especificar quais colunas estará valorando.

insert into Usuario (col2, col3, col4, col5) values ($1,$2,$3,$4);

Isso se e apenas se, o codigo for gerenciado pelo banco, senão, ou você trata isso na aplicação ou cria uma outra forma de gerar o código dentro da procedure.

Mariana.Vecci

drsmachado:Obrigada! Funcionou, agora como faço para verificar se o usuário ja existe no banco?
Obrigada!

drsmachado

Então, antes do insert, é preciso fazer um select.
Não sei quais dados está passando, o interessante seria verificar por todos.
Eu uso cursor (tudo bem que nunca tentei em postgres, só no mysql), pois me permite por o valor de uma consulta em uma variável e testá-la.
Como você sabe quais parâmetros, é possível até fazer um count(coluna_qualquer). Se ele for 0, pode adicionar, senão, sai da função

Eu achei estes ppts bem legais, acho que podem te ajudar www2.joinville.udesc.br/~dcc2efcm/SQLproceduralparte2.ppt

Mariana.Vecci

dsrmachado: Adorei o material! Acho meio complicado de mexer com cursor...

ai fiz assim, e aparentemente funcionou, ele acusa quando tem algum usuario igual(compara o nicki e o email) e retorna na tela
isso:

NOTA: ja existe
ERRO: controle atingiu o fim da função sem RETURN
CONTEXT: função PL/pgSQL "inserir_usuario"

Olha como ficou:
CREATE OR REPLACE FUNCTION inserir_usuario (varchar(30), varchar(10), varchar(20), varchar(8))
 RETURNS integer AS
$body$
DECLARE 
 existe integer;
BEGIN
     existe:=0;
     SELECT count(*) INTO ecount FROM Usuario WHERE nick_u=$2 AND email_u=$3;
     if existe=0 then
      INSERT INTO Usuario (nome_u, nick_u, email_u, pass_u) VALUES ($1,$2,$3,$4);
      RETURN $4; 
     else
      existe:=1; 
      RAISE NOTICE 'ja existe';
     end if; 
END;
$body$

LANGUAGE 'plpgsql';

beijokas.

drsmachado

Em Postgres é complicado, quando uso no MySQL acho bem mais fácil.

Espero que tenha ajudado.

Mariana.Vecci

Obrigada mais uma vez, ajudou muito, agora eu queria fazer uma outra função, uma para mudar a password do usuario,
mas to com dúvida se na hora de executar a função o usuario iria entrar com a nova password ou com todos os campos.

CREATE OR REPLACE FUNCTION atualizar_usuario(varchar(8)) RETURNs integer AS $BODY$ declare pass varchar(8); BEGIN update Usuario set pass_u = pass where pass_u = $1; return $1; END; $BODY$ LANGUAGE 'plpgsql';

Obrigada!

drsmachado

Esta questão é mais complicada, afinal, é preciso certificar-se que se trata do usuário. Não sei como está tratando isto.
Enfim, eu faria uma análise de todos os dados possíveis.

Mariana.Vecci

Bom, não entendo o você quer dizer com “Não sei como está tratando”

Minha visão é de quando eu chamasse a função, ja fosse com a password nova, assim:

SELECT atualizar_usuario (‘fulano’,‘fulaninho’,‘[email removido]’,‘novapassword’);

drsmachado

Ah, entendi.
Você está apenas alterando e não recuperando a senha.
Foi mal.
É que eu entendi que estaria gerando uma nova, caso o usuário a perdesse.
Sim, assim está ok.

Criado 7 de junho de 2011
Ultima resposta 8 de jun. de 2011
Respostas 12
Participantes 3