BancoDeDadosII

Embed Size (px)

DESCRIPTION

Aula12 Function

Citation preview

Apresentao do PowerPoint

Funes ou procedures

Professor Esp. Diego Andr SantAnaE-mail: [email protected]: Banco de Dados IIprofessordiegosantana.wordpress.comExemplo de funesAs funes que utilizamos que j existe e o AVG(),MAX(),MIN(), NOW() e etc.Estrutura bsicaCREATE OR REPLACE FUNCTION nome_da_funcao ( parametros )RETURNS tipo_retorno AS$$DECLARE--declaracao de variaveisBEGIN--conteudo da funcaoEND;$$ LANGUAGE linguagem;Funo somaCREATE OR REPLACE FUNCTION get_soma( integer ,integer) RETURNS integer AS$$DECLARE soma INTEGER;BEGIN return $1+$2;END;$$ LANGUAGE 'plpgsql';

select get_soma(2,3)Funo divisoCREATE OR REPLACE FUNCTION get_divisao ( integer ,integer) RETURNS integer AS$$DECLAREresultado INTEGER;BEGIN return $1/$2;END;$$ LANGUAGE 'plpgsql';

select get_divisao(2,3)Funo IMCCREATE OR REPLACE FUNCTION get_imc( peso integer ,altura numeric) RETURNS numeric AS$$DECLAREimc INTEGER;BEGIN return $1/($2*$2);END;$$ LANGUAGE 'plpgsql';

select get_imc (2,3)Funo para trazer os menores de idadecreate function menor_idade() returns setof prova.aluno as 'select * from prova.aluno where idade < 18' language 'SQL';

select menor_idade() Funo para trazer o aluno passando ID_ALUNOcreate function get_aluno (int) returns varchar as 'select nome_aluno from prova.aluno where id_aluno = $1' language 'SQL';

select get_aluno(1);Funo de multiplicaoCREATE OR REPLACE FUNCTION get_multiplicacao (p1 integer ,p2 integer) RETURNS integer AS$$DECLAREresultado INTEGER;BEGIN return p1*p2;END;$$ LANGUAGE 'plpgsql';select get_multiplicacao(9,7)Teste com a multiplicaoselect p1,p2,get_multiplicacao(p1,p2) from ((select generate_series as p1 from generate_series(1,10,1)) as a cross join (select generate_series as p2 from generate_series(1,10,1)) as b)as aFuno MdiaCrie uma funo que recebe 3 valores e retorne a media aritmetica.Funo MdiaCrie uma funo que recebe 3 valores N1 X PESO 2,N2 X PESO 2, N3 X PESO 3e retorne a media ponderada.Funo retornar o msCrie uma funo que entre com o ms e retorne o nome do ms;

Funo retornar o msCREATE OR REPLACE FUNCTION GET_MES_SQL(INTEGER) RETURNS VARCHAR ASE'select case $1 when 1 then \'JANEIRO\' when 2 then \'FEVEREIRO\' when 3 then \'MARO\' when 4 then\'ABRIL\' when 5 then\'MAIO\' when 6 then \'JUNHO\' when 7 then \'JULHO\' when 8 then \'AGOSTO\' when 9 then \'SETEMBRO\' when 10 then\'OUTUBRO\' when 11 then\'NOVEMBRO\' when 12 then \'DEZEMBRO\' END AS MES'

LANGUAGE 'sql';

SELECT GET_MES_SQL(2);IF NO POSTGRESQLIF $1=1 THEN RETURN 'JANEIRO'; ELSIF $1=2 THEN RETURN 'FEVEREIRO'; ELSE RETURN NAO TEM; END IF;

Funo retornar o msCREATE OR REPLACE FUNCTION GET_MES(INTEGER) RETURNS VARCHAR AS$$DECLAREMES INTEGER:=$1;BEGIN IF MES=1 THEN RETURN 'JANEIRO'; ELSIF MES=2 THEN RETURN 'FEVEREIRO'; END IF;END;$$

LANGUAGE 'plpgsql';COMO IMPRIMIR MENSAGEM RAISE NOTICE 'existe no banco ID = % ', id;

create function teste(id integer)returns void as$$ BEGIN RAISE NOTICE 'existe no banco ID = % ', id;END; $$LANGUAGE 'plpgsql';

SELECT TESTE(1);For na funoFOR registro IN SELECT * FROM prova.aluno LOOP /*programao*/ END LOOP;For na funoCREATE OR REPLACE FUNCTION get_nome_concatenano() RETURNS varchar AS $$DECLAREregistro RECORD;cont integer;nome varchar;BEGINRAISE NOTICE 'Inicio';nome := 'inicial:';FOR registro IN SELECT * FROM prova.aluno limit 10 LOOPRAISE NOTICE 'to no loop ID = % ', registro.id_aluno;nome :=nome || registro.nome_aluno;RAISE NOTICE 'nome = % ', registro.nome_aluno;END LOOP;return 1;END;$$ LANGUAGE plpgsql;select get_nome_concatenano() Funo converte data para somente ms e dia create function get_numdate (date) returns integer as E'select to_char($1,\'mmdd\')::integer' language 'SQL'; select get_numdate('1987-11-30'::date)Funo para trazer o signo da pessoa create function get_signo (int) returns varchar as E'select case when $1 =0121 and $1 =0220 and $1 =0321 and $1 =0421 and $1 =0521 and $1 =0621 and $1 =0723 and $1 =0823 and $1 =0923 and $1 =1023 and $1 =1123 and $1 =1223 then \'capricornio\'end as signo' language 'SQL;

select get_signo (get_numdate('1987-11-30'::date))

