0% acharam este documento útil (0 voto)
114 visualizações12 páginas

RESUMO PostgreSQL

O documento descreve as principais estruturas e funcionalidades de views, funções, procedimentos e triggers no PostgreSQL. Em três frases: Cria views para selecionar e exibir dados de tabelas de forma personalizada. Define funções para realizar operações e lógica de negócio reutilizáveis. Implementa procedimentos e triggers para automatizar tarefas como atualizações e acionar ações antes e depois de inserções ou exclusões de dados.

Enviado por

IsaacMedeiros
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
114 visualizações12 páginas

RESUMO PostgreSQL

O documento descreve as principais estruturas e funcionalidades de views, funções, procedimentos e triggers no PostgreSQL. Em três frases: Cria views para selecionar e exibir dados de tabelas de forma personalizada. Define funções para realizar operações e lógica de negócio reutilizáveis. Implementa procedimentos e triggers para automatizar tarefas como atualizações e acionar ações antes e depois de inserções ou exclusões de dados.

Enviado por

IsaacMedeiros
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
Você está na página 1/ 12

VISÃO

CREATE VIEW nome_view AS


SELECT * FROM tabela;

EXEMPLO: Listar alunos e quantidade de disciplinas inscritas

CREATE VIEW alunoDisciplina AS


SELECT a.nome,count(*) AS disciplinas_inscritas FROM aluno a, cursa c, disciplina d
WHERE a.coda = c.coda AND c.codd = d.codd GROUP BY a.nome;

CREATE VIEW nome_view (nova_coluna1 , nova_coluna2) AS


SELECT coluna1, coluna2 FROM tabela;

EXEMPLO:

CREATE VIEW nomeDisciplina (nome,disciplina) AS


SELECT * FROM aluno a, cursa c, disciplina d WHERE a.coda = c.coda AND c.codd = d.codd;

Obs: Para adcionar respeitar a restrição da tabela coloca WITH CHECK OPTION no final do
comando

SELECT * FROM nome_view;

EXEMPLO:

SELECT * FROM alunoDisciplina;

DROP VIEW nome_view;

FUNÇÃO

a) ESTRUTURA GERAL

CREATE OR REPLACE​ FUNCTION nome_funcao(variável_entrada <tipo>)


RETURNS <tipo> AS $$
DECLARE
variável_1 <tipo> ;
variável_2 <tipo> ;
BEGIN
……………..
RETURN variável_2;
END;
$$ LANGUAGE plpgsql;

Tipo → numeric / text / boolean (FALSE/TRUE) / integer / varchar(n);


b) OPERAÇÕES SIMPLES

EXEMPLO: Soma de dois valores

CREATE OR REPLACE FUNCTION soma(a numeric, b numeric)


RETURNS numeric AS $$
DECLARE
resultado numeric;
BEGIN
resultado := a + b;
RETURN resultado;
END;
$$ LANGUAGE plpgsql;

OPERADORES → +-*/
CONCATENAR TEXTOS → 'texto' || 'texto'
FUNCAO DE POTENCIA → POWER(base, expoente);

c) ​IF ELSE

IF condicao THEN ….;


ELSE ….;
END IF;

EXEMPLO: Veficar se um número é positivo

CREATE OR REPLACE FUNCTION ehPositivo(x numeric)


RETURNS boolean AS $$
DECLARE
resultado boolean;
BEGIN
IF x < 0 THEN resultado := FALSE;
ELSE resultado := TRUE;
END IF;
RETURN resultado;
END;
$$ LANGUAGE plpgsql;
EXEMPLO: Veficar é menor de idade

CREATE OR REPLACE FUNCTION ehMenor(idade numeric)


RETURNS text AS $$
DECLARE
resultado text;
BEGIN
IF idade < 18 THEN resultado := 'ELE É MENOR DE IDADE';
ELSE resultado := 'ELE É MENOR É MAIOR DE IDADE';
END IF;
RETURN resultado;
END;
$$ LANGUAGE plpgsql;

d) ​LAÇOS

Bloco de loop

LOOP
..…;
END LOOP;

COMANDOS PARA SAIR DO LOOP

FOR i IN 1..10
<bloco de loop>

FOR i IN REVERSE 10..1


<bloco de loop>

WHILE condição
<bloco de loop>

IF condicao THEN EXIT;


END IF;

EXIT WHEN condição;


EXEMPLO: Função que retorna fatorial

CREATE OR REPLACE FUNCTION fatorial(x integer)


RETURNS integer AS $$
DECLARE
fat integer;
BEGIN
fat := 1;
FOR i IN 1..x
LOOP
fat := fat * i;
END LOOP;
RETURN fat;
END;
$$ LANGUAGE plpgsql;

EXEMPLO: Função que retorna fatorial2

CREATE OR REPLACE FUNCTION fatorial2(x integer)


RETURNS integer AS $$
DECLARE
fat integer;
i integer;
BEGIN
fat := 1;
i :=1
WHILE i <= x
LOOP
fat := fat * i;
i := i+1;
END LOOP;
RETURN fat;
END;
$$ LANGUAGE plpgsql;

