funções ou procedures professor esp. diego andré sant’ana e-mail: [email protected]...
TRANSCRIPT
![Page 1: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/1.jpg)
Funções ou procedures
Professor Esp. Diego André Sant’AnaE-mail: [email protected]: Banco de Dados IIprofessordiegosantana.wordpress.com
![Page 2: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/2.jpg)
Exemplo de funções
As funções que utilizamos que já existe e o AVG(),MAX(),MIN(), NOW() e etc.
![Page 3: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/3.jpg)
Estrutura básicaCREATE OR REPLACE FUNCTION
nome_da_funcao ( parametros ) RETURNS tipo_retorno AS$$DECLARE --declaracao de variaveisBEGIN --conteudo da funcaoEND;$$ LANGUAGE linguagem;
![Page 4: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/4.jpg)
Função soma
CREATE 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)
![Page 5: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/5.jpg)
Função divisão
CREATE OR REPLACE FUNCTION get_divisao ( integer ,integer) RETURNS integer AS
$$ DECLARE resultado INTEGER; BEGIN return $1/$2; END; $$ LANGUAGE 'plpgsql';
select get_divisao(2,3)
![Page 6: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/6.jpg)
Função IMC
CREATE OR REPLACE FUNCTION get_imc( peso integer ,altura numeric) RETURNS numeric AS
$$ DECLARE imc INTEGER; BEGIN return $1/($2*$2); END; $$ LANGUAGE 'plpgsql';
select get_imc (2,3)
![Page 7: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/7.jpg)
Função 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()
![Page 8: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/8.jpg)
Função 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);
![Page 9: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/9.jpg)
Função de multiplicaçãoCREATE OR REPLACE FUNCTION
get_multiplicacao (p1 integer ,p2 integer) RETURNS integer AS
$$DECLARE resultado INTEGER;BEGIN return p1*p2;END;$$ LANGUAGE 'plpgsql';select get_multiplicacao(9,7)
![Page 10: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/10.jpg)
Teste com a multiplicação
select 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 a
![Page 11: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/11.jpg)
Função Média
Crie uma função que recebe 3 valores e retorne a media aritmetica.
![Page 12: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/12.jpg)
Função Média
Crie uma função que recebe 3 valores N1 X PESO 2,
N2 X PESO 2, N3 X PESO 3e retorne a media ponderada.
![Page 13: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/13.jpg)
Função retornar o mês
Crie uma função que entre com o mês e retorne o nome do mês;
![Page 14: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/14.jpg)
Função retornar o mês CREATE OR REPLACE FUNCTION GET_MES_SQL(INTEGER)
RETURNS VARCHAR AS E'select case $1 when 1 then \'JANEIRO\' when 2 then \'FEVEREIRO\'
when 3 then \'MARÇO\' 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);
![Page 15: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/15.jpg)
IF NO POSTGRESQLIF $1=1 THEN RETURN 'JANEIRO'; ELSIF $1=2 THEN RETURN 'FEVEREIRO'; ELSE RETURN ‘NAO TEM’; END IF;
![Page 16: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/16.jpg)
Função retornar o mês
CREATE OR REPLACE FUNCTION GET_MES(INTEGER) RETURNS VARCHAR AS
$$ DECLARE MES INTEGER:=$1; BEGIN IF MES=1 THEN RETURN 'JANEIRO'; ELSIF MES=2 THEN RETURN 'FEVEREIRO'; END IF; END; $$
LANGUAGE 'plpgsql';
![Page 17: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/17.jpg)
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);
![Page 18: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/18.jpg)
For na função
FOR registro IN SELECT * FROM prova.aluno LOOP /*programação*/
END LOOP;
![Page 19: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/19.jpg)
For na função
CREATE OR REPLACE FUNCTION get_nome_concatenano() RETURNS varchar AS $$
DECLARE registro RECORD; cont integer; nome varchar; BEGIN RAISE NOTICE 'Inicio'; nome := 'inicial:'; FOR registro IN SELECT * FROM prova.aluno limit 10 LOOP RAISE 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()
![Page 20: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/20.jpg)
Função converte data para somente mês 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)
![Page 21: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/21.jpg)
Função para trazer o signo da pessoa create function get_signo (int) returns varchar as E'select case when $1 <=0120 then \'capricornio\' when $1 >=0121 and $1 <=0219 then \'aquario\' when $1 >=0220 and $1 <=0320 then \'peixes\' when $1 >=0321 and $1 <=0420 then \'aries\' when $1 >=0421 and $1 <=0520 then \'touro\' when $1 >=0521 and $1 <=0620 then \'gemeos\' when $1 >=0621 and $1 <=0722 then \'cancer\' when $1 >=0723 and $1 <=0822 then \'leao\' when $1 >=0823 and $1 <=0922 then \'virgem\' when $1 >=0923 and $1 <=1022 then \'libra\' when $1 >=1023 and $1 <=1122 then \'escorpiao\' when $1 >=1123 and $1 <=1222 then \'sagitario\' when $1 >=1223 then \'capricornio\'end as signo' language 'SQL‘;
select get_signo (get_numdate('1987-11-30'::date))
![Page 22: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/22.jpg)
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));
![Page 23: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/23.jpg)
Criar a funçãoCREATE OR REPLACE FUNCTION get_id
( varchar ) RETURNS integer AS$$DECLARE variavel_id INTEGER;BEGIN SELECT INTO variavel_id id FROM
usuario WHERE nm_login = $1; RETURN variavel_id;END;$$ LANGUAGE 'plpgsql';
![Page 24: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/24.jpg)
Sobre a função A função acima (chamada get_id) recebe
como parâmetro um VARCHAR e retorna um INTEGER, e funciona da seguinte forma:
- declara uma variável chamada variavel_id, do tipo INTEGER;
- faz um select na tabelas de usuário onde a coluna nm_login é igual ao varchar recebido como parâmetro, e colocar o valor de id encontrado dentro da variável variavel_id (através do comandoSELECT INTO);
- retorna a variavel_id. O $1 representa o primeiro parâmetro recebido, o
$2 o segundo, e assim por diante.
![Page 25: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/25.jpg)
Para executarSELECT get_id( 'joao' );
![Page 26: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/26.jpg)
Exemplo de função CREATE OR REPLACE FUNCTION set_tentativa_login ( VARCHAR, VARCHAR )
RETURNS VOID AS
$$
DECLARE
registro RECORD;
tentativas INTEGER;
BEGIN
SELECT INTO registro id, fg_bloqueado, nu_tentativa_login FROM usuario WHERE nm_login = $1 AND ds_senha = $2;
IF registro IS NULL
THEN
SELECT INTO tentativas nu_tentativa_login FROM usuario WHERE nm_login = $1;
tentativas := tentativas + 1;
IF tentativas > 2
THEN
UPDATE usuario SET nu_tentativa_login = tentativas, fg_bloqueado = TRUE where nm_login = $1;
ELSE
UPDATE usuario SET nu_tentativa_login = tentativas where nm_login = $1;
END IF;
ELSE
UPDATE usuario SET nu_tentativa_login = 0 where nm_login = $1;
END IF;
END;
$$
LANGUAGE 'plpgsql';
![Page 27: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/27.jpg)
Exemplo de chamada loginSELECT set_tentativa_login( 'hallan', 'senha_errada' );
SELECT set_tentativa_login( 'maria', 'senha_errada' );
SELECT set_tentativa_login( 'hallan', 'hallan2011' );
![Page 28: Funções ou procedures Professor Esp. Diego André Sant’Ana E-mail: diego.santana@ifms.edu.br Disciplina: Banco de Dados II professordiegosantana.wordpress.com](https://reader035.vdocuments.net/reader035/viewer/2022070311/552fc144497959413d8e068d/html5/thumbnails/28.jpg)
REFERÊNCIAS
http://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