Funo para trazer o signo da pessoacreate OR REPLACE function get_signo_plpgsql (MES_DIA int) returns varchar as$$BEGIN IF MES_DIA =0121 and MES_DIA =0220 and MES_DIA =0321 and MES_DIA =0421 and MES_DIA =0521 and MES_DIA =0621 and MES_DIA =0723 and MES_DIA =0823 and MES_DIA =0923 and MES_DIA =1023 and MES_DIA =1123 and MES_DIA =1223 then RETURN 'capricornio'; END IF; END;$$language 'plpgsql';

select get_signo_PLPGSQL ( get_numdate('1987-11-30'::date))

Crie a tabela CREATE TABLE usuario (id integer NOT NULL,nm_login character varying,ds_senha character varying,fg_bloqueado boolean,nu_tentativa_login integer,CONSTRAINT pk_usuario PRIMARY KEY (id));

insert into usuario(id,nm_login,ds_senha,fg_bloqueado,nu_tentativa_login) values(1,'diego','1',false,0);insert into usuario(id,nm_login,ds_senha,fg_bloqueado,nu_tentativa_login) values(2,'maria','13',false,0);insert into usuario(id,nm_login,ds_senha,fg_bloqueado,nu_tentativa_login) values(3,'joao','123',false,0);insert into usuario(id,nm_login,ds_senha,fg_bloqueado,nu_tentativa_login) values(4,'pedro','123',true,0);Criar a funoCREATE OR REPLACE FUNCTION get_id ( varchar ) RETURNS integer AS$$DECLAREvariavel_id INTEGER;BEGINSELECT INTO variavel_id id FROM usuario WHERE nm_login = $1;RETURN variavel_id;END;$$ LANGUAGE 'plpgsql';

Sobre a funoA funo acima (chamadaget_id) recebe comoparmetroum VARCHAR eretornaum INTEGER, e funciona da seguinte forma:- declara uma varivel chamadavariavel_id, do tipo INTEGER;-faz um selectna tabelas de usurio onde a colunanm_login igual aovarcharrecebido como parmetro, e colocar o valor deidencontrado dentro da varivelvariavel_id(atravs do comandoSELECT INTO);- retorna avariavel_id.O $1 representa o primeiro parmetro recebido, o $2 o segundo, e assim por diante.

Para executarSELECT get_id( 'joao' );Exemplo de funoCREATE OR REPLACE FUNCTION set_tentativa_login ( VARCHAR, VARCHAR )RETURNS VOID AS$$DECLAREregistro RECORD;--variavel para armazenar a linha do registrotentativas INTEGER; -- variavel numero de tentativaBEGINSELECT INTO registro id, fg_bloqueado, nu_tentativa_login FROM usuario WHERE nm_login = $1 AND ds_senha = $2;IF registro IS NULL --se registro for nulo na pesquisa de login e senha entraTHEN SELECT INTO tentativas nu_tentativa_login FROM usuario WHERE nm_login = $1; --busca pelo logintentativas := tentativas + 1; --incrementa as tentativasIF tentativas > 2THEN--se tentar apartir da 3 vez ele bloqueadoUPDATE usuario SET nu_tentativa_login = tentativas, fg_bloqueado = TRUE where nm_login = $1;ELSE --incrementa 1 no numero de tentativaUPDATE usuario SET nu_tentativa_login = tentativas where nm_login = $1;END IF;ELSE --se caso o valor for correto ele zera o numero de tentativaUPDATE usuario SET nu_tentativa_login = 0 where nm_login = $1;END IF;END;$$LANGUAGE 'plpgsql';Exemplo de chamada loginSELECT set_tentativa_login( 'hallan', 'senha_errada' );SELECT set_tentativa_login( 'maria', 'senha_errada' );SELECT set_tentativa_login( 'hallan', 'hallan2011' );Exemplo de chamada loginCREATE OR REPLACE FUNCTION set_tentativa_login_boolean ( VARCHAR, VARCHAR ) RETURNS BOOLEAN AS$$DECLARE registro RECORD;--variavel para armazenar a linha do registro tentativas INTEGER; -- variavel numero de tentativaBEGIN SELECT INTO registro id, fg_bloqueado, nu_tentativa_login FROM usuario WHERE nm_login = $1 AND ds_senha = $2; IF registro IS NULL --se registro for nulo na pesquisa de login e senha entra THEN SELECT INTO tentativas nu_tentativa_login FROM usuario WHERE nm_login = $1; --busca pelo login tentativas := tentativas + 1; --incrementa as tentativas IF tentativas > 2 THEN--se tentar apartir da 3 vez ele bloqueado UPDATE usuario SET nu_tentativa_login = tentativas, fg_bloqueado = TRUE where nm_login = $1; ELSE --incrementa 1 no numero de tentativa UPDATE usuario SET nu_tentativa_login = tentativas where nm_login = $1; END IF; RETURN FALSE; ELSIF (registro.fg_bloqueado=FALSE) THEN --se caso o valor for correto ele zera o numero de tentativa UPDATE usuario SET nu_tentativa_login = 0 where nm_login = $1; RETURN TRUE;--pode logar ELSIF (registro.fg_bloqueado=TRUE) THENRETURN FALSE; --Se usuario ja bloqueado nao pode logar END IF;END;$$LANGUAGE 'plpgsql';

Exemplo de chamada loginselect * from usuarioselect set_tentativa_login_BOOLEAN('diego','12')REFERNCIAShttp://www.linuxnewmedia.com.br/images/uploads/pdf_aberto/LM07_postgresql.pdfhttp://postgresqlbr.blogspot.com.br/2012/08/tratamento-de-parametros-de-funcoes-com.htmlhttp://pt.wikibooks.org/wiki/PostgreSQL_Pr%C3%A1tico/Fun%C3%A7%C3%B5es_Definidas_pelo_Usu%C3%A1rio_e_Triggers/SQL