Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.
left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

left-side-bubbles-backgroundright-side-bubbles-background

Crie sua conta grátis para liberar esse material. 🤩

Já tem uma conta?

Ao continuar, você aceita os Termos de Uso e Política de Privacidade

Prévia do material em texto

Aula 04
TRF 5ª Região (Técnico Judiciário -
Apoio Especializado - Informática) Banco
de dados 
Autor:
Diego Carvalho, Thiago Rodrigues
Cavalcanti
11 de Março de 2024
Adquirido em @Xinyuu_bot - Telegram
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
Índice
..............................................................................................................................................................................................1) Oracle PL-SQL (Procedural Language-Structured Query Language) 3
..............................................................................................................................................................................................2) Blocos PL-SQL 12
..............................................................................................................................................................................................3) Estrutura de Controle, Cursores e Exceções 32
..............................................................................................................................................................................................4) Triggers 63
..............................................................................................................................................................................................5) Questões Comentadas - PL-SQL - Multibancas 90
..............................................................................................................................................................................................6) Lista de Questões - PL-SQL - Multibancas 159
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
2
195
Adquirido em @Xinyuu_bot - Telegram
ORACLE PL/SQL (PROCEDURAL LANGUAGE/STRUCTURED 
QUERY LANGUAGE). 
Nesta aula nosso estudo é sobre PL/SQL. O objetivo é conhecer PL/SQL e suas vantagens. 
Vamos, então, começar definindo o conceito de PL/SQL. Em seguida, passaremos por todo o escopo 
definido acima. Começaremos com uma introdução ao código PL/SQL, trataremos de variáveis de 
identificadores e, por fim, mostraremos os blocos e as instruções executáveis. 
O QUE É PL/SQL? 
Para começarmos a entender PL/SQL, precisamos primeiramente relembrar alguns conceitos 
sobre SQL. Uma das suas características principais, que devemos levar em consideração para nosso 
entendimento, é o fato de SQL ser uma linguagem declarativa. Quando escrevemos algum código 
em SQL, estamos dizendo ao banco de dados quais as ações, ou, o que nós queremos executar. Não 
estamos preocupados em entender como o banco de dados vai executar a ação. Isso tona o SQL 
muito fácil de usar. Contudo, possui a desvantagem de não conseguirmos especificar como vamos, 
por exemplo, executar uma consulta sobre o banco de dados. 
Neste momento, é que aparece o PL/SQL. Ele vem complementar a natureza declarativa da 
linguagem SQL, oferecendo funcionalidades lógicas por meio de uma linguagem procedural (PL). 
Assim, conseguimos ter o melhor dos dois mundos. Podemos agora traçar uma definição para 
PL/SQL, que é a extensão processual da Oracle para SQL. 
PL/SQL é uma forma natural, eficiente e segura para estender SQL. Seu ponto forte é o 
fornecimento de uma linguagem procedural executada no lado do servidor que é fácil de usar, 
integrada com SQL, robusta, portátil e segura. Assim, oferece uma plataforma robusta e de alto 
desempenho para aplicativos empresariais. 
Após o conhecimento da definição do termo PL/SQL vamos fazer uma rápida questão sobre o 
assunto. 
1. BANCA: FGV ANO: 2015 ÓRGÃO: TCE-SE PROVA: ANALISTA DE TECNOLOGIA DA INFORMAÇÃO 
- DESENVOLVIMENTO 
No Oracle, a linguagem procedural que permite estreito acoplamento com o SQL é conhecida 
como: 
A Data Pump; 
B PL/SQL; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
3
195
Adquirido em @Xinyuu_bot - Telegram
C SQL Explorer; 
D SQL*Loader; 
E Transact SQL. 
Comentário: Para não perdermos o hábito, vamos comentar cada uma das alternativas com 
exceção da B, cuja definição nós acabamos de mostrar acima. 
A tecnologia Oracle Data Pump permite a movimentação em alta velocidade de dados e 
metadados de um banco de dados para outro. Oracle Data Pump está disponível somente a 
partir da versão no Oracle Database 10g. 
Eclipse SQL Explorer é um cliente SQL que permite consultar e navegar em qualquer banco de 
dados compatível com JDBC. Ele suporta plug-ins com funcionalidades especializadas para 
bancos de dados individuais (Oracle, DB2 e MySQL) e pode ser estendido para incluir suporte 
especializado para outros bancos de dados. 
O SQL*Loader carrega dados a partir de arquivos externos em tabelas de banco de dados 
Oracle. Ele tem um poderoso mecanismo de análise de dados que impõe pouca limitação sobre 
o formato dos dados no arquivo de entrada. 
T-SQL (Transact-SQL) é um conjunto de extensões de programação da Sybase e Microsoft que 
adiciona vários recursos a Structured Query Language (SQL), incluindo controle de transações, 
exceção e tratamento de erros, processamento de fila e declaração de variáveis. 
Gabarito: B 
 
VANTAGENS 
A primeira vantagem que podemos listar é a portabilidade entre os sistemas operacionais. 
PL/SQL se preocupa apenas com o SGBD que tem que ser ORACLE. Um fato interessante é que 
PL/SQL é uma linguagem de texto, sendo assim, você pode utilizar qualquer editor para construir 
seus programas. Ao receber o código, o Oracle vai compilar e executar o mesmo quando solicitado. 
Uma segunda vantagem é a simplicidade. A sintaxe não possui elementos que gerem regras 
gramaticais complexas. Ou seja, depois que você aprende as estruturas básicas, a escrita de código 
é simples e direta. PL/SQL consiste em construções de linguagem processual, tais como declarações 
condicionais (se e else) e loops como (for). 
Outra vantagem é a melhoria de desempenho. O motor PL/SQL processa várias instruções SQL 
simultaneamente como um único bloco, reduzindo, assim, o tráfego de rede. 
Podemos citar ainda como ponto positivo a estrutura de blocos. PL/SQL consiste em blocos de 
código, que podem ser encaixados uns dentro dos outros. Cada unidade de bloco é constituída por 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
4
195
Adquirido em @Xinyuu_bot - Telegram
uma tarefa ou por um módulo lógico. Blocos PL/SQL podem ser armazenados na base de dados e 
reutilizados. 
Por fim, temos o tratamento de erros. PL/SQL manipula erros ou exceções de forma eficaz 
durante a execução de um programa de PL/SQL. Uma vez que uma exceção é detectada, podem ser 
tomadas medidas específicas, dependendo do tipo de exceção ou pode ser exibida para o usuário 
com uma mensagem. 
 
PL/SQL DEPLOYMENT 
Existem diferentes situações que você pode encontrar programas PL/SQL. Podemos citar os 
scripts, programas armazenados, objetos Oracle e embutidos em um programa. 
O script é basicamente um conjunto de instruções PL/SQL que podem ser executadas usando 
o SQL*Plus. Uma sessão do aplicativo que roda no cliente envia o script para execução no lado do 
servidor. 
O script pode estar embutido em algum código de aplicação. Suponha que você está 
desenvolvendo um aplicativo em Java e coloca dentro do código um conjunto de instruções PL/SQL. 
Esse código será enviado para processamento no servidor Oracle por meio de uma conexão com o 
banco dados toda vez que o código for executado. O risco de se utilizar deste mecanismo é que 
mudanças feitas no banco de dados podem gerar a necessidade de alterações no código do 
programa. 
Você pode ter programas armazenados como Triggers ou Stored Procedures. Isso não é nada 
além de um códigoque é armazenado no servidor de banco de dados Oracle. É considerado 
extremamente rápido. E uma vez escrito, pode ser chamado ou executado diversas vezes por 
usuários diferentes. 
Unidades de programas sobre os objetos Oracle também podem ser definidas. Com a adição 
de tipos de objetos e outros tipos de SQL, PL/SQL foi aprimorado para operar sobre novos tipos de 
objetos sem problemas. Assim, os desenvolvedores de aplicativos podem usar PL/SQL para 
implementar a lógica e operações em tipos definidos pelo usuário (UDF) que são executados no 
servidor de banco de dados. 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
5
195
Adquirido em @Xinyuu_bot - Telegram
PL/SQL ENGINE 
O Motor PL/SQL é o sistema de compilação e execução das unidades de código PL/SQL. O motor 
pode ser instalado no banco de dados ou em uma ferramenta de desenvolvimento de aplicações, 
como Oracle Forms. 
Em qualquer ambiente, o motor PL/SQL aceita como entrada qualquer unidade válida de 
código PL/SQL. O motor executa as instruções processuais, mas envia instruções SQL para o 
mecanismo do SQL no banco de dados, como mostrado na figura abaixo. 
 
Normalmente, o banco de dados processa as unidades de instruções PL/SQL. Quando uma 
ferramenta de desenvolvimento de aplicativo processa unidades de PL/SQL, ela passa para o seu 
motor PL/SQL local. Se um script PL/SQL não contém instruções SQL, o mecanismo processa 
localmente todo código do script PL/SQL. Isso é útil se a ferramenta de desenvolvimento de 
aplicações puder se beneficiar do controle condicional e iterativo. 
Por exemplo, as aplicações desenvolvidas em Oracle Forms, frequentemente, usam instruções 
SQL para testar os valores de entradas de campo e fazer cálculos simples. Usando PL/SQL, em vez 
de SQL, estas aplicações podem evitar chamadas para o banco de dados. 
 
TRABALHANDO COM AS FERRAMENTAS DO ORACLE 
DATABASE 
Para desenvolvermos algo dentro dos bancos de dados Oracle, precisamos conhecer as 
interfaces. Existe uma variedade de ferramentas para acessar o banco de dados que oferecem 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
6
195
==a80b1==
Adquirido em @Xinyuu_bot - Telegram
funcionalidades distintas. Podemos citar: Oracle SQL Developer, Oracle Enterprise Manager SQL 
Worksheet, Oracle SQL Plus, Oracle Application Express, Oracle JDeveloper Studio. 
Conexões com o banco de dados 
Para o Oracle permitir que você comece a trabalhar com qualquer ferramenta, é preciso passar 
por um mecanismo de autenticação. Ele é a primeira barreira de segurança que vai garantir o acesso 
ao SGBD. Uma autenticação de banco de dados é composta dos seguintes elementos: nome do 
usuário, senha e papeis. 
Por default, você deve informar um nome de uma conta do banco de dados. Essa conta é 
geralmente criada pelo DBA. Associada ao nome, você deve fornecer a senha de segurança. Na 
maioria dos casos, esse nome deve ser o mesmo do seu login. Os papeis ou roles definem quais as 
suas intenções ou os privilégios que você terá. Quando um DBA se conecta, ele pode usar SYSOPER, 
SYSDBA ou SYSASM. 
Outro ponto que você precisa entender é a conexão ao banco de dados. Usuários são 
autenticados contra instâncias de banco de dados. Essa instância pode ser identificada pelas 
definições de conexão ao banco de dados. São basicamente três definições geralmente armazenadas 
no arquivo TNSnames.ora. Primeiramente, temos o nome do host, que é o endereço IP do host do 
servidor de banco de dados. Temos também a porta TCP, que define onde o banco de dados recebe 
requisições no host. Por fim, temos o SID, que define o identificador de sistema, o qual deve ser um 
nome único para o servidor. 
A primeira coisa que devemos fazer é criar uma conexão ao banco de dados. É possível estar 
conectado com várias máquinas ao mesmo tempo. 
Bind de Variáveis 
O bind ou ligação de variáveis é um método para fazer o código SQL ou PL/SQL dinâmico, 
fazendo nossos scripts mais dinâmicos e flexíveis. É usado caso você não queira definir valores para 
variáveis de forma estática. Usamos dois pontos (:) para identificar uma variável que deve ser 
definida pela pessoa que chamou o código, ou seja, em tempo de execução. 
Conhecendo o SQL Developer 
SQL Developer é uma ferramenta de interface gráfica. Possui as mesmas funcionalidades do 
SQL*Plus, contudo de forma melhor apresentável. Apresentamos abaixo a interface da ferramenta: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
7
195
Adquirido em @Xinyuu_bot - Telegram
 
 
VEJAMOS UM RÁPIDO EXEMPLO DE PL/SQL 
Vamos usar o SQL*Plus para executar alguns comandos. Quando você instala o ORACLE você 
já tem o SQL*Plus. Primeiramente, vamos abrir o programa por meio da interface de linha de 
comando. Você deve passar como parâmetro a conta ou nome do usuário que vai fazer o acesso. 
Logo em seguida, é necessário informar a senha para ter acesso à conexão com o banco de dados. 
Em seguida, nós queremos executar algum código ou comando na interface. Para isso, vamos 
nos utilizar de um arquivo que já possui instruções PL/SQL e do operador ‘@’. No exemplo abaixo, 
utilizamos o seguinte comando: 
@ c:\test\code.sql. 
Após pressionar a tecla enter, o conteúdo do arquivo será executado. Em seguida, no prompt 
de comando, será exibida uma mensagem solicitando que você informe o número do ssn. Quando 
você digitar um valor e apertar novamente no enter, o código será processado com sucesso. 
Observem a sequência de passos que acabamos de descrever na figura abaixo: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
8
195
Adquirido em @Xinyuu_bot - Telegram
 
Agora vamos supor que queremos analisar o código que acabamos de executar. Para isso, 
usaremos o comando list. Observem que enter_ssn é um parâmetro de entrada, caracterizado pelo 
‘&’ antes do termo. 
 
O exemplo acima mostra um script PL/SQL. Veja que contamos com a presença da estrutura 
de comandos DECLARE, BEGIN, EXCEPTION e END. Entre o BEGIN e o END está inserido o código do 
nosso programa. DECLARE e BEGIN informam ao SQL*Plus que um bloco de programa será iniciado. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
9
195
Adquirido em @Xinyuu_bot - Telegram
A última linha da figura apresenta o comando: ‘set serveroutput on;’. Este comando 
basicamente avisa ao SQL*Plus que ele deve exibir o resultado da consulta ao servidor no prompt 
de comando. Para desligar essa opção, basta usar o comando ‘set serveroutput off;’. 
Observem que, ao final de cada linha, utilizamos o ‘;’ para indicar o final do comando. O ponto 
e vírgula não aloca o código inserido no buffer, quem faz isso é o ‘.’. Usamos o ‘.’ para indicar que 
terminamos de digitar nosso código. Por fim, temos que conhecer os comandos RUN e ‘/’ que servem 
para compilar e executar o código. Se quisermos modificar o comando do arquivo code.sql, podemos 
fazê-lo, usando o comando edit. Esse comando, no Windows, vai abrir uma nova janela do notepad 
para que possamos editar e salvar as mudanças. 
 
A substituição de variáveis é suportada por meio do ‘&’, vimos isso quando inserimos o valor 
para a variável enter_ssn. Comandos PL/SQL podem escrever no buffer de saída usando o comando 
DBMS_OUTPUT() para que isso aconteça. Observem na figura acima o uso da ‘/’. Quando colocamos 
uma barra invertida, queremos dizer para o Oracleexecutar o código. 
No SQL*Plus, a palavra página refere-se a uma tela cheia de informações em seu monitor ou 
a uma página de um relatório. Você pode colocar títulos na parte superior e inferior de cada página, 
definir o número de linhas por página e determinar a largura de cada linha. Já o relatório refere-se 
aos resultados completos de uma consulta. É possível colocar cabeçalhos e rodapés em cada 
relatório e formatá-los da mesma maneira que os títulos superior e inferior das páginas. 
Você pode definir um título a ser exibido na parte inferior de cada página. O comando TTITLE 
define o título principal; o comando BTITLE define o título inferior. 
 
Você também pode definir um cabeçalho e rodapé para cada relatório. O comando 
REPHEADER define o cabeçalho do relatório; o comando REPFOOTER define o rodapé do relatório. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
10
195
Adquirido em @Xinyuu_bot - Telegram
 
(Ministério da Economia – Desenvolvimento de Sistemas - 2020) Acerca de sistemas 
gerenciadores de banco de dados, julgue o item subsequente. 
 
No SQL*Plus empregado no Oracle, o comando TTITLE é utilizado para definir um título a 
ser exibido no topo de cada página de um relatório, enquanto o comando BTITLE é usado 
para definir um título a ser exibido na parte inferior de cada página do relatório. 
_______________________ 
Comentários: Conforme a explicação acima, podemos concluir que a questão está correta. 
 
Gabarito Certo. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
11
195
Adquirido em @Xinyuu_bot - Telegram
BLOCOS PL/SQL 
As instruções PL/SQL são organizadas em unidades conhecidas como blocos. Vamos falar agora 
das estruturas de blocos PL/SQL. Alguns desses blocos são obrigatórios e outros, opcionais. Veja a 
tabela abaixo para conhecer a descrição de cada uma desses blocos 
Seção Obrigatório Descrição 
DECLARE Não Declara os objetos internos do programa, por 
exemplo, as variáveis. 
BEGIN Sim Marca o início da lógica do programa. 
Lógica do 
programa 
Sim Essa parte contém o código PL/SQL e os comandos 
SQL. 
EXCEPTION Não Marca o início do contexto de exceções. 
END Sim Marca o fim da lógica do programa. 
 
Vejam que se o BEGIN é mandatório, por lógica o END também deve ser. Antes de 
continuarmos mostrando detalhes de cada um desses blocos, vamos trazer algumas informações a 
respeito da sintaxe da linguagem. 
REGRAS SINTÁTICAS DO PL/SQL 
Vamos entender primeiramente como fazer comentários dentro do código. Semelhante a 
todas as outras linguagens de programação, você deve ter condições de comentar seu código. Os 
comentários no PL/SQL podem ser feitos de duas formas. Para comentar todo o conteúdo de uma 
linha, você usa o '--'. Usando essa sintaxe, você informa ao compilador do Oracle que todo o texto 
daquela linha após o '--' não deve ser considerado. Essas informações representam apenas 
comentários e devem ser usadas para o entendimento humano do código. 
Se você quiser fazer um comentário em múltiplas linhas, você deve usar os caracteres ‘/*’ como 
delimitador de início e ‘*/’ como delimitador de fim do comentário. Esse tipo de comentário é 
definido exatamente da mesma forma para outras linguagens como C, C++ e Java. Você pode colocar 
a quantidade de conteúdo texto que você quiser dentro de um bloco de comentário de múltiplas 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
12
195
Adquirido em @Xinyuu_bot - Telegram
linhas. Esse tipo de comentário é útil se você quiser desabilitar uma parte do código. Vejam abaixo 
um exemplo de comentário: 
 
Quando você estiver escrevendo um código PL/SQL, deve ter em mente algumas regras. A 
primeira delas é que cada uma das linhas deve ter apenas um comando PL/SQL. Todo comando de 
execução deve terminar com um ponto e vírgula. Mesmo que você tenha um ponto e vírgula, você 
não pode escrever outra instrução executável na mesma linha. Observem o comando abaixo: 
 
Aí você deve estar se perguntando: por que as duas primeiras linhas não possuem o `;`? 
Comandos que representam apenas uma label para uma parte do código não terminam com ponto 
e vírgula. É o caso do BEGIN e do FOR, presentes na figura acima. 
Se colocarmos uma ‘/’ (slash) dentro do código PL/SQL, estamos pedindo para executar o 
código. Então, supondo que você tenha um código PL/SQL e a última linha deste código seja uma 
barra, quando você carregar o código no SQL*Plus, ele irá imediatamente executar. 
VISÃO GERAL DOS BLOCOS 
Já vimos que a construção de código na linguagem PL/SQL depende da existência de blocos. 
Após apresentarmos os blocos opcionais e obrigatórios, vamos tentar entender o que podemos ou 
devemos colocar em cada parte do nosso código. 
DECLARE 
Vamos agora falar rapidamente sobre cada um dos blocos. O primeiro deles seria o bloco 
DECLARE. Sabemos que ele é opcional, mas sugerimos que você use para manter a completude. É 
importante para facilitar o entendimento do código. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
13
195
Adquirido em @Xinyuu_bot - Telegram
Quando digitamos DECLARE na interface do SQL*Plus, o programa entende que vamos 
começar a digitar um novo bloco de comando. Desta forma, ele entra no modo de edição, passa para 
a próxima linha incluindo o numeral 2 no início. Você pode então começar a digitar seu código, 
declarando variáveis, por exemplo. 
 
Objetos na cláusula DECLARE 
A cláusula DECLARE é utilizada para definir ou declarar os objetos internos dos programas, 
como as variáveis. PL/SQL permite basicamente os seguintes objetos: Variable, Boolean, Constant, 
Record, Table, User-defined type. Uma variável é um elemento interno do programa que tem a 
capacidade de armazenar e modificar seu valor. 
Boolean é um tipo simples que permite apenas os valores TRUE, FALSE e NULL. Uma constante 
é similar a uma variável, mas seu valor não pode ser modificado. Um Record ou registro é um objeto 
complexo que se baseia na estrutura de uma tabela, o registro é basicamente uma linha de uma 
tabela com os valores para cada coluna. 
Temos ainda o objeto tabela que é composta basicamente por uma lista de registros. Sua 
estrutura deve ter a mesma definição da tabela armazenada no banco de dados. O último tipo de 
objeto que podemos criar é o tipo definido pelo usuário. Ele combina alguns tipos predefinidos para 
criar um tipo específico para o programa. 
Um exemplo interessante para entender esses tipos é o Bônus que algumas empresas pagam 
ao funcionário após o balanço. Alguns podem receber seu Bônus em dinheiro, outros podem receber 
em viagens, ações, dias de folga etc. Um tipo definido pelo usuário poderia ser capaz de representar 
essas diferentes categorias de Bônus. 
Regras para nomes de objetos 
O tamanho máximo deve ser 30 caracteres. O primeiro caractere dever ser uma letra. Alguns 
caracteres especiais são considerados legais, os principais são $, # e _. Outros são considerados 
ilegais, os mais relevantes são &, - (dash), /. Não devemos, ainda, usar espaço na definição de nomes. 
Observe que os caracteres não permitidos citados acima são reservados para outras funções 
do PL/SQL. Também não podemos usar as palavras reservadas, por exemplo, as que representam 
tipos de dados, number, char ... 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
14
195
Adquirido em @Xinyuu_bot - Telegram1. BANCA: FCC ANO: 2014 ÓRGÃO: TCE-RS PROVA: AUDITOR PÚBLICO EXTERNO - TÉCNICO EM 
PROCESSAMENTO DE DADOS 
O PL/SQL representa a linguagem de consulta de dados utilizada pelo sistema gerenciador de 
bancos de dados Oracle. Nessa linguagem há o uso de identificadores. Há apenas 
identificadores válidos do PL/SQL em: 
A meu prog, grande_programa, inicio&fim, gerador. 
B a&b, resta&1, ultimo-teste, entre2. 
C a/b, hoje, base$10, data12. 
D teste, primeiro_passo, abc$123, caso#1. 
E uma-vez, passo#3, um/dois, fase 8. 
Comentário: Variáveis devem ter tamanho máximo de 30 caracteres, começar com letra e 
podem conter números, underline( _ ), cifrão($) ou sustenido(#). 
Por outro lado, não devem conter os caracteres: ‘&’ , ‘/’, além de espaços em branco. 
Gabarito: D 
Tipos de dados disponíveis 
Vamos agora apresentar os tipos disponíveis de variáveis que podemos utilizar dentro do nosso 
código. Quando uma variável é declarada, deve ter associada a ela um tipo de dados. Alguns tipos 
são considerados escalares. Vamos começar apresentando esses tipos que tem como principal 
característica possuírem apenas um valor para cada registro. 
Os primeiros tipos escalares são os tipos inteiros. Esses tipos permitem apenas o 
armazenamento de números, eles não possuem casas decimais. Os tipos inteiros são 
BINARY_INTERGER, PLS_INTERGER e SIMPLE_INTEGER. Os dois primeiros são sinônimos. 
SIMPLE_INTERGER está disponível apenas nas versões 11g ou superior. Todos possuem o range 
variando entre -2G e +2G. 
Os tipos inteiros têm o que chamamos de subtipos. Ele muda dinamicamente o overflow de 
um tipo. Ele pode ser NATURAL, que só admite valores entre zero e 2G ou POSITIVE, que admite 
valores entre um e 2G. 
Os próximos tipos numéricos que vamos apresentar são os tipos de dados de ponto flutuante 
(floating point data types). Eles permitem casas decimais. São caracterizados dentro deste tipo 
BINARY_FLOAT, BINARY_DOUBLE e NUMBER (precision,scale). O tipo BINARY_FLOAT armazena um 
valor com precisão de 32 bits. Ele oferece uma precisão maior do que o NUMBER, além de suportar 
infinity e NaN (Not a number). 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
15
195
Adquirido em @Xinyuu_bot - Telegram
BINARY_DOUBLE fornece uma precisão de 64 bits e é perfeito para aplicações cientificas que 
exigem uma alta precisão computacional. O tipo de dados NUMBER armazena números fixos e de 
ponto flutuante. Números de qualquer magnitude podem ser armazenados e possuem portabilidade 
garantida entre diferentes sistemas de banco de dados Oracle que operam até 38 dígitos de 
precisão. Você também pode especificar a precisão (número total de dígitos) e a escala (número de 
dígitos à direita do ponto decimal). 
2. BANCA: FCC ANO: 2014 ÓRGÃO: TJ-AP PROVA: ANALISTA JUDICIÁRIO - BANCO DE DADOS - 
DBA 
Na linguagem PL/SQL, deseja-se especificar um atributo numérico com 5 dígitos no total, sendo 
2 desses dígitos após a vírgula. A forma para representar tal atributo é 
A NUMBER (3, 2). 
B NUMBER (5, 3, 2). 
C NUMBER (5, 2, 3). 
D NUMBER (5, 2). 
E NUMBER (2, 3). 
Comentário: Para resolver essa questão, basta ter o entendimento dos conceitos de precisão 
e escala que acabamos de comentar. Eles são parâmetros passados na definição de uma 
variável do tipo Number. Desta forma, podemos construir o comando que define o tipo para o 
atributo solicitado no enunciado: NUMBER(5,2). Observamos a resposta na alternativa D, que 
é o gabarito da questão. 
Gabarito: D 
Agora vamos analisar os tipos de dados de caracteres. Esse tipo permite o armazenamento de 
números e texto. Nesta categoria, temos o char(n) e varchar2(n). CHAR(n) representa uma string de 
caracteres de tamanho fixo que pode variar entre 1 e 32767. Ele possui um tamanho definido. Caso 
você declare uma variável do tipo CHAR com comprimento (n) igual a 15 e insira um dado nesta 
variável com tamanho menor que 15, o Oracle vai completar com espaços até atingir o tamanho da 
variável. 
VARCHAR2(n) representa uma string de caracteres de tamanho variável. Neste caso, n é o 
tamanho máximo da string que pode ser inserida nesta variável. Vejamos mais uma questão sobre 
esse assunto: 
3. Ano: 2017 Banca: FCC Órgão: TRT-11 Cargo: Técnico Judiciário de TI – Q. 45 
Considere o seguinte trecho de código PL/SQL com as linhas numeradas à esquerda. 
1 DECLARE 
2 nome1 VARCHAR2(10) := 'TRT11R'; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
16
195
Adquirido em @Xinyuu_bot - Telegram
3 nome2 CHAR(10) := 'TRT11R'; 
4 BEGIN 
5 IF nome1 = nome2 THEN 
6 DBMS_OUTPUT.PUT_LINE(nome1 || ' igual a ' || nome2); 
7 ELSE 
8 DBMS_OUTPUT.PUT_LINE(nome2 || ' diferente de ' || nome1 ); 
9 END IF; 
10 END; 
11 / 
Ao executar este código no Oracle 11g, em condições ideais, 
(A) será impresso TRT11R diferente de TRT11R. 
(B) será impresso TRT11R igual a TRT11R. 
(C) ocorrerá um erro, pois todos os strings deveriam estar delimitados por " " e não por ' '. 
(D) ocorrerá um erro, pois nome1 e nome2 são de tipos diferentes. 
(E) ocorrerá um erro, pois o comando de saída deveria ser DBMS_OUTPUT_LINE. 
Comentário: Essa questão visa testar seu conhecimento sobre os tipos de dados char e varchar. 
Considere que char(10) completa com espaços em branco o conjunto de caracteres para atingir 
o tamanho estabelecido na definição do atributo. Sabendo também que o varchar2(10) não 
completa com espaços em branco, o valor 10 apenas limita o tamanho máximo, a quantidade 
de caracteres que podem ser atribuídos às instâncias desta coluna. 
Gabarito: A 
Os próximos tipos de dados que vamos considerar são os tipos de dados predefinidos que 
permitem diferentes tipos de dados e um maior nível de controle. Podemos listar os tipos: ROWID 
(obsoleto), UROWID, BOOLEAN, DATE. ROWID representa o ID do objeto da linha do banco de dados 
e identifica uma linha física na tabela. ROWID foi substituído pelo UROWID. 
UROWID armazena o ID lógico ou físico para uma determinada linha. BOOLEAN possui apenas 
os valore TRUE, FALSE e NULL, são usados para testes condicionais. DATE registra a data e a hora. É 
importante armazenar suas datas em objetos do tipo DATE, pois ele faz validações dos dados, não 
permitindo que você armazene 31 de novembro, por exemplo. DATE ainda possui operadores que 
permite que você manipule suas datas. 
Existe dentro do ORACLE uma lista de sinônimos para os tipos de dados do ORACLE. Eles são 
importantes para compatibilidade com outros bancos de dados não Oracle, por exemplo, DB2 e SQL 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
17
195
Adquirido em @Xinyuu_bot - Telegram
Server. Eles não têm seu uso recomendado, ao menos que você esteja interessado em acessar um 
banco de dados não ORACLE. Vejam a tabela com a lista dos principais sinônimos abaixo. 
 
Declarando tipos de dados simples 
Quando declaramos uma variável, a primeira coisa que nós fazemos é atribuir um nome para 
ela. Em seguida, definimos um tipo ou qual tipo de dados essa variável vai armazenar. Ao final da 
linha de comando, colocamos um ‘;’ indicando o final da linha. 
Além do nome e tipo da variável, é possível definir outras características. Podemos atribuir um 
valor default, garantir que uma variável é NOT NULL ou ainda declarar um valor constante. Quando 
queremos definir um valor padrão para uma variável podemos usar o operador de atribuição ‘:=’. Se 
a atribuição de valor default não for feita, a variável terá seu valor padrão NULL. Outra maneira de 
atribuir um valor padrão é usar a cláusula DEFAULT, conforme apresentado abaixo: 
 
Outra coisa que podemos fazer quandoestamos declarando uma variável é indicar para o 
sistema que não queremos que valores nulos sejam atribuídos a mesma. Semelhantemente a uma 
restrição de banco de dados, você pode aplicar os termos NOT NULL para restringir o domínio da 
variável. Quando fazemos isso, caso o script tente atribuir um valor nulo para a variável, uma 
exceção será lançada. Ao utilizar o NOT NULL, é importante que você defina o valor inicial para a 
variável para evitar problemas. Veja o exemplo abaixo: 
 
Vamos agora aprender como declarar uma constante. Constantes são similares a variáveis, 
exceto pelo fato de que elas não podem ter seus valores modificados. Para declarar uma constante, 
basta colocar a palavra-chave CONSTANT antes da declaração do tipo. Vejamos um exemplo. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
18
195
Adquirido em @Xinyuu_bot - Telegram
 
Uma boa prática de programação PL/SQL é definir as constantes antes de definir as variáveis 
no bloco DECLARE. 
Declarando tipos de dados complexos 
Os tipos complexos permitem uma integração mais genuína entre o PL/SQL e o banco de dados 
ORACLE. Vamos começar apresentando o funcionamento do %TYPE e do %ROWTYPE. O comando 
%TYPE pode ser utilizado de duas formas. Na primeira, você informa o 
nome_da_tabela.nome_da_coluna antes do comando. Isso faz com que a variável seja associada à 
coluna da tabela e o tipo desta coluna seja atribuído à variável. 
Outra forma de utilizar o %TYPE é informando o nome de outra variável dentro do bloco 
DECLARE. Isso serve para manter a compatibilidade e a consistência entre variáveis de um 
determinado bloco. O que acontece de fato quando definimos o %TYPE é que o compilador vai 
procurar no dicionário de dados qual o tipo que devemos atribuir à variável. Veja a figura abaixo 
para melhorar seu entendimento: 
 
Você tem a possibilidade de acessar dados em outro esquema e se basear neles para criação e 
atributos por meio do comando %TYPE. Para isso, antes de identificarmos o nome da tabela e o 
nome da coluna, nós devemos inserir o nome do esquema. 
O %ROWTYPE funciona de forma bastante parecida com o %TYPE. A diferença é que quando 
utilizamos o %ROWTYPE não estamos nos referindo a uma coluna específica da tabela, mas a todas 
as colunas da tabela. Basicamente, o %ROWTYPE cria um tipo com os mesmos atributos da tabela 
ou da visão. Esse comando nos ajuda bastante quando queremos criar uma variável que possui todos 
os campos de uma tabela. Veja que ao invés de criarmos uma variável para cada atributo, podemos 
criar apenas uma variável que referencia toda a tabela. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
19
195
Adquirido em @Xinyuu_bot - Telegram
Quando vamos fazer uso dessa variável, é possível acessar um atributo específico, conforme 
exemplificado na figura abaixo: 
 
O PL/SQL também suporta estrutura de programação avançada e orientada a objetos por meio 
dos comandos TYPE ... TABLE, TYPE ... RECORD. O TYPE ... TABLE é usado para criar uma tabela. Ele 
é útil para armazenar valores de listas (ou arrays) retornados de uma consulta à base de dados. Para 
criar um tipo TABLE, temos que seguir um processo de duas etapas. Uma estrutura de dados do tipo 
tabela deve ser definida pelo programador. Em seguida, podemos referenciar esse tipo definido para 
criação de variáveis. Vejam o exemplo abaixo: 
DECLARE 
 -- Associative array indexed by string: 
 
 TYPE population IS TABLE OF NUMBER -- Associative array type 
 INDEX BY VARCHAR2(64); -- indexed by string 
 
 city_population population; -- Associative array variable 
 i VARCHAR2(64); -- Scalar variable 
Quando definimos a estrutura de uma TABLE, definimos um novo tipo de dados que deve ser 
indexado por uma coluna na tabela. Utilizamos o INDEX BY para determinar qual o tipo de dados 
será usado para indexar o tipo TABLE. 
O outro tipo de dado complexo que vamos comentar é o RECORD. Ele é um tipo de dado 
definido pelo usuário que permite maior flexibilidade do que o %ROWTYPE. Enquanto o %ROWTYPE 
exige uma relação direta com as colunas de uma tabela específica, o RECORD permite qualquer 
combinação de tipos de dados. 
Para definirmos um RECORD, precisamos basicamente de duas etapas. Primeiramente, 
precisamos declarar o registro como um tipo de dados definido pelo usuário. Vamos definir os 
atributos que fazem parte do nosso RECORD. Num segundo momento, podemos usar o tipo 
associado a uma variável. Desta forma, referenciando o tipo, podemos criar uma variável do tipo 
RECORD. Vejamos o exemplo abaixo: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
20
195
Adquirido em @Xinyuu_bot - Telegram
DECLARE 
 TYPE DeptRecTyp IS RECORD ( 
 dept_id NUMBER(4) NOT NULL := 10, 
 dept_name VARCHAR2(30) NOT NULL := 'Administration', 
 mgr_id NUMBER(6) := 200, 
 loc_id NUMBER(4) 
 ); 
 
 dept_rec DeptRecTyp; 
 dept_rec_2 dept_rec%TYPE; 
 Observem que após a definição de cada atributo, temos uma vírgula, exceto na definição do 
último atributo. Vejam também que os atributos estão dispostos entre parênteses após a declaração 
IS RECORD. 
Tipos definidos pelo usuário 
Os tipos definidos pelo usuário podem ser definidos com vários níveis de hierarquia 
encadeados. Por exemplo, quando tratamos de bônus de empresa a funcionários, podemos 
descrever o mesmo com um atributo dinheiro, mas também com outras possíveis formas de bônus, 
como dias de folga, direito ao uso do carro da empresa, viagens e etc. 
Vejamos um exemplo para podermos nos familiarizar com esses tipos. Observe, no exemplo 
abaixo, uma hierarquia de tipos. BonusCompensation faz parte do tipo EmpRecord. Vejam que 
estamos definindo tipos ou TYPE: 
 
PL/SQL também permite definir seus próprios subtipos. O tipo base pode ser qualquer tipo de 
dados PL/SQL especificado, seja escalar ou definida pelo usuário, como CHAR, DATE ou RECORD. Os 
subtipos podem fornecer compatibilidade com tipos de dados ANSI/ISO, mostrar o uso pretendido 
de itens de dados desse tipo e, ainda, detectar valores fora da faixa pré-estabelecida. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
21
195
Adquirido em @Xinyuu_bot - Telegram
Um subtipo pode ser irrestrito ou unconstrained. Ele tem o mesmo conjunto de valores do seu 
tipo básico, por isso, é apenas outro nome para o tipo de base. Portanto, subtipos unconstrained 
possuem o mesmo tipo básico definido e são permutáveis um com o outro. Nenhuma conversão de 
tipo de dados ocorre. Para definir um subtipo sem restrições, use esta sintaxe: 
SUBTYPE subtype_name IS base_type; 
Outra possibilidade é termos um subtipo restrito. Ele possui como domínio apenas um 
subconjunto dos valores do seu tipo base. Se o tipo de base permite que você especifique o 
tamanho, precisão e escala, ou intervalo de valores, então você pode especificá-los para seus 
subtipos. A sintaxe de definição de subtipo é: 
SUBTYPE subtype_name IS base_type 
{ precision [, scale ] | RANGE low_value .. high_value } [ NOT NULL ]; 
Para finalizar, veja a lista completa de variáveis do PL/SQL abaixo: 
 
 
Escopo de identificadores 
As referências a um identificador são resolvidas de acordo com o seu escopo e a sua 
visibilidade. O escopo de um identificador é a região de uma unidade de programa (bloco, 
subprograma ou pacote) a partir do qual você pode referenciar o identificador. Um identificador é 
visível apenas nasregiões a partir da qual você pode fazer referência ao identificador, usando um 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
22
195
Adquirido em @Xinyuu_bot - Telegram
nome não qualificado. A figura abaixo mostra o alcance e a visibilidade de uma variável chamada x, 
que é declarada em um bloco externo, então é declarada novamente em um sub-bloco interno. 
 
Identificadores declarados em um bloco PL/SQL são considerados locais para esse bloco e 
globais a todos os seus sub-blocos. Se um identificador global está declarado novamente em um 
sub-bloco, ambos os identificadores permanecem no escopo. Dentro do sub-bloco, no entanto, 
apenas o identificador local é visível. Você deve usar um nome qualificado para fazer referência ao 
identificador global. Veja, no exemplo abaixo, como definir um nome qualificado para o bloco por 
meio da sintaxe <<...>>: 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
23
195
Adquirido em @Xinyuu_bot - Telegram
Embora você não possa declarar um identificador duas vezes no mesmo bloco, você pode 
declarar o mesmo identificador em dois blocos diferentes. Os dois itens representados pelo 
identificador são distintos e, qualquer mudança em um, não afeta o outro. No entanto, um bloco 
<<a>> não pode referenciar identificadores declarados em outros blocos, por exemplo <<b>>, no 
mesmo nível, porque esses identificadores não são nem local, nem global para o bloco <<a>>. 
 
BEGIN 
O bloco seguinte ao DECLARE é o BEGIN. Vejamos o que podemos inserir nesta parte do nosso 
código PL/SQL. A cláusula BEGIN é a parte do código onde o processamento é feito. Podemos usar 
as variáveis e outros objetos que definimos na parte anterior. 
Dentro do bloco de BEGIN, é possível manipular dados internos do programa, manipular 
elementos do banco de dados, usar expressões regulares, trabalhar com valores literais, acessar 
objetos do banco de dados e, ainda, incluir uma estrutura lógica e suas ramificações. 
Podemos ainda acessar os dados de ambiente. Quando utilizamos a ferramenta SQL*Plus, é 
possível acessar as variáveis de ambiente, por exemplo. Esse mesmo princípio pode ser aplicado a 
outras ferramentas do Oracle. Quando você está trabalhando no ambiente do Oracle Developer 
Forms ou Reports, você tem acesso a essas variáveis também. 
Uma das primeiras possibilidades dentro do rol de comandos é o acesso aos dados por meio 
de SQL. Podemos usar a linguagem de manipulação de dados para fazer consultas ou modificações 
nas bases de dados. O acesso ao servidor de banco de dados, que é considerado a fonte primária de 
dados, é tipicamente feito por meio do comando SELECT ... INTO. 
Trabalhar a manipulação dos dados é, talvez, o principal aspecto de um programa ou script 
PL/SQL. Existem algumas técnicas que devemos levar em consideração. A primeira considera as 
referências feitas a variáveis básicas, escalares ou de tipos compostos. Outra possibilidade quando 
estamos tratando da manipulação de dados é lidar com strings literais. A concatenação de strings e 
outros tipos de manipulações contribuem para entregar valores ou resultados mais acessíveis pelos 
programas. 
Existe um conjunto de situações especiais que devemos nos preocupar quando estamos 
trabalhando com PL/SQL. Além de entender como manipular strings literais, podemos usar 
comparadores para avaliar variáveis e funções SQL para ajudar a controlar a lógica do programa. É 
possível, ainda, fazer uso de expressões regulares para encontrar um conjunto de caracteres em 
determinado conjunto de informações. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
24
195
==a80b1==
Adquirido em @Xinyuu_bot - Telegram
Vamos entender como podemos trabalhar com strings. Você deve lembrar que o operador de 
atribuição usado pelo PL/SQL é o ‘:=’. Outro operador importante é o ‘||’, ele vai concatenar os 
valores de duas. É possível encadear vários operadores para montar strings. Vejamos um exemplo: 
 
É importante observar que as aspas simples que cercam a vírgula e um espaço na figura acima 
servem para definir uma string baseada em um valor literal. Suponha que você queira atribuir um 
valor de nome a uma variável. Você pode usar o comando: ProfNome := ‘Thiago Cavalcanti’;. 
Outra consideração importante que deve ser feita está relacionada ao uso de caracteres 
especiais dentro das aspas simples. Um exemplo que podemos citar seria o uso da própria aspa 
simples, como o compilar consegue diferenciar se estamos terminando a string ou se queremos 
incluir uma aspa no nosso texto? Pra resolver estes problemas, podemos usar o comando q`!...!`. 
Esse comando afirma que todo texto entre as duas exclamações é considerado, mesmo que possua 
caracteres especiais. Veja o exemplo abaixo: 
 
Falamos sobre o uso de caracteres. Vamos concentrar nossa atenção agora em dados 
numéricos e sua atribuição. Para atribuir um valor numérico a uma variável, utilizamos o operador 
de atribuição. Devemos ter a preocupação do valor passado para a variável ser consistente com o 
tipo que definimos anteriormente. Você não pode atribuir uma string a um atributo numérico. Você 
deve considerar o uso de valores numéricos quando tiver a necessidade de fazer operações 
matemáticas sobre o mesmo. 
 
Quando você trabalha com datas, é importante saber o que acontece. O Oracle armazena 
fisicamente um valor numérico para o tipo Date e possui várias funções internas que nos ajudam na 
manipulação. Uma das funções é a SYSDATE que retorna a data atual do sistema. É possível somar 
dias a uma determinada data, basta passar o valor numérico da quantidade de dias que o Oracle 
executa a operação. Vejamos um exemplo. 
 
Para finalizar nossa apresentação de variáveis, falta tratarmos do tipo boolean. Boolean pode 
ser utilizado de diferentes formas no seu código. Lembre-se que ele pode assumir os valores TRUE, 
FALSE e NULL. Colocamos abaixo um exemplo de código que mostra como é possível atribuir um 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
25
195
Adquirido em @Xinyuu_bot - Telegram
valor para uma variável Boolean e como podemos utilizar essa variável em uma verificação dentro 
da sintaxe do comando lógico IF. 
 
Observem que, se o valor da variável HighPaid for maior do que 40 mil, então o comando vai 
imprimir “Yes, this salary is high”. Vejam, mais uma vez, o uso da função dbms_output.put_line() 
para exibir o valor na console. 
Usando operadores de comparação 
Vamos aprender agora como usar os operadores de comparação dentro do código PL/SQL. 
Devido à integração com Oracle e SQL, podemos usar todos os operadores presentes nos dois 
ecossistemas. Alguns dos mais conhecidos operadores de comparação são: igual (=), diferente 
(!=,<>,~=, ̂ =), IS NULL, LIKE, IN (lista), BETWEEN ‘string01’ AND ‘string01’. Vejam o uso deles abaixo: 
 
 
Utilizando funções SQL e Oracle 
O Oracle possui uma infinidade de funções internas que podem ser utilizadas para facilitar a 
implementação do código PL/SQL. Algumas dessas funções podem modificar os valores de dados de 
uma determinada coluna, por exemplo. Para entender melhor o que estamos querendo dizer, pense 
na função UPPER(), que modifica todos os caracteres da string passadas como parâmetro para 
maiúsculo. Veja, na figura abaixo, um exemplo de função SQL e dois de Oracle: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br26
195
Adquirido em @Xinyuu_bot - Telegram
 
O outro exemplo da figura acima é a função ROUND, que faz o arredondamento do valor 
numérico passado como parâmetro. Quando passamos um valor negativo para a função, ele vai fazer 
o arredondamento na parte inteira do valor. Neste caso, nos três últimos dígitos. Supondo que 
temos o valor 5779, ao aplicarmos a função ROUND com o parâmetro -3, o valor final seria 6000. 
 
DML e Transações com PL/SQL 
Uma das tarefas mais comuns que executamos por meio dos comandos PL/SQL é acessar os 
dados que já existem em um determinado banco de dados. Esse é certamente um dos pontos 
positivos de usar PL/SQL. Qualquer comando SQL DML válido ou qualquer instrução de controle de 
transação pode ser executado dentro do código PL/SQL. 
Podemos citar, como exemplos de comandos DML, o INSERT, o UPDATE, o DELETE e o LOCK 
TABLE. O comando LOCK TABLE não permite que outro usuário faça acesso à mesma tabela. O 
controle de transações pode ser feito por meio das instruções COMMIT, ROLLBACK, SAVEPOINT e 
SET TRANSACION. Vamos aproveitar para conceituar essas instruções. 
A instrução COMMIT termina a transação corrente, fazendo suas mudanças permanentes e 
visíveis a outros usuários. A cláusula WRITE da instrução COMMIT especifica a prioridade com que o 
Oracle Database escreve para o redo log as informações que a operação de confirmação gera. 
A declaração ROLLBACK termina a transação atual e desfaz todas as mudanças feitas durante 
essa transação. Se você cometer um erro, como excluir a linha errada de uma tabela, uma reversão 
restaura os dados originais. Se você não consegue terminar uma transação porque uma instrução 
SQL falhou ou um código PL/SQL gera uma exceção, o rollback permite que você tome uma ação 
corretiva e, talvez, comece de novo a transação. 
 Se uma instrução INSERT tenta armazenar um número duplicado para uma chave primária, o 
PL/SQL levanta a exceção predefinida DUP_VAL_ON_INDEX. Para garantir que mudanças em todas 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
27
195
Adquirido em @Xinyuu_bot - Telegram
as tabelas são desfeitas, o gerenciador de exceção executa um ROLLBACK. Antes de continuarmos, 
vamos fazer uma questão recente que cobrou justamente o conhecimento sobre essa exceção. 
4. BANCA: CESPE ANO: 2015 ÓRGÃO: TCU PROVA: AUDITOR FEDERAL DE CONTROLE EXTERNO - 
TECNOLOGIA DA INFORMAÇÃO 
Julgue os itens subsecutivos, a respeito de sistemas de bancos de dados. 
125 Como parte de um conjunto de instruções, o comando Oracle PL/SQL a seguir significa que, 
quando se tentar armazenar um valor duplicado em uma coluna que seja chave primária de 
uma tabela, será disparada uma exceção predefinida na linguagem; e serão desfeitas apenas 
as instruções escritas no contexto do SAVEPOINT nome_point. 
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK TO nome_point; 
Comentário: Vamos aos comentários da questão. Em Oracle, existe o que chamamos de 
exceções nomeadas. São exceções que possuem nomes no contexto de PL/SQL. Eles são 
nomeados no pacote padrão em PL/SQL e não precisam ser definidos pelo programador. 
O erro DUP_VAL_ON_INDEX, cujo código de erro é ORA-00001, é responsável por lançar uma 
exceção quando você tentar executar uma instrução INSERT ou UPDATE que cria um valor 
duplicado em um campo com restrição de índice exclusivo. A sintaxe do comando PL/SQL deve 
ser: 
EXCEPTION 
 WHEN exception_name1 THEN 
 [statements] 
No Oracle, a instrução de ROLLBACK é usada para desfazer o trabalho realizado pela transação 
atual ou uma transação que está em dúvida (in doubt). A sintaxe do ROLLBAK pode ser vista 
abaixo: 
ROLLBACK [ WORK ] [ TO [SAVEPOINT] savepoint_name | FORCE 'string' ]; 
Para cada um dos argumentos acima, temos um conjunto de descrição. Todos, porém, são 
opcionais. 
WORK - Foi acrescentado pela Oracle para ser compatível com SQL. Emitir o ROLLBACK com ou 
sem o parâmetro WORK resultará no mesmo resultado. 
TO SAVEPOINT - savepoint_name - A declaração ROLLBACK desfaz todas as alterações para a 
sessão atual até o savepoint especificado pelo savepoint_name. Se esta cláusula for omitida, 
então todas as alterações são desfeitas. 
FORCE 'string' - Ele é usado para forçar o rollback de uma transação que pode estar corrompido 
ou em dúvida. Com esta cláusula, você especifica o ID da transação entre aspas simples como 
string. Você pode encontrar o ID de transação na exibição sistema chamado 
DBA_2PC_PENDING. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
28
195
Adquirido em @Xinyuu_bot - Telegram
O Gabarito desta questão foi dado como CORRETO e, em seguida, alterado para ERRADO. 
Segundo a banca, o uso da palavra "apenas" torna incorreta a afirmação feita no item. 
Gabarito: E 
 
Os comandos SAVEPOINT marcam um ponto no processamento de uma transação. Os 
savepoints permite fazer rollback de apenas parte de uma transação, em vez de toda a transação. O 
número de pontos de salvamento ativos para cada sessão é ilimitado. 
Quando você reverter para um savepoint, quaisquer pontos de salvamento marcado depois do 
savepoint são apagados. O savepoint para o qual você reverteu não é apagado. Uma reversão 
simples ou um COMMIT apaga todos os pontos de salvamento. 
Você também pode usar a instrução SET TRANSACTION para iniciar uma transação no modo 
read-only ou leitura e gravação. Ela estabelece um nível de isolamento ou atribui sua transação atual 
para um segmento de rollback especificado. Transações read-only são úteis para a execução de 
várias consultas, enquanto outros usuários atualizam as mesmas tabelas. 
Durante uma transação de apenas leitura, todas as consultas se referem ao mesmo instante 
do banco de dados, fornecendo uma visão multi-table, multi-query e de leitura consistente. Outros 
usuários podem continuar a consultar ou atualizar dados como de costume. A confirmação ou 
anulação termina a transação. Vejamos um exemplo abaixo: 
 
A declaração SET TRANSACTION deve ser a primeira instrução SQL em uma transação de 
somente leitura e pode aparecer apenas uma vez em uma transação. Se você definir uma transação 
para READ ONLY, consultas subsequentes vão ver apenas as modificações efetivadas antes do início 
da transação. O uso do Read Only não afeta outros usuários ou transações. 
Somente SELECT, OPEN, FECTH, CLOSE, LOCK TABLE, COMMIT e ROLLBACK são permitidos em 
uma transação apenas de leitura. Consultas não podem ser FOR UPDATE. Antes de darmos 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
29
195
Adquirido em @Xinyuu_bot - Telegram
prosseguimento ao assunto, gostaria de mostrar uma questão que possui uma casca de banana a 
respeito de transações em PL/SQL. 
5. Ano: 2017 Banca: FGV Órgão: Alerj Cargo: Analista de Tecnologia da Informação Q. 47 
Observe as figuras a seguir que ilustram, parcialmente, dois procedimentos escritos em PL/SQL 
e implementados em uma instância de banco de dados Oracle 11g. Considere que a execução 
de proced1 foi submetida diretamente no prompt do Oracle SQL *Plus®. 
 
A transação iniciada na linha 5 de proced1 terá seus efeitos gravados permanentemente no 
banco de dados quando: 
(A) a rotina proced2 iniciar; 
(B) o COMMIT da linha 9 de proced2 for executado; 
(C) o EXECUTE IMMEDIATE da linha 9 de proced1 for executado; 
(D) o COMMIT da linha 10 de proced1 for executado; 
(E) o usuário desconectar voluntariamente do Oracle 11g durante a execução da linha 10 de 
proced2. 
Comentário: De acordo com a documentação do guia do usuário de PL/SQL da Oracle, o 
comando EXECUTE IMMEDIATE prepara e executa imediatamente uma instrução SQL ou um 
blocoanônimo PL/SQL. Ele permite que instruções DDL ou DCL possam ser executadas dentro 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
30
195
Adquirido em @Xinyuu_bot - Telegram
de um bloco PL/SQL. Os dados gravados efetivamente são apenas os que são manipulados pelo 
comando, não considerando as demais instruções executadas dentro da procedure. 
Contudo, existe um ponto importante que foi justamente a nuance que o examinador 
quis questionar na prova. Vejam o que diz a documentação oficial1 da Oracle sobre commits 
em transações: "A user runs a DDL statement such as CREATE, DROP, RENAME, or ALTER. If the 
current transaction contains any DML statements, Oracle first commits the transaction, and 
then runs and commits the DDL statement as a new, single statement transaction." 
Observem que o comando EXECUTE IMMEDIATE está criando uma tabela global temporária. 
Neste caso, temos um comando DDL. Sendo assim, todos os demais comandos DML da 
transação serão commitados nesta linha da transação. 
Gabarito: C 
Usando o SELECT 
Quando utilizamos o comando SELECT, precisamos ter em mente que a manipulação do 
resultado vai depender do número de linhas que nossa consulta retorna. Caso o comando retorne 
uma única linha, vamos usar a cláusula INTO para associarmos os valores da consulta a variáveis do 
nosso programa. Quando o resultado devolvido pela consulta possui múltiplas linhas, precisamos 
usar um cursor explícito. Falaremos mais sobre cursores no próximo tópico. 
Quando usamos a cláusula INTO, podemos usar qualquer tipo válido. Nossa preocupação é 
com o fato que os tipos devem bater exatamente com os tipos dos valores retornados na consulta. 
Veja o exemplo abaixo, que relaciona uma consulta a um tipo definido pelo usuário: 
 
 
1 https://docs.oracle.com/cd/B19306_01/server.102/b14220/transact.htm 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
31
195
Adquirido em @Xinyuu_bot - Telegram
ESTRUTURAS DE CONTROLE, CURSORES E EXCEÇÕES 
Agora vamos tratar das estruturas de controles que podemos ter dentro do código. Trataremos 
ainda de cursores e exceções. Sem perder tempo, vamos ao assunto! 
ESTRUTURAS DE CONTROLE 
A primeira parte desta nossa aula mostra como estruturar o fluxo de controle através de um 
programa PL/SQL. Vamos aprender como declarações e comandos podem ser conectados por 
estruturas de controle simples, mas poderosas, que possuem pontos únicos de entrada e de saída. 
Coletivamente, essas estruturas podem lidar com qualquer situação. Seu uso adequado leva, 
naturalmente, a um programa bem estruturado. Vamos apresentar, então, a sintaxe de cada um dos 
comandos. 
Visão geral das estruturas de controle 
As estruturas de controle são a extensão PL/SQL mais importante para SQL. Não só porque 
permitem PL/SQL manipular os dados do banco de dados, mas porque permitem processar os dados 
usando declarações de fluxo de controle. PL/SQL tem três categorias de instruções de controle: 
1. Instruções de seleção condicional, que executam diferentes comandos para diferentes 
valores de dados. As instruções de seleção condicional são o IF e o CASE. 
2. Instruções de loop, que executam as mesmas instruções ou comandos para uma quantidade 
diferente de valores de dados. As instruções de loop são: o LOOP básico, o FOR ... LOOP e o WHILE 
... LOOP. 
A instrução de transferências EXIT transfere o controle para o fim do LOOP. A instrução 
CONTINUE sai da iteração atual de um ciclo e transfere o controle para a próxima iteração. Ambos, 
EXIT e CONTINUE, têm uma cláusula opcional WHEN, em que você pode especificar uma condição 
para a execução. 
3. Instruções de controle sequenciais, que não são cruciais para a programação PL/SQL. As 
instruções de controle sequenciais são GOTO, que vai levar a execução do código para uma instrução 
específica, e NULL, que não faz nada. 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
32
195
Adquirido em @Xinyuu_bot - Telegram
Instruções de seleção condicional 
As instruções de seleção condicional, IF e CASE, executam instruções diferentes, dependendo 
dos valores de dados. A declaração IF executa ou pula uma sequência de uma ou mais declarações, 
dependendo de uma condição. A declaração IF tem as seguintes formas: IF THEN; IF THEN ELSE; IF 
THEN ELSIF. 
A instrução CASE escolhe uma condição, a partir de uma sequência de opções, e executa a 
instrução correspondente. A instrução CASE tem duas formas possíveis: simples, que avalia uma 
única expressão e compara com vários valores potenciais; searched, que avalia várias condições e 
escolhe a primeira que é verdadeira. A instrução CASE é apropriada quando uma ação diferente deve 
ser tomada para cada alternativa. 
Os comandos IF 
 
 
 
Vamos agora analisar a sintaxe de cada uma das possibilidades das instruções. Acima temos o 
comando IF-THEN. A palavra reservada IF marca o início da instrução IF. As instruções (statements) 
de 1 a n são uma sequência de comandos executáveis que consistem em uma ou mais das estruturas 
de programação padrão. A condição entre as palavras-chave IF e THEN determina se estas 
declarações são executadas. END IF é uma palavra reservada que indica o final da construção IF-
THEN. Este fluxo da lógica é ilustrado na figura. 
IF CONDITION 
THEN 
 STATEMENT 1; 
 ... 
 STATEMENT N; 
END IF; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
33
195
==a80b1==
Adquirido em @Xinyuu_bot - Telegram
 
Quando uma instrução IF-THEN é executada, uma condição é avaliada como TRUE ou FALSE. 
Se a condição for avaliada como TRUE, o controle passa para a primeira instrução executável do IF-
THEN. Se a condição for avaliada como FALSE, o controle passa para a primeira instrução executável 
após a instrução END IF. 
Considere o seguinte exemplo: você tem dois valores numéricos armazenados nas variáveis 
v_num1 e v_num2. Você precisa organizar estes valores para que o menor valor seja sempre 
armazenado em v_num1 e o maior valor, armazenado no v_num2. 
 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
34
195
Adquirido em @Xinyuu_bot - Telegram
No exemplo, a condição v_num1 > v_num2 é avaliada como verdadeiro, porque 5 é maior que 
3. A seguir, os valores são rearranjados de modo a que 3 seja atribuído a v_num1 e a 5 seja atribuído 
a v_num2. Este passo é realizado com a ajuda da terceira variável, v_temp, que é usada para o 
armazenamento temporário. Este exemplo produz a seguinte saída: 
v_num1 = 3 
v_num2 = 5 
Uma instrução IF-THEN especifica a sequência de instruções para executar somente se a 
condição for avaliada como TRUE. Quando esta condição for avaliada como FALSE ou NULL, não há 
nenhuma ação especial para tomar, a não ser prosseguir com a execução do programa. 
Uma instrução IF-THEN-ELSE permite que você especifique dois grupos de instruções. Um 
grupo é executado quando a condição for avaliada como TRUE. Outro grupo de instruções é 
executado quando a condição for avaliada como FALSE ou NULL. Essa estrutura é mostrada a seguir: 
 
Quando condição é TRUE, o controle passa para o STATEMENT 1. Quando a condição for 
avaliada como FALSE ou NULL, o controle é passado para o STATEMENT 2. Após a construção IF-
THEN-ELSE ser concluída, o STATEMENT 3 é executado. Este fluxo da lógica é ilustrado na figura 
abaixo: 
 
IF CONDITION 
THEN 
 STATEMENT 1; 
ELSE 
 STATEMENT2; 
END IF; 
STATEMENT 3; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
35
195
Adquirido em @Xinyuu_bot - Telegram
A construção IF-THEN-ELSE deve ser usada quando você escolher entre duas ações 
mutuamente exclusivas. Considere o seguinte exemplo: 
 
Para qualquer execução do código acima, o dbms_output.put_line será executado apenas uma 
vez. Por isso, a construção IF-THEN-ELSE permite que você especifique duas e só duas ações 
mutuamente exclusivas. Quando executado, este exemplo produz a seguinte saída: 
24 is even number 
Em alguns casos, uma condição usada em uma instrução IF pode ser avaliada como NULL, em 
vez de VERDADEIRO ou FALSO. Para a construção IF-THEN, as instruções associadas não serão 
executadas se uma condição for avaliada como NULL. Em vez disso, o controle da execução passará 
para a primeira instrução executável após END IF. Para a construção IF-THEN-ELSE, as instruções 
especificadas após a palavra-chave ELSE serão executadas se a condição associada for avaliada como 
NULL. 
Agora vamos tratar da instrução ELSIF. Vejam que a sintaxe da linguagem não coloca o E da 
palavra ELSE. O comando ELSIF aparece dentro de um código PL/SQL, conforme descrito abaixo. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
36
195
Adquirido em @Xinyuu_bot - Telegram
 
A palavra reservada IF marca o início de uma construção ELSIF. As condições 1 a N são avaliadas 
em sequência como TRUE ou FALSE. Estas condições são mutuamente exclusivas. Em outras 
palavras, se a condição 1 é avaliada como TRUE, o STATEMENT 1 é executado e controle passa para 
a primeira instrução executável após o END IF. 
O resto da construção ELSIF é ignorado. Quando a condição 1 é avaliada como FALSE, o controle 
passa para a parte do ELSIF seguinte e a condição 2 é avaliada, e assim por diante. Se nenhuma das 
condições especificadas for avalia como TRUE, o controle passa para o ELSE da construção ELSIF. 
Uma declaração ELSIF pode conter qualquer número de cláusulas ELSIF. O fluxograma da lógica é 
ilustrado abaixo: 
 
IF CONDITION 1 
THEN 
 STATEMENT 1; 
ELSIF CONDITION 2 
THEN 
 STATEMENT 2; 
ELSIF CONDITION 3 
THEN 
 STATEMENT 3; 
... 
ELSE 
 STATEMENT N; 
END IF; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
37
195
Adquirido em @Xinyuu_bot - Telegram
A figura mostra que, se uma condição é avaliada como TRUE, o STATEMENT 1 é executado e o 
controle passa para a primeira declaração após END IF. Se a condição for avaliada como FALSE, o 
controle passa a condição 2. Se a condição 2 é avaliada como TRUE, a declaração 2 é executada. Caso 
contrário, o controle passa para a instrução seguinte END IF, e assim por diante. 
Para obter uma declaração ELSIF, o IF deve ser sempre combinado com END IF. Deve haver um 
espaço entre o END e o IF. Quando o espaço for omitido, o compilador produz o seguinte erro: 
 
Você deve ter notado que, para todos os exemplos da instrução IF, as palavras reservadas IF, 
ELSIF e END IF são inseridas em uma linha separada e alinhadas com a palavra IF. Além disso, todas 
as instruções executáveis na construção IF são recuadas. O formato da construção IF não faz 
diferença para o compilador, mas o significado da formatação nos ajuda no entendimento da 
construção. 
Você conheceu os diferentes tipos de controles condicionais: IF-THEN, IF-THEN-ELSE e ELSIF. 
Estes tipos de controles condicionais podem ser aninhados dentro um do outro. Por exemplo, uma 
instrução IF pode ser aninhada dentro de um ELSIF e vice-versa. Considere o seguinte exemplo: 
 
A declaração IF-THEN-ELSE é chamada de instrução externa, pois abrange a instrução IF-THEN 
(mostradas em negrito). A declaração IF-THEN é chamada interna porque é cercada pelo corpo da 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
38
195
Adquirido em @Xinyuu_bot - Telegram
instrução IF-THEN-ELSE. Você pode aninhar instruções IF em qualquer nível de profundidade até o 
comprimento máximo de um bloco PL/SQL. E os blocos em si podem ser aninhados até 255 níveis 
de profundidade. 
O comando CASE 
A instrução CASE tem duas formas: CASE simples e CASE pesquisada. A instrução CASE permite 
que você especifique um seletor, o qual determina que grupo de ações seja executado. A instrução 
CASE pesquisada não tem um seletor; em vez disso, ela tem condições de pesquisa que são avaliadas 
para determinar qual grupo de ações serão tomadas. 
O CASE simples possui a seguinte estrutura: 
 
A palavra reservada CASE marca o início da instrução. Um seletor é um valor que determina 
quando cláusula deve ser executada. Cada cláusula WHEN contém uma expressão e uma ou mais 
instruções executáveis associadas. A cláusula ELSE é opcional e funciona de forma semelhante à 
cláusula ELSE usada na instrução IF-THEN-ELSE. END CASE é uma frase reservada que indica o fim da 
instrução CASE. O fluxo lógico da estrutura anterior é ilustrado na figura abaixo: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
39
195
Adquirido em @Xinyuu_bot - Telegram
 
Note-se que o seletor é avaliado somente uma vez e as cláusulas WHEN são avaliadas 
sequencialmente. O valor de uma expressão é comparado com o valor do seletor. Se eles forem 
iguais, a instrução associada a uma determinada cláusula WHEN é executada e todas as outras 
cláusulas WHEN não são avaliadas. Se nenhuma expressão corresponde ao valor do seletor, a 
cláusula ELSE é executada. Vejamos um exemplo: 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
40
195
Adquirido em @Xinyuu_bot - Telegram
Neste exemplo, uma variável, v_num_flag, é usada como um seletor para a instrução CASE. Se 
a função MOD retorna 0, o número é par; caso contrário, é ímpar. Se for atribuído a v_num o valor 
de 7 em tempo de execução, este exemplo produz a seguinte saída: 7 is odd number. 
A instrução CASE pesquisada tem condições de pesquisa que produzem valores booleanos: 
TRUE, FALSE ou NULL. Quando uma condição de pesquisa específica é avaliada como TRUE, o grupo 
de instruções associadas a esta condição é executado. Essa estrutura é mostrada na listagem abaixo: 
 
Quando uma condição de busca é avaliada como TRUE, o controle passa para a execução das 
instruções associadas a ela. Se nenhuma condição de pesquisa for avalia como TRUE, então as 
instruções associadas à cláusula ELSE são executadas. Note que a cláusula ELSE é opcional. 
É importante notar as diferenças entre as instruções CASE simples e CASE pesquisada. Você viu 
que a instrução CASE pesquisada não tem um seletor. Além disso, sua cláusula WHEN contém 
condições de pesquisa que produzem um valor booleano semelhante à instrução IF, não expressões 
que podem produzir um valor de um tipo qualquer. Observem a figura abaixo com a comparação 
entre as duas instruções: 
 
No fragmento de código da esquerda (declaração CASE simples), v_num_flag é o seletor. É uma 
variável PL/SQL que foi definida como um NUMBER. Uma vez que o valor da expressão é comparado 
com o valor do seletor, a expressão deve retornar um tipo de dados semelhante. A expressão '0' 
contém um número, de modo que seu tipo de dados também é numérico. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática)Banco de dados 
www.estrategiaconcursos.com.br
41
195
Adquirido em @Xinyuu_bot - Telegram
No fragmento de código do lado direito (instrução CASE pesquisada), não há necessidade do 
seletor, ele é substituído pela expressão MOD (v_num, 2) = 0. Esta expressão é avaliada como TRUE 
ou FALSE, assim como de uma instrução IF. 
Vamos agora analisar um exemplo da instrução CASE que gera um erro de sintaxe, porque o 
tipo de dados retornado pelas expressões não coincide com o tipo de dados atribuído ao seletor. 
 
Neste exemplo, a variável v_num_flag foi definida como um número. No entanto, o resultado 
da expressão avaliada pela cláusula WHEN produz o resultado com tipo de dados booleano. Como 
resultado, este exemplo produz o seguinte erro de sintaxe: 
 
Expressão CASE 
A expressão CASE tem uma estrutura quase idêntica a uma instrução CASE. Contudo, ao invés 
de realizar uma sequência de comandos, essa expressão retorna um valor que pode ser atribuído a 
uma variável. Veja o exemplo abaixo: 
 
Uma expressão CASE retorna um único valor que é atribuído a uma variável. No exemplo que 
você viu anteriormente, esta operação de atribuição foi realizada através do operador de atribuição, 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
42
195
Adquirido em @Xinyuu_bot - Telegram
:=. Você deve lembrar que existe outra maneira de atribuir um valor a uma variável PL/SQL, que é 
por meio de uma instrução SELECT INTO. 
 
1. BANCA: CESPE ANO: 2005 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA JUDICIÁRIO - 
TECNOLOGIA DA INFORMAÇÃO 
A respeito da sintaxe e da semântica do SQL, julgue os itens a seguir. 
O comando SELECT ... INTO, quando usado na linguagem PL/SQL, permite ao SELECT atribuir 
valores a variáveis. 
Comentário: Comentamos isso no parágrafo acima. Vamos seguir em frente, porque temos 
muito assunto para ver ainda nesta aula. 
Gabarito: C 
 
Funções NULLIF e COALESCE 
As funções NULLIF e COALESCE são definidas pela norma ANSI 1999 para serem abreviaturas 
do comando CASE. Ambas as funções podem ser usadas como variações da expressão CASE. 
 
Função NULLIF 
A função NULLIF compara duas expressões. Se elas são iguais, então a função retorna NULL; 
caso contrário, retorna o valor da primeira expressão. A função NULLIF tem a seguinte estrutura: 
NULLIF (EXPRESSÃO 1, EXPRESSÃO 2). 
Se EXPRESSÃO 1 é igual a EXPRESSÃO 2, a função NULLIF retorna NULL. Se EXPRESSÃO 1 não é 
igual a EXPRESSÃO 2, a função NULLIF retorna EXPRESSÃO 1. Note que a função NULLIF faz o oposto 
da função NVL. Se a primeira expressão é NULL, então a função NVL retorna a segunda expressão. 
Se a primeira expressão não é NULL, então a função NVL retorna a primeira expressão. Podemos ver 
um exemplo do NULLIF na construção abaixo: 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
43
195
Adquirido em @Xinyuu_bot - Telegram
Um valor é atribuído à variável v_num em tempo de execução. Em seguida, este valor é dividido 
por dois, e o seu resto é comparado com 0 através da função NULLIF. Se o resto for igual a 0, a função 
NULLIF retorna NULL; caso contrário, ele retorna o resto. O valor retornado pela função NULLIF é 
armazenado na variável v_remainder e exibido na tela, através da declaração 
DBMS_OUTPUT.PUT_LINE. 
Função COALESCE 
A função COALESCE compara cada expressão com NULL a partir da lista de expressões e retorna 
o valor da primeira expressão com valor não nulo. A função COALESCE tem a estrutura mostrada na 
listagem abaixo: 
COALESCE (EXPRESSÃO 1, EXPRESSÃO 2, ..., EXPRESSÃO N) 
Se a EXPRESSÃO 1 for avaliada como NULL, em seguida, a EXPRESSÃO 2 é avaliada. Se 
EXPRESSÃO 2 não avalia para NULL, então a função retorna EXPRESSÃO 2. Se EXPRESSÃO 2 também 
é avaliada como NULL, então a próxima expressão é avaliada. Se todas as expressões forem avaliadas 
como NULL, a função retorna NULL. Note que a função COALESCE é como uma função NVL aninhada. 
 
 
2. BANCA: FCC ANO: 2014 ÓRGÃO: TRF 3ª REGIÃO (SP MS) PROVA: ANALISTA JUDICIÁRIO - 
INFORMÁTICA (BANCO DE DADOS) 
Em PL/SQL, COALESCE (expr1, expr2) é equivalente a 
A CASE WHEN expr1 = expr2 AND expr1 IS NOT NULL END 
B SUBSTR (expr1, expr2) 
C MAX ( expr1, expr2) 
D CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END 
E WHERE expr1 IN expr2 
Comentário: Após a explicação acima, podemos definir a instrução CASE como equivalente ao 
comando COALESCE (exp1, expr2). Primeiramente, verificamos se o primeiro elemento é 
diferente de nulo. Caso seja, retornamos ele. Caso contrário, retornamos o elemento seguinte. 
O comando na sintaxe correta pode ser escrito da seguinte forma: 
CASE 
 WHEN expr1 IS NOT NULL 
 THEN expr1 
 ELSE expr2 
END 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
44
195
Adquirido em @Xinyuu_bot - Telegram
O gabarito, portanto, encontra-se na alternativa D. 
Gabarito: D 
 
Instruções de loop 
Geralmente, os programas de computador são escritos porque certas tarefas devem ser 
executadas várias vezes. Por exemplo, muitas empresas necessitam processar transações em uma 
base mensal. Um programa permite que a conclusão desta tarefa será executado no final de cada 
mês. 
Do mesmo modo, os programas devem incorporar instruções que precisam ser executadas 
repedidas vezes. Por exemplo, um programa pode precisar escrever um número de registros em 
uma tabela. Através da utilização de um ciclo, o programa pode escrever o número desejado de 
registos em uma tabela. Em outras palavras, os loops são facilidades as quais permitem que um 
conjunto de instruções seja executado repetidamente. 
Em PL/SQL, existem quatro tipos de loops: LOOPs simples, WHILE loops, numeric FOR loops e 
cursor FOR loops. Nesta parte da aula, você irá explorar LOOP simples, WHILE loops e FOR loops 
numéricos. 
LOOP Simples 
Um loop simples, como você pode inferir a partir de seu nome, é o tipo mais básico de loop e 
tem a estrutura mostrada na abaixo: 
 
 
A palavra reservada LOOP marca o início do ciclo simples. As instruções de 1 a N são uma 
sequência de comandos que é executada repetidamente. Estas indicações consistem em uma ou 
mais das estruturas de programação padrão. END LOOP é uma frase reservada que indica o final da 
construção de loop. 
LOOP 
 STATEMENT 1; 
 STATEMENT 2; 
 ... 
 STATEMENT N; 
END LOOP; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
45
195
Adquirido em @Xinyuu_bot - Telegram
Toda vez que o loop simples é iterativo, uma sequência de instruções é executada e, em 
seguida, o controle passa de volta para o topo do loop. A sequência de declarações irá executar um 
número infinito de vezes, porque não há nenhuma declaração especificando quando o loop deve 
terminar. Assim, um simples circuito é chamado uma quantidade infinita de vezes, pois não há meios 
para sair do ciclo. Um ciclo precisa ter uma condição de saída que determina quando o ciclo está 
completo. Esta condição de saída tem duas formas de ser especificada: utilizando o EXIT ou o EXIT 
WHEN. 
A instrução EXIT faz com que um loop termine quando a condição de saída é avaliada como 
TRUE. A condição de saída é avaliada com a ajuda de uma instrução IF. Quando a condição de saída 
é avaliada como TRUE, o controle passa para a primeira instrução executável após a instrução END 
LOOP. 
A instrução EXIT é válida somente quando colocada dentro de um loop. Quando colocada fora 
de um loop, ela irá causar um erro de sintaxe. Para evitar esse erro, use a instrução RETURN, quandovocê quiser terminar um bloco PL/SQL antes do seu término normal. 
A instrução EXIT WHEN faz com que um loop termine somente se a condição especificada na 
cláusula WHEN for avaliada como TRUE. O controle passa, então, para a primeira instrução 
executável após a instrução END LOOP. Vejam um exemplo do uso do EXIT WHEN: 
 
Usando Loops WHILE 
A estrutura do LOOP WHILE é apresentada abaixo: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
46
195
Adquirido em @Xinyuu_bot - Telegram
 
A palavra reservada WHILE marca o começo de uma construção de loop. A condição TEST é a 
condição de teste do laço, que é avaliada como VERDADEIRO ou FALSO. O resultado desta avaliação 
determina se o laço é executado ou não. Instruções de 1 a N são uma sequência de instruções que 
é executada repetidamente. END LOOP é uma frase reservada, que indica o final da construção de 
loop. 
A condição de teste deve ser avaliada como VERDADEIRO, pelo menos uma vez, para as 
instruções no loop executarem. No entanto, é também importante garantir que a condição de teste 
irá eventualmente se avaliada como FALSO. Caso contrário, o loop while será executado 
continuamente. 
As declarações EXIT e EXIT WHEN podem ser usadas dentro do corpo de um loop while. Se a 
condição de saída é avaliada como TRUE, antes da condição de teste ser avaliada como FALSE, o loop 
é encerrado prematuramente. Se a condição de teste é avaliada como FALSE, antes da condição de 
saída ser avaliada como TRUE, não há interrupção prematura do loop. 
Vejamos um exemplo do LOOP While. Neste exemplo, a condição do teste, eventualmente, 
será avaliada como FALSE, porque o valor de v_Counter é incrementado em 1 a cada ciclo. 
 
FOR LOOP numérico 
WHILE TEST 
CONDITION LOOP 
 STATEMENT 1; 
 STATEMENT 2; 
 ... 
 STATEMENT N; 
END LOOP; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
47
195
Adquirido em @Xinyuu_bot - Telegram
Um loop for numérico é chamado numérico, porque requer um inteiro como seu valor de 
terminação. A estrutura deste tipo de loop é mostrada na listagem a seguir: 
 
A palavra reservada FOR marca o início da construção de loop. A variável loop_counter é 
definida implicitamente. Não há necessidade de definir o contador de loop na seção de declaração 
do bloco PL/SQL; em vez disso, esta variável é definida na construção de loop. 
O limite inferior e limite superior são números inteiros ou expressões que avaliam valores 
inteiros em tempo de execução, e o ponto duplo (..) serve como o operador de intervalo. O limite 
inferior e o limite superior definem o número de iterações ou ciclos e seus valores são avaliados uma 
vez, durante a primeira iteração do loop. Neste ponto, determina-se quantas vezes o loop vai iterar. 
As instruções de 1 a N são uma sequência de comandos que é executada repetidamente. END LOOP 
é uma frase reservada que marca o fim da construção de loop. 
Uma das palavras reservadas IN ou IN REVERSE deve estar presente quando da definição do 
loop. Quando a palavra-chave REVERSE é usada, o contador de loop vai fazer uma iteração do limite 
superior ao limite inferior. No entanto, a sintaxe para a especificação limite não muda. O limite 
inferior é sempre referenciado primeiro. Vejamos um exemplo do comando abaixo: 
 
Algumas considerações importantes. Você não pode incrementar ou decrementar a variável 
v_counter, uma tentativa de manipular a variável dentro do ciclo vai gerar um erro. Você também 
não pode acessar essa variável fora do escopo do loop. Neste caso, o Oracle vai achar que a variável 
não foi declarada. Por fim, as instruções EXIT e EXIT WHEN apresentadas anteriormente podem ser 
utilizadas aqui da mesma forma para término prematuro da execução. 
Comandos CONTINUE e CONTINUE WHEN 
FOR loop_counter IN [REVERSE]lower_limit..upper_limit 
LOOP 
 STATEMENT 1; 
 STATEMENT 2; 
 ... 
 STATEMENT N; 
END LOOP; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
48
195
Adquirido em @Xinyuu_bot - Telegram
A condição de continuar tem duas formas: CONTINUE e CONTINUE WHEN. A instrução 
CONTINUE faz com que um loop termine a sua iteração atual e passe o controle para a próxima 
iteração do loop, quando a condição for avaliada como TRUE. A condição de continuar é avaliada 
com a ajuda de uma instrução IF. Quando a condição de continuar for avaliada como TRUE, o 
controle passa para a primeira instrução executável no corpo do loop. Veja a sintaxe do comando: 
 
Assim que a condição for avaliada como TRUE, o controle passa à DECLARAÇÃO 1 (STATEMENT 
1), que é a primeira instrução executável dentro do corpo do loop. Neste caso, ele faz a execução 
parcial do ciclo, portanto as afirmações seguintes após a condição de continuar dentro do corpo do 
loop não são executadas. 
O CONTINUE e CONTINUE WHEN são instruções que podem ser usadas em todos os tipos de 
loops. A diferença entre as condições de EXIT e de CONTINUE é que a condição de saída termina o 
loop, ao passo que a condição de continuar termina a iteração corrente do ciclo. 
Quando a instrução CONTINUE é usado sem uma condição de continuar, a iteração atual do 
loop terminará incondicionalmente e o controle da execução passará para a primeira instrução 
executável no corpo do loop. 
A instrução CONTINUE WHEN faz com que um loop termine sua iteração atual e passe o 
controle para a próxima iteração do loop, apenas quando a condição de continuar for avaliada como 
TRUE. O controle passa, então, para a primeira instrução executável no interior do corpo do ciclo. 
As declarações CONTINUE e COTINUE WHEN são válidas somente quando colocadas dentro de 
um loop. Quando colocadas fora de um loop, elas vão causar um erro de sintaxe. 
Usando loops aninhados 
Nós exploramos os três tipos de loops: loop simples, WHILE loops, e FOR loops numéricos. 
Qualquer um destes três tipos de loops pode ser encaixado um dentro do outro. Por exemplo, um 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
49
195
Adquirido em @Xinyuu_bot - Telegram
loop simples pode ser aninhado dentro de um loop while e vice-versa. Considere o seguinte 
exemplo: 
 
Neste exemplo, o loop while é chamado por um loop externo, porque abrange o laço simples. 
O laço simples (em negrito) é chamado por um loop interno, pois é cercado pelo corpo do loop while. 
O loop externo é controlado pelo contador de ciclo, v_counter1, e isso irá executar fornecendo 
o valor de v_counter1 que deve ser inferior a 3. Com cada iteração do circuito, o valor de v_counter1 
é exibido na tela. Em seguida, o valor de v_counter2 é inicializado para 0. Note que v_counter2 não 
é inicializado no momento da declaração. O laço simples é colocado no interior do corpo do loop 
while, então o valor de v_counter2 deve ser inicializado toda vez antes que o controle passar para o 
loop simples. 
Uma vez que o controle passa para o loop interno, o valor de v_counter2 é apresentado na tela 
e incrementado de 1. Em seguida, a condição de saída é avaliada. Se essa condição for avaliada como 
FALSE, o controle passa de volta para o topo do loop simples. Se for avaliada como TRUE, o controle 
passa para a primeira instrução executável fora do loop. No nosso caso, o controle passa de volta 
para o loop externo, o valor de v_counter1 é incrementado em 1 e a condição de teste do loop while 
é avaliada novamente. 
Você aprendeu sobre rotulagem ou label de blocos PL/SQL. Os laços podem ser marcados de 
um modo semelhante, tal como ilustrado abaixo: 
DiegoCarvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
50
195
Adquirido em @Xinyuu_bot - Telegram
 
 O rótulo deve aparecer imediatamente antes do início do ciclo. A sintaxe mostra que o rótulo 
pode ser opcionalmente utilizado no final da indicação do laço. É muito útil rotular laços-aninhados, 
tais rótulos melhoraram a legibilidade do script. 
 
GERENCIANDO ERROS E EXCEÇÕES NATIVAS 
Em PL/SQL, existem dois tipos de exceções: exceções built-in e exceções definidas pelo usuário. 
Nesta parte da aula, você vai aprender como lidar com certos tipos de erros de execução com a 
ajuda de exceções internas. Logo em seguida, falaremos sobre exceções definidas pelo usuário. 
Gerenciando erros e exceções nativas 
Para começarmos a entender o que seria uma exceção em tempo de execução, vamos olhar o 
código abaixo: 
 
Agora vamos executar o comando e supor que passaremos como parâmetro para v_num1 e 
v_num2, respectivamente, os valores 10 e 0. Note que vamos forçar nosso código a tentar executar 
uma divisão por zero. Sabemos que isso não é possível. Logo, o Oracle vai retornar uma mensagem 
de erro, qual seja: 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
51
195
Adquirido em @Xinyuu_bot - Telegram
Mesmo que este exemplo não contém erros de sintaxe, o script terminou prematuramente, 
porque o valor inserido para v_num2, o divisor, era zero. A divisão por 0 é indefinida, assim, esta 
operação conduz a um erro. 
Este exemplo ilustra um erro de execução que não pode ser detectado pelo compilador. Em 
outras palavras, para alguns dos valores especificados para as variáveis v_num1 e v_num2, o código 
é executado com sucesso. Quando outros valores são associados a v_num1 e v_num2, o programa 
não consegue executar. 
Como resultado, ocorre um erro de execução. Lembre-se que o compilador não pode detectar 
erros de execução. Neste caso, um erro de execução ocorre porque o compilador não sabe o 
resultado da divisão de v_num1 por v_num2. Este resultado só pode ser determinado em tempo de 
execução, daí esse erro é referido como um erro de execução. 
Para lidar com esse tipo de erro no programa, deve ser adicionado um manipulador de exceção. 
A seção de tratamento de exceção tem a estrutura mostrada na listagem abaixo: 
 
Nota-se que a seção de tratamento de exceção aparece após a seção executável do bloco. 
Portanto, o exemplo anterior pode ser reescrito da seguinte maneira (declarações adicionadas são 
mostradas em negrito): 
 
Uma seção de tratamento de exceção permite que um programa execute até a conclusão, em 
vez de terminar prematuramente. Ela também fornece o isolamento de rotinas de tratamento de 
EXCEPTION 
 WHEN EXCEPTION_NAME 
 THEN 
 ERROR-PROCESSING 
STATEMENTS; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
52
195
Adquirido em @Xinyuu_bot - Telegram
erros. Em outras palavras, todos os códigos de processamento de erro para um bloco específico 
podem ser colocados dentro de uma única seção. 
Como resultado, torna-se mais fácil de seguir e compreender a lógica do programa. Finalmente, 
acrescentando uma seção de tratamento de exceção, permitimos o processamento orientado a 
eventos de erros. Tal como no exemplo mostrado anteriormente, quando ocorre um evento de 
exceção específico, tais como a divisão por 0, a seção de tratamento de exceções é executada, e a 
mensagem de erro especificada para a instrução é exibida na tela por meio do comando 
DBMS_OUTPUT.PUT_LINE. 
Quando ocorre um erro que gera uma exceção built-in, a exceção é lançada implicitamente. 
Em outras palavras, se um programa rompe uma regra do Oracle, o controle passa para a seção de 
tratamento de exceção do bloco. Neste ponto, as declarações de processamento de erro são 
executadas. Após a seção de tratamento de exceção do bloco ser executada, o bloco termina; ou 
seja, o controle não retorna para a seção executável do bloco. 
Alguns erros comuns de tempo de execução do Oracle são predefinidos no PL/SQL, como 
exceções. A lista a seguir identifica algumas dessas exceções predefinidas e explica como elas são 
geradas: 
NO_DATA_FOUND: Esta exceção é gerada quando uma instrução SELECT INTO que não faz 
chamadas para funções de agrupamento, como SUM ou COUNT, não retorna nenhuma linha. Por 
exemplo, suponha que você emita uma instrução SELECT INTO contra a tabela aluno, onde a carteira 
de estudante é igual a 101. Se nenhum registro na tabela de ESTUDANTE satisfaz este critério 
(carteira de estudante é igual a 101), a exceção NO_DATA_FOUND é levantada. 
Quando uma instrução SELECT INTO chama uma função de agrupamento, como COUNT, o 
resultado nunca é vazio. Quando usado em uma instrução SELECT INTO contra a tabela aluno, a 
função COUNT retornará 0 para o valor da carteira de estudante 123. Assim, uma instrução SELECT 
INTO que chama uma função de agrupamento nunca irá levantar a exceção NO_DATA_FOUND. 
TOO_MANY_ROWS: Esta exceção é gerada quando uma instrução SELECT INTO retorna mais 
de uma linha. Por definição, um SELECT INTO pode retornar apenas uma única linha. Se uma 
instrução SELECT INTO retorna mais de uma linha, a definição da instrução SELECT INTO é violada. 
Isto provoca a exceção TOO_MANY_ROWS, que é levantada. 
Por exemplo, se você emitir uma instrução SELECT INTO contra a tabela aluno para um CEP 
específico. É altamente provável que esta instrução SELECT INTO irá retornar mais de uma linha, 
porque muitos estudantes podem residir na mesma área de CEP. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
53
195
Adquirido em @Xinyuu_bot - Telegram
ZERO_DIVIDE: Esta exceção é gerada quando uma operação de divisão é realizada no programa 
e um divisor é igual a zero. O exemplo mostrado anteriormente ilustra esse caso. 
LOGIN_DENIED: Esta exceção é gerada quando um usuário está tentando fazer logon no Oracle 
com um nome de usuário ou senha inválida. 
PROGRAM_ERROR: Esta exceção é gerada quando um programa PL/SQL tem um problema 
interno. 
VALUE_ERROR: Esta exceção é gerada quando ocorre um erro de conversão de tipo ou de 
tamanho incorreto. Por exemplo, suponha que você selecione o sobrenome de um estudante em 
uma variável que tem sido definido como VARCHAR2(5). Se o sobrenome do estudante contém mais 
de cinco caracteres, a exceção VALUE_ERROR é levantada. 
DUP_VALUE_ON_INDEX: Esta exceção é gerada quando um programa tenta armazenar um 
valor duplicado em uma coluna ou colunas que tenham um índice exclusivo definido sobre elas. Por 
exemplo, suponha que você está tentando inserir um registro na tabela da Seção Especializada do 
número de curso 25, seção 1. Se um registo para o curso e a seção de número dado já existe na 
tabela, a exceção DUP_VAL_ON_INDEX é levantada porque estas colunas têm um índice único 
definido em cima delas. 
 
Abaixo apresentamos um código com dois exemplos de tratamento de exceções: 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
54
195
Adquirido em @Xinyuu_bot - Telegram
É possível definir uma cláusula WHEN OTHERS dentro do bloco de exceção, que vai tratar todas 
as exceções que forem lançadas e não forem listadas especificamente dentro de outra cláusula 
WHEN. 
 
3. BANCA: CESPE ANO: 2010 ÓRGÃO: MPU PROVA: ANALISTA DO MPU - ANALISTA DE 
INFORMÁTICA - BANCO DE DADOS 
A respeito de PL/SQL, julgue os itens a seguir. 
O trecho de programa em PL/SQL a seguir possibilitaremover os efeitos de determinada 
transação no banco de dado, sempre que um erro ocorrer durante a execução. 
 
Comentário: A resposta dessa questão foi alterada de certo para errado, após recurso. Segue 
a justificativa da Banca: “Há erro na sintaxe do comando EXCEPTION WHEN OTHERS THEN 
dbms_output.put_line (‘ Erro na atualização do Salário’), o que prejudicou seu julgamento”. 
Desta forma, observamos que o comando estaria correto, se a sintaxe utilizada no 
dbms_output.put_line() estivesse correta. 
Gabarito: E 
 
Exceções criadas pelo usuário 
Muitas vezes, em seus programas, pode ser necessário lidar com problemas que são específicos 
do programa que você está escrevendo. Por exemplo, suponha que seu programa pede que um 
usuário digite um valor para a identificação do aluno. Este valor é, então, atribuído à variável 
v_student_id, que é usada mais tarde no programa. Geralmente, você quer um número positivo 
para um ID. Por engano, entretanto, o usuário digita um número negativo. No entanto, não ocorreu 
nenhum erro, porque o v_student_id variável foi definida como um número, e o usuário forneceu 
um valor numérico legítimo. 
Para resolver esse problema, você pode implementar sua própria exceção para lidar com esta 
situação. Este tipo de exceção é chamado uma exceção definida pelo usuário, pois é definido pelo 
programador. Antes de tal exceção poder ser usada, ela deve ser declarada. A exceção definida pelo 
usuário é declarada na parte declarativa de um bloco PL/SQL, como mostrado na listagem: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
55
195
Adquirido em @Xinyuu_bot - Telegram
 
Uma vez que uma exceção tenha sido declarada, as instruções executáveis associadas a essa 
exceção são especificadas na seção de tratamento de exceção do bloco. O formato da seção de 
tratamento de exceções é o mesmo que para exceções embutidas. Considere o seguinte fragmento 
de código: 
 
Você já sabe que exceções built-in são levantadas implicitamente. Em outras palavras, quando 
ocorre um erro, uma exceção embutida associada com este erro é gerada. Claro, você está 
assumindo que você tenha incluído essa exceção na seção de tratamento de exceções do seu 
programa. Por exemplo, uma exceção TOO_MANY_ROWS é gerada quando uma instrução SELECT 
INTO retorna várias linhas. 
A exceção definida pelo usuário deve ser levantada explicitamente. Em outras palavras, você 
precisa especificar no seu programa em que circunstâncias uma exceção deve ser levantada. Veja 
um exemplo abaixo: 
 
A instrução RAISE deve ser usada em conjunção com uma instrução IF. Caso contrário, o 
controle irá ser transferido para a seção de tratamento de exceções do bloco em cada execução. 
 
INTRODUÇÃO A CURSORES 
Cursores são áreas de memória onde a plataforma do Oracle executa instruções SQL. Na 
programação de banco de dados, os cursores são estruturas de dados internos que permitem o 
DECLARE 
 exception_name EXCEPTION; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
56
195
Adquirido em @Xinyuu_bot - Telegram
processamento de resultados de consulta SQL. Por exemplo, você usa um cursor para operar em 
todas as linhas da tabela de aluno para aqueles estudantes que fazem um curso particular (com 
entradas associadas na tabela a inscrição). Nesta parte da aula, você aprenderá a declarar um cursor 
explícito, que permite ao usuário processar muitas linhas devolvidas por uma consulta e escrever o 
código que irá processar cada linha de uma vez. 
Tipos de cursores 
Para a plataforma Oracle processar uma instrução SQL, ela precisa criar um espaço de memória 
conhecido como a área de contexto. Este irá conter as informações necessárias para processar a 
instrução. Essas informações incluem o número de linhas processadas e um ponteiro para a 
representação analisada da instrução (análise de uma instrução SQL é o processo pelo qual a 
informação é transferida para o servidor, nele a instrução SQL é avaliada como sendo válida). Em 
uma consulta, o conjunto ativo refere-se às linhas que serão retornadas. 
Um cursor é um identificador ou ponteiro, para a área de contexto. Através do cursor, um 
programa PL/SQL pode controlar a área de contexto e o que acontece nela, enquanto a instrução é 
processada. Duas características importantes sobre o cursor são: 
1. Os cursores permitem buscar e processar as linhas retornadas por uma instrução SELECT, 
uma linha de cada vez. 
2. Um cursor possui um nome de modo que possa ser referenciado. Existem dois tipos de 
cursores: 
• Um cursor implícito é automaticamente definido pelo Oracle cada vez que uma instrução 
SQL é executada. O usuário não estará ciente de que isso acontece e não será capaz de 
controlar ou processar a informação em um cursor implícito. 
• Um cursor explícito é definido pelo programador para qualquer consulta que retorna mais 
de uma linha de dados. Isso significa que, se o programador declarar um cursor dentro do 
bloco de código PL/SQL, esta declaração permite que o aplicativo processe 
sequencialmente cada linha de dados à medida que forem retornados pelo cursor. 
Para entender melhor as capacidades de um cursor explícito, primeiro você precisa entender 
o processo seguido por um cursor implícito. Esse processo segue os seguintes passos: 
• Qualquer bloco PL/SQL emite um cursor implícito sempre que uma instrução SQL é 
executada, desde que um cursor explícito não exista para essa instrução SQL. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
57
195
Adquirido em @Xinyuu_bot - Telegram
• Um cursor é automaticamente associado a cada instrução DML (Data Manipulation Language) 
UPDATE, DELETE e INSERT. 
• Todos os UPDATEs e DELETEs têm cursores que identificam o conjunto de linhas que serão 
afetadas pela operação. 
• Uma instrução INSERT necessita de um local para receber os dados que serão inseridos na 
base de dados; o cursor implícito preenche esta necessidade. 
• O cursor aberto mais recentemente é chamado de o cursor "SQL". 
O cursor implícito é usado para processar INSERT, UPDATE, DELETE e SELECT INTO. Durante o 
processamento de um cursor implícito, a plataforma do Oracle executa automaticamente as 
operações OPEN, FETCH e CLOSE. 
Um cursor implícito pode dizer quantas linhas foram afetadas por uma atualização. Cursores 
têm atributos como ROWCOUNT. SQL%ROWCOUNT, por exemplo, devolve o número de linhas 
atualizadas. Ele pode ser usado como se segue: 
 
Ao contrário de um cursor implícito, um cursor explícito é definido pelo programa para 
qualquer consulta que retorna mais de uma linha de dados. Assim, você precisa processar um cursor 
explícito da seguinte forma: primeiro, você declara um cursor. Em segundo lugar, você abre o cursor 
declarado. Em seguida, você faz o FECTH no cursor anteriormente declarado e aberto. Finalmente, 
você fecha o cursor. 
O único meio de gerar um cursor explícito é criando um cursor nomeado na seção de 
declaração do bloco PL/SQL. A vantagem de declarar um cursor explícito sobre o uso de um cursor 
implícito é que o cursor explícito dá mais controle ao programador. Cursores implícitos são menos 
eficientes do que cursores explícitos, o que torna mais difícil o tratamento e a identificação de erros. 
O processo para trabalhar com um cursor explícito consiste nos seguintes passos: 
1. Declarar o cursor. Isso inicializa o cursor na memória. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
58
195
Adquirido em @Xinyuu_bot - Telegram
2. Abrir ocursor. O cursor declarado anteriormente pode agora ser aberto e a memória é 
alocada. 
3. Fecthing do cursor. O cursor declarado anteriormente e devidamente aberto agora pode 
recuperar dados; este é o processo de FETCH do cursor. 
4. Fechar o cursor. O cursor declarado anteriormente, aberto, e fetched deve, agora, ser 
fechado para liberar alocação de memória. 
Declarar um cursor define o nome do cursor e associa com uma instrução SELECT. O primeiro 
passo é declarar o cursor com a seguinte sintaxe: 
CURSOR c_cursor_name IS select statement; 
O exemplo que se segue é um fragmento de PL/SQL que demonstra o primeiro passo de 
declarar um cursor. Um cursor nomeado C_MyCursor é declarado como uma instrução SELECT de 
todas as linhas na tabela de zipcode, que tem o estado do item igual ao "NY". 
 
Nomes de cursor seguem as mesmas regras de escopo e visibilidade que se aplicam aos 
identificadores PL/SQL. Porque o nome do cursor é um identificador PL/SQL, deve ser declarado 
antes de ser referenciado. Qualquer instrução SELECT válida pode ser usada para definir um cursor, 
incluindo joins e declarações com a UNION ou MINUS. 
O próximo passo no controle de um cursor explícito é para abri-lo. Quando a declaração de 
cursor OPEN é processada, quatro ações ocorrem automaticamente: 
1. As variáveis (incluindo variáveis de ligação) na cláusula WHERE são examinadas. 
2. Com base nos valores das variáveis, o conjunto ativo é determinado e o motor PL/SQL 
executa a consulta para esse cursor. As variáveis são examinadas pelo cursor apenas quando ele é 
aberto. 
3. O motor de PL/SQL identifica o conjunto de dados ativo e as linhas de todas as tabelas 
envolvidas que cumpram os critérios de cláusula WHERE. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
59
195
Adquirido em @Xinyuu_bot - Telegram
4. Um ponteiro para o conjunto ativo é definido para a primeira linha. 
A sintaxe para abrir um cursor é: 
OPEN cursor_name; 
Um ponteiro para o conjunto ativo também é estabelecido para o cursor, quando ele é aberto. 
O ponteiro determina qual linha é a próxima a ser buscada pelo cursor. Mais do que um cursor pode 
estar aberto em determinado momento. 
Depois que o cursor foi declarado e aberto, você pode recuperar dados do cursor. O processo 
de obtenção dos dados a partir do cursor é referido como FETCH do cursor. Existem dois métodos 
de FECTH em um cursor, que utilizam os seguintes comandos: 
FETCH cursor_name INTO PL/SQL variables; 
FETCH cursor_name INTO PL/SQL record; 
Quando o cursor recebe o comando de FETCH, ocorre o seguinte: 
1. O comando FETCH é usado para recuperar uma linha de cada vez a partir do conjunto ativo. 
Isto é feito geralmente dentro de um loop. Os valores de cada linha no conjunto ativo podem ser 
armazenados nas variáveis correspondentes ou em um registro PL/SQL de cada vez, executando 
operações para cada linha sucessivamente. 
2. Após cada comando FETCH, o ponteiro sobre conjunto ativo é movido para a próxima linha. 
Assim, cada FETCH irá retornar as linhas sucessivas do conjunto ativo, até que todo o conjunto seja 
retornado. O último comando FETCH não irá atribuir valores para as variáveis de saída. Assim, eles 
contêm ainda os seus valores anteriores. 
Depois de todas as linhas do cursor serem processadas (e recuperadas), o cursor deverá ser 
fechado. Isso diz ao motor de PL/SQL que o programa foi concluído, e os recursos associados podem 
ser liberados. A sintaxe para fechar o cursor é: 
CLOSE cursor_name; 
Uma vez que um cursor seja fechado, ele não é mais válido para buscar ou fazer FECTH a partir 
dele. Da mesma forma, não é possível fechar um cursor já fechado. Qualquer tentativa de executar 
uma dessas ações, resultará em um erro Oracle. 
Encerramos nossa explicação sobre o processo de utilização de um cursor, mostrando um 
exemplo da utilização. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
60
195
Adquirido em @Xinyuu_bot - Telegram
 
 
 
 
 
 
 
 
4. BANCA: CESPE ANO: 2012 ÓRGÃO: TRE-RJ PROVA: TÉCNICO DO JUDICIÁRIO - PROGRAMAÇÃO 
DE SISTEMAS 
Julgue os itens a seguir, relativos a conceitos de PL/SQL. 
51 PL/SQL é a linguagem para consulta de banco de dados padrão ANSI (American National 
Standards Institute) utilizado pelos principais sistemas gerenciadores de banco de dados 
(SGBDs) do mercado. 
52 A unidade básica em PL/SQL é um bloco com a seguinte estrutura: DECLARE, que é a seção 
para declaração de variáveis, tipos e subprogramas locais; BEGIN — única seção do bloco que 
é indispensável e obrigatória —, que é a seção executável, na qual ficam as instruções 
procedimentais e SQL; EXCEPTION, que é a seção/setor onde ficam as instruções de tratamento 
de erro; e END. 
53 CURSOR é uma área de trabalho temporária criada na memória do sistema quando um 
comando SQL é executado 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
61
195
Adquirido em @Xinyuu_bot - Telegram
Comentário: A alternativa 51 está incorreta. Sabemos que PL/SQL é uma extensão da ORACLE 
para a linguagem SQL, essa sim é definida em um padrão ANSI. 
Para termos um bloco PL/SQL, é necessária a presença do BEGIN e do END, além de alguma 
instrução ou comando para ser executado entre os dois. O BEGIN e o END limitam o código 
executável. Os blocos DECLARE e EXCEPTION são opcionais. 
A alternativa apresenta uma falha, pois pode passar a impressão de que apenas o BEGIN é 
obrigatório. É uma questão de sintaxe, caso não apareça o END, o código PL/SQL vai gerar um 
erro. Fiz um teste ... veja o erro que retornou: 
"ORA-06550: line 14, column 10: PLS-00103: Encountered the symbol "end-of-file" when 
expecting one of the following: ( begin case declare end exception exit for goto if loop mod null 
pragma raise return select update while with <an identifier> <a double-quoted delimited-
identifier> <a bind variable> << continue close current delete fetch lock insert open rollback 
savepoint set sql execute commit forall merge pipe purge json_exists json_value json_query 
json_object json_array ..." 
Para ajustar esse aspecto, é interessante perceber que a alternativa fala do bloco executável. 
Veja que este bloco se refere ao conjunto de comandos que está contido entre as duas palavras 
chaves: BEGIN e END. Sendo assim, a alternativa 52 está correta. 
Acabamos de falar sobre a temporariedade da existência do CURSOR. Ele ocupa uma região de 
memórias apenas enquanto está aberto. Logo após o seu fechamento, a memória é liberada. 
Gabarito: E C C 
 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
62
195
Adquirido em @Xinyuu_bot - Telegram
TRIGGERS 
Nesta parte da aula, você aprenderá sobre um tipo de bloco PL/SQL chamado de gatilho de 
banco de dados ou TRIGGER. Você também vai aprender sobre as diferentes características dos 
gatilhos e suas formas de uso no banco de dados. 
Vamos definir Triggers! 
Um gatilho de banco de dados é um bloco PL/SQL nomeado que é armazenado em um banco 
de dados e executado implicitamente quando ocorre um evento de disparo. O ato de execução de 
um gatilho é referido como disparo do gatilho. Um evento de disparo pode ser qualquer um dos 
seguintes procedimentos: 
1. Uma instrução DML (por exemplo, INSERT, UPDATE ou DELETE) executada contra uma tabela 
de banco de dados. Tal gatilho pode disparar antes ou depois de um evento de disparo. Por exemplo, 
se você tiver definido um gatilho para disparar antes de uma instrução INSERT na tabela de 
estudante, o gatilho é acionado toda vez antesde inserir uma linha na tabela. 
2. Uma instrução DDL (por exemplo, CREATE ou ALTER) executada por um usuário em particular 
contra um esquema. Esses gatilhos são muitas vezes utilizados para fins de auditoria e são 
especificamente úteis para administradores de banco de dados Oracle. Eles podem gravar várias 
alterações do esquema, inclusive quando essas alterações foram feitas para armazenar qual usuário 
fez a mudança. 
3. Um evento do sistema, como a inicialização ou o desligamento do banco de dados. 
4. Um evento de usuário, como o login e o logoff. Por exemplo, você pode definir um gatilho 
que dispara depois de um início de sessão em um banco de dados e que registra o nome de usuário 
e o tempo de login. 
A sintaxe geral para a criação de um gatilho é mostrada na listagem abaixo (as palavras e as 
frases reservadas entre colchetes são opcionais): 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
63
195
Adquirido em @Xinyuu_bot - Telegram
 
A palavra reservada CREATE especifica que você está criando um novo gatilho. A palavra 
reservada REPLACE especifica que você está modificando um gatilho existente. REPLACE é opcional. 
Note, no entanto, que o REPLACE está incluído na maioria dos casos de uso do comando. 
Suponha que em poucos, dias após a criação, você decide modificar este gatilho. Se você não 
incluir a palavra reservada REPLACE na cláusula CREATE do gatilho, uma mensagem de erro será 
gerada quando você compilar o gatilho. A mensagem de erro indica que o nome do seu gatilho já 
está sendo usado por outro objeto. Uma vez incluída na cláusula CREATE do gatilho a expressão 
REPLACE, há menos chance de um erro, porque se trata de um novo gatilho. Ele é criado e, se ele 
estiver referenciando um velho gatilho, ele será substituído. 
No entanto, você deve estar atento ao usar a palavra reservada REPLACE por várias razões. 
Primeiro, se acontecer de você usar REPLACE com o nome de uma função armazenada, 
procedimento ou pacote existente, você vai acabar com diferentes objetos de banco de dados que 
têm o mesmo nome. Isto ocorre porque os gatilhos têm um espaço de nomenclatura separado na 
base de dados. Enquanto compartilham do mesmo nome um gatilho e um procedimento, função ou 
pacote não provocam erros, mas potencialmente pode tornar confusa a interpretação, portanto, 
não é considerada uma boa prática de programação. Em segundo lugar, quando você usa a palavra 
reservada REPLACE e decide associar uma tabela diferente com o seu gatilho, uma mensagem de 
erro é gerada. Por exemplo, suponha que você criou um trigger STUDENT_BI para a tabela aluno. 
Em seguida, você decide alterar o presente gatilho e associá-lo com a tabela de MATRÍCULA. Como 
resultado, a seguinte mensagem de erro é gerada: 
ORA-04095: trigger 'STUDENT_BI' already exists on another table, cannot replace it 
As palavras opcionais reservadas EDITIONABLE e NONEDITIONABLE são especificadas, se o 
gatilho é um objeto editável ou não editável. Note que esta designação se aplica somente se editável 
for habilitado para o tipo de objeto TRIGGER. 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
64
195
Adquirido em @Xinyuu_bot - Telegram
 
 
 
 
 
 
 
 
 
O trigger_name refere-se ao nome do gatilho. BEFORE ou AFTER especifica quando o gatilho é 
acionado (antes ou depois do fato gerador). O triggering_event faz referência a uma declaração DML 
emitida contra a tabela. A table_name é o nome da tabela associada ao gatilho. 
A cláusula FOR EACH ROW especifica que o gatilho é acionado no nível de linha e dispara uma 
vez para cada linha que seja inserida, atualizada ou excluída. Você vai encontrar gatilho no nível de 
linha e no nível de instrução (statement). A cláusula WHEN especifica uma condição que deve ser 
avaliada como TRUE para o gatilho ser acionado. Por exemplo, esta condição pode especificar uma 
restrição na coluna de uma tabela. 
As próximas duas opções, FOLLOWS/PRECEDES e ENABLE/DISABLE, foram adicionados à 
cláusula CREATE OR REPLACE TRIGGER no Oracle 11g. Antes da versão Oracle 11g, era necessário 
emitir o comando ALTER TRIGGER para ativar ou desativar um gatilho, uma vez que tenha sido 
criado. A opção ENABLE/DISABLE especifica se um gatilho é criado no estado ativado ou desativado. 
Quando um trigger é ativado, ele é acionado quando ocorre o evento de disparo. Por outro lado, 
quando um gatilho é desativado, ele não dispara quando ocorre tal evento. Observe que, quando 
um gatilho é criado pela primeira vez sem opção ENABLE/DISABLE, ele é ativado por padrão. Para 
desativar o gatilho, você precisa emitir o comando ALTER TRIGGER, como mostrado na listagem 
abaixo: 
ALTER TRIGGER trigger_name DISABLE; 
Da mesma forma, para ativar um gatilho que foi desativado anteriormente, você precisa emitir 
o comando ALTER TRIGGER, como mostrado a seguir: 
Novidade! Dica do professor! 
Oracle apresenta uma característica muito importante chamada redefinição 
baseada na edição a partir da versão 11g, release 2. Esta funcionalidade 
permite aplicar as alterações a vários objetos de banco de dados, sem 
invalidar todo o sistema, permitindo, assim, que o tempo de inatividade seja 
perto de zero. Por exemplo, anteriormente, ao fazer mudanças estruturais 
em uma tabela, iríamos invalidar inúmeras funções, procedimentos e 
pacotes dependentes dessa tabela. Como resultado, você precisa verificar e 
recompilar todos os objetos de banco de dados invalidados. Potencialmente, 
exigiria um tempo de inatividade do banco de dados. Com a redefinição 
baseada na edição, você pode implementar todas essas mudanças sem 
problemas e migrar os usuários da versão antiga do sistema para a nova 
versão, sem incorrer em tempo de inatividade. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
65
195
Adquirido em @Xinyuu_bot - Telegram
ALTER TRIGGER trigger_name ENABLE; 
A opção FOLLOWS/PRECEDES permite que você especifique a ordem na qual se desencadeia o 
trigger. Aplica-se aos gatilhos que são definidos na mesma tabela e disparados ao mesmo tempo, 
pela mesma ação. Por exemplo, se você definiu dois gatilhos na tabela de ESTUDANTE que são 
disparados antes da operação de inserção ser realizada, o Oracle não garante a ordem em que esses 
gatilhos irão executar, a menos que você explicitamente especifique por meio da cláusula 
FOLLOWS/PRECEDES. Note-se que o gatilho referido na cláusula FOLLOWS/PRECEDES já deve existir 
e ter sido compilado com sucesso. 
A porção do gatilho descrito até este ponto é muitas vezes referida como o cabeçalho gatilho. 
Em seguida, vamos definir o corpo gatilho. O corpo de um gatilho tem a mesma estrutura como um 
bloco PL/SQL anônimo. Semelhante ao bloco PL/SQL, as seções de declaração e de exceção são 
opcionais. Triggers são usados para diferentes propósitos, como os seguintes: 
1. Impor regras de negócios complexas que não podem ser definidas usando as restrições de 
integridade 
2. Manter regras de segurança complexas 
3. Gerar automaticamente valores para colunas derivadas 
4. Coletar informações estatísticas sobre acessos a uma tabela 
5. Previr transações inválidas 
6. Fornecer valores para auditoria 
O corpo de um gatilho é um bloco PL/SQL. No entanto, várias restrições se aplicam quando 
você decide criar um gatilho: 
1. Um gatilho não pode emitir uma instrução de controle transacional, como COMMIT, 
SAVEPOINT ou ROLLBACK. Quando o gatilho é acionado, todas as operações realizadas pelo gatilho 
tornam-se parte de uma transação. Quando a transação é confirmada ou revertida, as operações 
realizadas pelo gatilho também são confirmadas ou revertidas.Uma exceção a essa regra é um 
gatilho que contém uma transação autônoma. Transações autônomas são discutidas em detalhe 
mais adiante ainda nesta aula. 
2. Qualquer função ou procedimento chamado por um disparador não pode emitir uma 
instrução de controle transacional, a menos que contenha uma transação autônoma. 
3. Não é permitida para declarar variáveis LONG ou LONG RAW no corpo de um gatilho. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
66
195
Adquirido em @Xinyuu_bot - Telegram
 
Before Triggers 
Considere o seguinte exemplo de um disparo na tabela ESTUDANTE. Este dispara o gatilho 
antes da instrução INSERT na tabela de aluno e preenche as colunas STUDENT_ID, CREATED_DATE, 
MODIFIED_DATE, CREATED_BY e MODIFIED_BY. A coluna STUDENT_ID é preenchida com o número 
gerado pela sequência STUDENT_ID_SEQ e as colunas CREATED_DATE, MODIFIED_DATE, 
CREATED_USER e MODIFIED_USER são preenchidos com a data atual e as informações de nome de 
usuário, respectivamente. 
 
Esse gatilho é acionado para cada linha, antes da instrução INSERT na tabela de estudante. 
Observe que o nome do gatilho é ESTUDANTE_BI, onde "ESTUDANTE" faz referência ao nome da 
tabela na qual o gatilho está definido e as letras "BI" significam "antes da inserção (BEFORE INSERT)". 
Não há nenhuma exigência específica para nomear gatilhos. No entanto, esta abordagem para 
nomes de um gatilho é bastante descritiva, porque o nome do gatilho contém o nome da tabela 
afetada pelo evento de gatilho, o momento do evento desencadeador (antes ou depois) e o próprio 
fato gerador, neste caso, o INSERT. 
No corpo do gatilho, existe um pseudorecord, :NEW, que permite o acesso a uma linha que 
está sendo processada. Em outras palavras, uma linha é inserida na tabela de aluno. O pseudorecord 
:NEW é de um tipo TRIGGERING_TABLE%TYPE, por isso, neste caso, é do tipo ESTUDANTE%TYPE. 
Para ter acesso aos atributos individuais do pseudorecord :NEW, utiliza-se a notação de ponto. Em 
Você sabia? 
Se você excluir uma tabela, gatilhos de banco de dados 
da tabela também são descartados. 
CREATE OR REPLACE TRIGGER estudante_bi 
BEFORE INSERT ON ESTUDANTE 
FOR EACH ROW 
BEGIN 
 :NEW.student_id := STUDENT_ID_SEQ.NEXTVAL; 
 :NEW.created_by := USER; 
 :NEW.created_date := SYSDATE; 
 :NEW.modified_by := USER; 
 :NEW.modified_date := SYSDATE; 
END; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
67
195
Adquirido em @Xinyuu_bot - Telegram
outras palavras, :NEW.CREATED_BY refere-se ao atributo CREATED_BY membro do registro :NEW, o 
nome do registro é separado pelo ponto do nome de seu membro. 
Além do pseudorecord :NEW, existe também o registro :OLD. Ele permite que você acesse as 
informações atuais do registro que está sendo atualizado ou excluído. Assim, o pseudorecord :OLD 
é indefinido para as instruções INSERT e o pseudorecord :NEW é indefinido para as instruções 
DELETE. No entanto, o compilador PL/SQL não gera erros de sintaxe quando: :OLD ou :NEW são 
usados em triggers, onde o fato gerador é uma operação de INSERT ou DELETE, respectivamente. 
Neste caso, os valores de membro são definidos como NULL. 
Dê uma olhada mais de perto na instrução que atribui um valor de sequência para a coluna 
student_id. A capacidade de acessar uma sequência via expressões PL/SQL é um novo recurso 
adicionado no Oracle 11g. Antes da versão 11g, as sequências podem ser acessadas somente por 
meio de consultas, conforme mostrado no próximo exemplo: 
 
 
Você deve usar gatilhos de BEFORE nas seguintes situações: 
• Quando um gatilho fornece valores para colunas derivadas antes de uma instrução 
INSERT ou UPDATE ser concluída. Por exemplo, o gatilho pode fornecer colunas orientadas para a 
auditoria, como CREATED_DATE e MODIFIED_DATE. 
• Quando um gatilho determina se um INSERT, UPDATE, ou DELETE devem ser 
autorizados para completar suas ações. Por exemplo, quando você insere um registro na tabela de 
instrutor, um gatilho pode verificar se o valor fornecido para a coluna de CEP é válido - em outras 
palavras, se há um registro na tabela de CEP correspondente ao valor que foi fornecido. 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
68
195
Adquirido em @Xinyuu_bot - Telegram
AFTER Triggers 
Suponha que exista uma tabela denominada AUDIT_TRAIL, tendo a estrutura mostrada na 
figura a seguir. Esta tabela é usada para coletar informações de acesso do usuário em diferentes 
tabelas no esquema ESTUDANTE. Por exemplo, você pode gravar os registros excluídos da tabela de 
instrutor e quando eles foram excluídos. 
 
Para conseguir isso, você precisa criar um gatilho na tabela instrutor, como mostrado no 
exemplo a seguir: 
 
Esse gatilho é acionado depois de um UPDATE ou um DELETE ser emitido sobre a tabela de 
instrutor. O corpo do gatilho contém duas funções booleanas, UPDATING e DELETING. A função 
UPDATING é avaliada como TRUE, se uma instrução UPDATE é emitida sobre a tabela, e a função 
DELETING é avaliada como TRUE, se uma instrução DELETE é emitida sobre a tabela. Outra função 
booleana, INSERTING, também é avaliada como TRUE, quando uma instrução INSERT é emitida 
contra a tabela. Essa última não aparece no exemplo acima. 
O gatilho insere um registro na tabela de AUDIT_TRAIL, quando uma operação UPDATE ou 
DELETE é emitida contra a tabela INSTRUCTOR. Primeiro, ele determina qual operação foi emitida 
em relação à tabela INSTRUTOR, via a instrução CASE. O resultado desta avaliação é, então, atribuído 
à variável v_trans_type. Em seguida, o gatilho adiciona um novo registro à tabela AUDIT_TRAIL. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
69
195
Adquirido em @Xinyuu_bot - Telegram
Uma vez que este gatilho é criado na tabela instrutor, qualquer operação UPDATE ou DELETE 
faz com que novos registros sejam criados na tabela AUDIT_TRAIL. Além disso, o gatilho pode ser 
melhorado através do cálculo de quantas linhas foram atualizadas ou excluídas da tabela instrutor. 
Você deve usar gatilhos AFTER nas seguintes situações: 
• Quando um gatilho deve disparar após uma instrução DML ser executada 
• Quando um gatilho executa ações não especificadas em um gatilho de BEFORE 
Transações autônomas 
Como referido anteriormente, quando um gatilho é disparado, todas as operações realizadas 
pelo gatilho tornam-se parte de uma transação. Quando esta transação é confirmada ou revertida, 
as operações realizadas pelo gatilho são confirmadas ou revertidas também. Considere uma 
instrução UPDATE contra a tabela de INSTRUTOR, como mostrado abaixo: 
 
Quando esta instrução UPDATE é executada, o gatilho INSTRUCTOR_AUD é acionado e adiciona 
um registro para a tabela de AUDIT_TRAIL, como mostrado a seguir: 
 
Em seguida, considere reverter a instrução UPDATE. Neste caso, o registro inserido na tabela 
de AUDIT_TRAIL também é revertido. Veja a figura abaixo: 
 
Como você pode ver, a tabela de AUDIT_TRAIL já não contém quaisquer registros. Para 
contornar esse comportamento, você pode optar por utilizar transações autônomas. 
UPDATE instructor 
 SET phone = '7181234567' 
 WHERE instructor_id = 101; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
70
195
Adquirido em @Xinyuu_bot - Telegram
Uma transação autónoma é uma transação independente inicializada por outra transação que 
é normalmente referida como a transação principal.Em outras palavras, uma transação autônoma 
pode emitir várias instruções DML e fazer commit ou revertê-las, sem confirmar ou reverter as 
instruções DML emitidas pela transação principal. 
Para definir uma transação autônoma, você precisa empregar o pragma 
AUTONOMOUS_TRANSACTION. Um pragma é uma instrução especial para o compilador PL/SQL, 
que é processada no momento da compilação. O pragma AUTONOMOUS_TRANSACTION aparece 
na seção de declaração de um bloco, como mostrado na listagem abaixo: 
 
Nesta versão do gatilho, você adicionou o pragma AUTONOMOUS_TRANSACTION ao bloco de 
declaração e o COMMIT na parte executável do gatilho. 
Agora, você pode tentar emitir uma instrução de UPDATE e, em seguida, fazer rollback da 
mesma e consultar a tabela AUDIT_TRAIL. Mesmo que as alterações na tabela de INSTRUTOR forem 
revertidas, a tabela de AUDIT_TRAIL continuará a conter um registro da tentativa da operação 
UPDATE. 
Row e Statement Triggers 
Nas páginas anteriores, você pode conhecer o gatilho de linha (ROW). Um gatilho de linha é 
acionado todas as vezes que alguma linha é afetada pela instrução. Quando a instrução FOR EACH 
ROW está presente na cláusula CREATE TRIGGER, o gatilho é de linha. 
Um gatilho declaração (statement) é disparado uma vez para a instrução de acionamento. Em 
outras palavras, um gatilho de statement é disparado apenas uma vez, independentemente do 
número de linhas afetadas pela instrução de acionamento. Para criar um gatilho de instrução, você 
pode omitir a instrução FOR EACH ROW na cláusula CREATE TRIGGER, como mostrado abaixo: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
71
195
Adquirido em @Xinyuu_bot - Telegram
 
Esse gatilho especial é acionado uma vez, após uma instrução DELETE ser emitida contra a 
tabela. Se a instrução DELETE remove uma linha, cinco linhas ou 500 linhas da tabela de 
ENROLLMENT, este gatilho é acionado apenas uma vez. 
Gatilhos de instrução devem ser usados quando as operações realizadas pelo gatilho não 
dependem dos dados nos registros individuais. Por exemplo, se você quiser limitar o acesso a uma 
tabela para o horário comercial, você pode usar um gatilho de instrução. Considere o seguinte 
exemplo: 
 
Esse gatilho de declaração na tabela INSTRUCTOR dispara antes de um INSERT, UPDATE, ou 
DELETE ser emitido. Em primeiro lugar, o gatilho determina o dia da semana. Se o dia corrente for 
um sábado ou um domingo, uma mensagem de erro é gerada. Por exemplo, se uma instrução de 
UPDATE na tabela de instructor for emitida no sábado ou domingo, o trigger gerará a seguinte 
mensagem de erro: 
 
Observe que este gatilho verifica apenas o dia específico da semana, mas não verifica a hora 
do dia. Você pode criar um gatilho mais sofisticado que verifica o dia da semana, se o tempo atual é 
entre 09:00 e 17:00. Se o dia cai durante a semana e a hora do dia não é entre 09:00 e 17:00, o erro 
também é gerado. 
 
CREATE OR REPLACE TRIGGER enrollment_ad 
AFTER DELETE ON ENROLLMENT 
...; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
72
195
Adquirido em @Xinyuu_bot - Telegram
Gatilhos de “Instead Of” 
Lembre-se que o PL/SQL fornece um tipo especial de gatilho que pode ser definido sobre visões 
do banco de dados. São os gatilhos de INSTEAD OF, que são criados como um gatilho de linha. Um 
disparo de um gatilho de INSTEAD OF é disparado em vez de uma instrução DML (INSERT, UPDATE, 
DELETE) que tenha sido emitida contra uma visão e tenha modificado diretamente as tabelas 
subjacentes. 
Considere um gatilho INSTEAD OF definido sobre a visão INSTRUCTOR_SUMMARY_VIEW. Esse 
gatilho exclui um registro da tabela INSTRUCTOR referente ao valor correspondente ao ID do 
instrutor. 
 
Observe o uso da cláusula INSTEAD OF no cabeçalho gatilho. Uma vez que o gatilho seja criado, 
o DELETE sobre a visão INSTRUCTOR_SUMMARY_VIEW não gera quaisquer erros. 
Quando esta instrução DELETE é emitida, o gatilho exclui um registro da tabela instructor 
correspondente ao valor INSTRUCTOR_ID especificado. Agora considere a mesma instrução DELETE 
com um ID instructor diferente que não existe na tabela. Quando esta instrução DELETE é emitida, 
vai gerar o seguinte erro: 
 
Para assegurar que tal gatilho funcione como pretendido, você deve estar ciente de dois 
fatores importantes: as relações entre as tabelas no banco de dados e o efeito em cascata que um 
projeto particular pode apresentar. 
Vamos agora fazer uma questão para fixarmos o conhecimento a respeito de triggers. 
 
 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
73
195
Adquirido em @Xinyuu_bot - Telegram
 
1. BANCA: FCC ANO: 2015 ÓRGÃO: TRE-RR PROVA: ANALISTA JUDICIÁRIO - ANÁLISE DE SISTEMAS 
Em PL/SQL, triggers DML podem ser criadas usando a instrução CREATE TRIGGER, cuja sintaxe 
é apresentada a seguir: 
CREATE [OR REPLACE] TRIGGER trigger_name 
timing 
event1 [OR event2 OR event3] 
ON object_name 
[REFERENCING OLD AS old | NEW AS new] 
FOR EACH ROW 
WHEN (condition)]] 
DECLARE] 
BEGIN 
... trigger_body 
[EXCEPTION . . .] 
END [trigger_name]; 
O timing da sintaxe do trigger indica quando o trigger será disparado em relação ao evento de 
trigger. Os valores permitidos são BEFORE, AFTER e 
A NOW. 
B ONCE. 
C AFTER NOW. 
D BEFORE NOW. 
E INSTEAD OF. 
Comentário: Existem basicamente três formas de definir o momento ou timing no qual um 
determinado gatilho será executado. Além dos conhecidos BEFORE e AFTER listados no 
enunciado, temos também o gatilho de INSTEAD OF, que é executado ao invés de uma 
determinada operação ou comando. 
Gabarito: E 
 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
74
195
Adquirido em @Xinyuu_bot - Telegram
PROCEDURES 
Todo o código PL/SQL que apresentamos até este ponto foi constituído por blocos anônimos 
que foram executados como scripts e compilados pelo servidor de banco de dados em tempo de 
execução. Agora você vai começar a usar o código modular. Código modular é uma metodologia 
para construir um programa de partes distintas (módulos), cada um dos quais realiza uma função ou 
tarefa específica em direção ao objetivo final do programa. 
Uma vez que o código modular é armazenado no servidor de banco de dados, torna-se um 
objeto de banco de dados, ou subprograma, que está disponível para outras unidades de programa. 
Para guardar o código no banco de dados, o código de origem precisa ser enviado para o servidor 
de modo que seja compilado e armazenado na base de dados. Este processo será abordado nas três 
seções seguintes. Esta primeira introduz os procedimentos armazenados. A próxima aborda os 
conceitos básicos de funções armazenadas e uma última, que trata dos pacotes. 
 
Benefícios do Código Modular 
Um módulo de PL/SQL é qualquer unidade lógica completa de trabalho. Existem cinco tipos de 
módulos em PL/SQL: 
(1) blocos anônimos, que são executados com um script de texto; 
(2) os procedimentos; 
(3) funções; 
(4) pacotes; 
(5) triggers. 
Existem duas principais vantagens de se utilizar o código modular: (1) é mais reutilizável e (2) 
é mais administrável. 
Você pode criar um procedimento utilizando o SQL*Plus ou em uma das muitas ferramentas 
para a criação e depuração de código armazenado PL/SQL. Se você estiver utilizando o SQL*Plus, 
você terá que escrever seu código em um editor de texto e, em seguida, executá-lo na janela do 
SQL*Plus. 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário- Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
75
195
Adquirido em @Xinyuu_bot - Telegram
Criando um Procedure 
Um procedimento ou procedure é um módulo de execução de uma ou mais ações; ele não 
precisa retornar nenhum valor. A sintaxe para criar um procedimento é a seguinte: 
 
Um procedimento pode ter zero ou muitos parâmetros. Cada procedimento tem duas partes: 
(1) a parte de cabeçalho, que vem antes da palavra-chave AS (ou, às vezes, IS - elas são 
intercambiáveis) e contém o nome do procedimento e a lista de parâmetros, e (2) o corpo, que é 
tudo após o AS (IS). A palavra REPLACE é opcional. Quando essa palavra-chave não está incluída no 
cabeçalho do procedimento, para mudar o código no procedimento, você deve primeiro remover o 
procedimento e, em seguida, recriá-lo. Devido ao fato de ser muito comum alterar o código de um 
procedimento, especialmente, quando se está em desenvolvimento, é altamente recomendável que 
você use a opção OR REPLACE. 
O script a seguir demonstra a sintaxe para a criação de um procedimento. Quando esse script 
for executado, ele cria um procedimento chamado de Discount, que é compilado em p-code e 
armazenado no banco de dados para execução posterior. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
76
195
Adquirido em @Xinyuu_bot - Telegram
 
Para executar o procedimento armazenado Discount, a seguinte sintaxe é usada: 
 
Não há o comando COMMIT neste procedimento, o que significa que o procedimento não irá 
atualizar o banco de dados. Um comando COMMIT precisa ser emitido após o procedimento ser 
executado, se você quiser que as alterações sejam feitas. 
Alternativamente, você pode digitar COMMIT, antes ou depois do END LOOP. Se você colocar 
a instrução COMMIT antes do END LOOP, então você está fazendo COMMIT depois de cada loop. Se 
você colocar a instrução COMMIT após o END LOOP, as alterações não serão confirmadas após o 
procedimento estar concluído. É mais sábio seguir a segunda opção, uma vez que deixa você mais 
bem preparado para os erros de manipulação. 
Duas visões principais no dicionário de dados fornecem informações sobre o código 
armazenado: a visão USER_OBJECTS, que dá informações sobre os objetos, e a visão USER_SOURCE, 
que dá o texto do código fonte. O dicionário de dados também tem as versões ALL_ e DBA_ dessas 
views. 
A seguinte instrução SELECT recebe informação pertinente da visão USER_OBJECTS sobre o 
procedimento de desconto que escrevemos anteriormente: 
EXECUTE Procedure_name 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
77
195
Adquirido em @Xinyuu_bot - Telegram
 
Um procedimento pode se tornar inválido se a tabela na qual ele se baseia é excluída ou 
alterada. Você pode recompilar um procedimento inválido com o seguinte comando: 
 
 
Usando os parâmetros IN e OUT 
Os parâmetros são um meio para passar valores a partir do ambiente de chamada para o 
servidor e vice-versa. Estes valores são processados ou devolvidos através da execução do processo. 
Há três modos de parâmetros: IN, OUT e IN OUT. 
Os modos especificam se o parâmetro passado é lido ou age como um receptor para um objeto 
ou informação de saída. A figura abaixo ilustra a relação entre os parâmetros quando estão no 
cabeçalho procedimento versus quando o procedimento é executado. 
 
 
Parâmetros formais são os nomes indicados entre parênteses, como parte de um cabeçalho de 
um módulo. Parâmetros reais são os valores das expressões especificadas entre parênteses, como 
uma lista de parâmetros quando uma chamada é feita a um determinado módulo. O parâmetro 
formal e o parâmetro real relacionado devem ser do mesmo tipo ou de tipos de dados compatíveis. 
A tabela a seguir explica os três tipos de parâmetros de procedimentos: 
 
 
alter procedure procedure_name compile 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
78
195
Adquirido em @Xinyuu_bot - Telegram
Modo Descrição Uso 
IN 
Passa o valor para o programa 
Constantes, literais e expressões 
Não pode ser modificado pelo programa 
Modo default 
Somente leitura 
OUT 
Passa valores de retorno do programa 
Deve ser uma variável 
Não pode receber valores default 
O valor é atribuído apenas se o programa 
executar com sucesso 
Somente escrita 
IN OUT 
Tanto passa valores para o programa 
quanto envia valores de volta 
Deve ser uma variável 
Parâmetros formais não requerem restrições sobre o tipo de dados. Por exemplo, em vez de 
especificar uma restrição, tal como VARCHAR2 (60), você pode apenas definir o tipo VARCHAR2 para 
o nome do parâmetro na lista de parâmetros formal. A restrição é passada com o valor quando é 
feita uma chamada. 
2. BANCA: CESPE ANO: 2013 ÓRGÃO: MPU PROVA: ANALISTA DO MPU - TECNOLOGIA DA 
INFORMAÇÃO - SUPORTE E INFRAESTRUTURA 
Com relação a linguagens de bancos de dados, julgue os itens subsecutivos. 
Em PL/SQL, parâmetros cujo tipo não esteja explicitamente declarado são considerados como 
do tipo IN. 
Comentário: Observem que acabamos de comentar, na tabela acima, que o modo default para 
os parâmetros é o IN. Ou seja, caso não seja definido explicitamente, podemos considerar o 
parâmetro apenas de entrada. 
Gabarito: C 
 
Aqui terminamos nosso assunto teórico relacionado a procedimentos. Vamos agora continuar 
com a nossa ementa tratando de funções. 
 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
79
195
Adquirido em @Xinyuu_bot - Telegram
FUNCTIONS 
Uma função armazenada na base de dados é muito parecida com um procedimento, nela um 
bloco PL/SQL nomeado pode receber parâmetros e ser invocado. Existem diferenças fundamentais 
tanto na forma como ela é criada e como ela é usada. Nesta seção, você vai aprender as noções 
básicas de como criar, usar e apagar uma função. 
 
Criando Functions 
As funções são outro tipo de código armazenado muito semelhante aos procedimentos. A 
diferença significativa entre os dois é que uma função é um bloco PL/SQL que retorna um único 
valor. As funções podem aceitar um, muitos ou nenhum parâmetro, mas elas devem ter uma 
cláusula de retorno em sua seção de execução. 
O tipo do valor de retorno de dados deve ser declarado no cabeçalho da função. Uma função 
não é um executável independente do mesmo modo que um procedimento é. A função deve ser 
sempre utilizada em alguns contextos. Uma função produz uma saída que tem de ser atribuída a 
uma variável, ou pode ser utilizada em uma instrução de SELECT. 
Esta seção aborda a sintaxe da função básica e demonstra como criar uma função. A sintaxe 
para criar uma função é a seguinte: 
 
A função não tem necessariamente qualquer parâmetro, mas deve ter um valor de retorno 
declarado no cabeçalho. Ela deve retornar valores para todos os possíveis fluxos de execução. A 
declaração RETURN não tem que aparecer como a última linha da seção de execução principal. 
Pode haver mais de uma instrução RETURN. A função pode ter parâmetros IN, OUT ou IN OUT, 
embora você raramente encontrará, exceto parâmetros IN, porque não é boa prática de 
programação usar os outros parâmetros (OUT e IN OUT). O exemplo a seguir mostra um script para 
a criação de uma função chamada show_description: 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
80
195
Adquirido em @Xinyuu_bot - Telegram
 
O cabeçalho da função do exemplo indica que a funçãotem um parâmetro numérico e retorna 
um valor do tipo VARCHAR2. A função faz uso de uma variável VARCHAR2(50) chamada 
v_description. Dá a esta variável o valor da descrição do curso, cujo número é passado para a função. 
O valor de retorno é a própria variável. 
Há duas exceções na função. A primeira é quando nenhum dado é encontrado. Neste caso, a 
exceção NO_DATA_FOUND deve ser lançada, que é o mais provável de ocorrer. A segunda exceção 
é lançada quando quaisquer outros erros acontecem. A cláusula WHEN OTHERS é utilizada como um 
catchall para qualquer outro erro que possa ocorrer. 
A cláusula de retorno é uma das últimas declarações na função. A razão para esse 
posicionamento é que o foco do programa irá retornar para o ambiente de chamada uma vez que a 
cláusula RETURN é emitida. 
Invocando Funções 
Funções retornam um valor único e podem ser muito úteis em uma instrução SELECT. Em 
particular, elas podem ajudá-lo a evitar instruções SQL complexas e repetidas dentro de uma 
instrução SELECT. A declaração a seguir demonstra o uso da função show_description em uma 
instrução SELECT para cada curso da tabela COURSE: 
 
SELECT course_no, show_description(course_no) 
 FROM course; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
81
195
Adquirido em @Xinyuu_bot - Telegram
As funções também podem ser utilizadas em uma instrução SQL. Na verdade, você tem feito 
uso delas o tempo todo. Você simplesmente não pode ter percebido isso. Como um exemplo 
simples, imagine usando a função UPPER em uma instrução SELECT: 
 
A função UPPER fornecida pelo Oracle retorna o valor em letras maiúsculas do parâmetro que 
foi passado. Para uma função definida pelo usuário ser chamada em uma expressão SQL, ela deve 
ser uma função de linha (ROW), não uma função de grupo, e os tipos de dados devem ser tipos de 
dados SQL. Os tipos de dados não podem ser tipos de dados PL/SQL, como um valor booleano, tabela 
(TABLE) ou registro (RECORD). Além disso, em uma função, não é permitida a inclusão de quaisquer 
declarações DML (INSERT, UPDATE, DELETE). 
Para usar uma função em uma instrução SQL SELECT, a função deve ter certo nível de pureza, 
que é adquirido com a cláusula PRAGMA RESTRICT_REFERENCES. 
Definindo funções com a cláusula WITH 
A partir do Oracle Database 12.1, você pode definir funções, bem como procedimentos dentro 
da mesma instrução SQL em que a instrução SELECT aparece. Isto alivia a troca de contexto entre o 
código PL/SQL e os motores SQL, permitindo que ambas as etapas tenham lugar no motor de SQL e, 
por sua vez, prevê um ganho de desempenho. A função ou procedimento precisa ser definido 
utilizando a cláusula WITH. Nas versões anteriores da plataforma Oracle, apenas subconsultas 
podiam ser definidas na cláusula WITH. 
O exemplo seguinte demonstra como a função show_description, que foi desenvolvida 
anteriormente, pode ser utilizada na cláusula WITH. A função foi renomeada para show_descript 
para garantir que ela não se confunda com a versão anterior, show_description. 
 
SELECT UPPER('bill') FROM DUAL; 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
82
195
Adquirido em @Xinyuu_bot - Telegram
O recurso WITH FUNCTION é útil em muitas situações. A principal desvantagem deste recurso 
é que você perde os benefícios de uma função reutilizável em favor de obter um melhor 
desempenho através da redução das trocas de contexto entre os motores SQL e PL/SQL. Antes de 
decidir qual abordagem usar, é aconselhável fazer uma análise de custo e pesar os benefícios contra 
a eventual necessidade de reutilizar a função em outros contextos. 
Definindo funções com o Pragma UDF 
As funções podem ser criadas acrescentando a sintaxe do pragma UDF, a qual notifica o 
compilador que uma função definida pelo usuário será utilizada em instruções SQL. Um pragma é 
basicamente uma sugestão para o compilador, que permite aperfeiçoar a função adequadamente. 
Quando a sintaxe UDF pragma é usada, a função terá um desempenho mais elevado quando usada 
no SQL. Muito pouco precisa ser feito para aplicar o pragma, basicamente, adicionar a frase pragma 
UDF antes da declaração de variável, como mostrado em negrito no exemplo a seguir: 
 
 
 
PACKAGES 
Um pacote é uma coleção de objetos PL/SQL agrupados sob um mesmo nome do pacote. Os 
pacotes podem incluir procedimentos, funções, cursores, declarações, tipos e variáveis. Colecionar 
objetos em um pacote tem inúmeros benefícios. Nesta seção, você vai aprender o que esses 
benefícios são e como aproveitá-los. 
 
Criando Packages 
Existem numerosos benefícios para a utilização de pacotes como um método de agrupar suas 
funções e procedimentos, sendo o primeiro que um pacote bem projetado é um agrupamento lógico 
de objetos, tais como funções, procedimentos, variáveis globais e cursores. Todo o código (árvore 
de análise e pseudocode [p-code]) é carregado na memória (área global compartilhada [SGA] do 
servidor Oracle) na primeira chamada do pacote. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
83
195
==a80b1==
Adquirido em @Xinyuu_bot - Telegram
Isto significa que a primeira chamada para o pacote é muito cara, pois envolve um monte de 
processamento no servidor, mas todas as chamadas subsequentes irão resultar em um desempenho 
melhor. Por esta razão, os pacotes são frequentemente utilizados em aplicações onde os 
procedimentos e funções são chamados repetidamente. 
Pacotes permitem que você faça uso de alguns dos conceitos envolvidos na programação 
orientada a objetos, apesar de PL/SQL não ser uma "verdadeira" linguagem de programação 
orientada a objetos. Com o pacote de PL/SQL, você pode agrupar funções e procedimentos e 
fornecer-lhes um contexto. 
Devido ao fato de todo o código do pacote ser carregado na memória, você também pode 
escrever seu programa para que outros códigos semelhantes sejam colocados no pacote e permitir 
que vários procedimentos e funções possam chamá-los. Você pode fazer isso se a lógica de cálculo 
for bastante intensa e você quer mantê-la em um só lugar. 
Um nível adicional de segurança se aplica quando utilizamos pacotes. Quando um usuário 
executa um procedimento em um pacote (ou procedimentos armazenados e funções), o 
procedimento opera com as mesmas permissões que o seu proprietário. Pacotes permitem a criação 
de funções e procedimentos privados, que podem ser chamados apenas a partir de outras funções 
e procedimentos do pacote. Semelhante aos métodos privates de Java, isso reforça a ocultação de 
informações. A estrutura do pacote incentiva, assim, projeto top-down. 
A especificação do pacote contém informações sobre o conteúdo do pacote, mas não o código 
para os procedimentos e as funções. Ele também contém declarações de variáveis globais e públicas. 
Qualquer coisa colocada na seção de declaração de um bloco PL/SQL pode ser codificada em uma 
especificação do pacote. 
Todos os objetos colocados na especificação do pacote são chamados objetos públicos. 
Qualquer função ou procedimento que não esteja presente na especificação do pacote, mas esteja 
no corpo do pacote, é chamada de função ou procedimento privado. 
Quando os procedimentos e funções públicas estão sendo chamados a partir de um pacote, o 
programador que escreve o processo de "chamada" precisa apenas das informações presentes na 
especificação do pacote, uma vez que fornece todas as informações necessárias para chamar um 
dos procedimentos ou funções dentro do pacote. A sintaxe para a especificação do pacote é a 
seguinte: 
 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região(Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
84
195
Adquirido em @Xinyuu_bot - Telegram
 
 
O corpo do pacote contém o código executável real para os objetos descritos na especificação 
do pacote. Ele contém o código para todos os procedimentos e as funções descritas na especificação 
e pode conter, adicionalmente, a codificação para os objetos não declarados na especificação. O 
último tipo de objeto presente é invisível ao exterior do pacote e é referido como "ocultos". Ao criar 
pacotes armazenados, a especificação do pacote e o corpo podem ser compilados separadamente. 
Vejam a definição do corpo de um pacote abaixo: 
 
Uma série de regras deve ser seguida no código do corpo do pacote. Primeiro, deve haver uma 
correspondência exata entre os cabeçalhos do cursor e do módulo e suas definições na especificação 
do pacote. Em segundo lugar, as declarações de variáveis, exceções, tipo ou constantes na 
especificação não podem ser repetidas no corpo. Em terceiro lugar, qualquer elemento declarado 
na especificação pode ser referenciado no corpo. 
Você pode usar a seguinte notação ao chamar elementos internos de fora do pacote: 
package_name.element. Você não precisa qualificar os elementos quando eles são declarados e 
referenciados no interior do corpo do pacote ou quando são declarados na especificação e 
referenciados no interior do corpo do mesmo pacote. 
O exemplo a seguir mostra a especificação do pacote manage_students. Posteriormente, 
mostraremos a criação do corpo do mesmo pacote. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
85
195
Adquirido em @Xinyuu_bot - Telegram
 
O exemplo a seguir cria uma especificação de pacote de um pacote chamado school_api. Vejam 
que, neste caso, fazemos referência, na definição do pacote, a uma função e a uma procedure. 
 
Agora vamos criar o corpo do pacote manage_students, que foi especificado anteriormente. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
86
195
Adquirido em @Xinyuu_bot - Telegram
 
Este script compila o pacote manage_students no banco de dados. A especificação para o 
pacote indica que existe um procedimento e uma função. O procedimento find_sname requer um 
parâmetro IN, a carteira de estudante ou algum outro student_id. Ele retorna dois parâmetros: o 
primeiro e o último nome do aluno. 
A função id_is_good recebe um único parâmetro e retorna um valor booleano (verdadeiro ou 
falso). Embora o corpo ainda não tenha sido inserido no banco de dados, o pacote já está disponível 
para outras aplicações. Por exemplo, se você incluiu uma chamada para um destes procedimentos 
em outro procedimento armazenado, esse procedimento irá compilar (mas não executar). 
É mais ou menos a mesma ideia de interface de Java. Você define as assinaturas dos métodos, 
neste caso, para as funções, procedimentos e gatilhos. Contudo, para serem executados, é preciso 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
87
195
Adquirido em @Xinyuu_bot - Telegram
que um objeto concreto seja criado. Neste caso, você precisa do corpo do pacote. Para concluir 
nosso estudo, vamos observar o uso do pacote manage_students em outro bloco. 
 
Este é um bloco PL/SQL para executar a função e o procedimento no pacote manage_students. 
Se um valor existente de student_id for inserido, o nome do aluno é exibido. Se o student_id não é 
válido, uma mensagem de erro é exibida. 
Aqui terminamos o conteúdo da nossa aula de PL/SQL. Concluímos o assunto relacionado à 
matéria. Vamos a seguir fazer um conjunto de questões comentadas a respeito do assunto. 
 
 
Vamos agora fazer uma questão para fixarmos melhor a matéria. 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
88
195
Adquirido em @Xinyuu_bot - Telegram
 
3. BANCA: CESPE ANO: 2012 ÓRGÃO: TRE-RJ PROVA: TÉCNICO DO JUDICIÁRIO - PROGRAMAÇÃO 
DE SISTEMAS 
Julgue os itens a seguir, relativos a conceitos de PL/SQL. 
51 PL/SQL é a linguagem para consulta de banco de dados padrão ANSI (American National 
Standards Institute) utilizado pelos principais sistemas gerenciadores de banco de dados 
(SGBDs) do mercado. 
52 A unidade básica em PL/SQL é um bloco com a seguinte estrutura: DECLARE, que é a seção 
para declaração de variáveis, tipos e subprogramas locais; BEGIN — única seção do bloco que 
é indispensável e obrigatória —, que é a seção executável, na qual ficam as instruções 
procedimentais e SQL; EXCEPTION, que é a seção/setor onde ficam as instruções de tratamento 
de erro; e END. 
53 CURSOR é uma área de trabalho temporária criada na memória do sistema quando um 
comando SQL é executado 
Comentário: A alternativa 51 está incorreta. Sabemos que PL/SQL é uma extensão da ORACLE 
para a linguagem SQL, essa sim é definida em um padrão ANSI. 
Para termos um bloco PL/SQL, é necessário a presença do BEGIN e do END, além de alguma 
instrução ou comando para ser executado entre os dois. Os blocos DECLARE e EXCEPTION são 
opcionais. A alternativa 52 está correta. 
Acabamos de falar sobre a temporariedade da existência do CURSOR. Ele ocupa uma região de 
memórias apenas enquanto está aberto. Logo após o seu fechamento, a memória é liberada. 
Gabarito: E C C 
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
89
195
Adquirido em @Xinyuu_bot - Telegram
QUESTÕES COMENTADAS
1. FUNDATEC - ANC (PROCERGS)/PROCERGS/Desenvolvimento/Oracle PL SQL/2023
Considere o seguinte comando:
CREATE OR REPLACE PROCEDURE questao AS
BEGIN
FOR k IN (SELECT * FROM PESSOA)
LOOP
cont := cont+1;
DBMS_OUTPUT.PUT_LINE('NOME: '||k.NOME);
END LOOP;
END;
Analise as assertivas abaixo e assinale a alternativa correta.
I. A opção [OR REPLACE] é opcional na sintaxe da criação da procedure e irá sobrescrever
a procedure.
II. O comando LOOP não possui EXIT e nem EXIT WHEN, por isso será infinito.
III. A saída irá mostrar a lista de nomes da tabela PESSOA.
IV. A quantidade de vezes que o LOOP será executado é determinada pela quantidade de
tuplas da tabela PESSOA.
a) Todas estão corretas.
b) Todas estão incorretas.
c) Apenas II e III estão corretas.
d) Apenas III e IV estão corretas.
e) Apenas I, III e IV estão corretas.
Comentário: Vamos analisar cada uma das alternativas:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
90
195
Adquirido em @Xinyuu_bot - Telegram
I. Esta assertiva está correta. A opção [OR REPLACE] na declaração CREATE OR REPLACE
PROCEDURE indica que se a procedure já existir com o mesmo nome, ela será substituída
pela nova definição. Ela é opcional e deve ser utilizada se deseja substituir uma procedure
existente.
II. Esta assertiva está incorreta. Embora seja verdade que o comando LOOP não tenha
uma cláusula de saída explícita, ele ainda pode ser encerrado usando um comando EXIT
ou EXIT WHEN dentro do loop. No entanto, sem uma cláusula de saída apropriada, o loop
continuará indefinidamente, o que pode levar a um comportamento indesejado.
A assertiva III está correta. A saída irá mostrar a lista de nomes da tabela PESSOA devido
ao comando DBMS_OUTPUT.PUT_LINE('NOME: '||k.NOME); dentro do loop, que imprime
os nomes na saída padrão.
A assertiva IV também está correta. A quantidade de vezes que o loop será executado é
determinada pela quantidade de tuplasda tabela PESSOA, já que o loop itera sobre todas
as linhas da tabela.
Portanto, a alternativa correta é a letra e) Apenas I, III e IV estão corretas.
Gabarito: E
2. FUNDATEC - Ana Sist (BRDE)/BRDE/Administração de Banco de Dados/2023
Considere as tabelas criadas com os comandos SQL abaixo, e os comandos de inserção de
tuplas SQL (padrão SQL99 ou superior).
Create table A (pka int primary key, a1 integer);
Create table B (pkb int primary key, b1 integer);
Create table C (pkc int primary key, c1 integer);
insert into A values (1,10);
insert into A values (2, 10);
insert into A values (3, 2);
insert into A values (4, 3);
insert into B values (10,0);
insert into C values (100,0);
Suponha a criação dos gatilhos T1 e T2 definidos abaixo cujas cláusulas estão de acordo com
padrão, e cujo código disparado foi escrito conforme sintaxe PL/SQL (Oracle).
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
91
195
Adquirido em @Xinyuu_bot - Telegram
Create Trigger T1
Before delete on A
begin
Update B set b1 = b1 +
1;
end;
Create Trigger T2
After delete on A
for each row
begin
Update C set c1 = c1 +
1;
end;
Considere que os três comandos SQL de remoção de tuplas abaixo foram executados sem erro:
I. delete from A where a1>=10;
II. delete from A where a1<10;
III. delete from A where a1 is null;
Finalmente, foram executadas as duas consultas SQL abaixo, cada qual retornando uma única
tupla:
(1) SELECT b1 FROM B;
(2) SELECT c1 FROM C;
Selecione a alternativa que representa, nesta ordem, o valor do atributo b1 resultante da
consulta (1), e o valor do atributo c1 resultante da consulta (2).
a) 2 – 2.
b) 2 – 3.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
92
195
Adquirido em @Xinyuu_bot - Telegram
c) 2 – 4.
d) 3 – 2.
e) 3 – 4.
Comentário: Para determinar os valores resultantes das consultas (1) e (2), vamos analisar os
efeitos das três operações de remoção de tuplas na tabela B e na tabela C:
 Para a operação de remoção (I) - delete from A where a1>=10:
● As tuplas com pka igual a 1 e 2 serão removidas.
● Como essas tuplas possuem valores de a1 maiores ou iguais a 10, o trigger T1 será
ativado uma vez, incrementando o valor de b1 em 1 e o trigger T2 será ativado 2
vezes, logo, o valor de c1 será incrementado em 2.
 Para a operação de remoção (II) - delete from A where a1<10:
● As tuplas com pka igual a 3 e 4 serão removidas.
● Como essas tuplas possuem valores de a1 menores que 10, o trigger T1 será
ativado uma vez, passando o valor de b1 para 3 e o trigger T2 será ativado 2 vezes,
passando o valor de c1 para 4..
 Para a operação de remoção (III) - delete from A where a1 is null:
● O valor de b1 será incrementado pois o comando de delete foi executado. Já o
valor de c1 não será incrementado pois nenhuma linha foi excluída.
Portanto, após a execução das operações de remoção, o valor de b1 na tabela B será 3, pois
duas chamadas ao trigger T1 incrementaram o valor de b1. O valor de c1 na tabela C será 4, pois
o trigger T2 foi ativado quatro vezes, uma para cada tupla removida.
Assim, a alternativa correta é:
a) 3 – 4.
Gabarito: E
3. FUNDATEC - ANC (PROCERGS)/PROCERGS/Desenvolvimento/Oracle PL SQL/2023
Considere o seguinte comando:
CREATE SEQUENCE sequenciaquestao
START WITH 100
INCREMENT BY 2
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
93
195
Adquirido em @Xinyuu_bot - Telegram
NOCACHE
NOCYCLE;
Analise as assertivas abaixo e assinale a alternativa correta.
I. No ORACLE, se forem omitidas as cláusulas CACHE e NOCACHE na criação da
SEQUENCE, o banco de dados irá fazer um CACHE de 20 sequencias por default.
II. Quando uma transação gerou e utilizou valores de uma SEQUENCE e a transação for
finalizada com ROOLBACK, os valores gerados para SEQUENCE também serão desfeitos
e ela voltará ao valor que tinha antes.
III. A primeira referência a sequenciaquestao.NEXTVAL retornará o valor 101.
a) Todas estão corretas.
b) Todas estão incorretas.
c) Apenas I está correta.
d) Apenas II está correta.
e) Apenas III está correta.
Comentário: A alternativa correta é: c) Apenas I está correta. Vamos analisar cada assertiva:
I. Correta. Se as cláusulas CACHE e NOCACHE forem omitidas na criação da SEQUENCE
no Oracle, o banco de dados fará um CACHE de 20 sequências por padrão.
II. Incorreta. Quando uma transação é revertida (rollback), os valores da SEQUENCE
gerados durante a transação são perdidos e não revertidos. A SEQUENCE continuará a
partir do próximo valor disponível, sem considerar os valores gerados durante a transação
revertida.
III. Incorreta. A SEQUENCE foi criada com o START WITH 100, portanto a primeira
referência a sequenciaquestao.NEXTVAL retornará o valor 100.
Gabarito: C
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
94
195
Adquirido em @Xinyuu_bot - Telegram
4. FUNDATEC - ANC (PROCERGS)/PROCERGS/Desenvolvimento/Oracle PL SQL/2023
NVL e NVL2 são funções que ORACLE disponibiliza para serem utilizadas nas consultas.
Analise as assertivas abaixo e assinale a alternativa correta.
I. NVL2(E1,E2) especifica que se E1 for nulo, a função retornará E2, caso contrário,
retornará E1.
II. NVL(E1,E2,E3) especifica que se E1 for nulo, a função retornará E3, caso contrário,
retornará E2.
III. NVL e NVL2 são usadas quando o valor de um campo de uma tupla pode retornar
NULL.
a) Todas estão corretas.
b) Todas estão incorretas.
c) Apenas I está correta.
d) Apenas II está correta.
e) Apenas III está correta.
Comentário: Vamos comentar as assertivas:
I. Incorreta. A função NVL2 recebe três parâmetros, o primeiro é o valor usado na
condição, o segundo será o resultado da consulta quando o valor na condição for NOT
NULL, e o terceiro quando for NULL.
II. Incorreta. A função NVL no Oracle especifica que se E1 for nulo, a função retornará E2;
caso contrário, retornará E1. A função NVL não aceita três argumentos como mencionado
na assertiva.
III. Correta. NVL e NVL2 são usadas quando o valor de um campo de uma tupla pode
retornar NULL.
Gabarito: E
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
95
195
Adquirido em @Xinyuu_bot - Telegram
5. FCC - TJ TRT18/TRT 18/Apoio Especializado/Tecnologia da Informação/2023
Considere a expressão PL/SQL de um banco de dados Oracle 19 aberto e funcionando
em condições ideais:
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
A função equivalente a essa expressão é:
a) COALESCE(expr1, expr2)
b) CHR(expr1, expr2)
c) COMPOSE(expr1, expr2)
d) COLLATION(expr1, expr2)
e) COLLECT(expr1, expr2)
Gabarito: A
Comentário: A expressão PL/SQL fornecida:
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
tem uma função equivalente em SQL chamada COALESCE. Portanto, a opção correta é:
a) COALESCE(expr1, expr2)
A função COALESCE retorna o primeiro valor não nulo na lista de expressões. Se expr1 não
for nulo, ela retorna expr1; caso contrário, ela retorna expr2. Isso corresponde à lógica da
expressão CASE apresentada.
6. VUNESP - Ana (EPC)/EPC/Sistemas/2023
O PL/SQL comporta diversas expressões em seus comandos. Há algumas expressões que
necessitam utilizar os chamados delimitadores. Em particular, os delimitadores de
concatenação e de exponenciação são, respectivamente,
a) & e %
b) || e #
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
96
195
Adquirido em @Xinyuu_bot- Telegram
c) ** e !
d) “ “ e &
e) || e **
Gabarito: E
Comentário: A expressão de concatenação em PL/SQL é feita usando o operador ||, e a
expressão de exponenciação é feita usando o operador **. Portanto, a opção correta é: e) || e
**
7. VUNESP - Ana (EPC)/EPC/Sistemas/2023
Considere a seguinte tabela de um banco de dados relacional:
Produto (ID_Prod, Nome, Estoque)
Considere que previamente foi criada uma variável denominada item, do tipo caractere,
assim como o atributo Nome. O comando do PL/SQL para atribuir a essa variável o nome do
produto de ID igual a 200 é:
a) item = SELECT Nome
FROM Produto
WHERE ID_Prod = 200;
b) MAKE item AS SELECT Nome
FROM Produto
WHERE ID_Prod = 200;
c) SELECT Nome INTO item
FROM Produto
WHERE ID_Prod = 200;
d) MAKE Nome INTO item
FROM Produto
WHERE ID_Prod = 200;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
97
195
Adquirido em @Xinyuu_bot - Telegram
e) INCLUDE IN item Nome
FROM Produto
WHERE ID_Prod = 200;
Gabarito: C
Comentário: A opção correta para atribuir o nome do produto de ID igual a 200 à variável
item em PL/SQL é: c) SELECT Nome INTO item FROM Produto WHERE ID_Prod = 200;
8. VUNESP - ADP (DPE SP)/DPE SP/Analista Desenvolvedor/2023
O comando da linguagem PL/SQL (utilizada no Sistema Gerenciador de Bancos de Dados
Oracle 21c) para declarar uma constante tem a seguinte composição:
DECLARE
Comando
...........
O conteúdo a ser inserido em Comando para que seja criada uma constante denominada
“total”, do tipo inteiro, com o valor 200, é:
a) CONSTANT INTEGER total = 200;
b) INTEGER total OF TYPE CONSTANT ←← 200;
c) INTEGER CONSTANT total := 200;
d) total OF TYPE CONSTANT INT = 200;
e) total CONSTANT INTEGER := 200;
Gabarito: E
Comentário: A opção correta é: e) total CONSTANT INTEGER := 200; A declaração de
uma constante em PL/SQL segue o formato NOME_CONSTANT TYPE := VALOR;.
Portanto, para criar uma constante chamada "total" do tipo inteiro com o valor 200, a
declaração correta seria total CONSTANT INTEGER := 200;.
9. VUNESP - ATI (TJ RS)/TJ RS/Análise de Sistemas/2023
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
98
195
Adquirido em @Xinyuu_bot - Telegram
Segundo a linguagem PL/SQL utilizada pelo sistema gerenciador de bancos de dados
Oracle (21c), a forma de se declararem comentários de uma linha, em meio a um código, é:
a) - - Comentário utilizado no PL/SQL
b) / / Comentário utilizado no PL/SQL
c) % % Comentário utilizado no PL/SQL
d) # # Comentário utilizado no PL/SQL
e) $ $ Comentário utilizado no PL/SQL
Gabarito: A
Comentário: A forma de se declararem comentários de uma linha em PL/SQL é: a) --
Comentário utilizado no PL/SQL
10.VUNESP - ADP (DPE SP)/DPE SP/Analista Desenvolvedor/2023
Considere a linguagem PL/SQL utilizada no Sistema Gerenciador de Bancos de Dados
Oracle 21c. Suponha que tenha sido criada uma variável cuja declaração limite seu tamanho
a 3 caracteres. Se houver a tentativa de atribuir um valor com mais de 3 caracteres a essa
variável, ocorrerá
a) a geração de uma mensagem de aviso para que o usuário redefina o valor a ser
atribuído.
b) a geração de uma mensagem de erro.
c) a inserção do valor Null, em lugar do valor com mais de 3 caracteres.
d) um aumento automático desse tamanho máximo, acompanhado de uma mensagem de
aviso.
e) um corte do número de caracteres desse valor, até atingir 3 caracteres.
Gabarito: B
Comentário: No PL/SQL do Oracle, ao declarar uma variável com um tamanho específico,
você está limitando o número máximo de caracteres ou bytes que essa variável pode
armazenar. Se houver uma tentativa de atribuir um valor que ultrapasse esse limite, o Oracle
PL/SQL gera uma mensagem de erro indicando que o valor excede a capacidade
especificada. Isso é uma medida de segurança para garantir a integridade dos dados e
evitar comportamentos inesperados devido a valores excessivamente longos para variáveis
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
99
195
Adquirido em @Xinyuu_bot - Telegram
ou tipos de dados específicos. Portanto, a resposta correta é que ocorrerá a geração de
uma mensagem de erro. Assim, a opção correta é: b) a geração de uma mensagem de erro.
11.VUNESP - Ana SJ (TJM SP)/TJM SP/2023
O sistema gerenciador de banco de dados Oracle 21c utiliza, para acesso ao banco de
dados, a linguagem PL/ SQL. Tal linguagem oferece diversos operadores para indicar
desigualdade entre valores.
Assinale a alternativa que apresenta duas opções para tais operadores de desigualdade.
a) <> e ^=.
b) >> e */.
c) || e ^%.
d) << e **.
e) := e ==.
Gabarito: A
Comentário: A linguagem PL/SQL utiliza os operadores de desigualdade <> e !=. Portanto,
a alternativa correta é: a) <> e ^=.
12.CEBRASPE (CESPE) - Ana (MPE RO)/MPE RO/Sistemas/2023
Sabendo que o Oracle DataBase 21C oferece um tipo de dado nativo com suporte a JSON,
assinale a opção que contém o script de criação de uma tabela no Oracle DataBase 21C com
esse tipo de dado.
a) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo BLOB
);
b) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
100
195
Adquirido em @Xinyuu_bot - Telegram
desc_processo JSON
);
c) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo JSON_TRANSFORM
);
d) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo FLOAT
);
e) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo TIMESTAMP
);
Gabarito: B
Comentário: A opção correta que permite mostrar a quantidade de contratos ativos de
determinado órgão no ano de 2023 é:
SELECT COUNT (*)
FROM contrato
WHERE situacao = 'ATIVO'
AND ano = 2023;
Vamos analisar a consulta parte por parte:
● SELECT COUNT(*): Esta parte da consulta seleciona o número de linhas resultantes da
condição especificada.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
101
195
Adquirido em @Xinyuu_bot - Telegram
● FROM contrato: Indica que estamos realizando a operação na tabela chamada "contrato".
● WHERE situacao = 'ATIVO' AND ano = 2023: Essa cláusula especifica as condições que
devem ser atendidas para que uma linha seja incluída no resultado. Aqui, estamos filtrando
as linhas em que a coluna "situacao" é igual a 'ATIVO' e a coluna "ano" é igual a 2023.
Portanto, a consulta está contando o número de linhas na tabela "contrato" onde a situação é
'ATIVO' e o ano é 2023. O resultado dessa consulta será a quantidade de contratos ativos para o
ano de 2023, conforme a condição estabelecida.
13.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Auditoria e Fiscalização)/2018
O Auditor digitou um comando que exibiu os dados abaixo.
O comando digitado foi
a. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, SVG(ip.qtdItePed * pro.PreUnitPro) as "Total" FROM
Produto pro, ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed
<=3 ORDER BY ip.idPed;
b. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro OR ip.idPed <=3 ORDER BY
ip.idPed;
c. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
d. SELECT ip.idPed, ip.idItePed,ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro && ip.idPed <3 ORDER BY
ip.idPed;
e. SELECT idPed, idItePed, idPro, nomePro, qtdItePed, PreUnitPro, (ip.qtdItePed *
pro.PreUnitPro) as "Total" FROM Produto, ItemPedido WHERE ip.idPro = pro.idPro AND
ip.idPed <=3 ORDER BY ip.idPed;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
102
195
Adquirido em @Xinyuu_bot - Telegram
Comentário. Observe que essa questão pede que você construa uma junção entre duas
tabelas. Contudo, o examinador optou por não usar o comando JOIN e fazer uma junção
usando o produto cartesiano seguido por um predicado. Esse predicado vai fazer o papel da
condição de junção, estabelecendo um relacionamento entre os valores idProd presentes nas
respectivas colunas das relações Produto e ItemPedido. Vejamos o código da resposta:
SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed, pro.PreUnitPro,
(ip.qtdItePed * pro.PreUnitPro) as Total — lista as colunas que vão aparecer no resultado.
FROM Produto pro, ItemPedido ip — faz o produto cartesiano entre as relações.
WHERE ip.idPro = pro.idPro — condição de junção na cláusula WHERE AND ip.idPed <=3 —
restrição sobre os valores do atributo idPed
ORDER BY ip.idPed; — ordenação, de forma ascendente, pelo atributo idPed.
Assim, temos nossa resposta na alternativa C.
Gabarito: C
14.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Auditoria e Fiscalização)/2018
O Auditor digitou um comando que exibiu os dados abaixo.
Se o Auditor usasse join, o comando correto para exibir os dados seria
a. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro
JOIN ItemPedido ip ON ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
b. SELECT JOIN ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
c. JOIN ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total ON Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
103
195
Adquirido em @Xinyuu_bot - Telegram
ip.idPed;
d. SELECT idPed, idItePed, dPro, nomePro, qtdItePed, reUnitPro, (qtdItePed *
PreUnitPro) as Total FROM Produto pro JOIN ItemPedido ip WHERE
ItemProduto.idPro = Produto.idPro AND ItemProduto.idPed <=3 ORDER BY
idPed;
e. JOIN ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
Comentário. Nesta questão, o examinador optou por usar a sintaxe mais consistente e
otimizada para execução de uma junção. Lembre-se que a palavra-chave JOIN aparece dentro
da cláusula FROM. Logo, podemos eliminar essas alternativas que apresentam o JOIN no início
do comando. Outro ponto é a necessidade da condição de junção dada pela cláusula ON ou
USING. Observa-se, então, que a única alternativa possível do ON é a letra A. Contudo, a letra
A apresenta um problema de sintaxe. O examinador “esqueceu” de colocar a cláusula WHERE
após a condição de junção. Isso gera um erro na maioria dos SGDBs e não é o padrão definido
pelo SQL. O correto seria:
SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed, pro.PreUnitPro,
(ip.qtdItePed * pro.PreUnitPro) as Total
FROM Produto pro JOIN ItemPedido ip ON ip.idPro =
pro.idPro WHERE ip.idPed <=3 ORDER BY ip.idPed;
Gabarito: A.
15.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Auditoria e Fiscalização)/2018
Para calcular o número de produtos com nomes que terminam com a letra B, o Auditor
testou os comandos abaixo
I. SELECT COUNT(nomePro) FROM Produto WHERE nomePro BEGIN '%B';
II. SELECT COUNT(*) FROM PRODUTO WHERE SUBSTR(nomePro, -1)='B';
III. SELECT COUNT(*) FROM Produto WHERE nomePro LIKE '%B';
IV. SELECT COUNT(nomePro) FROM Produto WHERE SUBSTR(nomePro, 0)='B';
Mostrará o resultado desejado o que consta APENAS em
(A) II e III.
(B) III.
(C) I e IV.
(D) III e IV.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
104
195
Adquirido em @Xinyuu_bot - Telegram
(E) I e II.
Comentário. O examinador explicita o uso do MySQL como banco de dados de teste dos
comandos que aparecem na prova. O SQL ANSI é o padrão definido pela ISO/IEC. Por padrão,
SQL não usa SUBSTR, embora alguns SGBDs aceitem o comando. O comando correto seria
SUBSTRING. Isso pode ser verificado no draft da norma neste link1. Sendo assim, o único
comando que funcionará em todos os SGBDs é o descrito no comando III. Entretanto, a banca
conseguiu fazer o código funcionar no ORACLE e no MySQL. Assim, a resposta correta está na
alternativa A.
Gabarito: A
16.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Um profissional de TI deseja utilizar algumas funções do Oracle Database 12c para:
I. Remover todos os caracteres especificados do começo ou do final de uma string.
II. Obter a localização de uma substring em uma string.
Para tanto, ele deve usar, respectivamente, as funções
(A) Lpad e Instr.
(B) Lpad e Initcap.
(C) Trim e Instr.
(D) Chr e Instr.
(E) Chr e Initcap.
1 http://web.cecs.pdx.edu/~len/sql1999.pdf
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
105
195
Adquirido em @Xinyuu_bot - Telegram
Comentários: As funções são semelhantes aos operadores, pois manipulam itens de dados e
retornam um resultado. As funções diferem dos operadores no formato de seus argumentos.
Esse formato permite que elas operem em zero, um, dois ou mais argumentos:
função (argumento, argumento, ...) Vejamos as funções cobradas no enunciado:
TRIM: permite que você remova caracteres iniciais ou finais (ou ambos) de uma sequência de
caracteres. Se trim_character ou trim_source for um caracter literal, você deverá colocá-lo
entre aspas simples. Segue a sintaxe:
INSTR: Pesquisa substring em uma string. A operação de pesquisa é definida como
comparando o argumento de substring com substrings de string do mesmo tamanho para
igualdade até que uma correspondência seja encontrada ou não haja mais substrings
restantes. Cada subsequência de sequência de caracteres consecutiva comparada começa
com um caracter à direita (para pesquisas de avanço) ou com um caracter à esquerda (para
pesquisas de retrocesso) do primeiro caractere da subsequência comparada anterior. Se uma
substring igual à substring for encontrada, a função retornará um inteiro indicando a posição
do primeiro caracter dessa subseqüência. Se nenhuma substring for encontrada, a função
retornará zero. Segue a sintaxe:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
106
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito: C
17.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Função de acesso a dados disponibilizada no Oracle Database 12c, cujo objetivo é
minimizar a leitura de dados desnecessários, melhorando a performance de acesso a
tabelas com muitos registros e que pode ser utilizada como alternativa ao select
count(distinct). Trata-se de
(A) APPROXCOUNT(DISTINCT).
(B) MAX_COUNT_DISTINCT.(C) MAXCOUNT(DISTINCT).
(D) COUNT_DISTINCT_APPROACH.
(E) APPROX_COUNT_DISTINCT.
Comentários: APPROX_COUNT_DISTINCT retorna o número aproximado de linhas que
contêm um valor distinto para expr.
Essa função fornece uma alternativa para a função COUNT (DISTINCT expr), que retorna o
número exato de linhas que contêm valores distintos de expr. APPROX_COUNT_DISTINCT
processa grandes quantidades de dados significativamente mais rápido que COUNT, com um
desvio insignificante do resultado exato.
Para expr, você pode especificar uma coluna de qualquer tipo de dado escalar diferente de
BFILE, BLOB, CLOB, LONG, LONG RAW ou NCLOB.
APPROX_COUNT_DISTINCT ignora as linhas que contêm um valor nulo para expr. Esta função
retorna um NUMBER.
Temos a resposta da questão na letra e).
Gabarito: E
18.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
107
195
Adquirido em @Xinyuu_bot - Telegram
A troca de contexto é a ocorrência de chaveamento entre a engine SQL e a engine
PL/SQL durante a execução de queries ou blocos PL/SQL. Essa troca é invocada sempre
que, dentro de um bloco PL/SQL, executa-se uma query ou um comando DML.
Se executados isoladamente, os comandos INSERT, DELETE ou UPDATE, por exemplo,
costumam ter pouco ou mesmo nenhum impacto na performance, mas quando
executados em loops, o efeito das trocas de contexto se torna cumulativo e o prejuízo
na performance do procedimento se torna bem evidente.
Para evitar esse prejuízo, o Oracle 11g implementa um comando cujo objetivo é enviar
ao servidor um lote de comandos DML de uma única vez, utilizando apenas uma troca
de contexto. Trata-se do
a. LOOPALL.
b. FORNEXT.
c. FETCH FIRST.
d. FORALL.
e. MAXLOOP.
Comentário. A Oracle desenvolveu o comando FORALL, cujo objetivo é enviar ao servidor um
lote de comandos DML de uma única vez, utilizando apenas uma troca de contexto. O
resultado dessa abordagem são procedimentos muito mais leves, rápidos e eficientes. O
comando FORALL faz o processamento e submete para o banco todos os comandos DML
necessários em um único passo e, portanto, em apenas uma troca de contexto.
Sempre que possível, devemos executar operações de carga em um único passo, como por
exemplo, utilizando um INSERT SELECT com a hint APPEND. Mas, quando isso não é possível,
e precisamos recorrer ao processamento com PL/SQL, o uso do comando FORALL é
fundamental para a otimização de trocas de contexto por DML. Portanto, o FORALL é uma
ferramenta indispensável de otimização, tanto para desenvolvedores como DBAs.
Gabarito: D
19.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Em um Oracle Database, um profissional de TI deseja criar uma trigger chamada
Atualiza_salario_func, com o objetivo de exibir as diferenças entre o novo
(NEW.salarioFunc) e o antigo salário (OLD.salarioFunc) constantes da tabela de
funcionários. Para tanto, ele escreveu o seguinte código:
CREATE TRIGGER
Atualiza_salario_func
BEFORE I ON II
FOR EACH ROW
WHEN (NEW.CODFUNC > 0)
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
108
195
Adquirido em @Xinyuu_bot - Telegram
DECLARE
diferenca_salario
number; BEGIN
diferenca_salario := :NEW.salarioFunc - :OLD.salarioFunc;
dbms_output.put('Salário antigo:' || :OLD.salarioFunc);
dbms_output.put('Salário novo:' || :NEW.salarioFunc);
dbms_output.put_line(' A diferença de salário foi de: ' ||
diferenca_salario); END;
/
As lacunas I e II devem especificar, correta e respectivamente, os elementos genéricos
a. triggering_event e table_name.
b. condition e database_name.
c. triggering_event e column_name.
d. column_event e table_name.
e. row_event e column_name.
Comentário. O gabarito é letra a). Veja a sintaxe do comando:
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ]
TRIGGER plsql_trigger_source
{ BEFORE | AFTER | INSTEAD OF }
{ ddl_event [OR ddl_event]... | database_event [OR database_event ]... } ON
{ [schema.] SCHEMA | [ PLUGGABLE ] DATABASE }
[ trigger_ordering_clause ] [ ENABLE | DISABLE ] trigger_body
Gabarito: A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
109
195
Adquirido em @Xinyuu_bot - Telegram
20.Ano: 2017 Banca: FGV Órgão: Alerj Cargo: Analista de Tecnologia da Informação Q. 49
Observe a instrução SQL a seguir, que representa uma consulta à tabela "TB_Produto"
de uma instância de banco de dados Oracle 11g.
SELECT
desc_prod
FROM
TB_Produto
WHERE to_char(data_saida,'YYYY-MM-DD') = '2016-01-04';
A consulta lista a descrição dos produtos que tiveram data de saída do estoque em 04
de Janeiro de 2016. A coluna que armazena a data de saída do produto não é chave
primária. Visando melhorar o desempenho das consultas à coluna “data_saida”, o
Administrador de Banco de Dados deve criar um índice do tipo:
a. B-Tree;
b. Function-Based;
c. Bitmap;
d. Hash;
e. Unique.
Comentário: Um dos maiores problemas com índices é que os índices são muitas vezes
suprimidos por desenvolvedores e usuários ad-hoc. Desenvolvedores que usam funções muitas
vezes suprimem os índices criados pelo banco de dados. No Oracle, existe uma maneira de
combater este problema.
Os índices baseados em função permitem criar um índice baseado em uma função ou
expressão. O valor da função ou expressão é especificado pela pessoa que cria o índice e é
armazenado no índice. Os índices baseados em funções podem envolver várias colunas,
expressões aritméticas ou, ainda, uma função PL/SQL ou uma chamada em C. O exemplo a
seguir mostra como criar um índice baseado em função:
Desta forma, podemos marcar nosso gabarito na alternativa B. Para quem tiver curiosidade, o
mestre Fábio Prado fez uma palestra sobre esse assunto, os slides também estão disponíveis
aqui2.
Gabarito: B
2 http://www.dbabr.com.br/blog/wp-content/uploads/2016/03/TudoSobreIndices.pdf
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
110
195
Adquirido em @Xinyuu_bot - Telegram
21.Ano: 2018 Banca: CESPE Órgão: STM Cargo: Programação de Sistemas
Julgue os próximos itens, que dizem respeito aos SGBDs Oracle, MySQL e PostgreSQL.
66 Em um pacote (package) no SGBD Oracle, a implementação dos métodos
juntamente com quaisquer métodos privados e atributos permanece oculta no corpo do
pacote.
67 Uma sequência (sequence) Oracle pode gerar uma série de números distintos,
tanto na ordem crescente quanto na decrescente.
70 No SGBD Oracle, uma coluna com restrição do tipo UNIQUE pode ser declarada
como NOT NULL.
Comentário: Vamos responder cada uma das alternativas acima.
66. Os pacotes PL/SQL agrupam funções e procedures relacionadas, juntamente,
com variáveis e cursores comuns. O pacote consiste em duas partes: uma especificação
do pacote e um corpo de pacote. Na especificação, os métodos e atributos dos pacotes
são expostos; a implementação dos métodos, juntamente com quaisquer métodos
privados e atributos permanecem ocultos no corpo do pacote. A utilização de um
pacote, em vez de uma procedure ou função independente, permite que a procedure
ou função incorporada seja alterada sem invalidar nenhum objeto que referencia
elementos da especificação do pacote, evitando assim a recompilação dos objetos que
referenciam o pacote. Vejam que a alternativa está perfeitamente correta.
67. Uma sequence é um gerador de números sequenciais, e pode ser parametrizada
conforme sua necessidade. Vejamos o comando para criar a sequence:
create sequence
TESTE_SEQ minvalue 1
maxvalue 9999999999
start with 1
increment
by 1
nocache
cycle;
70. Aconstrait de integridade UNIQUE garante que uma coluna ou grupo de colunas
seja única em toda a tabela. Uma coluna com essa restrição pode ser declarada NOT
NULL. Se a coluna não for declarada com a constraint NOT NULL, qualquer número de
linhas poderá conter valores NULL, desde que as linhas restantes tenham valores únicos
nessa coluna. Sendo assim, temos mais uma alternativa correta.
Gabarito: C C C
22.Ano: 2018 Banca: CESPE Órgão: STM Cargo: Programação de Sistemas Questão: 71 a 75
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
111
195
Adquirido em @Xinyuu_bot - Telegram
Considerando as informações apresentadas na figura precedente (captura de tela de
uma sessão do SQL*Plus), relativas a comandos SQL, julgue os itens que se seguem.
71 A instrução contida na linha 3 possibilita a inserção de informações em um buffer
que poderá ser lido por outro procedimento ou pacote.
72 Empregada de forma correta no código em questão, pois se relaciona a um
bloco anônimo de PL/SQL, a variável &numero_proc, na linha 2, não pode ser utilizada
em comandos DML.
73 O código em tela não criará nenhum objeto no banco de dados, como, por
exemplo, procedure, triggers, packages e functions.
74 Ao se fechar a sessão do SQL*Plus na qual foi capturada a tela em apreço, a
variável definida na linha 2 persistirá no banco de dados.
75 Na linha 2, o trecho &numero_proc constitui uma variável do tipo bind.
Comentário: Vamos comentar cada uma das alternativas acima:
71. O procedimento Oracle dbms_output.put_line permite que você escreva dados em um
arquivo plano ou direcione os resultados do comando para uma tela. Este procedimento
armazena uma linha no buffer. Logo, temos uma alternativa correta.
72. A própria questão entra em contradição pois a variável é usada em um comando DML.
Logo, a alternativa está incorreta.
73. Essa afirmação está correta, pois não existe nenhum comando para a criação de outros
objetos no enunciado. Temos apenas uma transação.
74. Na linha 2, temos apenas uma consulta à base da dados, logo, não existe a necessidade
de persistir nada no banco de dados. Vamos apenas comparar o valor da tupla armazenada com
o parâmetro passado. Sendo assim, temos uma alternativa incorreta.
75. Se pensarmos no termo &numero_proc, veremos que ele não se trata de uma variável do
tipo bind.
A variável de ligação (bind variable) funciona como um parâmetro da instrução SQL, sendo um
elo entre o servidor de banco de dados e o ambiente de programação ou interface de acesso
que o utiliza, para a passagem de valores dinâmicos a cada execução do SQL.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
112
195
Adquirido em @Xinyuu_bot - Telegram
Variáveis de ligação de entrada podem ocorrer em valores na cláusula WHERE de um SELECT,
um UPDATE ou um DELETE, em valores na cláusula SET do UPDATE, na cláusula VALUES do
INSERT ou ainda em parâmetros e valores em um bloco de código procedural. Já variáveis de
ligação de saída são o meio de se obter os valores resultantes na cláusula de retorno de um
SELECT ou como variáveis de saída de um bloco procedural.
As variáveis de ligação são definidas na fase de preparação de uma instrução SQL. Antes de
cada execução desse SQL, deve ser feita a efetiva ligação dos parâmetros, atribuindo-lhes
valores. Os bancos de dados possuem diferentes sintaxes para definir variáveis de ligação.
Variáveis bind no Oracle são nomes precedidos por dois-pontos (:nome). Logo, temos uma
alternativa incorreta.
Gabarito: C E C E E
23.BANCA: FCC ANO: 2017 ÓRGÃO: TRF - 5ª REGIÃO PROVA: ANALISTA JUDICIÁRIO -
INFORMÁTICA
[42] Um Analista de Sistemas foi solicitado a criar uma tabela chamada processo em um
banco de dados Oracle aberto e em condições ideais. Nesta tabela, se nenhum valor
for fornecido para o campo data_abertura, quando se utilizar a instrução INSERT, a data
do sistema deve ser automaticamente inserida. Para fazer isso, o Analista deve utilizar a
instrução CREATE TABLE processo(processo_no NUMBER(10), data_abertura
a) DATE DEFAULT SYSDATE);
b) DATETIME DEFAULT SYSTEMDATE);
c) DATE WITH SYSDATE AS DEFAULT);
d) DATE DEFAULTVALUE SYSDATE);
e) DATE SYSDATE('default'));
Comentário: Vejam que a questão pede para definir um tipo de dados para uma coluna
específica: data_abertura. Esse atributo deve possuir o valor default data atual do sistema. No
Oracle, o SYSDATE retorna a data e a hora atuais definidas para o sistema operacional no qual
o banco de dados reside. O tipo de dados do valor retornado é DATE e o formato retornado
depende do valor do parâmetro de inicialização NLS_DATE_FORMAT. A função não requer
argumentos. Nas instruções SQL distribuídas, esta função retorna a data e a hora definidas para
o sistema operacional do seu banco de dados local. Você não pode usar esta função em uma
restrição CHECK.
Agora, podemos montar nossa definição com os termos: DATE DEFAULT SYSDATE. Em
seguida, é necessário fecharmos o parêntese e colocarmos o ponto e vírgula para encerarmos
o comando. Tal resposta está presenta na alternativa A.
Gabarito: A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
113
195
Adquirido em @Xinyuu_bot - Telegram
24.BANCA: FCC ANO: 2017 ÓRGÃO: TST PROVA: ANALISTA JUDICIÁRIO – ANÁLISE DE
SISTEMAS
[33] Para atualizar as linhas da tabela backup_employees de forma que corresponda à
tabela employees, um Analista de Sistemas utilizou a instrução abaixo em um banco de
dados Oracle aberto e em condições ideais.
MERGE INTO backup_employees bac
..I.. (SELECT * FROM employees) emp
ON (bac.employee_id = emp.employee_id)
..II..
UPDAT
E SET
bac.name = emp.name,
bac.job_id =
emp.job_id, bac.salary
= emp.salary*1.5,
bac.commission = emp.commission,
DELETE WHERE (emp.commission IS NOT NULL)
..III..
INSERT VALUES(emp.employee_id, emp.name, emp.job_id,
emp.salary, emp.commission);
Para que a sintaxe da instrução esteja correta, as lacunas I, II e III devem ser preenchidas,
correta e respectivamente, por
a) WITH − WHEN FOUND THEN − WHEN NOT FOUND THEN
b) FROM − IF FOUND THEN − ELSE
c) WITH − IF MATCHED THEN − OTHERWISE
d) USING − WHEN MATCHED THEN − WHEN NOT MATCHED THEN
e) USING − IF FOUND THEN − IF NOT FOUND THEN
Comentário: O comando MERGE é uma junção do UPDATE com o INSERT. Primeiramente,
procura-se na tabela pela chave primária do valor a ser inserido. Caso exista uma tupla com a
mesma chave, ela é atualizada de acordo com o descrito no UPDATE. Caso não exista, a
inserção é efetuada. Vejam a sintaxe do comando no SGBD Oracle. É possível, ainda, usar o
comando MERGE para excluir um conjunto de linhas com a cláusula DELETE.
MERGE [hints] INTO [nome_tabela]
USING [nome_tabela_visão_ou_consulta]
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
114
195
Adquirido em @Xinyuu_bot - Telegram
ON ([condição])
WHEN MATCHED THEN [cláusula_de_update]
DELETE [cláusula_where]
WHEN NOT MATCHED THEN [cláusula_de_insert]
[LOG ERRORS [cláusula_de_log_erros][REJECT LIMIT [inteiro | ilimitado]];
Como o comando MERGE combina operações de INSERT, UPDATE e DELETE, o usuário
deverá ter os privilégios de (gravação e leitura) na tabela (destino) e, claro, o privilégio de
leitura na tabela (origem). Para o uso da cláusula de DELETE na tabela (origem), também é
necessário o privilégio.
Agora, podemos olhar para questão e completar as lacunas com os valores USING, WHEN
MATCHED THEN, WHEN NOT MATCHED, respectivamente. Essa resposta está presente na
alternativa D.
Gabarito: D
25.BANCA: FCC ANO: 2017 ÓRGÃO: DPE-RS PROVA: ANALISTA – BANCO DE DADOS
[46] Os comandos do sistema gerenciadorde banco de dados Oracle 11g que
permitem paralisar e retomar operações de entrada/saída (arquivos de dados e de
controle, por exemplo), assim como consultas são, respectivamente, ALTER SYSTEM
a) SUSPEND e RESUME.
b) CLOSE e OPEN.
c) QUIT e REOPEN.
d) OUT e IN.
e) RESET e SET.
Comentário: Vamos aproveitar a questão para aprendemos um pouco mais sobre o ORACLE.
A instrução ALTER SYSTEM SUSPEND interrompe todas as entradas e as saídas (E/S) para
arquivos de dados e arquivos de controle. O estado suspenso permite que você faça backup
de um banco de dados sem interferência de E/S. Quando o banco de dados é suspenso, todas
as operações de E/S preexistentes podem ser concluídas e todos os novos acessos ao banco
de dados são colocados em um estado de fila.
O comando suspender não é específico para uma instância. Em um ambiente Oracle Real
Application Clusters, quando você emite o comando SUSPEND em um sistema, os mecanismos
internos de bloqueio propagam a solicitação de parada em todas as instâncias, interrompendo,
assim, todas as instâncias ativas em um determinado cluster. No entanto, se alguém iniciar uma
nova instância, enquanto as outras estiverem suspensas, a nova instância não será suspensa.
Você pode usar a instrução ALTER SYSTEM RESUME para retomar as operações normais do
banco de dados. Os comandos SUSPEND e RESUME podem ser emitidos de diferentes
instâncias. Por exemplo, se as instâncias 1, 2 e 3 estiverem em execução e você emitir uma
instrução ALTER SYSTEM SUSPEND da instância 1, é possível emitir uma instrução RESUME das
instâncias 1, 2 ou 3 com o mesmo efeito.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
115
195
Adquirido em @Xinyuu_bot - Telegram
Desta forma, temos a nossa resposta na alternativa A.
Gabarito: A
26.BANCA: FCC ANO: 2017 ÓRGÃO: TRE-PR PROVA: ANALISTA JUDICIÁRIO – ANÁLISE
DE SISTEMAS
[40] Um Database Administrator − DBA Oracle deseja conceder à usuária Maria os
privilégios para criar sessão de conexão no banco de dados e criar tabelas, permitindo
ainda que ela possa estender seus privilégios para outros usuários. O comando que o
DBA deverá utilizar é:
a) GRANT CREATE SESSION, CREATE TABLE TO Maria WITH RESTRICTED OPTION;
b) GRANT CREATE SESSION, CREATE TABLE TO Maria WITH ADMIN OPTION;
c) GRANT PRIVILEGE CREATE SESSION, CREATE TABLE TO Maria WITH GRANT OPTION;
d) GRANT ADMIN CREATE SESSION, CREATE TABLE TO Maria;
e) GRANT CREATE SESSION, CREATE TABLE TO Maria WITH GRANT OPTION;
Comentário: O comando GRANT do Oracle segue o padrão da sintaxe do SQL ANSI, contudo
algumas extensões são previstas no dialeto específico do SGBD. O comando pode associar
privilégios de sistema e de objetos. Para conhecer maiores detalhes sobre a sintaxe do
comando, sugiro acessar o link3. Quanto aos comandos para concessão de privilégios de
sessão e criação de tabelas com possibilidade de propagação dos privilégios, temos:
GRANT CREATE SESSION; -- permite conexão ao banco de dados.
GRANT CREATE TABLE TO Maria WITH ADMIN OPTION;
Especifique WITH GRANT OPTION para permitir que o beneficiário conceda privilégios de
objeto a outros usuários e funções. Assim, temos nossa resposta na alternativa B.
Gabarito: B
27.BANCA: FCC ANO: 2017 ÓRGÃO: DPE-RS PROVA: ANALISTA – BANCO DE DADOS
[38] A função básica de um gatilho ou trigger, em um banco de dados relacional, é
a) verificar o grau de normalização de todas as tabelas de um banco de dados,
assegurando-se do respeito às formas normais desejadas.
b) realizar a compilação de todos comandos SQL presentes no banco de dados e
armazenar os comandos compilados.
c) verificar a correção das definições presentes no dicionário de dados, apontando
eventuais erros de semântica.
3 https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_9013.htm
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
116
195
Adquirido em @Xinyuu_bot - Telegram
d)executar comandos previamente declarados, quando da ocorrência de um evento no
banco de dados, também especificado em sua definição.
e)verificar a eficácia da política de atribuição de senhas implementada no banco de
dados, determinando seu grau de eficácia.
Comentário: Antes que um TRIGGER possa ser criado, o usuário SYS deve executar um script
SQL comumente chamado de DBMSSTDX.SQL. O nome exato e a localização deste script
dependem do seu sistema operacional. Para criar um gatilho em seu próprio esquema sobre
uma tabela do mesmo, você deve ter o privilégio do sistema CREATE TRIGGER.
Para criar um gatilho em uma tabela de qualquer esquema, você deve ter o privilégio de
sistema CREATE ANY TRIGGER.
Além dos privilégios anteriores, para criar um gatilho no DATABASE (banco de dados), você
deve ter o privilégio do sistema ADMINISTER DATABASE TRIGGER.
Se o gatilho emitir instruções SQL ou chamadas a procedimentos ou funções, o proprietário
do gatilho deve ter os privilégios necessários para executar essas operações. Esses privilégios
devem ser concedidos diretamente ao proprietário em vez de adquiridos através de ROLES.
A figura abaixo apresenta a estrutura básica do ORACLE para um gatilho:
A resposta a questão é a definição de um gatilho. Ele vai executar comandos (ação)
previamente declarados, quando da ocorrência de um evento no banco de dados, também
especificado em sua definição. Muitas vezes, essa execução da ação depende da verificação
de uma condição especificada. Sendo assim, nossa resposta está na alternativa D.
Gabarito: D
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
117
195
Adquirido em @Xinyuu_bot - Telegram
28.BANCA: FCC ANO: 2016 ÓRGÃO: TRF - 3ª REGIÃO PROVA: TÉCNICO JUDICIÁRIO -
INFORMÁTICA
[64] Para responder a questão, considere as informações abaixo.
O super-usuário root do banco de dados deseja conceder permissão para que o usuário
Paulo possa alterar os dados dos registros contidos na tabela Processo. Para isso ele
deve digitar a instrução
a) ADD PERMISSION TO Paulo FOR update ON Processo;
b) GRANT update ON Processo TO Paulo;
c) CREATE ROLE update ON Processo TO Paulo WITH GRANT OPTION;
d) GRANT OPTION update FROM Processo TO Paulo;
e) CREATE ROLE ON Processo FOR update TO Paulo;
Comentário: Temos mais uma questão de concessão de privilégios a um objeto. Vamos
começar observando a sintaxe do comando. Após o GRANT, devemos estruturar o comando
para concessão de privilégios a objetos da seguinte forma:
Podemos, então, construir o comando: GRANT update ON Processo TO Paulo;. Assim, o
usuário Paulo poderá alterar os dados dos registros contidos na tabela Processo. Logo, nossa
resposta pode ser encontrada na alternativa B.
Gabarito: B
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
118
195
Adquirido em @Xinyuu_bot - Telegram
29.BANCA: FCC ANO: 2016 ÓRGÃO: TRT - 14ª REGIÃO (RO E AC) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
[35] No Oracle 11g há uma instrução que permite atualizar, inserir ou remover linhas
condicionalmente em uma tabela, evitando o uso de várias instruções DML. Esta
instrução é especialmente útil nas aplicações em ambientes de Data Warehouse, nas
quais é preciso trabalhar com dados provenientes de várias origens. Trata-se da
instrução
a) SWITCH.
b) TRUNCATE.
c) MERGE.
d) IFCOMMAND.
e) EXEC.
Comentário: Já falamos desta instrução em uma questão anterior. Ela agrupa as instruções de
UPDATE, INSERT ou DELETE e as executa, de acordo com condições avaliadas. Essa instrução
utiliza a sintaxe MERGE.
Gabarito: C
30.BANCA: FCC ANO:2016 ÓRGÃO: TRT - 23ª REGIÃO (MT) PROVA: ANALISTA
JUDICIÁRIO – TECNOLOGIA DA INFORMAÇÃO
[30]Considere a instrução abaixo, digitada em um banco de dados Oracle 11g que
possui a tabela Produtos, aberta e em condições ideais, contendo os campos
NomeProduto − varchar2(50), PrecoUnitario − number(5,2), UnidadesEmEstoque − integer,
UnidadesNoPedido − integer:
SELECT NomeProduto, PrecoUnitario*(UnidadesEmEstoque+...l...
(UnidadesNoPedido,0)) FROM Produtos;
Para retornar 0 se o valor de UnidadesNoPedido for nulo, a lacuna I deverá ser corretamente
preenchida com
a) IIF
b) IFNULL
c) NVL
d) COALESCE
e) ISNULL
Comentário: Essa questão exige o entendimento de cada uma das funções do Oracle listadas
nas alternativas.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
119
195
Adquirido em @Xinyuu_bot - Telegram
O IIF executa um teste condicional e retorna um valor numérico apropriado ou um conjunto,
dependendo se o valor avaliado é verdadeiro ou falso. Vejam a sintaxe do comando abaixo:
IIF ( search_condition, true_part, false_part )
O IFNULL() não existe dentro do contexto do Oracle. Ele é usado pelo MySQL para especificar
como vamos tratar os valores nulos, retornando zero, caso o valor da coluna seja nulo.
O NVL() é a função do Oracle que tem o mesmo objetivo, também retorna zero, caso o valor da
coluna seja nulo.
A função COALESCE recebe dois ou mais argumentos e retorna o primeiro que não é nulo.
Vejam que essa função também pode ser gabarito da questão. O examinador não verificou se o
Oracle possuía essa função. Acho que caberia recurso, não sei se alguém entrou! Logo, o
gabarito permaneceu na alternativa C.
O ISNULL() não existe dentro do contexto do Oracle, ele é usado pelo Microsoft SQL Server
para especificar como vamos tratar os valores nulos. Ele retorna zero, caso o valor da coluna seja
nulo.
Gabarito: C
31.BANCA: FCC ANO: 2016 ÓRGÃO: TRT - 23ª REGIÃO (MT) PROVA: ANALISTA
JUDICIÁRIO – TECNOLOGIA DA INFORMAÇÃO
[33] Após um DBA criar um usuário executando a instrução CREATE USER Paulo
IDENTIFIED BY abcd;, o usuário Paulo ainda não tem nenhum privilégio. Para conceder
a ele o privilégio de sistema para criar tabelas e views o DBA deve digitar no Oracle
11g, a instrução
a) CREATE PERMISSION create table, create view TO Paulo;
b) CREATE GRANT table, view TO Paulo;
c) GRANT create table, create view TO Paulo;
d) CREATE ROLE create table, create view TO Paulo;
e) GRANT OPTION create table AND create view TO Paulo;
Comentário: Se pensarmos no SQL padrão, podemos fazer uso do comando DCL de GRANT
para dar permissão à criação de tabelas e visões. Neste caso, a única alternativa que apresenta
a sintaxe correta do comando é a alternativa C. As demais possuem erros de sintaxe.
Gabarito: C
32.BANCA: FCC - Analista Judiciário (TRT 24ª Região)/Apoio Especializado/Tecnologia da
Informação/2017
Uma das atribuições do administrador de banco de dados Oracle é conceder
permissões de acesso a usuários do banco de dados. Para isso pode ser utilizada, por
exemplo, a instrução abaixo.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
120
195
==a80b1==
Adquirido em @Xinyuu_bot - Telegram
GRANT select ON TRT.employees TO paulo WITH ..I.. ;
Esta instrução concede privilégio de SELECT na tabela employees do esquema TRT ao
usuário paulo. Para este usuário poder estender seus privilégios de objeto para outros
usuários, deve ser incluída na lacuna I
a) PERMISSION CASCADE
b) GRANT OPTION
c) GRANT PRIVILEGE
d) EXTEND ROLE
e) GRANT CASCADE
Comentário. Observe a sintaxe do comando GRANT:
No final do comando, se incluirmos WITH GRANT OPTION, o usuário poderá estender seus
privilégios de objeto para outros usuários. Assim, temos a resposta na alternativa b).
Gabarito: B
33.BANCA: FCC - Técnico Judiciário (TRT 24ª Região)/Apoio Especializado/Tecnologia da
Informação/2017
Em um banco de dados Oracle aberto e em condições ideais há uma tabela chamada
funcionario com os campos idFuncionario (inteiro − primary key), nome (cadeia de
caracteres) e salario (real). Para exibir o nome e o salário de todos os funcionários cujo
valor de salário esteja fora do intervalo de 1000 a 12000 utiliza-se a instrução SQL
SELECT nome, salario FROM funcionario WHERE
a) salario<1000 AND salario>12000;
b) salario NOT BETWEEN 1000 OR 12000;
c) 1000>salario>12000;
d) salario NOT BETWEEN 1000 AND 12000;
e) salario BETWEEN 1000 AND 12000;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
121
195
Adquirido em @Xinyuu_bot - Telegram
Comentário. Uma condição BETWEEN determina se o valor de uma expressão está em um
intervalo definido por outras duas expressões. Veja a sintaxe:
expr1 [ NOT ] BETWEEN expr2 AND expr3
Logo, encontramos o gabarito na letra d).
Gabarito: D
34.BANCA: FCC - Analista Judiciário (TRF 5ª Região)/Apoio Especializado/Informática -
Desenvolvimento/2017
O Departamento de Recursos Humanos de uma instituição solicitou ao Analista de
Sistemas um relatório mostrando o nome do funcionário e o salário acrescido de 13.5%.
O salário deverá ser expresso como número inteiro e com a seguinte legenda de
coluna: Salário Reajustado.
Considerando que a tabela funcionarios possui os campos nome e salario, para gerar o
relatório o Analista deverá usar, em um banco de dados Oracle aberto e em condições
ideais, a instrução
a) SELECT nome, TOINT(ROUND(salario * 1.135)) 'Salário Reajustado ' FROM
funcionarios;
b) SELECT nome, INTEGER(salario * 1.135) 'Salário Reajustado' FROM funcionarios;
c) SELECT nome, ROUND(salario * 1.135, 0) "Salário Reajustado" FROM funcionarios;
d) SELECT nome, TRUNCATE(salario + 13.5%, 0) "Salário Reajustado" FROM
funcionarios;
e) SELECT FROM funcionarios (nome, ROUND(salario * 1.135, 0) "Salário Reajustado");
Comentário. A instrução SELECT ou subconsulta é usada para recuperar dados de uma ou
mais tabelas, tabelas de objetos, visualizações, visualizações de objetos, visualizações
materializadas, visualizações analíticas ou hierarquias.
Como o enunciado pede para o salário ser expresso como número inteiro, devemos utilizar a
função ROUND, de forma a tornar o número inteiro.
ROUND retorna n arredondado para lugares inteiros à direita do ponto decimal. Se você
omitir inteiro, então n é arredondado para zero lugares. Se o inteiro for negativo, n será
arredondado para a esquerda do ponto decimal. Veja a sintaxe:
ROUND(n [, integer ])
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
122
195
Adquirido em @Xinyuu_bot - Telegram
SELECT nome, ROUND(salario * 1.135, 0) "Salário Reajustado" FROM funcionarios
Assim, temos nossa resposta na letra c).
Gabarito: C
35.BANCA: FCC - Analista Judiciário (TRT 23ª Região)/Apoio Especializado/Tecnologia da
Informação/2016
Após um DBA criar um usuário executando a instrução CREATE USER Paulo IDENTIFIED
BY abcd;, o usuário Paulo ainda não tem nenhum privilégio. Para conceder a ele o
privilégio de sistema para criar tabelas e views o DBA deve digitar no Oracle 11g, a
instrução
a) CREATE PERMISSION create table, create view TO Paulo;
b) CREATE GRANT table, view TO Paulo;
c) GRANT create table, create view TO Paulo;
d) CREATE ROLE create table, create view TO Paulo;
e) GRANT OPTION create table AND create view TO Paulo;
Comentário. De acordo com a sintaxe do comando GRANT, temos a resposta na letra c).
Gabarito: C
36.BANCA: FCC - Analista Judiciário (TRT 14ª Região)/Apoio Especializado/Tecnologia da
Informação/2016
Uma tabela de um banco de dados Oracle chamada funcionarios possui os campos id,
nome e salario. Um Analista deseja realizar uma consulta nesta tabela, que exiba o id, o
nome dos funcionários, o salário e o salário acrescidode 12,5%. O salário com o
acréscimo deverá ser mostrado como um número inteiro e a coluna deverá ser nomeada
Salário Reajustado.
A instrução SQL que deverá ser digitada pelo Analista é
a) SELECT id, nome, salario, TO_INT(salario * 1.125,0) AS "Salário Reajustado"
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
123
195
Adquirido em @Xinyuu_bot - Telegram
FROM funcionarios;
b) SELECT id, nome, salario, ARRED(salario * 1.125) AS "Salário Reajustado"
FROM funcionarios;
c) SELECT id, nome, salario, ROUND(salario * 1.125, 0) "Salário Reajustado"
FROM funcionarios;
d) SELECT id, nome, salario, TRUNC(salario * 1.125) 'Salário Reajustado' FROM
funcionarios;
e) SELECT id, nome, salario, TO_INTEGER(salario * 1.125) AS "Salário
Reajustado" FROM funcionarios;
Comentário. A instrução SELECT ou subconsulta é usada para recuperar dados de uma ou
mais tabelas, tabelas de objetos, visualizações, visualizações de objetos, visualizações
materializadas, visualizações analíticas ou hierarquias.
Como o enunciado pede para o salário ser expresso como número inteiro, devemos utilizar a
função ROUND, de forma a tornar o número inteiro.
ROUND retorna n arredondado para lugares inteiros à direita do ponto decimal. Se você
omitir inteiro, então n é arredondado para zero lugares. Se o inteiro for negativo, n será
arredondado para a esquerda do ponto decimal. Veja a sintaxe:
ROUND(n [, integer ])
SELECT id, nome, salario, ROUND(salario * 1.125, 0) "Salário Reajustado" FROM funcionarios
Assim, temos nossa resposta na letra c).
Gabarito: C
37.BANCA: FCC - Analista Judiciário (TRT 14ª Região)/Apoio Especializado/Tecnologia da
Informação/2016
No Oracle 11g há uma instrução que permite atualizar, inserir ou remover linhas
condicionalmente em uma tabela, evitando o uso de várias instruções DML. Esta
instrução é especialmente útil nas aplicações em ambientes de Data Warehouse, nas
quais é preciso trabalhar com dados provenientes de várias origens. Trata-se da
instrução
a) SWITCH.
b) TRUNCATE.
c) MERGE.
d) IFCOMMAND.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
124
195
Adquirido em @Xinyuu_bot - Telegram
e) EXEC.
Comentário. O comando MERGE é uma junção do UPDATE com o INSERT. Primeiramente,
procura-se na tabela pela chave primária do valor a ser inserido. Caso exista uma tupla com a
mesma chave, ela é atualizada de acordo com o descrito no UPDATE. Caso não exista, a
inserção é efetuada. Vejam a sintaxe do comando no SGBD Oracle. É possível, ainda, usar o
comando MERGE para excluir um conjunto de linhas com a cláusula DELETE.
MERGE [hints] INTO [nome_tabela]
USING [nome_tabela_visão_ou_consulta]
ON ([condição])
WHEN MATCHED THEN [cláusula_de_update]
DELETE [cláusula_where]
WHEN NOT MATCHED THEN [cláusula_de_insert]
[LOG ERRORS [cláusula_de_log_erros][REJECT LIMIT [inteiro | ilimitado]];
A resposta está presente na alternativa C.
Gabarito: C
38.BANCA: FCC - Técnico da Receita Estadual (SEFAZ MA)/Tecnologia da Informação/2016
O Oracle fornece um comando que é capaz de atualizar, inserir ou remover dados de modo
condicional em uma tabela de banco de dados. Trata-se do comando
a) IFOPERATION.
b) TRUNCATE.
c) MERGE.
d) IFCONSTRAINT.
e) PURGE.
Comentário. O comando MERGE é uma junção do UPDATE com o INSERT. Primeiramente,
procura- se na tabela pela chave primária do valor a ser inserido. Caso exista uma tupla com
a mesma chave, ela é atualizada de acordo com o descrito no UPDATE. Caso não exista, a
inserção é efetuada. Vejam a sintaxe do comando no SGBD Oracle. É possível, ainda, usar o
comando MERGE para excluir um conjunto de linhas com a cláusula DELETE.
MERGE [hints] INTO [nome_tabela]
USING [nome_tabela_visão_ou_consulta]
ON ([condição])
WHEN MATCHED THEN [cláusula_de_update]
DELETE [cláusula_where]
WHEN NOT MATCHED THEN [cláusula_de_insert]
[LOG ERRORS [cláusula_de_log_erros][REJECT LIMIT [inteiro | ilimitado]];
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
125
195
Adquirido em @Xinyuu_bot - Telegram
A resposta está presente na alternativa C.
Gabarito: C
39.BANCA: FCC - Analista Tecnológico (PRODATER)/Analista de Sistemas/2016
Em um banco de dados Oracle, considere o trigger checar_salario_trigger na tabela
funcionarios, que é acionado antes de uma operação INSERT ou UPDATE em cada
linha, chamando o procedure checar_salario.
CREATE OR REPLACE TRIGGER checar_salario_trigger
...I... id, salario
ON funcionarios
..I..I..
BEGIN
checar_salario(:new.id, :new.salario);
END;
/
SHOW ERRORS
As lacunas I e II devem ser preenchidas, correta e respectivamente, com
a) BEFORE INSERT OR UPDATE OF − FOR EACH ROW
b) PREVIOUS INSERT OR UPDATE OF – WHILE ROW>0
c) BEFORE INSERT OR UPDATE ON – WHILE ROW.NEXT()
d) BEFORE INSERT OR UPDATE ON − FOR ROW; ROW>0; ROW++
e) PREVIOUS INSERT OR UPDATE ON − FOR EACH ROW
Comentário. O gabarito encontra-se na alternativa a). Vamos à sintaxe:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
126
195
Adquirido em @Xinyuu_bot - Telegram
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ]
TRIGGER plsql_trigger_source
{ BEFORE | AFTER } dml_event_clause [ referencing_clause ] [ FOR EACH
ROW ] [ trigger_edition_clause ] [ trigger_ordering_clause ]
[ ENABLE | DISABLE ] [ WHEN ( condition ) ] trigger_body
dml_event_clause:
{ DELETE | INSERT | UPDATE [ OF column [, column ]... ] }
[ OR { DELETE | INSERT | UPDATE [ OF column [, column]... ] }...
ON [ schema.] { table | view }
Gabarito: A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
127
195
Adquirido em @Xinyuu_bot - Telegram
40.BANCA: FCC - Analista de Tecnologia da Informação (CREMESP)/Administração de
Banco de Dados/2016
Considere, em Oracle, a sintaxe de trigger abaixo:
CREATE [OR REPLACE] TRIGGER nome_trigger
momento
evento1 [OR evento2 OR evento3]
ON nome_objeto
[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
WHEN (condição)]]
DECLARE]
BEGIN
... corpo_trigger
[EXCEPTION . . .]
END [nome_trigger];
O parâmetro momento pode assumir os valores BEFORE, AFTER ou
a) INSTANT ON.
b) AWHILE.
c) LATER.
d) INSTEAD OF.
e) NOW ON.
Comentário. Temos a resposta na alternativa d), conforme sintaxe:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
128
195
Adquirido em @Xinyuu_bot - Telegram
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ]
TRIGGER plsql_trigger_source
{ BEFORE | AFTER | INSTEAD OF }
{ ddl_event [OR ddl_event]... | database_event [OR database_event
]... } ON { [schema.] SCHEMA | [ PLUGGABLE ] DATABASE }
[ trigger_ordering_clause ] [ ENABLE | DISABLE ] trigger_body
Gabarito: D
41.BANCA: FCC - Analista de Tecnologia da Informação (CREMESP)/Administração de
Banco de Dados/2016
Considere as seguintes afirmações sobre triggers em Oracle.
I.No Oracle 11g é possível criar um trigger desativado e depois ativá-lo somente
quando se souber que ele será compilado com sucesso.
II. Os triggers são acionados implicitamente pelo Oracle quando um evento de
trigger ocorre, não importando qual usuário está conectado ou qual aplicação está
sendo usada.
III. O trigger de linha é disparado uma vez para o evento de trigger, mesmo que
nenhuma linha seja afetada.
IV. Podem ser criados triggers que sejam acionados sempre que instruções DDL
(CREATE, ALTER ou DROP) ocorram no banco de dados.
Está correto o que seafirma APENAS em
a) II e IV.
b) I e III.
c) I, II e IV.
d) III e IV.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
129
195
Adquirido em @Xinyuu_bot - Telegram
e) II e III.
Comentário. Vamos aos comentários das afirmativas:
I – Correto. A opção ENABLE/DISABLE especifica se um gatilho é criado no estado
ativado ou desativado. Quando um trigger é ativado, ele é acionado quando ocorre o evento
de disparo. Por outro lado, quando um gatilho é desativado, ele não dispara quando ocorre
tal evento. Observe que, quando um gatilho é criado pela primeira vez sem opção
ENABLE/DISABLE, ele é ativado por padrão. Para desativar o gatilho, você precisa emitir o
comando ALTER TRIGGER, como mostrado na listagem abaixo:
ALTER TRIGGER trigger_name DISABLE;
Da mesma forma, para ativar um gatilho que foi desativado anteriormente, você precisa
emitir o comando ALTER TRIGGER, como mostrado a seguir:
ALTER TRIGGER trigger_name ENABLE;
II – Correto. Um evento de disparo pode ser qualquer um dos seguintes procedimentos:
1. Uma instrução DML (por exemplo, INSERT, UPDATE ou DELETE) executada contra
uma tabela de banco de dados. Tal gatilho pode disparar antes ou depois de um evento de
disparo. Por exemplo, se você tiver definido um gatilho para disparar antes de uma instrução
INSERT na tabela de estudante, o gatilho é acionado toda vez antes de inserir uma linha na
tabela.
2. Uma instrução DDL (por exemplo, CREATE ou ALTER) executada por um usuário em
particular contra um esquema. Esses gatilhos são muitas vezes utilizados para fins de
auditoria e são especificamente úteis para administradores de banco de dados Oracle. Eles
podem gravar várias alterações do esquema, inclusive quando essas alterações foram feitas
para armazenar qual usuário fez a mudança.
3. Um evento do sistema, como a inicialização ou o desligamento do banco de dados.
4. Um evento de usuário, como o login e o logoff. Por exemplo, você pode definir um
gatilho que dispara depois de um início de sessão em um banco de dados e que registra o
nome de usuário e o tempo de login.
III – Errado, pois o trigger de linha é disparado para o evento de trigger apenas a
quando linha seja afetada. Veja a sintaxe:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
130
195
Adquirido em @Xinyuu_bot - Telegram
{ BEFORE | AFTER } dml_event_clause [ referencing_clause ] [ FOR EACH ROW ]
[ trigger_edition_clause ] [ trigger_ordering_clause ]
[ ENABLE | DISABLE ] [ WHEN ( condition ) ] trigger_body
IV – Correto. Este é um dos seguintes procedimentos para um evento de disparo:
Uma instrução DDL (por exemplo, CREATE ou ALTER) executada por um usuário em
particular contra um esquema. Esses gatilhos são muitas vezes utilizados para fins de
auditoria e são especificamente úteis para administradores de banco de dados Oracle. Eles
podem gravar várias alterações do esquema, inclusive quando essas alterações foram feitas
para armazenar qual usuário fez a mudança.
Sendo assim, temos o gabarito na letra c), com as afirmativas I, II e IV corretas.
Gabarito: C
42. BANCA: FCC - Analista de Tecnologia da Informação (CREMESP)/Administração de
Banco de Dados/2016
Considere a função a seguir, criada no Oracle 11g.
CREATE OR REPLACE FUNCTION func(
p1 IN NUMBER DEFAULT 5,
p2 IN NUMBER DEFAULT 5)
RETURN NUMBER IS
resultado number;
BEGIN
resultado:= p1 + (p2 * 2);
RETURN resultado;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
131
195
Adquirido em @Xinyuu_bot - Telegram
END func;
/
É correto afirmar que
a) uma forma correta de chamar a função é por meio da instrução SELECT func(p2
=> 10) FROM DUAL;
b) ao chamar a função será exibida a mensagem de erro ORA-00907: missing right
parenthesis.
c) ao chamar a função utilizando a instrução RUN SCRIPT func(null,10) será exibido o
valor 20.
d) a função pode ser chamada corretamente por meio da instrução SELECT func(null,10)
FROM ORACLE_SYS_DB;
e) a função está incorreta, pois os parâmetros p1 e p2 da função não suportam a
diretiva DEFAULT.
Comentário. As funções são semelhantes aos operadores, pois manipulam itens de dados e
retornam um resultado. As funções diferem dos operadores no formato de seus argumentos.
Esse formato permite que eles operem em zero, um, dois ou mais argumentos:
function(argument, argument, ...)
Funções retornam um valor único e podem ser muito úteis em uma instrução SELECT. Em
particular, elas podem ajudá-lo a evitar instruções SQL complexas e repetidas dentro de uma
instrução SELECT.
O DUAL é uma tabela criada automaticamente pelo Oracle Database, juntamente com o
dicionário de dados. O DUAL está no esquema do usuário SYS, mas é acessível pelo nome
DUAL para todos os usuários. Ele possui uma coluna, DUMMY, definida como VARCHAR2 (1)
e contém uma linha com um valor X. Selecionar a partir da tabela DUAL é útil para calcular
uma expressão constante com a instrução SELECT. Como o DUAL tem apenas uma linha, a
constante é retornada apenas uma vez. Como alternativa, você pode selecionar uma
constante, uma pseudocoluna ou uma expressão de qualquer tabela, mas o valor será
retornado quantas vezes houver linhas na tabela.
Dessa forma, a função pode ser chamada como SELECT func(p2 => 10) FROM DUAL.
E quanto ao operador "=>" professor? Corresponde a uma atribuição. Esse operador é
pouco utilizado, é difícil até encontrar referências para ele na internet, mas funciona como
uma atribuição sim. Fiz um teste no Oracle e rodou “bonitinho”... inclusive, se eu quiser
posso atribuir os dois parâmetros usando o operador separando com vírgula:
SELECT func(p1 => 10, p2 => 20) FROM
DUAL;
Assim, temos nossa resposta na alternativa a).
Gabarito: A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
132
195
Adquirido em @Xinyuu_bot - Telegram
43. BANCA: FCC - Analista (PGE MT)/Analista de Sistemas/2016
Um Analista de Sistemas que utiliza PL/SQL em um banco de dados Oracle afirma,
corretamente, que
a) se uma chamada recursiva a um procedure estiver dentro de um cursor FOR loop,
cada cursor é aberto em cada chamada, podendo estourar o limite OPEN_LOOPS
mas o mesmo não ocorre se o cursor estiver entre um OPEN e CLOSE.
b) podem ser utilizadas chamadas a subprogramas externos escritos em Java,
embora haja a restrição de um Java stored procedure somente poder ser
chamado de dentro de um package.
c) um trigger pode ter dois estados: enabled ou disabled e, por default, é criado no
estado enabled. Para criar um trigger no estado disabled deve-se usar a cláusula
DISABLE na declaração CREATE TRIGGER.
d) packages podem ter duas partes: uma especificação e um corpo. A especificação
define as queries para os cursores e o código dos subprogramas, já o corpo
define a interface do package.
e) em PL/SQL uma condição de erro é chamada exceção. As exceções são somente
internas, geradas pelo run-time system. Todas possuem nomes predefinidos como
DIVIDE_ZERO e ERROR_STORAGE.
Comentário. A opção ENABLE/DISABLE especifica se um gatilho é criado no estado ativado
ou desativado. Quando um trigger é ativado, ele é acionado quando ocorre o evento de
disparo. Por outro lado, quando um gatilho é desativado, ele não dispara quando ocorre tal
evento. Observe que, quando um gatilho é criado pela primeira vez sem opção
ENABLE/DISABLE, ele é ativado por padrão. Para desativar o gatilho, você precisa emitir o
comando ALTER TRIGGER, como mostrado na listagem abaixo:
ALTER TRIGGER trigger_name DISABLE;
Da mesma forma, para ativar um gatilho que foi desativado anteriormente, você precisa
emitir o comando ALTER TRIGGER, como mostradoa seguir:
ALTER TRIGGER trigger_name
ENABLE; Assim, temos o gabarito na
alternativa c). Gabarito: C
44. BANCA: FCC - Analista Ministerial (MPE PB)/Analista de Sistemas/Administrador de
Banco de Dados/2015
Para controlar a lógica de transações no Oracle utilizam-se as instruções COMMIT e
ROLLBACK. Sobre a instrução COMMIT é correto afirmar:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
133
195
Adquirido em @Xinyuu_bot - Telegram
a) Antes de executar um COMMIT, o usuário não pode revisar o resultado das
operações de manipulações de dados por meio de consultas às tabelas.
b) Após executar um COMMIT, o estado anterior dos dados é perdido
permanentemente e todos os usuários com permissão adequada poderão exibir
os resultados das transações realizadas antes do COMMIT.
c) Antes de um COMMIT ser executado, outros usuários poderão exibir os
resultados das operações de manipulação de dados feitas pelo usuário atual.
d) Após executar um COMMIT, as linhas afetadas são bloqueadas e não estarão
disponíveis para outros usuários executarem novas alterações nos dados.
e) Antes de executar um COMMIT, as linhas afetadas pelas alterações feitas nos
dados pelo usuário atual estarão liberadas, de forma que outros usuários possam
alterar os dados destas linhas.
Comentário. A instrução COMMIT é usada para finalizar uma transação atual e tornar
permanentes todas as alterações realizadas na transação. Uma transação é uma sequência de
instruções SQL que o Oracle Database trata como uma única unidade. Essa instrução
também apaga todos os savepoints na transação e libera os bloqueios de transação.
Até você confirmar uma transação:
Você pode ver as alterações feitas durante a transação, consultando as tabelas modificadas,
mas outros usuários não podem ver as alterações. Depois de confirmar a transação, as
alterações ficam visíveis para as declarações de outros usuários que são executadas após o
commit.
Você pode reverter (desfazer) quaisquer alterações feitas durante a transação com a instrução
ROLLBACK (consulte ROLLBACK).
Temos a resposta na letra b).
Gabarito: B
45. BANCA: FCC - Analista Ministerial (MPE PB)/Analista de Sistemas/Administrador de
Banco de Dados/2015
No Oracle, uma função é um bloco PL/SQL nomeado que retorna um valor. A função a
seguir, calcula um imposto sobre o salário com base em uma alíquota fixa simples de 27%.
CREATE OR REPLACE FUNCTION imposto(valor IN
NUMBER) RETURN NUMBER IS
BEGIN
RETURN (valor *
0.27); END imposto;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
134
195
Adquirido em @Xinyuu_bot - Telegram
/
Considere a existência de um ambiente Oracle com SQL*Plus em condições ideais, com
banco de dados, tabelas, campos e valores existentes. Considere também que, nos
casos necessários, foi executado o comando SET SERVEROUTPUT ON antes das
instruções abaixo.
I. SELECT nome, salario,
imposto(salario) FROM Funcionario
WHERE idDepartamento = 5;
II. EXECUTE dbms_output.put_line(imposto(10000));
III. VARIABLE salario
NUMBER; EXECUTE :salario :=
imposto(10000);
IV. DECLARE imp
NUMBER; BEGIN
imp = imposto(10000);
DBMS_OUTPUT.PUT('O imposto é: '||
imp);
END;
Para chamar a função imposto, está correto o que consta APENAS em
a) III e IV.
b) I, II e III.
c) II e III.
d) I e III.
e) II e IV.
Comentário. Com relação ao comando SET SERVEROUTPUT ON, ON usa o TAMANHO e
FORMATO do FORMATO anterior do SET SERVEROUTPUT ON SIZE n, ou usa valores padrão
se nenhum comando SET SERVEROUTPUT tiver sido emitido anteriormente na conexão
atual.
SIZE define o número de bytes da saída que podem ser armazenados em buffer no servidor
do banco de dados Oracle. O padrão é ILIMITADO. n não pode ser menor que 2000 ou
maior que 1.000.000.
Recursos não são pré-alocados quando SERVEROUTPUT é definido. Como não há
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
135
195
Adquirido em @Xinyuu_bot - Telegram
penalidade de desempenho, use UNLIMITED, a menos que você queira conservar a memória
física.
Para ativar a exibição de texto em um bloco PL / SQL usando DBMS_OUTPUT.PUT_LINE,
digite:
SET SERVEROUTPUT ON
Podemos chamar uma função das seguintes formas:
Instrução SELECT ou subconsulta (item I): usada para recuperar dados de uma ou mais
tabelas, tabelas de objetos, visualizações, visualizações de objetos, visualizações
materializadas, visualizações analíticas ou hierarquias.
Comando EXECUTE (itens II e III): geralmente é útil quando você deseja executar uma
instrução PL / SQL que referencia um procedimento armazenado.
dbms_output.put_line: Você pode usar um gatilho para imprimir alguma saída do processo
de depuração.
Assim, temos nossa resposta na letra b), com as instruções I, II e III corretas.
Gabarito: B
46. BANCA: FCC - Analista Judiciário (TRE AP)/Apoio Especializado/Análise de Sistemas/2015
Após constatar que um objeto de um banco de dados Oracle 11g não está disponível
no momento por causa de uma falha na conexão de rede, um Analista de Sistemas,
portando o devido privilégio, deseja desativar um trigger chamado insere_ordem, que
faz referência a este objeto. Para isso deve digitar o comando
a) ALTER TRIGGER insere_ordem DISABLE;
b) DISABLE TRIGGER insere_ordem;
c) ALTER TRIGGER insere_ordem OFF;
d) DISABLE ON TRIGGER insere_ordem;
e) STOP TRIGGER insere_ordem;
Comentário. O gabarito correto está na letra a). A opção ENABLE/DISABLE especifica se um
gatilho é criado no estado ativado ou desativado. Quando um trigger é ativado, ele é
acionado quando ocorre o evento de disparo. Por outro lado, quando um gatilho é
desativado, ele não dispara quando ocorre tal evento. Observe que, quando um gatilho é
criado pela primeira vez sem opção ENABLE/DISABLE, ele é ativado por padrão. Para
desativar o gatilho, você precisa emitir o comando ALTER TRIGGER, como mostrado na
listagem abaixo:
ALTER TRIGGER trigger_name DISABLE;
Gabarito: A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
136
195
Adquirido em @Xinyuu_bot - Telegram
47. BANCA: FCC - Analista Judiciário (TRE AP)/Apoio Especializado/Análise de Sistemas/2015
Considere um banco de dados Oracle 11g aberto e em condições ideais que possui as tabelas
e campos presentes na instrução PL/SQL:
SELECT e.sobrenome, e.id_departamento,
d.nome_departamento FROM empregados e, departamentos d
WHERE ..I.. ;
Usando join externa, para que a consulta recupere todas as linhas na tabela
empregados, mesmo que não haja correspondência na tabela departamentos, a lacuna I
deve ser preenchida por
a) e.id_departamento(+) = d.id_departamento
b) d.id_departamento = e.id_departamento
c) d.id_departamento = e.id_departamento RIGHT JOIN ON
d) e.id_departamento = d.id_departamento(+)
e) e.id_departamento = d.id_departamento
Comentário. O gabarito da questão está na letra d). Uma JOIN é uma consulta que combina
linhas de duas ou mais tabelas, visualizações ou visualizações materializadas.
O resultado de uma junção externa esquerda para a tabela A e B contém todos os registros
da tabela à esquerda A, mesmo se a condição de junção não corresponder a um registro na
tabela B. Por exemplo, se você executar uma junção externa esquerda de funcionários
(esquerda) para os departamentos (à direita) e, se alguns funcionários não estiverem em um
departamento, a consulta retornará linhas de funcionários sem correspondência nos
departamentos.
Uma junção externa estende o resultado de uma junção simples. Uma junção externa retorna
todas as linhas que satisfazem a condição de junção e também retorna algumas ou todas as
linhas de uma tabela paraas quais nenhuma linha da outra satisfaz a condição de junção.
Para gravar uma consulta que executa uma junção externa das tabelas A e B e retorna todas
as linhas de A (uma junção externa esquerda), use a sintaxe LEFT [OUTER] JOIN na cláusula
FROM ou aplique o operador de junção externa (+) ao todas as colunas de B na condição de
junção na cláusula WHERE. Para todas as linhas em A que não possuem linhas
correspondentes em B, o Oracle Database retorna null para qualquer lista de seleção de
expressões contendo colunas de B.
Segue um exemplo de LEFT
[OUTER] JOIN: SELECT * FROM A, B
WHERE A.c1 = B.c2(+)
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
137
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito: D
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
138
195
Adquirido em @Xinyuu_bot - Telegram
48. BANCA: FCC - Analista Judiciário (TRT 16ª Região)/Apoio Especializado/Tecnologia da
Informação/2014
Em um banco de dados Oracle, um usuário poderá conceder qualquer privilégio de
objeto, sobre qualquer objeto de esquema que possua, para qualquer outro usuário ou
função. Para conceder, por exemplo, a permissão de insert e select na tabela cliente
para o usuário mac30, de forma que ele possa conceder estas permissões a outros
usuários sobre esta tabela, utiliza- se a instrução
a) GRANT insert, select ON cliente TO mac30 WITH GRANT OPTION;
b) CREATE ROLE insert, select ON cliente TO mac30 WITH LICENCE ON;
c) GRANT ADD insert, select FROM cliente TO mac30 WITH GRANT OPTION;
d) GRANT insert, select FROM cliente TO mac30 WITH GRANT ON;
e) GRANT insert, select FROM cliente TO mac30 WITH GRANT;
Comentário. A instrução GRANT é usada para conceder:
Privilégios do sistema para usuários e funções.
Funções para usuários, funções e unidades de programa. As funções concedidas podem ser
definidas pelo usuário (locais ou externas) ou predefinidas.
Privilégios de objeto para um objeto específico para usuários e
funções. Segue a sintaxe da instrução GRANT:
{ object_privilege | ALL [ PRIVILEGES ] }
[ (column [, column ]...) ]
[, { object_privilege | ALL [ PRIVILEGES ] }
[ (column [, column ]...) ]
]...
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
139
195
Adquirido em @Xinyuu_bot - Telegram
on_object_clause
TO grantee_clause
[ WITH HIERARCHY OPTION ]
[ WITH GRANT OPTION ]
De acordo com a sintaxe da instrução, temos a nossa resposta na letra a).
Gabarito: A
49. BANCA: FCC - Analista Judiciário (TRT 13ª Região)/Apoio Especializado/Tecnologia da
Informação/2014
Em um ambiente de banco de dados Oracle 11g ideal, foram criadas duas tabelas por meio
das instruções PL/SQL a seguir:
CREATE TABLE orders (order_id NUMBER PRIMARY KEY, line_items_count NUMBER
DEFAULT 0 );
CREATE TABLE lineitems (order_id REFERENCES orders, seq_no NUMBER,
CONSTRAINT lineitems PRIMARY
KEY(order_id,seq_no) );
Foi criada, relacionada às tabelas, a seguinte trigger, colocada em execução:
CREATE OR REPLACE TRIGGER lineitems_trigger
AFTER INSERT OR UPDATE OR DELETE ON
lineitems FOR EACH ROW
BEGIN
IF (INSERTING OR UPDATING)
THEN
UPDATE orders SET line_items_count =
NVL(line_items_count,0)+1 WHERE order_id = :new.order_id;
END IF;
IF (DELETING OR
UPDATING) THEN
UPDATE orders SET line_items_count = NVL(line_items_count,0)-1
WHERE order_id = :old.order_id;
END IF;
END;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
140
195
Adquirido em @Xinyuu_bot - Telegram
/
Em seguida, foram executadas as instruções abaixo, nesta ordem:
INSERT INTO orders (order_id) VALUES (78);
INSERT INTO orders(order_id) VALUES (92);
INSERT INTO lineitems (order_id, seq_no) VALUES (78,1);
INSERT INTO lineitems (order_id, seq_no) VALUES (78,2);
SELECT * FROM orders;
Considere:
I. Ao executar a instrução INSERT INTO orders (order_id) VALUES (78); a trigger
incrementou o valor contido no campo line_items_count passando de 0 para 1.
II. Ao executar a instrução INSERT INTO lineitems (order_id, seq_no) VALUES (78,1);
a trigger incrementou o valor contido no campo line_items_count da tabela orders
passando de 0 para 1.
III. Ao executar a instrução INSERT INTO lineitems (order_id, seq_no) VALUES (78,2);
a trigger incrementou o valor contido no campo line_items_count da tabela orders
passando de 1 para 2.
IV. A instrução SELECT * FROM orders; mostrará no campo line_items_count da
linha cujo order_id é 78 o valor 3.
Está correto o que consta APENAS em
a) I e IV.
b) I.
c) II e IV.
d) II e III.
e) III.
Comentário. Vamos aos comentários das alternativas:
I – Errado. A trigger é acionada por: AFTER INSERT OR UPDATE OR DELETE ON
lineitems. Por este motivo, o campo line_items_count não é incrementado.
II – Correto. A tabela lineitems é composta por (order_id REFERENCES orders, seq_no
NUMBER, CONSTRAINT lineitems PRIMARY, ou seja, dois campos numéricos (duas entradas)
Como a trigger é acionada por AFTER INSERT OR UPDATE OR DELETE ON lineitems, o campo
line_items_count é incrementado de 0 para 1.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
141
195
Adquirido em @Xinyuu_bot - Telegram
III – Correto. A tabela lineitems é composta por (order_id REFERENCES orders, seq_no
NUMBER, CONSTRAINT lineitems PRIMARY, ou seja, dois campos numéricos (duas entradas)
Como a trigger é acionada por AFTER INSERT OR UPDATE OR DELETE ON lineitems, o campo
line_items_count é incrementado de 1 para 2.
IV – Errado. Considerando o comando SELECT * FROM orders, mostrará no campo
line_items_count da linha cujo order_id é 78 o valor 2.
Gabarito: D
50. BANCA: FCC - Analista Judiciário (TRE PE)/Apoio Especializado/Análise de Sistemas/2011
Sobre triggers no banco de dados Oracle, considere:
I. Em instruções DDL, podem ser associados com uma tabela.
II. Em instruções DML, para publicação de eventos, estão associados a um banco
de dados ou com um esquema.
III. Podem ser disparados antes ou depois para cada linha na qual a operação DML
especificada ocorre.
Está correto o que consta em
a) I e II, apenas.
b) I e III, apenas.
c) I, II e III.
d) II e III, apenas.
e) III, apenas.
Comentário. Vamos à análise das afirmativas:
I – Errado. Uma instrução DDL (por exemplo, CREATE ou ALTER) é executada por um
usuário em particular contra um esquema. Esses gatilhos são muitas vezes utilizados para fins
de auditoria e são especificamente úteis para administradores de banco de dados Oracle.
Eles podem gravar várias alterações do esquema, inclusive quando essas alterações foram
feitas para armazenar qual usuário fez a mudança.
II – Errado. Uma instrução DML (por exemplo, INSERT, UPDATE ou DELETE) é executada contra
uma
tabela de banco de dados. Tal gatilho pode disparar antes ou depois de um evento de disparo.
III – Correto. Uma instrução DML (por exemplo, INSERT, UPDATE ou DELETE) é
executada contra uma tabela de banco de dados. Tal gatilho pode disparar antes ou depois
de um evento de disparo.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
142
195
Adquirido em @Xinyuu_bot - Telegram
Assim, temos o gabarito na letra e), com apenas a afirmativa III correta.
Gabarito: E
51. BANCA: CESPE - Técnico Judiciário (TRE BA)/Apoio Especializado/Programação
de Sistemas/2017
Uma empresa criou um banco de dados Oracle para pagamento de pró-labore até o
último dia do mês. Para evitar que o registro dopagamento seja gravado no banco de
dados após essa data, o administrador do referido banco de dados deverá usar um(a)
a) update.
b) delete.
c) view.
d) trigger.
e) insert.
Comentário. A resposta está na letra d). Um trigger ou um gatilho de banco de dados é um
bloco PL/SQL nomeado que é armazenado em um banco de dados e executado
implicitamente quando ocorre um evento de disparo. O ato de execução de um gatilho é
referido como disparo do gatilho.
Assim, é possível evitar que o registro do pagamento seja gravado no banco de dados após
o último dia do mês.
Gabarito: D
52. BANCA: CESPE - Técnico Judiciário (TRE BA)/Apoio Especializado/Programação
de Sistemas/2017
Em uma empresa usuária de banco de dados Oracle, foi criada uma function para cálculo do
imposto de INSS no programa de geração da folha de pagamento dos empregados.
Nessa situação, se, na geração da folha de pagamento, o banco de dados retornar um erro
da function do tipo program error, essa ocorrência será devida ao fato de a function
a) não possuir os cálculos.
b) calcular e gravar os dados.
c) não ter os dados do imposto.
d) não possuir a instrução return.
e) não tratar os erros.
Comentário. program error: operação desconhecida executada no registro; Causa: erro interno.
Se nesta situação a function tivesse a instrução return, o erro seria evitado. A resposta está na
letra d).
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
143
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito: D
53. BANCA: CESPE - Analista Judiciário (STF)/Apoio Especializado/Análise de Sistemas de
Informação /2013
Julgue o seguinte item, referentes a frameworks para camada de persistência e SQL.
Considerando que a consulta abaixo seja realizada em um SGBD Oracle, é correto
afirmar que o valor 0 será mostrado na coluna salario quando um valor NULL for
retornado.
SELECT nome, NVL(salario, 0),
cidade FROM empregado
WHERE salario IS
NULL ORDER BY
nome;
Certo
Errado
Comentário. Veja a sintaxe para a função NVL:
NVL(expr1, expr2)
A função NVL permite substituir null (retornado como um espaço em branco) por uma string
nos resultados de uma consulta. Se expr1 for nulo, o NVL retornará expr2. Se expr1 não for
nulo, o NVL retornará expr1. Temos o gabarito na letra c).
Gabarito: C
54. BANCA: CESPE - Analista Judiciário (TRT 17ª Região)/Apoio Especializado/Tecnologia da
Informação/2013
Julgue o item subsequente com relação aos comandos SQL.
Em um único objeto de dados, um package no Oracle 11g pode agregar
subprogramas, constantes, comandos DML, funções e procedures. O exemplo abaixo
descreve corretamente a sintaxe para criar o package PkgTeste contendo uma função,
uma procedure e um comando DML.
CREATE PACKAGE BODY
PkgTeste AS BEGIN
WITH FUNCTION FuncaoTeste (parametro VARCHAR2) RETURN codigo NUMBER;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
144
195
Adquirido em @Xinyuu_bot - Telegram
WITH PROCEDURE PTeste (codigo NUMBER);
WITH SELECT * FROM TabelaTeste WHERE
NuCodigo=codigo; END
Certo
Errado
Comentário. Observe a sintaxe do comando CREATE PACKAGE BODY:
CREATE [ OR REPLACE ] [ EDITIONABLE | NONEDITIONABLE ] PACKAGE BODY
plsql_package_body_source
[ schema. ] package { IS | AS } declare_section [ initialize_section ]
END [ package_name ] ;
BEGIN statement... -> Não há o WITH antes do statement
[ EXCEPTION exception_handler... ]
Assim, concluímos que a assertiva está errada.
Gabarito: E
55. BANCA: CESPE - Analista Administrativo (ANAC)/Área 4/2012
Acerca do sistema gerenciador de banco de dados Oracle, julgue o item a seguir.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
145
195
Adquirido em @Xinyuu_bot - Telegram
No Oracle 10g, uma trigger de DDL pode executar rotinas pré-definidas antes (before)
ou depois (after) de um evento ocorrer, como, por exemplo, a execução dos comandos
TRUNCATE, REVOKE ou GRANT.
Certo
Errado
Comentário. Um gatilho ou um trigger pode ser acionado por uma instrução DDL (por
exemplo, CREATE ou ALTER) executada por um usuário em particular contra um esquema.
Esses gatilhos são muitas vezes utilizados para fins de auditoria e são especificamente úteis
para administradores de banco de dados Oracle. Eles podem gravar várias alterações do
esquema, inclusive quando essas alterações foram feitas para armazenar qual usuário fez a
mudança. Isto pode ocorrer antes (before) ou depois (after) de um evento definido ocorrer,
como por exemplo TRUNCATE, REVOKE ou GRANT.
Assim, concluímos que a assertiva está correta.
Gabarito: C
56. BANCA: CESPE - Analista Administrativo (ANAC)/Área 4/2012
Acerca do sistema gerenciador de banco de dados Oracle, julgue o item a seguir.
No Oracle 10g, é possível, por meio de triggers, monitorar eventos de DML, como, por
exemplo, a execução do comando DELETE, ou ainda, monitorar eventos de banco de
dados (Database) como, por exemplo, o evento SERVERERROR.
Certo
Errado
Comentário. Um evento de disparo para um trigger ou um gatilho pode ser qualquer um dos
seguintes procedimentos:
1. Uma instrução DML (por exemplo, INSERT, UPDATE ou DELETE) executada contra
uma tabela de banco de dados. Tal gatilho pode disparar antes ou depois de um evento de
disparo.
2. Uma instrução DDL (por exemplo, CREATE ou ALTER) executada por um usuário em
particular contra um esquema. Esses gatilhos são muitas vezes utilizados para fins de
auditoria e são especificamente úteis para administradores de banco de dados Oracle.
3. Um evento do sistema, como a inicialização ou o desligamento do banco de dados.
4. Um evento de usuário, como o login e o logoff. Por exemplo, você pode definir um
gatilho que dispara depois de um início de sessão em um banco de dados e que registra o
nome de usuário e o tempo de login.
Com base nestas possibilidades, a assertiva está correta.
Gabarito: C
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
146
195
Adquirido em @Xinyuu_bot - Telegram
57. BANCA: CESPE - Técnico Judiciário (TRE MT)/Apoio Especializado/Programação
de Sistemas/2010
Considere que, em eleições para cargos públicos, as seguintes regras devem ser
obedecidas: uma pessoa pode se candidatar a várias eleições; uma eleição pode ter
diversos candidatos; em uma eleição, cada pessoa pode se candidatar somente a um
cargo. Para representar esse cenário, foram criadas, em um banco de dados, as tabelas
a seguir.
Com base na linguagem SQL do Oracle 10g, assinale a opção que seleciona corretamente
o(s) nome(s) da(s) pessoa(s) que não se candidatou(aram) a nenhuma das três eleições.
a) select nome from pessoa where id_pessoa not in (select id_pessoa from
pessoa a where not exists (select id_pessoa from candidato b where a.id_pessoa
= b.id_pessoa)
b) select nome from pessoa where id_pessoa in (select distinct id_pessoa from
candidato)
c) select nome from pessoa a where id_pessoa in (select distinct id_pessoa from
candidato b where a.id_pessoa = b.id_pessoa)
d) select nome from pessoa where id_pessoa in (select id_pessoa from
pessoa a where not exists (select id_pessoa from candidato b where a.id_pessoa
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
147
195
Adquirido em @Xinyuu_bot - Telegram
= b.id_pessoa)
e) select nome from pessoa where id_pessoa in (select id_pessoa from pessoa a where
exists (select id_pessoa from candidato b where a.id_pessoa = b.id_pessoa)
Comentário. A instrução SELECT ou subconsulta é usada para recuperar dados de uma ou
mais tabelas,tabelas de objetos, visualizações, visualizações de objetos, visualizações
materializadas, visualizações analíticas ou hierarquias. Neste caso, considerando as
alternativas, faz-se necessário o uso de três instruções SELECT com cláusulas WHERE:
(1) select nome from pessoa where id_pessoa in
(2) (select id_pessoa from pessoa a where not exists -> a: Tabela pessoa
(3) (select id_pessoa from candidato b where a.id_pessoa = b.id_pessoa) -> b: Tabela candidato
A instrução SELECT (3) relaciona os códigos id_pessoa que estão em ambas as tabelas,
pessoa e candidato. Já a instrução SELECT (2) seleciona os códigos id_pessoa que não estão
compreendidos no SELECT (3).
Por fim, a instrução SELECT (1) relaciona os nomes referente aos códigos id_pessoa
selecionados em SELECT (2), ou seja, o(s) nome(s) da(s) pessoa(s) que não se
candidatou(aram) a nenhuma das três eleições. Temos, então, nossa resposta na letra d).
Gabarito: D
58. BANCA: CESPE - Analista Judiciário (TRT 5ª Região)/Apoio Especializado/Tecnologia da
Informação/2008
Com relação a qualidade de software, bancos de dados e suas tecnologias, julgue o item.
No ORACLE, um trigger é um bloco PL/SQL armazenado e associado a uma tabela,
esquema ou banco de dados que pode ser criado com o comando CREATE TRIGGER.
Certo
Errado
Comentário. A afirmativa está correta. Um trigger ou gatilho de banco de dados é um bloco
PL/SQL nomeado que é armazenado em um banco de dados e executado implicitamente
quando ocorre um evento de disparo. O ato de execução de um gatilho é referido como
disparo do gatilho.
A sintaxe geral para a criação de um gatilho é mostrada na listagem abaixo (as palavras e as
frases reservadas entre colchetes são opcionais):
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
148
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito: C
59. BANCA: CESPE ANO: 2010 ÓRGÃO: TRT - 21ª REGIÃO (RN) PROVA: TÉCNICO DO
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
Julgue o item abaixo, relativo à linguagem PL/SQL.
Caso seja utilizado o comando de manipulação de dados SELECT, da linguagem de
consulta estruturada (SQL), em um bloco PL/SQL, deverá ser incluído, obrigatoriamente,
a cláusula INTO.
Comentário: A instrução SELECT INTO recupera dados de uma ou mais tabelas de banco de
dados, e atribui os valores selecionados a variáveis ou a coleções. No seu uso padrão (SELECT
... INTO), esta declaração recupera uma ou mais colunas de uma única linha. No seu uso em
massa (SELECT ... BULK COLLECT INTO), a declaração recupera como resultado um conjunto
de linhas de uma só vez.
Gabarito: C
60. BANCA: CESPE ANO: 2015 ÓRGÃO: TCU PROVA: AUDITOR FEDERAL DE CONTROLE
EXTERNO - TECNOLOGIA DA INFORMAÇÃO
Julgue os itens subsecutivos, a respeito de sistemas de bancos de dados.
125 Como parte de um conjunto de instruções, o comando Oracle PL/SQL a seguir
significa que, quando se tentar armazenar um valor duplicado em uma coluna que seja
chave primária de uma tabela, será disparada uma exceção predefinida na linguagem; e
serão desfeitas apenas as instruções escritas no contexto do SAVEPOINT nome_point.
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK TO nome_point;
Comentário. Como a questão trata de exceções, vamos apresentar novamente os
comentários da mesma. Em Oracle, existe o que chamamos de exceções nomeadas. São
exceções que possuem nomes no contexto de PL/SQL. Eles são nomeados no pacote
padrão em PL/SQL e não precisam ser definidos pelo programador.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
149
195
Adquirido em @Xinyuu_bot - Telegram
O erro DUP_VAL_ON_INDEX, cujo código de erro é ORA-00001, é responsável por lançar
uma exceção quando você tentar executar uma instrução INSERT ou UPDATE que cria um
valor duplicado em um campo com restrição de índice exclusivo. A sintaxe do comando
PL/SQL deve ser:
EXCEPTION
WHEN exception_name1 THEN
[statements]
No Oracle, a instrução de ROLLBACK é usada para desfazer o trabalho realizado pela
transação atual ou por uma transação que está em dúvida (in doubt). A sintaxe do
ROLLBAK pode ser vista abaixo:
ROLLBACK [ WORK ] [ TO [SAVEPOINT] savepoint_name | FORCE 'string' ];
Para cada um dos argumentos acima, temos um conjunto de descrição. Todos, porém, são
opcionais.
WORK - Foi acrescentado pela Oracle para ser compatível com SQL. Emitir o ROLLBACK
com ou sem o parâmetro WORK resultará no mesmo resultado.
TO SAVEPOINT - savepoint_name - A declaração ROLLBACK desfaz todas as alterações
para a sessão atual até o savepoint especificado pelo savepoint_name. Se esta cláusula for
omitida, então todas as alterações são desfeitas.
FORCE 'string' - Ele é usado para forçar o rollback de uma transação que pode estar
corrompida ou em dúvida. Com esta cláusula, você especifica o ID da transação entre
aspas simples como string. Você pode encontrar o ID de transação na exibição sistema
chamado DBA_2PC_PENDING.
Veja que pela explicação acima, a alternativa se apresenta correta.
Gabarito: C
61. BANCA: CESPE ANO: 2005 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
A respeito da sintaxe e da semântica do SQL, julgue os itens a seguir.
O comando DECLARE CURSOR permite a recuperação e a manipulação de registros de
uma tabela, linha a linha. Para isso, deve-se declarar o cursor, abrir o cursor, recuperar as
linhas do cursor e fechar o cursor, empregando os comandos DECLARE, OPEN, FETCH
e CLOSE, respectivamente.
Comentário. O erro da questão está em afirmar que o cursor é declarado com a palavra
reservada DECLARE. Na realidade, DECLARE é uma região onde as variáveis do bloco PL/SQL
são declaradas, incluindo aí a declaração dos próprios cursores. Para declarar um cursor
explícito, basta utilizar a palavra CURSOR dentro da área DECLARE. Veja um exemplo abaixo:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
150
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito: E
62. BANCA: FCC ANO: 2009 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
Nas estruturas de controle de iteração dos programas PL/SQL são utilizadas apenas as
instruções
A LOOP e IF.
B IF e CASE.
C GOTO e NULL.
D CASE e GOTO.
E LOOP e EXIT.
Comentário. Instruções de loop ou de controle de iteração executam as mesmas instruções ou
comandos para uma quantidade diferente de valores de dados. As instruções de loop são o
LOOP básico, FOR ... LOOP e WHILE ... LOOP.
As transferências de controle em uma instrução podem utilizar o EXIT que transfere o controle
para o fim do LOOP. A instrução CONTINUE sai da iteração atual de um ciclo e transfere o
controle para a próxima iteração. Ambos, EXIT e CONTINUE, têm uma cláusula opcional
WHEN, em que você pode especificar uma condição para a execução.
Resta, portanto, marcamos a alternativa E, pois apenas LOOP e EXIT satisfazem os critérios
definidos no enunciado. Para os demais comandos, temos as seguintes considerações a fazer:
1. IF e CASE - são estruturas condicionais. 2. GOTO - é uma estrutura de salto. 3. NULL - não
faz nada.
Gabarito: E
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
151
195
Adquirido em @Xinyuu_bot - Telegram
63. BANCA: FCC ANO: 2009 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
No tipo Escalares, NÃO é uma das quatro famílias de tipos de dados predefinidos do
PL/SQL:
A referências.
B data e hora.
C números.
D caracteres.
E booleanos.
Comentário. Os tipos de dados escalares são classificados em cinco tipos: numéricos (C),
caracteres (D), booleanos (E), data e hora (B) e intervalo. Vejamque só nos resta como
alternativa para a questão a letra A.
Gabarito: A
64. BANCA: FCC ANO: 2009 ÓRGÃO: TRT - 3ª REGIÃO (MG) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
Para passar resultados de query entre subprogramas PL/SQL, ou seja, quando um
subprograma executa uma query e o resultado será processado por outro subprograma,
utiliza-se uma:
A view.
B subquery.
C variável cursor.
D variável
bind.
E variável locator.
Comentário. Vamos aproveitar a questão para falar um pouco sobre a variável cursor. Como
um cursor, uma variável de cursor aponta para a linha atual do conjunto de resultados de uma
consulta que retorna múltiplas linhas. Uma variável de cursor é mais flexível porque ela não
está vinculada a uma consulta específica. Você pode abrir uma variável de cursor para qualquer
consulta que retorna o conjunto consistente de colunas.
Você passa uma variável de cursor como um parâmetro para subprogramas locais e
armazenados. Abrindo a variável de cursor em um subprograma e processando, a variável em
um subprograma diferente ajuda a centralizar a recuperação de dados. Essa técnica também é
útil para aplicações multi linguagem, onde um subprograma PL/SQL pode retornar um
conjunto de resultados para um subprograma escrito em uma linguagem diferente, como Java
ou Visual Basic.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
152
195
Adquirido em @Xinyuu_bot - Telegram
Variáveis de cursor estão disponíveis para cada cliente PL/SQL. Por exemplo, você pode
declarar uma variável de cursor em um ambiente de host PL/SQL, como um OCI ou Pro*C, em
seguida, passá-lo como uma variável de host de entrada (variável de ligação) para PL/SQL.
Ferramentas de desenvolvimento de aplicações, tais como Oracle Forms, que têm um
mecanismo PL/SQL, podem utilizar variáveis de cursor inteiramente no lado do cliente. Ou
você pode transferir as variáveis de cursor entre um cliente e o servidor de banco de dados
através de chamadas de procedimento remoto.
O que são variáveis de cursor (REF CURSORs)?
Variáveis de cursor são como ponteiros para conjuntos de resultados. São utilizadas quando
você quer executar uma consulta em um subprograma e processar os resultados em um
subprograma diferente (possivelmente, uma escrita em uma linguagem diferente). Uma variável
de cursor tem tipo de dados REF CURSOR, e você pode vê-los referido informalmente como
REF CURSORs.
Ao contrário de um cursor explícito, que se refere sempre à mesma área de trabalho, uma
variável de cursor pode se referir a diferentes áreas de trabalho. Você não pode usar uma
variável de cursor onde é esperado um cursor ou vice-versa.
Por que usar variáveis de cursor?
Você usa variável de cursor para passar conjuntos de resultados de consulta entre
subprogramas armazenados PL/SQL e vários clientes. O PL/SQL e seus clientes compartilham
um ponteiro para a área de trabalho em que o conjunto de resultados é armazenado. Por
exemplo, um cliente OCI, uma aplicação de formulários Oracle, e servidor de banco de dados
Oracle podem se referir à mesma área de trabalho.
Uma área de trabalho de consulta permanece acessível enquanto quaisquer variáveis de
cursor apontar para ela, enquanto você passa o valor de uma variável de cursor de um âmbito
para outro. Por exemplo, se você passar uma variável de cursor do host a um bloco PL/SQL
incorporado em um programa Pro*C, a área de trabalho para a qual a variável aponta o cursor
permanece acessível após o bloqueio ser concluído.
Se você tem um motor de PL/SQL no lado do cliente, chamadas de cliente para o servidor
não devem impor quaisquer restrições. Por exemplo, você pode declarar uma variável de
cursor no lado do cliente, abrir e fazer FETCH a partir dele no lado do servidor, em seguida,
continuar a buscar a partir do lado do cliente.
Gabarito: C
65. BANCA: CESPE ANO: 2010 ÓRGÃO: INMETRO PROVA: PESQUISADOR - GESTÃO DA
INFORMAÇÃO
Com respeito aos conceitos e comandos PL/SQL, assinale a opção correta.
A Por meio de um produto da linguagem PL/SQL chamado trigger, é possível dar nome
às áreas de trabalho utilizadas no Oracle e acessar a informação contida nessas áreas.
B Um package é um programa PL/SQL que pode ser acionado por uma aplicação, por
um trigger ou por uma ferramenta Oracle.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
153
195
Adquirido em @Xinyuu_bot - Telegram
C Uma stored procedure é um arquivo que agrupa, em um único local, funções, cursores,
outras stored procedures aninhadas e variáveis.
D O cursor é um programa PL/SQL armazenado no banco de dados que é executado
imediatamente antes ou após os comandos INSERT, UPDATE e DELETE.
E Com o uso da linguagem PL/SQL, é possível criar objetos de esquema como triggers,
stored procedures e packages.
Comentário. Analisado as alternativas, vemos na letra A que a definição de trigger não está
coerente com a descrição correta. Trigger é um objeto armazenado que dispara uma ação
mediante um evento.
Vejam que o examinador também errou a definição de package na alternativa B. Package é
uma forma de agrupar código PL/SQL, de acordo com um contexto.
Package é um arquivo que agrupa, em um único local, funções, cursores, outras stored
procedures aninhadas e variáveis. Não é uma stored procedure, como sugere a letra C.
Na alternativa D, temos uma descrição de um possível trigger, e não de um cursor.
Por fim, a letra E traz a nossa resposta. Saber usar PL/SQL nos ajuda a criar objetos de
esquema, como triggers, stored procedures e packages.
Gabarito: E
66. BANCA: CESPE ANO: 2010 ÓRGÃO: MPU PROVA: ANALISTA DO MPU - ANALISTA DE
INFORMÁTICA - BANCO DE DADOS
A respeito de PL/SQL, julgue os itens a seguir.
Um bloco de programa PL/SQL inclui partes bem distintas, como declaração (declaration) de
variáveis e objetos, módulo executável (executable) e módulo de exceções (exception).
Comentário: Vejam que a questão descreve os blocos presentes em um código PL/SQL.
Gabarito: C
67. BANCA: CESPE ANO: 2010 ÓRGÃO: MPU PROVA: ANALISTA DO MPU - ANALISTA DE
INFORMÁTICA - BANCO DE DADOS
A respeito de PL/SQL, julgue o item a seguir.
O trecho de programa em PL/SQL a seguir possibilita aumentar o valor da variável salary
em 15%, sempre que esta alcançar valor abaixo da variável media_salary.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
154
195
Adquirido em @Xinyuu_bot - Telegram
Comentário. Essa é a famosa questão mamão com açúcar. Vejam que o código apresenta uma
multiplicação do atributo salário por 1.1, ou seja, 10%, e não 15% como sugere o texto da
questão.
Gabarito: E
68. BANCA: CESPE ANO: 2004 ÓRGÃO: TRT - 10ª REGIÃO (DF E TO) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
DECLARE
a T1.e%TYPE;
b T1.f%TYPE;
CURSOR T1Cursor IS
SELECT e, f FROM T1 WHERE e < f FOR UPDATE;
BEGIN OPEN T1Cursor;
LOOP
FETCH T1Cursor INTO a, b;
EXIT WHEN T1Cursor%NOTFOUND;
DELETE FROM T1 WHERE CURRENT OF T1Cursor;
INSERT INTO T1 VALUES(b, a);
END LOOP;
CLOSE T1Cursor;
END; .
RUN;
A respeito da sintaxe e da semântica da linguagem PL/SQL, cursor, em ambiente
Oracle, e levando em consideração o código acima, julgue os itens subsequentes.
63 As variáveis a e b são declaradas de maneira que tenham tipos iguais aos tipos
de atributos e e f da relação T1.
64 Na definição do cursor T1Cursor a query SELECT-FROM-WHERE seleciona as
tuplas de T1 onde o primeiro componente é menor que o segundo. A declaração do
FOR UPDATE é obrigatória na declaração do cursor, mesmo que não haja nenhuma
mudança no mesmo.
65 O FETCH deve prover variáveis para cada componente da tupla recuperada,
sempre por meio de variáveis locais, como mostra o código indicado.
66 O %NOTFOUND depois do nome do cursoré verdadeiro exatamente quando o
FETCH, por meio do cursor, falha na busca de alguma tupla.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
155
195
Adquirido em @Xinyuu_bot - Telegram
67 O DELETE apaga a tupla inicial usando a condição especial WHERE CURRENT
do cursor T1Cursor.
Comentário. Na alternativa 63, é questionado se você detém o conhecimento a respeito
do uso correto da cláusula %TYPE. Quando utilizamos %TYPE, por exemplo, ‘a
T1.e%TYPE’, estamos afirmando que o atributo ou variável ‘a’ tem o mesmo tipo
definido para a coluna ‘e’ da tabela ‘T1’, o que torna a assertiva correta.
A questão 64 erra ao afirmar que FOR UPDATE é obrigatório na declaração de um
cursor. Vamos aproveitar a oportunidade para falar do FOR UPDATE em conjunto com
cursores.
O cursor cláusula FOR UPDATE é usado com um cursor somente quando você deseja
atualizar tabelas no banco de dados. Geralmente, quando você executa uma instrução
SELECT, você não está bloqueando todas as linhas. O objetivo de usar a cláusula FOR
UPDATE é bloquear as linhas das tabelas que você deseja atualizar, para que outro
usuário não possa executar uma atualização até você completar a sua atualização e
liberar o bloqueio. A próxima instrução COMMIT ou ROLLBACK libera o bloqueio.
A cláusula FOR UPDATE irá mudar a maneira pela qual o cursor opera em apenas alguns
aspectos. Quando você abre um cursor, todas as linhas que atendem aos critérios de
restrição são identificadas como parte do conjunto de ativo. Usando a cláusula FOR
UPDATE, você irá bloquear essas linhas que foram identificadas no conjunto ativo. Se a
cláusula FOR UPDATE é usada, as linhas não podem ser lidas a partir do cursor até que
um COMMIT tenha sido emitido. É importante, portanto, você considerar onde colocar
a instrução COMMIT.
Vimos, na aula anterior, que existem dois métodos de FECTH em um cursor. Eles
utilizam as seguintes sintaxes para os comandos:
FETCH cursor_name INTO PL/SQL
variables; FETCH cursor_name INTO
PL/SQL record;
Pelo exposto, a questão 65 também está incorreta.
Sobre a alternativa 66, vamos apresentar abaixo uma tabela com os atributos de um
cursor. Eles são usados para definir o resultado de uma operação com o cursor quando
o mesmo está aberto (o texto encontra-se em inglês por uma questão de necessidade
de lançamento da aula para o seu concurso).
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
156
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito C E E C E
69. BANCA: FCC ANO: 2008 ÓRGÃO: TRT - 2ª REGIÃO (SP) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
A linguagem PL/SQL, introduzida nos gerenciadores de banco de dados ORACLE,
A aumenta a capacidade não-procedural da SQL, oferecendo e combinando blocos de
construtores procedurais.
B constitui uma interface básica pela qual pode-se entrar e executar comandos SQL para
manipulações genéricas de um banco.
C trata-se de uma linguagem que identifica quais as informações necessárias e não
como buscá-las.
D tem os seus comandos executados pelo executor de SQL do Kernel.
E tem os seus comandos enviados para serem processados pelo SGBD um por vez.
Comentário. A linguagem PL/SQL é uma extensão à linguagem SQL, portanto todos os
comandos SQL podem ser utilizados em PL/SQL. PL/SQL é uma linguagem procedural e
estruturada, com hierarquia de comandos e fluxo linear de execução. Ele aumenta de fato a
capacidade do SQL por conta da inserção de novas estruturas de controle de fluxo. Isso torna a
alternativa A correta.
PL/SQL é uma extensão da linguagem SQL e não uma interface gráfica. Alguns programas
fornecem interface gráfica para uso do PL/SQL, como o SQL Developer. Logo, alternativa B é
incorreta.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
157
195
Adquirido em @Xinyuu_bot - Telegram
Gabarito: A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
158
195
Adquirido em @Xinyuu_bot - Telegram
LISTA DE QUESTÕES
1. FUNDATEC - ANC (PROCERGS)/PROCERGS/Desenvolvimento/Oracle PL SQL/2023
Considere o seguinte comando:
CREATE OR REPLACE PROCEDURE questao AS
BEGIN
FOR k IN (SELECT * FROM PESSOA)
LOOP
cont := cont+1;
DBMS_OUTPUT.PUT_LINE('NOME: '||k.NOME);
END LOOP;
END;
Analise as assertivas abaixo e assinale a alternativa correta.
I. A opção [OR REPLACE] é opcional na sintaxe da criação da procedure e irá sobrescrever
a procedure.
II. O comando LOOP não possui EXIT e nem EXIT WHEN, por isso será infinito.
III. A saída irá mostrar a lista de nomes da tabela PESSOA.
IV. A quantidade de vezes que o LOOP será executado é determinada pela quantidade de
tuplas da tabela PESSOA.
a) Todas estão corretas.
b) Todas estão incorretas.
c) Apenas II e III estão corretas.
d) Apenas III e IV estão corretas.
e) Apenas I, III e IV estão corretas.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
159
195
Adquirido em @Xinyuu_bot - Telegram
2. FUNDATEC - Ana Sist (BRDE)/BRDE/Administração de Banco de Dados/2023
Considere as tabelas criadas com os comandos SQL abaixo, e os comandos de inserção de
tuplas SQL (padrão SQL99 ou superior).
Create table A (pka int primary key, a1 integer);
Create table B (pkb int primary key, b1 integer);
Create table C (pkc int primary key, c1 integer);
insert into A values (1,10);
insert into A values (2, 10);
insert into A values (3, 2);
insert into A values (4, 3);
insert into B values (10,0);
insert into C values (100,0);
Suponha a criação dos gatilhos T1 e T2 definidos abaixo cujas cláusulas estão de acordo com
padrão, e cujo código disparado foi escrito conforme sintaxe PL/SQL (Oracle).
Create Trigger T1
Before delete on A
begin
Update B set b1 = b1 +
1;
end;
Create Trigger T2
After delete on A
for each row
begin
Update C set c1 = c1 +
1;
end;
Considere que os três comandos SQL de remoção de tuplas abaixo foram executados sem erro:
I. delete from A where a1>=10;
II. delete from A where a1<10;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
160
195
Adquirido em @Xinyuu_bot - Telegram
III. delete from A where a1 is null;
Finalmente, foram executadas as duas consultas SQL abaixo, cada qual retornando uma única
tupla:
(1) SELECT b1 FROM B;
(2) SELECT c1 FROM C;
Selecione a alternativa que representa, nesta ordem, o valor do atributo b1 resultante da
consulta (1), e o valor do atributo c1 resultante da consulta (2).
a) 2 – 2.
b) 2 – 3.
c) 2 – 4.
d) 3 – 2.
e) 3 – 4.
3. FUNDATEC - ANC (PROCERGS)/PROCERGS/Desenvolvimento/Oracle PL SQL/2023
Considere o seguinte comando:
CREATE SEQUENCE sequenciaquestao
START WITH 100
INCREMENT BY 2
NOCACHE
NOCYCLE;
Analise as assertivas abaixo e assinale a alternativa correta.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
161
195
Adquirido em @Xinyuu_bot - Telegram
I. No ORACLE, se forem omitidas as cláusulas CACHE e NOCACHE na criação da
SEQUENCE, o banco de dados irá fazer um CACHE de 20 sequencias por default.
II. Quando uma transação gerou e utilizou valores de uma SEQUENCE e a transação for
finalizada com ROOLBACK, os valores gerados para SEQUENCE também serão desfeitos
e ela voltará ao valor que tinha antes.
III. A primeira referência a sequenciaquestao.NEXTVAL retornará o valor 101.
a) Todas estão corretas.b) Todas estão incorretas.
c) Apenas I está correta.
d) Apenas II está correta.
e) Apenas III está correta.
4. FUNDATEC - ANC (PROCERGS)/PROCERGS/Desenvolvimento/Oracle PL SQL/2023
NVL e NVL2 são funções que ORACLE disponibiliza para serem utilizadas nas consultas.
Analise as assertivas abaixo e assinale a alternativa correta.
I. NVL2(E1,E2) especifica que se E1 for nulo, a função retornará E2, caso contrário,
retornará E1.
II. NVL(E1,E2,E3) especifica que se E1 for nulo, a função retornará E3, caso contrário,
retornará E2.
III. NVL e NVL2 são usadas quando o valor de um campo de uma tupla pode retornar
NULL.
a) Todas estão corretas.
b) Todas estão incorretas.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
162
195
Adquirido em @Xinyuu_bot - Telegram
c) Apenas I está correta.
d) Apenas II está correta.
e) Apenas III está correta.
5. FCC - TJ TRT18/TRT 18/Apoio Especializado/Tecnologia da Informação/2023
Considere a expressão PL/SQL de um banco de dados Oracle 19 aberto e funcionando
em condições ideais:
CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END
A função equivalente a essa expressão é:
a) COALESCE(expr1, expr2)
b) CHR(expr1, expr2)
c) COMPOSE(expr1, expr2)
d) COLLATION(expr1, expr2)
e) COLLECT(expr1, expr2)
6. VUNESP - Ana (EPC)/EPC/Sistemas/2023
O PL/SQL comporta diversas expressões em seus comandos. Há algumas expressões que
necessitam utilizar os chamados delimitadores. Em particular, os delimitadores de
concatenação e de exponenciação são, respectivamente,
a) & e %
b) || e #
c) ** e !
d) “ “ e &
e) || e **
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
163
195
Adquirido em @Xinyuu_bot - Telegram
7. VUNESP - Ana (EPC)/EPC/Sistemas/2023
Considere a seguinte tabela de um banco de dados relacional:
Produto (ID_Prod, Nome, Estoque)
Considere que previamente foi criada uma variável denominada item, do tipo caractere,
assim como o atributo Nome. O comando do PL/SQL para atribuir a essa variável o nome do
produto de ID igual a 200 é:
a) item = SELECT Nome
FROM Produto
WHERE ID_Prod = 200;
b) MAKE item AS SELECT Nome
FROM Produto
WHERE ID_Prod = 200;
c) SELECT Nome INTO item
FROM Produto
WHERE ID_Prod = 200;
d) MAKE Nome INTO item
FROM Produto
WHERE ID_Prod = 200;
e) INCLUDE IN item Nome
FROM Produto
WHERE ID_Prod = 200;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
164
195
Adquirido em @Xinyuu_bot - Telegram
8. VUNESP - ADP (DPE SP)/DPE SP/Analista Desenvolvedor/2023
O comando da linguagem PL/SQL (utilizada no Sistema Gerenciador de Bancos de Dados
Oracle 21c) para declarar uma constante tem a seguinte composição:
DECLARE
Comando
...........
O conteúdo a ser inserido em Comando para que seja criada uma constante denominada
“total”, do tipo inteiro, com o valor 200, é:
a) CONSTANT INTEGER total = 200;
b) INTEGER total OF TYPE CONSTANT←← 200;
c) INTEGER CONSTANT total := 200;
d) total OF TYPE CONSTANT INT = 200;
e) total CONSTANT INTEGER := 200;
9. VUNESP - ATI (TJ RS)/TJ RS/Análise de Sistemas/2023
Segundo a linguagem PL/SQL utilizada pelo sistema gerenciador de bancos de dados
Oracle (21c), a forma de se declararem comentários de uma linha, em meio a um código, é:
a) - - Comentário utilizado no PL/SQL
b) / / Comentário utilizado no PL/SQL
c) % % Comentário utilizado no PL/SQL
d) # # Comentário utilizado no PL/SQL
e) $ $ Comentário utilizado no PL/SQL
10.VUNESP - ADP (DPE SP)/DPE SP/Analista Desenvolvedor/2023
Considere a linguagem PL/SQL utilizada no Sistema Gerenciador de Bancos de Dados
Oracle 21c. Suponha que tenha sido criada uma variável cuja declaração limite seu tamanho
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
165
195
Adquirido em @Xinyuu_bot - Telegram
a 3 caracteres. Se houver a tentativa de atribuir um valor com mais de 3 caracteres a essa
variável, ocorrerá
a) a geração de uma mensagem de aviso para que o usuário redefina o valor a ser
atribuído.
b) a geração de uma mensagem de erro.
c) a inserção do valor Null, em lugar do valor com mais de 3 caracteres.
d) um aumento automático desse tamanho máximo, acompanhado de uma mensagem de
aviso.
e) um corte do número de caracteres desse valor, até atingir 3 caracteres.
11.VUNESP - Ana SJ (TJM SP)/TJM SP/2023
O sistema gerenciador de banco de dados Oracle 21c utiliza, para acesso ao banco de
dados, a linguagem PL/ SQL. Tal linguagem oferece diversos operadores para indicar
desigualdade entre valores.
Assinale a alternativa que apresenta duas opções para tais operadores de desigualdade.
a) <> e ^=.
b) >> e */.
c) || e ^%.
d) << e **.
e) := e ==.
12.CEBRASPE (CESPE) - Ana (MPE RO)/MPE RO/Sistemas/2023
Sabendo que o Oracle DataBase 21C oferece um tipo de dado nativo com suporte a JSON,
assinale a opção que contém o script de criação de uma tabela no Oracle DataBase 21C com
esse tipo de dado.
a) CREATE TABLE processo
(
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
166
195
Adquirido em @Xinyuu_bot - Telegram
numero INTEGER PRIMARY KEY,
desc_processo BLOB
);
b) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo JSON
);
c) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo JSON_TRANSFORM
);
d) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo FLOAT
);
e) CREATE TABLE processo
(
numero INTEGER PRIMARY KEY,
desc_processo TIMESTAMP
);
13.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Auditoria e Fiscalização)/2018
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
167
195
Adquirido em @Xinyuu_bot - Telegram
O Auditor digitou um comando que exibiu os dados abaixo.
O comando digitado foi
a. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, SVG(ip.qtdItePed * pro.PreUnitPro) as "Total" FROM
Produto pro, ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed
<=3 ORDER BY ip.idPed;
b. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro OR ip.idPed <=3 ORDER BY
ip.idPed;
c. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
d. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro && ip.idPed <3 ORDER BY
ip.idPed;
e. SELECT idPed, idItePed, idPro, nomePro, qtdItePed, PreUnitPro, (ip.qtdItePed *
pro.PreUnitPro) as "Total" FROM Produto, ItemPedido WHERE ip.idPro = pro.idPro AND
ip.idPed <=3 ORDER BY ip.idPed;
14.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Auditoria e Fiscalização)/2018
O Auditor digitou um comando que exibiu os dados abaixo.
Se o Auditor usasse join, o comando correto para exibir os dados seria
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
168
195
Adquirido em @Xinyuu_bot - Telegram
a. SELECT ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed* pro.PreUnitPro) as Total FROM Produto pro
JOIN ItemPedido ip ON ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
b. SELECT JOIN ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
c. JOIN ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total ON Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
d. SELECT idPed, idItePed, dPro, nomePro, qtdItePed, reUnitPro, (qtdItePed *
PreUnitPro) as Total FROM Produto pro JOIN ItemPedido ip WHERE
ItemProduto.idPro = Produto.idPro AND ItemProduto.idPed <=3 ORDER BY
idPed;
e. JOIN ip.idPed, ip.idItePed, ip.idPro, pro.nomePro, ip.qtdItePed,
pro.PreUnitPro, (ip.qtdItePed * pro.PreUnitPro) as Total FROM Produto pro,
ItemPedido ip WHERE ip.idPro = pro.idPro AND ip.idPed <=3 ORDER BY
ip.idPed;
15.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Auditoria e Fiscalização)/2018
Para calcular o número de produtos com nomes que terminam com a letra B, o Auditor
testou os comandos abaixo
I. SELECT COUNT(nomePro) FROM Produto WHERE nomePro BEGIN '%B';
II. SELECT COUNT(*) FROM PRODUTO WHERE SUBSTR(nomePro, -1)='B';
III. SELECT COUNT(*) FROM Produto WHERE nomePro LIKE '%B';
IV. SELECT COUNT(nomePro) FROM Produto WHERE SUBSTR(nomePro, 0)='B';
Mostrará o resultado desejado o que consta APENAS em
(A) II e III.
(B) III.
(C) I e IV.
(D) III e IV.
(E) I e II.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
169
195
Adquirido em @Xinyuu_bot - Telegram
16.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Um profissional de TI deseja utilizar algumas funções do Oracle Database 12c para:
I. Remover todos os caracteres especificados do começo ou do final de uma string.
II. Obter a localização de uma substring em uma string.
Para tanto, ele deve usar, respectivamente, as funções
(A) Lpad e Instr.
(B) Lpad e Initcap.
(C) Trim e Instr.
(D) Chr e Instr.
(E) Chr e Initcap.
17.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Função de acesso a dados disponibilizada no Oracle Database 12c, cujo objetivo é
minimizar a leitura de dados desnecessários, melhorando a performance de acesso a
tabelas com muitos registros e que pode ser utilizada como alternativa ao select
count(distinct). Trata-se de
(A) APPROXCOUNT(DISTINCT).
(B) MAX_COUNT_DISTINCT.
(C) MAXCOUNT(DISTINCT).
(D) COUNT_DISTINCT_APPROACH.
(E) APPROX_COUNT_DISTINCT.
18.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
A troca de contexto é a ocorrência de chaveamento entre a engine SQL e a engine PL/SQL
durante a execução de queries ou blocos PL/SQL. Essa troca é invocada sempre que, dentro
de um bloco PL/SQL, executa-se uma query ou um comando DML.
Se executados isoladamente, os comandos INSERT, DELETE ou UPDATE, por exemplo,
costumam ter pouco ou mesmo nenhum impacto na performance, mas quando
executados em loops, o efeito das trocas de contexto se torna cumulativo e o prejuízo
na performance do procedimento se torna bem evidente.
Para evitar esse prejuízo, o Oracle 11g implementa um comando cujo objetivo é enviar
ao servidor um lote de comandos DML de uma única vez, utilizando apenas uma troca
de contexto. Trata-se do
a. LOOPALL.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
170
195
Adquirido em @Xinyuu_bot - Telegram
b. FORNEXT.
c. FETCH FIRST.
d. FORALL.
e. MAXLOOP.
19.BANCA: FCC Sefaz/SC - Auditor-Fiscal da Receita Estadual (Tecnologia da
Informação)/2018
Em um Oracle Database, um profissional de TI deseja criar uma trigger chamada
Atualiza_salario_func, com o objetivo de exibir as diferenças entre o novo
(NEW.salarioFunc) e o antigo salário (OLD.salarioFunc) constantes da tabela de
funcionários. Para tanto, ele escreveu o seguinte código:
CREATE TRIGGER
Atualiza_salario_func
BEFORE I ON II
FOR EACH ROW
WHEN (NEW.CODFUNC > 0)
DECLARE
diferenca_salario
number; BEGIN
diferenca_salario := :NEW.salarioFunc - :OLD.salarioFunc;
dbms_output.put('Salário antigo:' || :OLD.salarioFunc);
dbms_output.put('Salário novo:' || :NEW.salarioFunc);
dbms_output.put_line(' A diferença de salário foi de: ' ||
diferenca_salario); END;
/
As lacunas I e II devem especificar, correta e respectivamente, os elementos genéricos
a. triggering_event e table_name.
b. condition e database_name.
c. triggering_event e column_name.
d. column_event e table_name.
e. row_event e column_name.
20.Ano: 2017 Banca: FGV Órgão: Alerj Cargo: Analista de Tecnologia da Informação Q. 49
Observe a instrução SQL a seguir, que representa uma consulta à tabela "TB_Produto"
de uma instância de banco de dados Oracle 11g.
SELECT
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
171
195
Adquirido em @Xinyuu_bot - Telegram
desc_prod
FROM
TB_Produto
WHERE to_char(data_saida,'YYYY-MM-DD') = '2016-01-04';
A consulta lista a descrição dos produtos que tiveram data de saída do estoque em 04
de Janeiro de 2016. A coluna que armazena a data de saída do produto não é chave
primária. Visando melhorar o desempenho das consultas à coluna “data_saida”, o
Administrador de Banco de Dados deve criar um índice do tipo:
a. B-Tree;
b. Function-Based;
c. Bitmap;
d. Hash;
e. Unique.
21.Ano: 2018 Banca: CESPE Órgão: STM Cargo: Programação de Sistemas
Julgue os próximos itens, que dizem respeito aos SGBDs Oracle, MySQL e PostgreSQL.
66 Em um pacote (package) no SGBD Oracle, a implementação dos métodos
juntamente com quaisquer métodos privados e atributos permanece oculta no corpo do
pacote.
67 Uma sequência (sequence) Oracle pode gerar uma série de números distintos,
tanto na ordem crescente quanto na decrescente.
70 No SGBD Oracle, uma coluna com restrição do tipo UNIQUE pode ser declarada
como NOT NULL.
22.Ano: 2018 Banca: CESPE Órgão: STM Cargo: Programação de Sistemas Questão: 71 a 75
Considerando as informações apresentadas na figura precedente (captura de tela de
uma sessão do SQL*Plus), relativas a comandos SQL, julgue os itens que se seguem.
71 A instrução contida na linha 3 possibilita a inserção de informações em um buffer
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
172
195
Adquirido em @Xinyuu_bot - Telegram
que poderá ser lido por outro procedimento ou pacote.
72 Empregada de forma correta no código em questão, pois se relaciona a um
bloco anônimo de PL/SQL, a variável &numero_proc, na linha 2, não pode ser utilizada
em comandos DML.
73 O código em tela não criará nenhum objeto no banco de dados, como, por
exemplo, procedure, triggers, packages e functions.
74 Ao se fechar a sessão do SQL*Plus na qual foi capturada a tela em apreço, a
variável definida na linha 2 persistirá no banco de dados.
75 Na linha 2, o trecho &numero_proc constitui uma variável do tipo bind.
23.BANCA: FCC ANO: 2017 ÓRGÃO: TRF - 5ª REGIÃO PROVA: ANALISTA JUDICIÁRIO -
INFORMÁTICA
[42] Um Analista de Sistemas foi solicitado a criar uma tabela chamada processo em um
banco de dados Oracle aberto e em condições ideais. Nesta tabela, se nenhum valor
for fornecido para o campo data_abertura, quando se utilizar a instrução INSERT, a data
do sistema deve ser automaticamente inserida. Para fazer isso, o Analista deve utilizar a
instrução CREATE TABLE processo(processo_no NUMBER(10), data_abertura
a) DATE DEFAULT SYSDATE);b) DATETIME DEFAULT SYSTEMDATE);
c) DATE WITH SYSDATE AS DEFAULT);
d) DATE DEFAULTVALUE SYSDATE);
e) DATE SYSDATE('default'));
24.BANCA: FCC ANO: 2017 ÓRGÃO: TST PROVA: ANALISTA JUDICIÁRIO – ANÁLISE DE
SISTEMAS
[33] Para atualizar as linhas da tabela backup_employees de forma que corresponda à
tabela employees, um Analista de Sistemas utilizou a instrução abaixo em um banco de
dados Oracle aberto e em condições ideais.
MERGE INTO backup_employees bac
..I.. (SELECT * FROM employees) emp
ON (bac.employee_id = emp.employee_id)
..II..
UPDAT
E SET
bac.name = emp.name,
bac.job_id =
emp.job_id, bac.salary
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
173
195
Adquirido em @Xinyuu_bot - Telegram
= emp.salary*1.5,
bac.commission = emp.commission,
DELETE WHERE (emp.commission IS NOT NULL)
..III..
INSERT VALUES(emp.employee_id, emp.name, emp.job_id,
emp.salary, emp.commission);
Para que a sintaxe da instrução esteja correta, as lacunas I, II e III devem ser preenchidas,
correta e respectivamente, por
a) WITH − WHEN FOUND THEN − WHEN NOT FOUND THEN
b) FROM − IF FOUND THEN − ELSE
c) WITH − IF MATCHED THEN − OTHERWISE
d) USING − WHEN MATCHED THEN − WHEN NOT MATCHED THEN
e) USING − IF FOUND THEN − IF NOT FOUND THEN
25.BANCA: FCC ANO: 2017 ÓRGÃO: DPE-RS PROVA: ANALISTA – BANCO DE DADOS
[46] Os comandos do sistema gerenciador de banco de dados Oracle 11g que
permitem paralisar e retomar operações de entrada/saída (arquivos de dados e de
controle, por exemplo), assim como consultas são, respectivamente, ALTER SYSTEM
a) SUSPEND e RESUME.
b) CLOSE e OPEN.
c) QUIT e REOPEN.
d) OUT e IN.
e) RESET e SET.
26.BANCA: FCC ANO: 2017 ÓRGÃO: TRE-PR PROVA: ANALISTA JUDICIÁRIO – ANÁLISE
DE SISTEMAS
[40] Um Database Administrator − DBA Oracle deseja conceder à usuária Maria os
privilégios para criar sessão de conexão no banco de dados e criar tabelas, permitindo
ainda que ela possa estender seus privilégios para outros usuários. O comando que o
DBA deverá utilizar é:
a) GRANT CREATE SESSION, CREATE TABLE TO Maria WITH RESTRICTED OPTION;
b) GRANT CREATE SESSION, CREATE TABLE TO Maria WITH ADMIN OPTION;
c) GRANT PRIVILEGE CREATE SESSION, CREATE TABLE TO Maria WITH GRANT OPTION;
d) GRANT ADMIN CREATE SESSION, CREATE TABLE TO Maria;
e) GRANT CREATE SESSION, CREATE TABLE TO Maria WITH GRANT OPTION;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
174
195
Adquirido em @Xinyuu_bot - Telegram
27.BANCA: FCC ANO: 2017 ÓRGÃO: DPE-RS PROVA: ANALISTA – BANCO DE DADOS
[38] A função básica de um gatilho ou trigger, em um banco de dados relacional, é
a) verificar o grau de normalização de todas as tabelas de um banco de dados,
assegurando-se do respeito às formas normais desejadas.
b) realizar a compilação de todos comandos SQL presentes no banco de dados e
armazenar os comandos compilados.
c) verificar a correção das definições presentes no dicionário de dados, apontando
eventuais erros de semântica.
d) executar comandos previamente declarados, quando da ocorrência de um evento no
banco de dados, também especificado em sua definição.
e) verificar a eficácia da política de atribuição de senhas implementada no banco de
dados, determinando seu grau de eficácia.
28.BANCA: FCC ANO: 2016 ÓRGÃO: TRF - 3ª REGIÃO PROVA: TÉCNICO JUDICIÁRIO -
INFORMÁTICA
[64] Para responder a questão, considere as informações abaixo.
O super-usuário root do banco de dados deseja conceder permissão para que o usuário
Paulo possa alterar os dados dos registros contidos na tabela Processo. Para isso ele
deve digitar a instrução
a) ADD PERMISSION TO Paulo FOR update ON Processo;
b) GRANT update ON Processo TO Paulo;
c) CREATE ROLE update ON Processo TO Paulo WITH GRANT OPTION;
d) GRANT OPTION update FROM Processo TO Paulo;
e) CREATE ROLE ON Processo FOR update TO Paulo;
29.BANCA: FCC ANO: 2016 ÓRGÃO: TRT - 14ª REGIÃO (RO E AC) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
[35] No Oracle 11g há uma instrução que permite atualizar, inserir ou remover linhas
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
175
195
Adquirido em @Xinyuu_bot - Telegram
condicionalmente em uma tabela, evitando o uso de várias instruções DML. Esta
instrução é especialmente útil nas aplicações em ambientes de Data Warehouse, nas
quais é preciso trabalhar com dados provenientes de várias origens. Trata-se da
instrução
a) SWITCH.
b) TRUNCATE.
c) MERGE.
d) IFCOMMAND.
e) EXEC.
30.BANCA: FCC ANO:2016 ÓRGÃO: TRT - 23ª REGIÃO (MT) PROVA: ANALISTA
JUDICIÁRIO – TECNOLOGIA DA INFORMAÇÃO
[30] Considere a instrução abaixo, digitada em um banco de dados Oracle 11g que
possui a tabela Produtos, aberta e em condições ideais, contendo os campos
NomeProduto − varchar2(50), PrecoUnitario − number(5,2), UnidadesEmEstoque − integer,
UnidadesNoPedido − integer:
SELECT NomeProduto, PrecoUnitario*(UnidadesEmEstoque+...l...
(UnidadesNoPedido,0)) FROM Produtos;
Para retornar 0 se o valor de UnidadesNoPedido for nulo, a lacuna I deverá ser corretamente
preenchida com
a) IIF
b) IFNULL
c) NVL
d) COALESCE
e) ISNULL
31.BANCA: FCC ANO: 2016 ÓRGÃO: TRT - 23ª REGIÃO (MT) PROVA: ANALISTA
JUDICIÁRIO – TECNOLOGIA DA INFORMAÇÃO
[33] Após um DBA criar um usuário executando a instrução CREATE USER Paulo
IDENTIFIED BY abcd;, o usuário Paulo ainda não tem nenhum privilégio. Para conceder
a ele o privilégio de sistema para criar tabelas e views o DBA deve digitar no Oracle
11g, a instrução
a) CREATE PERMISSION create table, create view TO Paulo;
b) CREATE GRANT table, view TO Paulo;
c) GRANT create table, create view TO Paulo;
d) CREATE ROLE create table, create view TO Paulo;
e) GRANT OPTION create table AND create view TO Paulo;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
176
195
Adquirido em @Xinyuu_bot - Telegram
32.BANCA: FCC - Analista Judiciário (TRT 24ª Região)/Apoio Especializado/Tecnologia da
Informação/2017
Uma das atribuições do administrador de banco de dados Oracle é conceder
permissões de acesso a usuários do banco de dados. Para isso pode ser utilizada, por
exemplo, a instrução abaixo.
GRANT select ON TRT.employees TO paulo WITH ..I.. ;
Esta instrução concede privilégio de SELECT na tabela employees do esquema TRT ao
usuário paulo. Para este usuário poder estender seus privilégios de objeto para outros
usuários, deve ser incluída na lacuna I
a) PERMISSION CASCADE
b) GRANT OPTION
c) GRANT PRIVILEGE
d) EXTEND ROLE
e) GRANT CASCADE
33.BANCA: FCC - Técnico Judiciário (TRT 24ª Região)/Apoio Especializado/Tecnologia da
Informação/2017
Em um banco de dados Oracle aberto e em condições ideais há uma tabela chamada
funcionario com os campos idFuncionario (inteiro − primary key), nome (cadeia de
caracteres) e salario (real). Para exibir o nome e o salário de todos os funcionários cujo
valor de salário esteja fora do intervalo de 1000 a 12000 utiliza-se a instrução SQL
SELECT nome, salario FROM funcionario WHERE
a) salario<1000 AND salario>12000;
b) salario NOT BETWEEN 1000 OR 12000;
c) 1000>salario>12000;
d) salario NOT BETWEEN 1000 AND 12000;
e) salario BETWEEN 1000 AND 12000;
34.BANCA: FCC - Analista Judiciário (TRF 5ª Região)/Apoio Especializado/Informática -
Desenvolvimento/2017
O Departamento de Recursos Humanos de uma instituição solicitou ao Analista de
Sistemas um relatório mostrando o nome do funcionário e o salário acrescido de 13.5%.
O salário deverá ser expresso como número inteiro e com a seguinte legenda de
coluna: Salário Reajustado.
Considerando que a tabela funcionarios possui os campos nome e salario,para gerar o
relatório o Analista deverá usar, em um banco de dados Oracle aberto e em condições
ideais, a instrução
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
177
195
Adquirido em @Xinyuu_bot - Telegram
a) SELECT nome, TOINT(ROUND(salario * 1.135)) 'Salário Reajustado ' FROM
funcionarios;
b) SELECT nome, INTEGER(salario * 1.135) 'Salário Reajustado' FROM funcionarios;
c) SELECT nome, ROUND(salario * 1.135, 0) "Salário Reajustado" FROM funcionarios;
d) SELECT nome, TRUNCATE(salario + 13.5%, 0) "Salário Reajustado" FROM
funcionarios;
e) SELECT FROM funcionarios (nome, ROUND(salario * 1.135, 0) "Salário Reajustado");
35.BANCA: FCC - Analista Judiciário (TRT 23ª Região)/Apoio Especializado/Tecnologia da
Informação/2016
Após um DBA criar um usuário executando a instrução CREATE USER Paulo IDENTIFIED
BY abcd;, o usuário Paulo ainda não tem nenhum privilégio. Para conceder a ele o
privilégio de sistema para criar tabelas e views o DBA deve digitar no Oracle 11g, a
instrução
a) CREATE PERMISSION create table, create view TO Paulo;
b) CREATE GRANT table, view TO Paulo;
c) GRANT create table, create view TO Paulo;
d) CREATE ROLE create table, create view TO Paulo;
e) GRANT OPTION create table AND create view TO Paulo;
36.BANCA: FCC - Analista Judiciário (TRT 14ª Região)/Apoio Especializado/Tecnologia da
Informação/2016
Uma tabela de um banco de dados Oracle chamada funcionarios possui os campos id,
nome e salario. Um Analista deseja realizar uma consulta nesta tabela, que exiba o id, o
nome dos funcionários, o salário e o salário acrescido de 12,5%. O salário com o
acréscimo deverá ser mostrado como um número inteiro e a coluna deverá ser nomeada
Salário Reajustado.
A instrução SQL que deverá ser digitada pelo Analista é
a) SELECT id, nome, salario, TO_INT(salario * 1.125,0) AS "Salário Reajustado"
FROM funcionarios;
b) SELECT id, nome, salario, ARRED(salario * 1.125) AS "Salário Reajustado"
FROM funcionarios;
c) SELECT id, nome, salario, ROUND(salario * 1.125, 0) "Salário Reajustado"
FROM funcionarios;
d) SELECT id, nome, salario, TRUNC(salario * 1.125) 'Salário Reajustado' FROM
funcionarios;
e) SELECT id, nome, salario, TO_INTEGER(salario * 1.125) AS "Salário
Reajustado" FROM funcionarios;
37.BANCA: FCC - Analista Judiciário (TRT 14ª Região)/Apoio Especializado/Tecnologia da
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
178
195
Adquirido em @Xinyuu_bot - Telegram
Informação/2016
No Oracle 11g há uma instrução que permite atualizar, inserir ou remover linhas
condicionalmente em uma tabela, evitando o uso de várias instruções DML. Esta
instrução é especialmente útil nas aplicações em ambientes de Data Warehouse, nas
quais é preciso trabalhar com dados provenientes de várias origens. Trata-se da
instrução
a) SWITCH.
b) TRUNCATE.
c) MERGE.
d) IFCOMMAND.
e) EXEC.
38.BANCA: FCC - Técnico da Receita Estadual (SEFAZ MA)/Tecnologia da Informação/2016
O Oracle fornece um comando que é capaz de atualizar, inserir ou remover dados de modo
condicional em uma tabela de banco de dados. Trata-se do comando
a) IFOPERATION.
b) TRUNCATE.
c) MERGE.
d) IFCONSTRAINT.
e) PURGE.
39.BANCA: FCC - Analista Tecnológico (PRODATER)/Analista de Sistemas/2016
Em um banco de dados Oracle, considere o trigger checar_salario_trigger na tabela
funcionarios, que é acionado antes de uma operação INSERT ou UPDATE em cada
linha, chamando o procedure checar_salario.
CREATE OR REPLACE TRIGGER checar_salario_trigger
...I... id, salario
ON funcionarios
..I..I..
BEGIN
checar_salario(:new.id, :new.salario);
END;
/
SHOW ERRORS
As lacunas I e II devem ser preenchidas, correta e respectivamente, com
a) BEFORE INSERT OR UPDATE OF − FOR EACH ROW
b) PREVIOUS INSERT OR UPDATE OF – WHILE ROW>0
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
179
195
Adquirido em @Xinyuu_bot - Telegram
c) BEFORE INSERT OR UPDATE ON – WHILE ROW.NEXT()
d) BEFORE INSERT OR UPDATE ON − FOR ROW; ROW>0; ROW++
e) PREVIOUS INSERT OR UPDATE ON − FOR EACH ROW
40.BANCA: FCC - Analista de Tecnologia da Informação (CREMESP)/Administração de
Banco de Dados/2016
Considere, em Oracle, a sintaxe de trigger abaixo:
CREATE [OR REPLACE] TRIGGER nome_trigger
momento
evento1 [OR evento2 OR evento3]
ON nome_objeto
[REFERENCING OLD AS old | NEW AS new]
FOR EACH ROW
WHEN (condição)]]
DECLARE]
BEGIN
... corpo_trigger
[EXCEPTION . . .]
END [nome_trigger];
O parâmetro momento pode assumir os valores BEFORE, AFTER ou
a) INSTANT ON.
b) AWHILE.
c) LATER.
d) INSTEAD OF.
e) NOW ON.
41.BANCA: FCC - Analista de Tecnologia da Informação (CREMESP)/Administração de
Banco de Dados/2016
Considere as seguintes afirmações sobre triggers em Oracle.
I.No Oracle 11g é possível criar um trigger desativado e depois ativá-lo somente
quando se souber que ele será compilado com sucesso.
II. Os triggers são acionados implicitamente pelo Oracle quando um evento de
trigger ocorre, não importando qual usuário está conectado ou qual aplicação está
sendo usada.
III. O trigger de linha é disparado uma vez para o evento de trigger, mesmo que
nenhuma linha seja afetada.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
180
195
Adquirido em @Xinyuu_bot - Telegram
IV. Podem ser criados triggers que sejam acionados sempre que instruções DDL
(CREATE, ALTER ou DROP) ocorram no banco de dados.
Está correto o que se afirma APENAS em
a) II e IV.
b) I e III.
c) I, II e IV.
d) III e IV.
e) II e III.
42. BANCA: FCC - Analista de Tecnologia da Informação (CREMESP)/Administração de
Banco de Dados/2016
Considere a função a seguir, criada no Oracle 11g.
CREATE OR REPLACE FUNCTION func(
p1 IN NUMBER DEFAULT 5,
p2 IN NUMBER DEFAULT 5)
RETURN NUMBER IS
resultado number;
BEGIN
resultado:= p1 + (p2 * 2);
RETURN resultado;
END func;
/
É correto afirmar que
a) uma forma correta de chamar a função é por meio da instrução SELECT func(p2
=> 10) FROM DUAL;
b) ao chamar a função será exibida a mensagem de erro ORA-00907: missing right
parenthesis.
c) ao chamar a função utilizando a instrução RUN SCRIPT func(null,10) será exibido o
valor 20.
d) a função pode ser chamada corretamente por meio da instrução SELECT func(null,10)
FROM ORACLE_SYS_DB;
e) a função está incorreta, pois os parâmetros p1 e p2 da função não suportam a
diretiva DEFAULT.
43. BANCA: FCC - Analista (PGE MT)/Analista de Sistemas/2016
Um Analista de Sistemas que utiliza PL/SQL em um banco de dados Oracle afirma,
corretamente, que
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
181
195
Adquirido em @Xinyuu_bot - Telegram
a) se uma chamada recursiva a um procedure estiver dentro de um cursor FOR loop,
cada cursor é aberto em cada chamada, podendo estourar o limite OPEN_LOOPS
mas o mesmo não ocorre se o cursor estiver entre um OPEN e CLOSE.
b) podem ser utilizadas chamadas a subprogramas externos escritos em Java,
embora haja a restrição de um Java stored procedure somente poder ser
chamado de dentro de um package.
c) um trigger pode ter dois estados: enabled ou disabled e, por default, é criado no
estado enabled. Para criar um trigger no estado disabled deve-se usar a cláusula
DISABLE na declaração CREATE TRIGGER.
d) packages podem ter duas partes: uma especificação e um corpo. A especificação
define as queries para os cursores e o código dos subprogramas, já o corpo
define a interface do package.
e) em PL/SQL uma condição de erro é chamadaexceção. As exceções são somente
internas, geradas pelo run-time system. Todas possuem nomes predefinidos como
DIVIDE_ZERO e ERROR_STORAGE.
44. BANCA: FCC - Analista Ministerial (MPE PB)/Analista de Sistemas/Administrador de
Banco de Dados/2015
Para controlar a lógica de transações no Oracle utilizam-se as instruções COMMIT e
ROLLBACK. Sobre a instrução COMMIT é correto afirmar:
a) Antes de executar um COMMIT, o usuário não pode revisar o resultado das
operações de manipulações de dados por meio de consultas às tabelas.
b) Após executar um COMMIT, o estado anterior dos dados é perdido
permanentemente e todos os usuários com permissão adequada poderão exibir
os resultados das transações realizadas antes do COMMIT.
c) Antes de um COMMIT ser executado, outros usuários poderão exibir os
resultados das operações de manipulação de dados feitas pelo usuário atual.
d) Após executar um COMMIT, as linhas afetadas são bloqueadas e não estarão
disponíveis para outros usuários executarem novas alterações nos dados.
e) Antes de executar um COMMIT, as linhas afetadas pelas alterações feitas nos
dados pelo usuário atual estarão liberadas, de forma que outros usuários possam
alterar os dados destas linhas.
45. BANCA: FCC - Analista Ministerial (MPE PB)/Analista de Sistemas/Administrador de
Banco de Dados/2015
No Oracle, uma função é um bloco PL/SQL nomeado que retorna um valor. A função a
seguir, calcula um imposto sobre o salário com base em uma alíquota fixa simples de 27%.
CREATE OR REPLACE FUNCTION imposto(valor IN
NUMBER) RETURN NUMBER IS
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
182
195
Adquirido em @Xinyuu_bot - Telegram
BEGIN
RETURN (valor *
0.27); END imposto;
/
Considere a existência de um ambiente Oracle com SQL*Plus em condições ideais, com
banco de dados, tabelas, campos e valores existentes. Considere também que, nos
casos necessários, foi executado o comando SET SERVEROUTPUT ON antes das
instruções abaixo.
I. SELECT nome, salario,
imposto(salario) FROM Funcionario
WHERE idDepartamento = 5;
II. EXECUTE dbms_output.put_line(imposto(10000));
III. VARIABLE salario
NUMBER; EXECUTE :salario :=
imposto(10000);
IV. DECLARE imp
NUMBER; BEGIN
imp = imposto(10000);
DBMS_OUTPUT.PUT('O imposto é: '||
imp);
END;
Para chamar a função imposto, está correto o que consta APENAS em
a) III e IV.
b) I, II e III.
c) II e III.
d) I e III.
e) II e IV.
46. BANCA: FCC - Analista Judiciário (TRE AP)/Apoio Especializado/Análise de Sistemas/2015
Após constatar que um objeto de um banco de dados Oracle 11g não está disponível
no momento por causa de uma falha na conexão de rede, um Analista de Sistemas,
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
183
195
Adquirido em @Xinyuu_bot - Telegram
portando o devido privilégio, deseja desativar um trigger chamado insere_ordem, que
faz referência a este objeto. Para isso deve digitar o comando
a) ALTER TRIGGER insere_ordem DISABLE;
b) DISABLE TRIGGER insere_ordem;
c) ALTER TRIGGER insere_ordem OFF;
d) DISABLE ON TRIGGER insere_ordem;
e) STOP TRIGGER insere_ordem;
47. BANCA: FCC - Analista Judiciário (TRE AP)/Apoio Especializado/Análise de Sistemas/2015
Considere um banco de dados Oracle 11g aberto e em condições ideais que possui as tabelas
e campos presentes na instrução PL/SQL:
SELECT e.sobrenome, e.id_departamento,
d.nome_departamento FROM empregados e, departamentos d
WHERE ..I.. ;
Usando join externa, para que a consulta recupere todas as linhas na tabela
empregados, mesmo que não haja correspondência na tabela departamentos, a lacuna I
deve ser preenchida por
a) e.id_departamento(+) = d.id_departamento
b) d.id_departamento = e.id_departamento
c) d.id_departamento = e.id_departamento RIGHT JOIN ON
d) e.id_departamento = d.id_departamento(+)
e) e.id_departamento = d.id_departamento
48. BANCA: FCC - Analista Judiciário (TRT 16ª Região)/Apoio Especializado/Tecnologia da
Informação/2014
Em um banco de dados Oracle, um usuário poderá conceder qualquer privilégio de
objeto, sobre qualquer objeto de esquema que possua, para qualquer outro usuário ou
função. Para conceder, por exemplo, a permissão de insert e select na tabela cliente
para o usuário mac30, de forma que ele possa conceder estas permissões a outros
usuários sobre esta tabela, utiliza- se a instrução
a) GRANT insert, select ON cliente TO mac30 WITH GRANT OPTION;
b) CREATE ROLE insert, select ON cliente TO mac30 WITH LICENCE ON;
c) GRANT ADD insert, select FROM cliente TO mac30 WITH GRANT OPTION;
d) GRANT insert, select FROM cliente TO mac30 WITH GRANT ON;
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
184
195
Adquirido em @Xinyuu_bot - Telegram
e) GRANT insert, select FROM cliente TO mac30 WITH GRANT;
49. BANCA: FCC - Analista Judiciário (TRT 13ª Região)/Apoio Especializado/Tecnologia da
Informação/2014
Em um ambiente de banco de dados Oracle 11g ideal, foram criadas duas tabelas por meio
das instruções PL/SQL a seguir:
CREATE TABLE orders (order_id NUMBER PRIMARY KEY, line_items_count NUMBER
DEFAULT 0 );
CREATE TABLE lineitems (order_id REFERENCES orders, seq_no NUMBER,
CONSTRAINT lineitems PRIMARY
KEY(order_id,seq_no) );
Foi criada, relacionada às tabelas, a seguinte trigger, colocada em execução:
CREATE OR REPLACE TRIGGER lineitems_trigger
AFTER INSERT OR UPDATE OR DELETE ON
lineitems FOR EACH ROW
BEGIN
IF (INSERTING OR UPDATING)
THEN
UPDATE orders SET line_items_count =
NVL(line_items_count,0)+1 WHERE order_id = :new.order_id;
END IF;
IF (DELETING OR
UPDATING) THEN
UPDATE orders SET line_items_count = NVL(line_items_count,0)-1
WHERE order_id = :old.order_id;
END IF;
END;
/
Em seguida, foram executadas as instruções abaixo, nesta ordem:
INSERT INTO orders (order_id) VALUES (78);
INSERT INTO orders(order_id) VALUES (92);
INSERT INTO lineitems (order_id, seq_no) VALUES (78,1);
INSERT INTO lineitems (order_id, seq_no) VALUES (78,2);
SELECT * FROM orders;
Considere:
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
185
195
Adquirido em @Xinyuu_bot - Telegram
I. Ao executar a instrução INSERT INTO orders (order_id) VALUES (78); a trigger
incrementou o valor contido no campo line_items_count passando de 0 para 1.
II. Ao executar a instrução INSERT INTO lineitems (order_id, seq_no) VALUES (78,1);
a trigger incrementou o valor contido no campo line_items_count da tabela orders
passando de 0 para 1.
III. Ao executar a instrução INSERT INTO lineitems (order_id, seq_no) VALUES (78,2);
a trigger incrementou o valor contido no campo line_items_count da tabela orders
passando de 1 para 2.
IV. A instrução SELECT * FROM orders; mostrará no campo line_items_count da
linha cujo order_id é 78 o valor 3.
Está correto o que consta APENAS em
a) I e IV.
b) I.
c) II e IV.
d) II e III.
e) III.
50. BANCA: FCC - Analista Judiciário (TRE PE)/Apoio Especializado/Análise de Sistemas/2011
Sobre triggers no banco de dados Oracle, considere:
I. Em instruções DDL, podem ser associados com uma tabela.
II. Em instruções DML, para publicação de eventos, estão associados a um banco
de dados ou com um esquema.
III. Podem ser disparados antes ou depois para cada linha na qual a operação DML
especificada ocorre.
Está correto o que consta em
a) I e II, apenas.
b) I e III, apenas.
c) I, II e III.
d) II e III, apenas.
e) III, apenas.
51. BANCA: CESPE - Técnico Judiciário (TRE BA)/Apoio Especializado/Programação
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática)Banco de dados 
www.estrategiaconcursos.com.br
186
195
Adquirido em @Xinyuu_bot - Telegram
de Sistemas/2017
Uma empresa criou um banco de dados Oracle para pagamento de pró-labore até o
último dia do mês. Para evitar que o registro do pagamento seja gravado no banco de
dados após essa data, o administrador do referido banco de dados deverá usar um(a)
a) update.
b) delete.
c) view.
d) trigger.
e) insert.
52. BANCA: CESPE - Técnico Judiciário (TRE BA)/Apoio Especializado/Programação
de Sistemas/2017
Em uma empresa usuária de banco de dados Oracle, foi criada uma function para cálculo do
imposto de INSS no programa de geração da folha de pagamento dos empregados.
Nessa situação, se, na geração da folha de pagamento, o banco de dados retornar um erro
da function do tipo program error, essa ocorrência será devida ao fato de a function
a) não possuir os cálculos.
b) calcular e gravar os dados.
c) não ter os dados do imposto.
d) não possuir a instrução return.
e) não tratar os erros.
53. BANCA: CESPE - Analista Judiciário (STF)/Apoio Especializado/Análise de Sistemas de
Informação /2013
Julgue o seguinte item, referentes a frameworks para camada de persistência e SQL.
Considerando que a consulta abaixo seja realizada em um SGBD Oracle, é correto
afirmar que o valor 0 será mostrado na coluna salario quando um valor NULL for
retornado.
SELECT nome, NVL(salario, 0),
cidade FROM empregado
WHERE salario IS
NULL ORDER BY
nome;
Certo
Errado
54. BANCA: CESPE - Analista Judiciário (TRT 17ª Região)/Apoio Especializado/Tecnologia da
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
187
195
Adquirido em @Xinyuu_bot - Telegram
Informação/2013
Julgue o item subsequente com relação aos comandos SQL.
Em um único objeto de dados, um package no Oracle 11g pode agregar
subprogramas, constantes, comandos DML, funções e procedures. O exemplo abaixo
descreve corretamente a sintaxe para criar o package PkgTeste contendo uma função,
uma procedure e um comando DML.
CREATE PACKAGE BODY
PkgTeste AS BEGIN
WITH FUNCTION FuncaoTeste (parametro VARCHAR2) RETURN codigo NUMBER;
WITH PROCEDURE PTeste (codigo NUMBER);
WITH SELECT * FROM TabelaTeste WHERE
NuCodigo=codigo; END
Certo
Errado
55. BANCA: CESPE - Analista Administrativo (ANAC)/Área 4/2012
Acerca do sistema gerenciador de banco de dados Oracle, julgue o item a seguir.
No Oracle 10g, uma trigger de DDL pode executar rotinas pré-definidas antes (before)
ou depois (after) de um evento ocorrer, como, por exemplo, a execução dos comandos
TRUNCATE, REVOKE ou GRANT.
Certo
Errado
56. BANCA: CESPE - Analista Administrativo (ANAC)/Área 4/2012
Acerca do sistema gerenciador de banco de dados Oracle, julgue o item a seguir.
No Oracle 10g, é possível, por meio de triggers, monitorar eventos de DML, como, por
exemplo, a execução do comando DELETE, ou ainda, monitorar eventos de banco de
dados (Database) como, por exemplo, o evento SERVERERROR.
Certo
Errado
57. BANCA: CESPE - Técnico Judiciário (TRE MT)/Apoio Especializado/Programação
de Sistemas/2010
Considere que, em eleições para cargos públicos, as seguintes regras devem ser
obedecidas: uma pessoa pode se candidatar a várias eleições; uma eleição pode ter
diversos candidatos; em uma eleição, cada pessoa pode se candidatar somente a um
cargo. Para representar esse cenário, foram criadas, em um banco de dados, as tabelas
a seguir.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
188
195
Adquirido em @Xinyuu_bot - Telegram
Com base na linguagem SQL do Oracle 10g, assinale a opção que seleciona corretamente
o(s) nome(s) da(s) pessoa(s) que não se candidatou(aram) a nenhuma das três eleições.
a) select nome from pessoa where id_pessoa not in (select id_pessoa from
pessoa a where not exists (select id_pessoa from candidato b where a.id_pessoa
= b.id_pessoa)
b) select nome from pessoa where id_pessoa in (select distinct id_pessoa from
candidato)
c) select nome from pessoa a where id_pessoa in (select distinct id_pessoa from
candidato b where a.id_pessoa = b.id_pessoa)
d) select nome from pessoa where id_pessoa in (select id_pessoa from
pessoa a where not exists (select id_pessoa from candidato b where a.id_pessoa
= b.id_pessoa)
e) select nome from pessoa where id_pessoa in (select id_pessoa from pessoa a where
exists (select id_pessoa from candidato b where a.id_pessoa = b.id_pessoa)
58. BANCA: CESPE - Analista Judiciário (TRT 5ª Região)/Apoio Especializado/Tecnologia da
Informação/2008
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
189
195
==a80b1==
Adquirido em @Xinyuu_bot - Telegram
Com relação a qualidade de software, bancos de dados e suas tecnologias, julgue o item.
No ORACLE, um trigger é um bloco PL/SQL armazenado e associado a uma tabela,
esquema ou banco de dados que pode ser criado com o comando CREATE TRIGGER.
Certo
Errado
59. BANCA: CESPE ANO: 2010 ÓRGÃO: TRT - 21ª REGIÃO (RN) PROVA: TÉCNICO DO
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
Julgue o item abaixo, relativo à linguagem PL/SQL.
Caso seja utilizado o comando de manipulação de dados SELECT, da linguagem de
consulta estruturada (SQL), em um bloco PL/SQL, deverá ser incluído, obrigatoriamente,
a cláusula INTO.
60. BANCA: CESPE ANO: 2015 ÓRGÃO: TCU PROVA: AUDITOR FEDERAL DE CONTROLE
EXTERNO - TECNOLOGIA DA INFORMAÇÃO
Julgue os itens subsecutivos, a respeito de sistemas de bancos de dados.
125 Como parte de um conjunto de instruções, o comando Oracle PL/SQL a seguir
significa que, quando se tentar armazenar um valor duplicado em uma coluna que seja
chave primária de uma tabela, será disparada uma exceção predefinida na linguagem; e
serão desfeitas apenas as instruções escritas no contexto do SAVEPOINT nome_point.
EXCEPTION WHEN DUP_VAL_ON_INDEX THEN ROLLBACK TO nome_point;
61. BANCA: CESPE ANO: 2005 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
A respeito da sintaxe e da semântica do SQL, julgue os itens a seguir.
O comando DECLARE CURSOR permite a recuperação e a manipulação de registros de
uma tabela, linha a linha. Para isso, deve-se declarar o cursor, abrir o cursor, recuperar as
linhas do cursor e fechar o cursor, empregando os comandos DECLARE, OPEN, FETCH
e CLOSE, respectivamente.
62. BANCA: FCC ANO: 2009 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
Nas estruturas de controle de iteração dos programas PL/SQL são utilizadas apenas as
instruções
A LOOP e IF.
B IF e CASE.
C GOTO e NULL.
D CASE e GOTO.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
190
195
Adquirido em @Xinyuu_bot - Telegram
E LOOP e EXIT.
63. BANCA: FCC ANO: 2009 ÓRGÃO: TRT - 16ª REGIÃO (MA) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
No tipo Escalares, NÃO é uma das quatro famílias de tipos de dados predefinidos do
PL/SQL:
A referências.
B data e hora.
C números.
D caracteres.
E booleanos.
64. BANCA: FCC ANO: 2009 ÓRGÃO: TRT - 3ª REGIÃO (MG) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
Para passar resultados de query entre subprogramas PL/SQL, ou seja, quando um
subprograma executa uma query e o resultado será processado por outro subprograma,
utiliza-se uma:
A view.
B subquery.
C variável cursor.
D variável
bind.
E variável locator.
65. BANCA: CESPE ANO: 2010 ÓRGÃO: INMETRO PROVA: PESQUISADOR - GESTÃO DA
INFORMAÇÃO
Com respeito aos conceitos e comandos PL/SQL, assinale a opção correta.
A Por meio de um produto da linguagem PL/SQL chamado trigger, é possível dar nome
às áreas de trabalho utilizadas noOracle e acessar a informação contida nessas áreas.
B Um package é um programa PL/SQL que pode ser acionado por uma aplicação, por
um trigger ou por uma ferramenta Oracle.
C Uma stored procedure é um arquivo que agrupa, em um único local, funções, cursores,
outras stored procedures aninhadas e variáveis.
D O cursor é um programa PL/SQL armazenado no banco de dados que é executado
imediatamente antes ou após os comandos INSERT, UPDATE e DELETE.
E Com o uso da linguagem PL/SQL, é possível criar objetos de esquema como triggers,
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
191
195
Adquirido em @Xinyuu_bot - Telegram
stored procedures e packages.
66. BANCA: CESPE ANO: 2010 ÓRGÃO: MPU PROVA: ANALISTA DO MPU - ANALISTA DE
INFORMÁTICA - BANCO DE DADOS
A respeito de PL/SQL, julgue os itens a seguir.
Um bloco de programa PL/SQL inclui partes bem distintas, como declaração (declaration) de
variáveis e objetos, módulo executável (executable) e módulo de exceções (exception).
67. BANCA: CESPE ANO: 2010 ÓRGÃO: MPU PROVA: ANALISTA DO MPU - ANALISTA DE
INFORMÁTICA - BANCO DE DADOS
A respeito de PL/SQL, julgue o item a seguir.
O trecho de programa em PL/SQL a seguir possibilita aumentar o valor da variável salary
em 15%, sempre que esta alcançar valor abaixo da variável media_salary.
68. BANCA: CESPE ANO: 2004 ÓRGÃO: TRT - 10ª REGIÃO (DF E TO) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
DECLARE
a T1.e%TYPE;
b T1.f%TYPE;
CURSOR T1Cursor IS
SELECT e, f FROM T1 WHERE e < f FOR UPDATE;
BEGIN OPEN T1Cursor;
LOOP
FETCH T1Cursor INTO a, b;
EXIT WHEN T1Cursor%NOTFOUND;
DELETE FROM T1 WHERE CURRENT OF T1Cursor;
INSERT INTO T1 VALUES(b, a);
END LOOP;
CLOSE T1Cursor;
END; .
RUN;
A respeito da sintaxe e da semântica da linguagem PL/SQL, cursor, em ambiente
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
192
195
Adquirido em @Xinyuu_bot - Telegram
Oracle, e levando em consideração o código acima, julgue os itens subsequentes.
63 As variáveis a e b são declaradas de maneira que tenham tipos iguais aos tipos
de atributos e e f da relação T1.
64 Na definição do cursor T1Cursor a query SELECT-FROM-WHERE seleciona as
tuplas de T1 onde o primeiro componente é menor que o segundo. A declaração do
FOR UPDATE é obrigatória na declaração do cursor, mesmo que não haja nenhuma
mudança no mesmo.
65 O FETCH deve prover variáveis para cada componente da tupla recuperada,
sempre por meio de variáveis locais, como mostra o código indicado.
66 O %NOTFOUND depois do nome do cursor é verdadeiro exatamente quando o
FETCH, por meio do cursor, falha na busca de alguma tupla.
67 O DELETE apaga a tupla inicial usando a condição especial WHERE CURRENT
do cursor T1Cursor.
69. BANCA: FCC ANO: 2008 ÓRGÃO: TRT - 2ª REGIÃO (SP) PROVA: ANALISTA
JUDICIÁRIO - TECNOLOGIA DA INFORMAÇÃO
A linguagem PL/SQL, introduzida nos gerenciadores de banco de dados ORACLE,
A aumenta a capacidade não-procedural da SQL, oferecendo e combinando blocos de
construtores procedurais.
B constitui uma interface básica pela qual pode-se entrar e executar comandos SQL para
manipulações genéricas de um banco.
C trata-se de uma linguagem que identifica quais as informações necessárias e não
como buscá-las.
D tem os seus comandos executados pelo executor de SQL do Kernel.
E tem os seus comandos enviados para serem processados pelo SGBD um por vez.
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
193
195
Adquirido em @Xinyuu_bot - Telegram
1. E
2. E
3. C
4. E
5. A
6. E
7. C
8. E
9. A
10.B
11.A
12.B
13.C
14.A
15.A
16.C
17.E
18.D
19.A
20.B
21.C C C
22.C E C E E
23.A
24.D
25.A
26.B
27.D
28.B
29.C
30.C
31.C
32.B
33.D
34.C
35.C
36.C
37.C
38.C
39.A
40.D
41.C
42.A
43.C
44.B
45.B
46.A
47.D
48.A
49.D
50.E
51.D
52.D
53.C
54.E
55.C
56.C
57.D
58.C
59.C
60.C
61.E
62.E
63.A
64.C
65.E
66.C
67.E
68.C E E C E
69.A
Diego Carvalho, Thiago Rodrigues Cavalcanti
Aula 04
TRF 5ª Região (Técnico Judiciário - Apoio Especializado - Informática) Banco de dados 
www.estrategiaconcursos.com.br
194
195
Adquirido em @Xinyuu_bot - Telegram

Mais conteúdos dessa disciplina