Sumário
PL/pgSQL........................................................................................................................................................ 1
1. Introdução ..................................................................................................................................... 1
1.1. Por que você deve usar PL/pgSQL? ............................................................................. 2
1.2. Instalando PL/pgSQL ......................................................................................................... 2
2. Entendendo a estrutura do PL/pgSQL ................................................................................ 3
2.1. Usando Variáveis ..................................................................................................................... 4
2.2. Trabalhando com erros e exceções - RAISE ................................................................ 6
2.3. Chamadas e retornos de função ....................................................................................... 8
2.4. Estruturas de controle........................................................................................................... 9
2.4.1. Comandos condicionais .................................................................................................. 10
2.4.2. LOOPS ................................................................................................................................... 13
2.5. STORED PROCEDURES ....................................................................................................... 14
2.6. FUNCTIONS ............................................................................................................................. 14
2.7. TRIGGERS ................................................................................................................................ 16
Questões Comentadas ............................................................................................................................ 18
Questões PostgreSQL - CESPE ........................................................................................................ 26
Gabarito .................................................................................................................................................... 34
Considerações finais ................................................................................................................................ 35
Referências .................................................................................................................................................. 35
PL/pgSQL
1. Introdução 16712855225
Você deve se certificar de ter instalado a linguagem procedural que você está
prestes a usar. O PostgreSQL suporta várias linguagens, como vimos anteriormente, e
garante que o processo de instalação seja bastante simples e transparente.
Você pode consultar o manual online do PostgreSQL presente em
www.postgresql.org/docs/9.5/static/index.html para conhecer a sintaxe geral dos
procedural que (1) possa ser usada para criar funções e procedimentos de gatilhos,
(2) acrescente estruturas de controle à linguagem SQL, (3) possa realizar cálculos
complexos, (4) herde todos os tipos, funções e operadores definidos pelo usuário, (5)
possa ser definida como confiável pelo servidor, e (6) seja fácil de usar.
Funções criadas com PL/pgSQL podem ser usadas em qualquer lugar que uma
das funções internas do postgres possam aparecer. Por exemplo, é possível criar
funções de cálculo condicional complexo e depois usá-las para definir operadores ou
utilizá-las em expressões de índice.
No PostgreSQL 9.0 e versões posteriores, a PL/pgSQL é instalada por padrão.
No entanto, ainda é um módulo carregável, especialmente para que os
administradores de segurança possam optar por removê-lo conscientemente.
PL/pgSQL é uma linguagem estruturada em blocos. O contexto completo usado
para a definição de uma função deve ser um bloco. Um bloco é definido como:
Prof. Victor Dalton www.estrategiaconcursos.com.br 3 de 35
PostgreSQL PL/pgSQL
Prof. Thiago Cavalcanti
execução do sub-bloco. Você pode acessar as variáveis externas se você qualifica seus
nomes com a etiqueta do seu bloco. Vejam o exemplo de comando abaixo para
entender melhor a sintaxe na prática:
outro valor após a inicialização, a fim de que o seu valor se mantenha constante
durante a execução do bloco.
A opção COLLATE especifica um agrupamento de caractere relacionado à
linguagem utilizada para a variável. Se NOT NULL for especificado, uma atribuição de
valor nulo resulta em um erro em tempo de execução. Todas as variáveis declaradas
como NOT NULL devem ter um valor padrão não nulo especificado. Existe a opção de
usar o sinal de igual (=) para atribuição de valor a variável, ele é usado em vez do
padrão PL/SQL que é o := (dois pontos igual).
D mouse DEFAULT := 3;
Gabarito E. Essa questão trata dos conceitos que acabamos de falar. Vejam que a
sintaxe correta para a variável mouse deve ser seguida pela palavra reservada
CONSTANT, indicando uma constante. Logo após devemos definir o tipo da variável,
neste caso INTEGER e atribuir seu valor inicial três. Para finalizar basta colocar o
ponto e vírgula indicando termino do comando de declaração. Observamos essa
descrição na alternativa E.
tipos de dados mais comumente usados em PL/pgSQL: boolean, text, char, integer,
double precision, date e time.
expressão cujo valor seja representado por uma string. As palavras-chave permitidas
para opção são:
MESSAGE - Define o texto da mensagem de erro. Esta opção não pode ser
usada quando o RAISE incluir uma string formatada antes do USING. Observe as
descrições do comando RAISE acima.
HINT - Fornece uma mensagem com uma dica para a resolução do problema.
PERFORM function_identifier(arguments);
16712855225
IF ... THEN
CASE ... WHEN ... THEN ... ELSE ... END CASE
Se a instrução SELECT INTO não pôde recuperar um número ISBN para o livro
baseada no ID do mesmo e no número da edição fornecida à função de quantidade, a
16712855225
ação retorna um valor de -1, que deve ser interpretado como um erro pela função que
o chamou. O fluxo da função continua se houver um número de ISBN encontrado para
o livro, então outro SELECT INTO é usado para recuperar a quantidade remanescente
em estoque para o livro em questão. A quantidade é, em seguida, retornada e a
função termina. Vejamos seu código:
b_isbn text;
stock_amount integer;
BEGIN
RETURN stock_amount;
END;
' LANGUAGE 'plpgsql';
END;
' LANGUAGE 'plpgsql';
statement;
[...]
ELSE IF condition
statement;
[...]
END IF;
END;
' LANGUAGE 'plpgsql';
CASE search-expression
WHEN expression THEN
statements
END CASE;
CASE nota
WHEN 7,8,9,10 THEN
status := 'APROVADO';
RETURN status;
16712855225
para a próxima instrução após o END CASE. A sintaxe para uma instrução CASE
pesquisada é a seguinte:
CASE
WHEN boolean-expression THEN
Statements
END CASE;
Vamos agora revisitar nosso exemplo anterior pra mostrar como ficaria o
código utilizando essa forma de instrução CASE.
CASE
WHEN nota >=7 AND nota <= 10THEN
status := 'APROVADO';
RETURN status;
WHEN nota>=1 AND nota < 7 THEN
status := REPROVADO';
RETURN status;
ELSE
status := 'Não apareceu para a prova!';
RETURN grade;
END CASE;
Com isso terminamos o estudo das instruções condicionais, vamos agora passar
para os comandos de repetição ou loops.
2.4.2. LOOPS
Loops, como instruções condicionais, são outro método de controle de fluxo de
funções. Os Loops definem a quantidade de iterações para se realizar uma tarefa, e
através do uso de iteração, você pode expandir extremamente a funcionalidade de
uma função PL/pgSQL. Vejamos a sintaxe básica para o loop na figura abaixo:
16712855225
16712855225
2.6. FUNCTIONS
-- Para chamar a função definida acima podemos usar a seguinte sintaxe abaixo e teremos como
-- resultado a mensage
SELECT
A partir do posgres 8.3 foi introduzida a opção de definir o custo estimado para
uma determinada função, está é determinada pela palavra chave COST que prevê a
quantidade de linhas retornadas pela função. O outro parâmetro encontrado no código
é dado pelas palavras SECUIRTY DEFINER. Essa opção diz que, se a função for
definida no contexto ou num nível de segurança, quando for invocada por outro
usuário ela terá as mesmas permissões de execução que o usuário que definiu a
função. Mesmo que o usuário que executou não tenha tais permissões.
2.7. TRIGGERS
O PL/pgSQL pode ser usado para definir os procedimentos de gatilhos. Um
procedimento de gatilho é criado com o comando CREATE FUNCTION, declarando-o
como uma função sem argumentos e tipo de retorno de TRIGGER. Note que a função
deve ser declarada sem argumentos mesmo que você espere receber argumentos
especificados no CREATE TRIGGER - argumentos do gatilho são passados pelo
parâmetro TG_ARGV.
16712855225
Com isso terminamos o escopo da nossa aula de PL/SQL, esperamos que vocês
tenham curtido! Não deixem de seguir minha página no facebook (Prof. Thiago
Cavalcanti) e o meu perfil no periscope, neles faço comentários semanais sobre banco
de dados e BI para concursos públicos.
16712855225
Questões Comentadas
Veja que este comando é o gabarito da nossa questão. Ele permite a recuperação dos
indicadores de status do sistema. Cada item é uma palavra chave que identifica o
valor de estado a ser atribuído à variável especificada. Os itens de status disponíveis
atualmente são ROW_COUNT, o número de linhas processadas pelo último comando
16712855225
SQL enviado para a máquina SQL, e RESULT_OID, o OID da última linha inserida pelo
comando SQL mais recente. Note que RESULT_OID só é útil depois de um comando
INSERT em uma tabela contendo OIDs. Vejamos um exemplo:
A instrução SELECT INTO define FOUND como TRUE quando uma linha é atribuída,
falso se nenhuma linha é retornada.
A instrução PERFORM define FOUND como TRUE quando produz (e despreza) uma ou
mais linhas, falso se não produz nenhuma linha.
O UPDATE, INSERT e DELETE definem FOUND como TRUE quando pelo menos uma
linha é afetada, falso se nenhuma linha é afetada.
A instrução FETCH define FOUND como verdade quando retorna uma linha, falso se
nenhuma linha é retornada.
A instrução MOVE atribui a FOUND valor TRUE quando reposiciona com sucesso o
cursor, FALSE contrário.
A instrução FOR define FOUND como TRUE quando interage uma ou mais vezes, caso
contrário FALSE. Isso se aplica a todas as quatro variantes da instrução FOR.
Outras declarações PL/pgSQL não alteram o estado do FOUND. Note em particular que
o EXECUTE muda a saída do GET DIAGNOSTICS, mas não altera o FOUND. FOUND é
uma variável local dentro de cada função PL/pgSQL; quaisquer alterações afetam
apenas a função atual.
03. BANCA: FCC ANO: 2013 ÓRGÃO: TRT - 12ª REGIÃO (SC) PROVA:
ANALISTA JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
A cascading triggers.
B recursive triggers.
C sub-triggers.
16712855225
D indented triggers.
E multi-trigger.
Gabarito A. Sabemos que uma função de gatilho executa comandos SQL, então estes
comandos podem disparar outros gatilhos. Isto é conhecido como gatilhos em cascata
ou cascading triggers. Não há nenhuma limitação para o número de níveis desta
cascata. É possível que as cascatas provoquem uma invocação recursiva do mesmo
gatilho; por exemplo, um INSERT pode executar um comando que insere uma linha
adicional na mesma tabela, fazendo com que o gatilho INSERT possa ser disparado
mais uma vez. É responsabilidade do desenvolvedor, evitar recursão infinita em tais
cenários.
Dica: Também é possível escrever uma função de gatilho em C, embora a maioria das
pessoas ache que é mais fácil de usar uma das linguagens procedurais.
04. BANCA: FCC ANO: 2013 ORGÃO: TRT - 12ª Região (SC) PROVA: Analista
Judiciário - Tecnologia da Informação
Gabarito E. O comando CREATE USER MAPPING FOR, cuja sintaxe completa pode
ser vista abaixo, é utilizado para definir um novo mapeamento entre um usuário e um
servidor externo ou estrangeiro.
16712855225
05. BANCA: FCC ANO: 2012 ORGÃO: MPE-AP – Prova: Analista Ministerial -
Tecnologia da Informação
Gabarito D. Vamos aproveitar essa questão para falar um pouco sobre cursores. Em
vez de executar uma consulta inteira de uma só vez, é possível criar um cursor que
encapsula a consulta e, em seguida, ler algumas linhas de cada vez. Uma razão para
fazer isso é para evitar o estouro de memória quando o resultado contém um grande
número de linhas. (No entanto, os usuários PL/pgSQL normalmente não precisam se
preocupar com isso, uma vez que quando utilizamos loops automaticamente um
cursor é criado internamente para evitar problemas de memória.) Um uso mais
interessante é retornar uma referência a um cursor que criado por uma função,
permitindo que o ler as linhas. Isso fornece uma maneira eficiente para retornar
grandes conjuntos de linhas em funções.
Todo o acesso aos cursores em PL/pgSQL passa por variáveis de cursor, que são
sempre do tipo de dados especial refcursor. Uma maneira de criar uma variável de
cursor é apenas para declará-la como uma variável do tipo refcursor. Outra forma é
usar a sintaxe declaração do cursor, o que em geral é:
Antes de um cursor ser utilizado para recuperar linhas, ele deve ser aberto. (Esta é a
ação equivalente ao comando SQL DECLARE CURSOR.) PL/pgSQL possui três formas
de instrução OPEN. A primeira possibilidade seria o OPEN FOR query (sintaxe: OPEN
unbound_cursorvar [[NO] SCROLL] FOR query). Neste caso, a variável cursor é aberta
e a consulta especificada é entregue para execução. O cursor não pode estar aberto, e
ele deve ter sido declarado como uma variável de cursor não ligado (ou seja, como
uma variável refcursor simples). A consulta deve ser feita por meio do SELECT, ou
qualquer outro comando que retorne linhas (como EXPLAIN).
A outra opção seria OPEN FOR EXECUTE (sintáxe: OPEN unbound_cursorvar [[NO]
SCROLL] FOR EXECUTE query_string [USING expression [, ...]];). E a última opção
seria OPEN BOUND CURSOR (OPEN bound_cursorvar [([argument_name: =]
argument_value [, ...])];) Esta forma de OPEN é usada para abrir uma variável cursor
cuja consulta foi vinculada a ela quando foi declarada. Uma lista de expressões com
valores de argumentos deve aparecer se e somente se o cursor foi declarado com
estes argumentos. Estes valores serão substituídos na consulta.
16712855225
Uma vez que o cursor tenha sido aberto, ele pode ser manipulado com as instruções
descritas abaixo. Estas manipulações podem não ocorre na mesma função que abriu o
cursor. Você pode retornar um valor refcursor fora da função e deixar a outra função
operar o cursor. São três os principais comandos:
1. FETCH - recupera a próxima linha do cursor no target, que pode ser uma linha, um
registro, ou uma lista de variáveis simples, separadas por vírgulas, da mesma forma
que o comando SELECT INTO. Se não houver nenhuma linha seguinte, o alvo é
definido como NULL(s). Tal como acontece com SELECT INTO, a variável especial
FOUND pode verificar se uma linha foi obtida ou não.
retorna a linha para qual mudou o ponteiro. Aqui também é possível usar a variável
especial FOUND para verificar para ver se uma linha será obtida pelo próximo
comando MOVE.
3. CLOSE - fecha o cursor aberto. Pode ser utilizado para libertar recursos antes do
final da operação, ou para liberar a variável cursor para ser aberta novamente.
06. BANCA: FCC ANO: 2012 ORGÃO: MPE-AP - Analista Ministerial PROVA:
Tecnologia da Informação
A END.
B ROLLBACK.
C TRANSFER.
D EFFECTIVE.
E SELECT.
Gabarito A. São seis os principais comandos utilizados para trabalhar com transações
dentro do PostgreSQL: START TRANSACTION, BEGIN, COMMIT, ROLLBACK,
SAVEPOINT e SET TRANSACTION. Vejamos a sintaxe e a definição de cada uma deles.
implicitamente realizada ao final do comando (se a execução for bem sucedida, caso
contrário, um rollback é realizado).
Uma opção ao COMMIT é o END que também confirma a transação atual. Este
comando é uma extensão do PostgreSQL que é equivalente ao COMMIT.
ROLLBACK reverte a transação atual e faz com que todas as modificações realizadas
pela transação sejam descartadas. Sua sintaxe é semelhante a do commit.
Observem que, pelo exposto, podemos marcar a alternativa A, visto que COMMIT e
END provocam o mesmo resultado para o PostgreSQL.
07. BANCA: FCC ANO: 2012 ORGÃO: MPE-AP - Técnico Ministerial PROVA:
16712855225
Informática
A criar uma classe de operadores que define como um determinado tipo de dado pode
ser usado em um índice.
B criar cursores, que podem ser utilizados para retornar, de cada vez, um pequeno
número de linhas em uma consulta.
Gabarito B. Vejam que podemos pensar em duas opções para o uso do DECLARE.
Quando queremos criar um cursor ou quando estamos utilizando PL/pgSQL e
utilizamos o DECLARE no bloco para declaramos as variáveis a serem utilizadas pelo
comando. A questão optou por questionar o uso do DECLARE na criação de cursores.
Observem que as demais alternativas não fazem sentido. Como tarefa, tente acha o
comando que executa cada uma das operações descritas nas demais alternativas.
08. BANCA: FCC ANO: 2012 ORGÃO: MPE-AP - Técnico Ministerial PROVA:
Informática
09. BANCA: FCC ANO: 2012 ORGÃO: MPE-PE - Técnico Ministerial PROVA:
16712855225
Informática
A xmllist.
B xmlrowcat.
C xmlgrep.
D xmlagg.
E xmlconcr.
Gabarito D. Vejamos o que as ações feitas por cada uma das funções xml da
questão. Antes, porém, precisamos eliminar da nossa analise as alternativas que não
são funções XML. Eliminamos as letras A, B, C e E.
Para a lista completa das funções XML sugiro olhar a documentação oficial aqui.
16712855225
10) Banca: CESPE Ano: 2013 Órgão: TCE-RO Prova: Analista Judiciário
- Informática
A respeito da utilização do banco de dados relacional em plataforma
PostgreSQL, julgue o próximo item.
[1] Considere que as linhas apresentadas a seguir estejam presentes no
arquivo de nome pg_hba.conf de instalação do PostgreSQL. Nesse caso, será
permitido acesso a todos os computadores, exceto aquele que esteja com o
endereço IP
16712855225
[1] O utilitário RECREATE permite analisar e remover as linhas das tabelas que
não estão mais em uso, o que aperfeiçoa o desempenho do banco de dados.
15) Ano: 2013 Banca: CESPE Órgão: MPOG Prova: Analista - Tecnologia
da Informação
No que se refere aos sistemas gerenciadores de banco de dados livres, julgue
os itens que se seguem.
[1] No PostgreSQL, é possível atualizar um campo do banco de dados usando-
se o comando a seguir.
Prof. Victor Dalton www.estrategiaconcursos.com.br 30 de 35
PostgreSQL PL/pgSQL
Prof. Thiago Cavalcanti
16) Banca: CESPE Ano: 2013 Órgão: MPOG Prova: Analista - Tecnologia
da Informação
17) Banca: CESPE Ano: 2013 Órgão: FUB Prova: Analista - Tecnologia
da Informação
A respeito de banco de dados, julgue os próximos itens.
[1] O processo servidor, denominado postgres, gerencia os arquivos do banco
de dados, aceita conexões para o banco de dados provenientes das aplicações
clientes e executa ações de banco de dados no comportamento do cliente.
18) Banca: CESPE Ano: 2013 Órgão: FUB Prova: Analista - Tecnologia
da Informação
16712855225
21) Banca: CESPE Ano: 2014 Órgão: TJ-SE Prova: Analista Judiciário -
Banco de Dados
Acerca dos sistemas gerenciadores de banco de dados InterSystems Cache,
PostgreSQL, MySQL e Oracle, julgue os itens subsequentes.
[1] Caso a instrução abaixo seja executada no PostgreSQL 9.3, ela retornará o
espaço em disco utilizado pela tabela processo, desconsiderando-se o espaço
utilizado pelos seus índices.
SELECT pg_table_size('processo'); 16712855225
22) Banca: CESPE Ano: 2010 Órgão: MPU Prova: Analista do MPU -
Analista de Informática - Banco de Dados
Acerca de SGBD Oracle, Postgres e MySQL, julgue os próximos itens.
[1] O PostgresSQL é um sistema de gerenciamento de banco de dados objeto-
relacional (SGBDOR) de código aberto, tendo como linguagem procedural única
de armazenagem o PL/SQL.
23) Banca: CESPE Ano: 2013 Órgão: TRT - 17ª REGIÃO (ES) Prova:
Analista Judiciário - Tecnologia da Informação
Julgue os itens subsequentes com relação aos comandos SQL.
[1] No PostgreSql 9.3 é possível configurar permissão para usuários até o nível
de tabelas, mas não controles para acesso de colunas. Logo, o comando SQL
abaixo está correto para Oracle 11g, mas não para PostgreSql 9.3.
GRANT SELECT (col1), UPDATE (col1) ON TabelaTeste TO Usuario;
24) Banca: CESPE Ano: 2013 Órgão: TRT - 17ª REGIÃO (ES) Prova:
Analista Judiciário - Tecnologia da Informação
Julgue os itens subsequentes com relação aos comandos SQL.
No PostgreSql 9.3, os dois comandos abaixo retornam true como resultado.
SELECT 'abc' SIMILAR TO '%(b|d)%'
SELECT 'abc' SIMILAR TO '(b|c)%'
25) Banca: CESPE Ano: 2013 Órgão: TRT - 17ª REGIÃO (ES) Prova:
Analista Judiciário - Tecnologia da Informação
16712855225
Gabarito
1. E
2. D
3. E
4. D
5. C
6. E
7. E
8. C
9. E
10. C
11. C
12. E
13. C
14. E
15. E
16. C
17. C
18. C
19. C
20. C
21. C
22. E
23. E
24. E
25. E
16712855225
Considerações finais
Espero que tenha gostado! Desejo a todos bons estudos! E até breve!
Thiago Cavalcanti
Referências
Fiz uma lista com alguns links de referências caso você queria se
aprofundar um pouco.
i. Para saber um pouco mais sobre administração de bancos de dados
PostgreSQL - http://www.postgresql.org/docs/9.4/static/admin.html
ii. Informações sobre o catálogo de dados do PostgreSQL -
http://www.postgresql.org/docs/9.1/static/catalogs.html
iii. Novas funcionalidades do PostreSQL 9.4 -
https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.4
iv. Informações do PostgreSQL na Wikipedia -
https://en.wikipedia.org/wiki/PostgreSQL
v. PL/pgSQL - http://www.postgresql.org/docs/9.5/static/plpgsql.html
16712855225