e) ​CASE

CASE x
WHEN <a> THEN
……;
WHEN <b> THEN
……;
WHEN <c> THEN
……;
ELSE
……;
END CASE;
f) PASSAR VALOR RESULTADO DE UMA TABELA PARA UMA VARIAVEL

CREATE OR REPLACE FUNCTION nome_funcao(codigo <tipo>)


RETURNS <tipo> AS $$
DECLARE
variavel <tipo>;
BEGIN
SELECT coluna INTO variavel FROM tabela WHERE valor_coluna = codigo;

RETURN variavel;
END;
$$ LANGUAGE plpgsql;

CURSOR

As colunas da tabela é como um array (vetor);


O cursor passa por todas as linha da coluna em cada loop;
O valor do objeto apontado pelo cursor é passado para um variável do tipo
correspondente

1) DECLARAÇÃO

DECLARE
valor_buscado <tipo>;
resultado <tipo>;
cursor_nome CURSOR FOR
SELECT coluna FROM tabela;

2) LOOP

OPEN cursor_nome;
<bloco de loop>
CLOSE cursor_nome;

3) BUSCA

//O Codigo abaixo ficará dentro do bloco de loop

FETCH NEXT FROM cursor_nome INTO valor_buscado;


EXIT WHEN NOT FOUND;
resultado := valor_buscado;

/lerá todo dado do cursor CURSOR_NOME correspondente a coluna e passará cada valor para
a variável VALOR_BUSCADO e a variável RESUTADO obterá o valor
EXEMPLO: Exibir a nota correspondente ao nome de um aluno

CREATE OR REPLACE FUNCTION exibeNota(nomeAluno text)


RETURNS numeric AS $$
DECLARE
resultado numeric;
notaBuscada numeric;
cursor_nota CURSOR FOR
SELECT cr FROM aluno WHERE nome = nomeAluno;

BEGIN
OPEN cursor_nota;
LOOP
FETCH NEXT FROM cursor_nota INTO notaBuscada;
EXIT WHEN NOT FOUND;
resultado := notaBuscada;
END LOOP;
CLOSE cursor_nota;
RETURN resultado;
END;
$$ LANGUAGE plpgsql;

EXEMPLO: Somar notas dos alunos conforme o ano de nascimento

CREATE OR REPLACE FUNCTION somarNota(ano numeric)


RETURNS numeric AS $$
DECLARE
resultado numeric;
notaBuscada numeric;
nascimentoBuscado numeric;
cursor_nota CURSOR FOR
SELECT cr ,nascimento FROM aluno;
BEGIN
resultado := 0;
OPEN cursor_nota;
LOOP
FETCH NEXT FROM cursor_nota INTO notaBuscada, nascimentoBuscado;
EXIT WHEN NOT FOUND;
IF ( nascimentoBuscado > ano ) THEN
resultado := resultado + notaBuscada;
END IF;
END LOOP;
CLOSE cursor_nota;
RETURN resultado;
END;
$$ LANGUAGE plpgsql;
PROCEDIMENTO

retorna vazio (só aceita UPDATE, INSERT, DELETE)

CREATE OR REPLACE​ FUNCTION nome_funcao(variável_entrada <tipo>)


RETURNS void AS $$
DECLARE
….
BEGIN
<UPDATE, INSERT, DELETE>
END;
$$ LANGUAGE plpgsql;

EXEMPLO: Atualizar tabela

CREATE OR REPLACE FUNCTION alteraNota(codigo numeric, novaNota numeric)


RETURNS void AS $$
DECLARE

BEGIN
UPDATE aluno SET cr = novaNota WHERE coda = codigo;
END;
$$ LANGUAGE plpgsql;

Extra SQL

UPDATE

UPDATE tabela SET coluna = valor


WHERE coluna1 = valor1;

UPDATE aluno SET cr = 9.3 WHERE coda = 2222;

UPDATE tabela SET coluna = (CASE WHEN <condicao> THEN <valor> ELSE <valor> END)
WHERE coluna1 = valor1;

UPDATE aluno SET cr = (CASE WHEN cr < 7 THEN cr*0.8 ELSE cr*0.8 END)

UPDATE tabela SET coluna =


(CASE WHEN <condicao> THEN <valor>
WHEN <condicao> THEN <valor>
WHEN <condicao> THEN <valor> ELSE <valor> END) WHERE coluna1 = valor1;

UPDATE filme SET preco_sugerido_locacao =


(CASE WHEN censura = 12 THEN preco_sugerido_locacao*1.05
WHEN censura = 16 THEN preco_sugerido_locacao*1.1
ELSE preco_sugerido_locacao*1.02 END)

INDICE

CREATE INDEX indiceColuna ON tabela (coluna);

DROP INDEX indiceColuna;

Indice serve para melhorar o desempenho nas consultas de uma tabela naqual possa possuir
uma grande quantidade de dados.

COPIAR TABELA

SELECT * INTO novaTabela FROM tabela;

COPIAR SÓ A ESTRUTURA DA TABELA

SELECT * INTO novaTabela FROM tabela WHERE 1=0;


TRIGGER

Não possui argumentos de antrada

funcao_trigger() → função que não recebe argumentos e retorna um trigger


(1ª passo)

CREATE OR REPLACE FUNCTION funcao_trigger()


RETURNS trigger AS $$
DECLATE
….
BEGIN
<UPDATE, INSERT, DELETE em cima de tabela>
<RETURN NEW>
END;
$$ LANGUAGE plpgsql;

(2ª passo)

CREATE TRIGGER nome_trigger <BEFORE | AFTER > <INSERT | DELETE | UPDATE >
ON tabela
FOR EACH ROW EXECUTE PROCEDURE funcao_trigger();

Dica

NEW.coluna → valor que será inserido na tabela, ou por INSERT ou UPDATE

- Mudar/Corrigir valores antes de serem inserios

EXEMPLO: Corrigir idade automaticamente quando inserida na tabela

CREATE OR REPLACE FUNCTION corrigeIdade()


RETURNS trigger AS $$
DECLARE
BEGIN
NEW.idade = 2016 - NEW.nascimento;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tgCorrigeIdade BEFORE INSERT OR UPDATE ON aluno


FOR EACH ROW EXECUTE PROCEDURE corrigeIdade();

INSERT INTO aluno VALUES (987,'MARIEL', 1990, 5, null);

//O valor da idade será 26 (2016 - nascimento) na tabela

operação → trigger → tabela (BEFORE)

- Transferir tuplas inseridas para outra tabela

EXEMPLO: A tabela "alunorep" receberá as notas (cr) menores que 5 automaticamente quando
inseridas na tabela "aluno". Ambas precisam ter a mesma estrutura .

CREATE OR REPLACE FUNCTION menorNota()


RETURNS trigger AS $$
DECLARE
BEGIN
IF NEW.cr<5 THEN
INSERT INTO alunorep (coda,nome,nascimento,cr,idade)
VALUES (NEW.coda,NEW.nome,NEW.nascimento,NEW.cr,NEW.idade);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tgMenorNota BEFORE INSERT OR UPDATE ON aluno


FOR EACH ROW EXECUTE PROCEDURE menorNota();

INSERT INTO aluno VALUES (345,'MARIA', 1996, 5, 20);


INSERT INTO aluno VALUES (567, 'CARLOS', 1992, 4, 24); /​ /será enviado a alunorep pois 4<5

- Comparar uma valor novo (NEW) com o antigo (OLD)

EXEMPLO: Não pode atualizar a tabela com valor que seja menor que 50% de mesmo

CREATE OR REPLACE FUNCTION fc_atualizacao_preco()


RETURNS trigger AS $$
DECLARE
BEGIN
IF (NEW.preco_aplicado < OLD.preco_aplicado * 0.5) THEN
RAISE EXCEPTION 'Nao diminua o preco aplicado ou aumente mais de 50 porcento';
END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tg_atualiza_preco BEFORE UPDATE OF preco_aplicado ON locacao


FOR EACH ROW EXECUTE PROCEDURE fc_atualizacao_preco();

UPDATE locacao SET preco_aplicado = 4.4


WHERE cod_exemplar = 24 and cod_cliente = 1;

EXEMPLO: Salvar tuplas deletadas de uma tabela

CREATE OR REPLACE FUNCTION salvarTupla()


RETURNS trigger AS $$
DECLARE
BEGIN
INSERT INTO alunorep (coda,nome,nascimento,cr,idade)
VALUES (OLD.coda,OLD.nome,OLD.nascimento,OLD.cr,OLD.idade);
RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER tgSalvarTupla BEFORE DELETE ON aluno


FOR EACH ROW EXECUTE PROCEDURE salvarTupla();

DELETE FROM aluno WHERE coda = 345; ​ ​//será enviado a alunorep pois 4<5

RETURN NULL → Ele transfere sem deletar a tupla

DROP TRIGGER <nome_trigger> ON <tabela>;

FUNÇÕES USADO NOS EXERCICIOS

Data e usuaria atual

CURRENT_DATE ​//Exemplo '2014-12-09'


CURRENT_USER

DATA ATUAL
TO_CHAR (CURRENT_DATE, 'D') ​//Retorna dia da semana atual (0 a 6)
TO_CHAR (CURRENT_DATE, 'MM') ​ //Retorna mês atual
TO_CHAR (CURRENT_DATE, 'YYYY') ​ //Retorna ano atual

Criar sequencia

CREATE SEQUENCE nomeSequencia START valorInicial; ​ //fora da trigger

SELECT nextval('nomeSequencia') INTO valorAtual; ​ //Dentro da trigger

Verificar operacao da trigger usada

TG_OP verificar se a operação é INSERT,/ UPDATE,/ DELETE ou TRUNCATE

IF(TG_OP : = 'INSERT') THEN 'A operação é Insert' END IF;


ELSE 'A operação não Insert';
END ELSE;

EXCEÇÕES

RAISE EXCEPTION 'menssagem';

RAISE EXCEPTION 'menssagem %', valor;

Você também pode gostar