Prof.
Gilberto Assis
PL/SQL
O que são?
PL/SQL (Procedural Language/Structured Query Language) é uma extensão procedural da
linguagem SQL desenvolvida pela Oracle Corporation. Ele combina a manipulação de dados da
SQL com a capacidade de controle de fluxo de uma linguagem procedural, permitindo a criação
de blocos de código reutilizáveis e a execução de operações complexas diretamente no banco de
dados. PL/SQL é uma linguagem robusta e poderosa que permite aos desenvolvedores criar
aplicações seguras, eficientes e escaláveis.
Quando nos referimos a natureza Procedural dessa linguagem, queremos dizer sobre a
capacidade de sequenciar comandos, de definir a ordem de execução das instruções, utilizando
estruturas de controle como IF-THEN-ELSE, loops e tratamento de exceções. Além de, definifir
variáveis e constantes, permitindo armazenar e processar dados de forma mais flexível.
A definição acima quer dizer que, a linguagem PL/SQL permite ao desenvolvedor manipular os
resultados obtidos pelos códigos SQL (select, insert, update e delete) e não apenas visualizá-los
como resultado de uma operação. Por exemplo, quando realizamos um select simplesmente
obtemos o resultado da consulta, sem ter a chance de realizar tratamentos e/ou desenvolvimento
de regras de negócios. O PL/SQL vem como uma resposta para essa limitação, uma vez que ele
permite capturar o resultado da operação e desenvolver toda lógica necessária para atender os
anseios de nossos clientes.
Isso é possível, porque ele é uma linguagem de programação que estende as capacidades da
linguagem SQL, enquanto o SQL é ideal para realizar consultas e operações simples em bases
de dados, o PL/SQL adiciona uma camada de programação procedural, permitindo a criação de
blocos de código mais complexos e personalizados como procedimentos e funções, que podem
ser criados para modularizar o código e realizar tarefas específicas, promovendo a reutilização e a
organização do código. Para isso, o PL/SQL usa um conjunto de operadores lógicos, estruturais
de decisão e de repetição, além de objetos e classes de manipulação de diferentes formas de
tipos de dados.
Em resumo, o PL/SQL combina a facilidade de uso do SQL com a flexibilidade de uma linguagem
de programação procedural, permitindo a criação de soluções personalizadas e eficientes para o
gerenciamento de bancos de dados.
Prof. Gilberto Assis
PL/SQL
O aprofundamento desse tema pode ser obtido através da consulta da documentação oficial da
ORACLE
[Link]
Perceba que a documentação oficial está alinhada a introdução acima.
Prof. Gilberto Assis
PL/SQL
Um poco da história e evolução do PL/SQL
PL/SQL foi introduzido pela primeira vez na versão 6 do Oracle Database, em 1991. Desde então,
tem evoluído significativamente, incorporando novos recursos e melhorias de desempenho. A
linguagem foi projetada para ser integrada com o Oracle Database, permitindo que os
desenvolvedores escrevam código que pode ser executado diretamente no servidor de banco de
dados, reduzindo a necessidade de transferir grandes volumes de dados entre o servidor e o
cliente.
Moderação é a palavra-chave
Evitar a movimentação de dados pode ser uma característica muito boa para a regra de negócios,
entretanto isso deve ser muito bem avaliado e dimensionado pelos gestores da aplicação e do
banco de dados. Você deve estar ciente de que o PL/SQL, não precisa movimentar dados, porque
ele é executado dentro do servidor de banco de dados, ou seja, disputa recursos do servidor
(CPU, memória, disco e rede) com outras aplicações e/ou sessões ativas. Em muitos casos,
concetrar as rotinas e programas no servidor de banco de dados significa sobrecarga de trabalho
e consequente enfileiramento de requisições e perda de performance.
Outro ponto de atenção é a característica de baixa portabilidade, comum a toda linguagem de
programação proprietária, que representa custo elevado de migração do sistema desenvolvido.
Devemos estar cientes de que o PL/SQL é uma linguagem de programação desenvolvida pela
ORACLE para ser usada no banco de dados ORACLE e isso quer dizer que, caso haja
necessidade de mudança de banco de dados, todo código deverá ser revisto e/ou reescrito, pois
não há compatibilidade entre as linguagens de bancos de dados.
Entenda, que não haver compatibilidade não significa que a lógica possa ser reaproveitada, a
lógica usada para resolver os problemas e desafios se mantém, o que muda é a forma de
escrever esses códigos. Ficando apenas o trabalho de transcrição de uma linguagem para outra e
que na prática pode ser impossível devido o grande número de objetos existentes na solução
proposta.
Prof. Gilberto Assis
PL/SQL
Estrutura de um Bloco PL/SQL
Um bloco PL/SQL é a unidade básica de um programa PL/SQL. Ele é composto por três seções
principais:
1. Declaração: Onde variáveis, constantes, cursores e outros elementos são declarados.
Esta seção é opcional e é usada para declarar variáveis, constantes, cursores e outros elementos
que serão usados na seção de execução. As variáveis podem ser de tipos escalares (como
NUMBER, VARCHAR2, DATE) ou compostos (como registros e tabelas).
2. Corpo do programa: Onde o desenvolvimento do programa é realizado com instruções SQL e
PL/SQL.
Esta é a seção principal onde as instruções SQL e PL/SQL são executadas. Aqui, você pode
manipular dados, chamar procedures e functions, e controlar o fluxo do programa usando
estruturas condicionais e de loop.
Você deve saber que toda instrução no PL/SQL é encerrada com ; (ponto e virgula), exemplo:
valor := 3;
3. Tratamento de Exceções: Onde as exceções/erros são tratados.
Esta seção é opcional e é usada para tratar erros que ocorrem durante a execução do bloco
PL/SQL. As exceções podem ser pré-definidas (como 'NO_DATA_FOUND' e
'TOO_MANY_ROWS') ou definidas pelo usuário.
A estrutura básica de um bloco PL/SQL é a seguinte:
DECLARE
-- Seção de declaração (opcional)
BEGIN
-- corpo do programa
EXCEPTION
-- Tratamento de exceções (opcional)
END;
/
Prof. Gilberto Assis
PL/SQL
Regra de nomenclatura ORACLE:
As regras para nomear objetos no Oracle variam de acordo com o tipo de objeto. Aqui estão as
regras gerais:
Comprimento:
• De 1 a 30 caracteres, com exceção dos nomes de links, que podem ter até 128 caracteres.
Caracteres permitidos:
• Letras de A a Z (maiúsculas e minúsculas são diferenciadas).
• Números de 0 a 9.
• Sublinhado (_).
• Cifrão ($).
• Símbolo de hash (#).
Restrições:
• Palavras reservadas do Oracle não podem ser usadas como nomes de objetos.
• Os nomes não podem começar com um número.
• Os nomes não podem conter espaços em branco.
Os nomes não devem conter caracteres especiais, como acentos ou til.
Declaração de Variáveis
As variáveis em PL/SQL são declaradas na seção de declaração de um bloco PL/SQL. Elas
podem ser de vários tipos, incluindo tipos escalares (como NUMBER, VARCHAR2, DATE) e tipos
compostos (como registros e tabelas).
PL/SQL suporta uma ampla gama de tipos de dados, incluindo:
• NUMBER: Usado para armazenar números inteiros e de ponto flutuante.
• VARCHAR2: Usado para armazenar cadeias de caracteres de comprimento variável.
• DATE: Usado para armazenar datas e horas.
• BOOLEAN: Usado para armazenar valores booleanos (TRUE, FALSE, NULL).
• CLOB: Usado para armazenar grandes objetos de texto (Character Large Objects).
• TABLE: Usado para armazenar coleções de elementos do mesmo tipo.
DECLARE
nome VARCHAR2(50);
idade NUMBER;
BEGIN
nome := 'Florzinha';
idade := 7;
DBMS_OUTPUT.PUT_LINE('A aluna '|| nome ||', tem '|| idade||' anos.');
END;
/
reposta: A aluna Florzinha tem 7 anos.
Prof. Gilberto Assis
PL/SQL
Declaração de Constantes
As constantes são semelhantes às variáveis, mas seus valores não podem ser alterados após a
inicialização.
Exemplo de Declaração de Constantes
DECLARE
juros CONSTANT NUMBER := 0.07;
BEGIN
DBMS_OUTPUT.PUT_LINE('Juros: ' || c_taxa);
END;
/
resposta: Juros: 0.07
Cursores
Os cursores são usados para manipular conjuntos de resultados de consultas SQL. Tenha em
mente que esse tema será estudado separadamente em aula específica, e que esse texto é
apenas uma introdução.
Existem dois tipos de cursores: cursores explícitos e implícitos.
Cursores Explícitos
Os cursores explícitos são declarados e manipulados pelo programador. Eles são úteis quando
você precisa processar várias linhas de uma consulta SQL.
Exemplo de Declaração de Cursor Explícito
DECLARE
CURSOR cr_empregado IS
SELECT cod_empregado, nome_empregado FROM empregado;
codigo empregado.cod_empregado%TYPE;
nome empregado.nomee_empregado%TYPE;
BEGIN
OPEN cr_empregado;
LOOP
FETCH cr_empregado INTO codigo, nome;
EXIT WHEN cr_empregado%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('código: '|| codigo ||', nome: '|| nome);
END LOOP;
CLOSE cr_empregado;
END;
/
Cursores Implícitos
Os cursores implícitos são gerenciados automaticamente pelo Oracle quando uma instrução SQL
é executada. Eles são usados principalmente para instruções SQL que retornam uma única linha.
Prof. Gilberto Assis
PL/SQL
Procedures
As procedures são subprogramas que realizam uma tarefa específica e podem ser chamados por
outros programas. Elas são declaradas usando a palavra-chave 'PROCEDURE'.
Exemplo de Declaração de Procedure
CREATE OR REPLACE PROCEDURE pr_saudar_usuario(valor IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Olá, ' || valor);
END pr_saudar_usuario;
/
Parâmetros de Procedures
As procedures podem ter três tipos de parâmetros:
- IN: Parâmetros de entrada que passam valores para a procedure.
- OUT: Parâmetros de saída que retornam valores da procedure.
- IN OUT: Parâmetros que podem passar valores para a procedure e retornar valores dela.
Exemplo de Procedure com Parâmetros
1 – Exemplo: indicar se um valor é par ou ímpar
-- Solicitação de entrada
ACCEPT valor PROMPT 'Informe o número:';
DECLARE
valor number; -- variável do tipo number
BEGIN
-- testa se o valor é divisível por 2
if mod(&valor,2) = 0
then dbms_output.put_line('O valor é par');
else dbms_output.put_line('O valor é ímpar');
end if;
END;
/
Prof. Gilberto Assis
PL/SQL
Functions
As functions são subprogramas que retornam um valor e podem ser usados em expressões SQL.
Elas são declaradas usando a palavra-chave 'FUNCTION'.
1 - Exemplo de Declaração de Function
CREATE OR REPLACE FUNCTION fn_calcular_idade(p_ano_nascimento IN NUMBER)
RETURN NUMBER IS
v_idade NUMBER;
BEGIN
v_idade := EXTRACT(YEAR FROM SYSDATE) - p_ano_nascimento;
RETURN v_idade;
END fn_calcular_idade;
/
Uso de Functions em SQL
As functions podem ser usadas em instruções SQL, o que permite a reutilização de lógica
complexa em consultas.
Exemplo de Uso de Function em SQL
SELECT nome, fn_calcular_idade(ano_nascimento) AS idade
FROM empregados;
2 – programa que indica se o valor de entrada é par ou ímpar
CREATE OR REPLACE FUNCTION fn_par_impar(valor number)
RETURN VARCHAR2
AS
BEGIN
-- testa se o valor é divisível por 2
if mod(valor,2) = 0
then RETURN 'O valor é par';
else RETURN 'O valor é ímpar';
end if;
END;
/
-- chamada da função
SELECT fn_par_impar(3) FROM dual;
Prof. Gilberto Assis
PL/SQL
ESTRUTURAS LÓGICAS
IF-THEN-ELSE
Essa estrutura verifica o resultado de uma expressão lógica como TRUE ou FALSE.
No caso de verdade (TRUE) ele entra na bloco THEN e no caso de falso (FALSE) ele irá para o
bloco do ELSE. Essa estrutura lógica pode sedr usado em qualquer uma das formas de
programas (functions, procedures e/ou blocos anônimos).
Exemplo:
create or replace function fn_maior (valor1 number, valor2 number)
return number
as
menor number;
begin
if valor1 < valor2
then menor := valor1;
else menor := valor2;
end if;
return menor;
end;
/
IF-ESIF-THEN-ELSE
Semelhante a estrutura anterior, mas com a opção de fazer diversos testes no mesmo bloco.
create or replace function fn_maior_igual (valor1 number, valor2 number)
return varchar2
as
menor number;
begin
if valor1 < valor2
then menor := valor1;
elsif valor1 = valor2
then menor := 'iguais';
else menor := valor2;
end if;
return menor;
end;
/
Observe que no bloco acima só fechamos (end if;) um IF.
Prof. Gilberto Assis
PL/SQL
ESTRUTURA DE REPETIÇÃO
Assim como as demais linguagens de programação, o PL/SQL da oracle permite o uso de
estruturas de repetição na resolução de problemas informatizados.
Existem 3 formas de escrever estruturas de repetição no PL/SQL: FOR, WHILE e LOOP.
Você leitor deverá saber que quanto a função, ao desempenho e ao poder de resolução todas se
equivalem, diferenciando apenas em como controlar o desvio do programa para fora da repetição
e também quanto ao tipo de evento que será usado no controle da própria estrutura.
FOR - essa estrutura de repetição é usada para controles de fluxo exclusivamente numérico.
Para tanto, deve-se declarar uma variável interna e exclusiva do for que varia de um valor inicial
até um valor final realizando os comandos declarados em seu corpo.
FIQUE ATENTO: o teste do FOR acontece no início da estrutura, ou seja, para que ele seja
executado pelo menos uma vez, é necessário que o teste seja verdadeiro.
SINTAXE:
FOR variável_for in valor_inicial .. valor_final LOOP
corpo do for contendo as intruções
que serão executadas
a cada interação do FOR
END LOOP;
/
Exemplo 1:
begin
for x in 1 .. 3 loop
dbms_output.put_line('o valor atual de x é ===> '||X);
end loop;
end;
/
o resultado do bloco de comandos acima resultará na saída:
o valor atual de x é ===> 1
o valor atual de x é ===> 2
o valor atual de x é ===> 3
Isto porque, a cada interação o valor de x (variável interna do FOR) será incrementado em 1
unidade. Como o valor inicial indicado foi 1, a primeira interação resulta na primeira linha da
resposta. Quando o programa chega no comando de finalização do for (end loop) ele volta ao
início do bloco de repetição e testa se o valor inicial é maior que o valor final. Em caso negativo
ele realizará os comandos dentro de sua estrutura (linha 2 e linha 3 da saída).
Quando o teste do for resultar em verdade ele deixa o for sem realizar os comandos dentro de
seu corpo.
Repare que o valor_inicial pode receber qualquer valor menor que o valor_final;
Prof. Gilberto Assis
PL/SQL
Exemplo 2:
begin
for x in 99 .. 100 loop
dbms_output.put_line('o valor atual de x é ===> '||X);
end loop;
end;
/
o resultado do bloco de comandos acima resultará na saída:
o valor atual de x é ===> 99
o valor atual de x é ===> 100
Exemplo 3: a procedure abaixo mostra todos os números pares entre dois números informados
pelo usuário.
create or replace procedure pr_pares(menor number, maior number)
as
resposta varchar2(300):='';
begin
for x in menor .. maior loop
if mod(x,2) = 0
then resposta := resposta || x || ' ';
end if;
end loop;
dbms_output.put_line(resposta);
end;
/
Naturalmente o FOR poderá ser usado em qualquer tipo de programa (PROCEDURES,
FUNCTION e/ou BLOCO ANÔNIMO).
Saiba que é possível fazer o FOR executar do maior número para o menor número, ou seja, de
trás para frente, ou ainda em ordem inversa. Para isso basta informar o parâmetro REVERSE.
SINTAXE:
FOR variável_for in REVERSE valor_inicial .. valor_final LOOP
<corpo do for contendo as intruções que serão executadas
a cada interação do FOR>
END LOOP;
/
Exemplo:
begin
for x in reverse 1 .. 3 loop
dbms_output.put_line('o valor atual de x é ===> '||X);
end loop;
end;
/
Prof. Gilberto Assis
PL/SQL
o resultado do bloco de comandos acima resultará na saída:
o valor atual de x é ===> 3
o valor atual de x é ===> 2
o valor atual de x é ===> 1
Repare que também no reverse o valor_inicial deve receber valor menor que o valor_final;
Exemplo 2: a função abaixo mostra a frase informada pelo usuário de forma invertida.
create or replace function FN_INVERTE_LETRAS(valor varchar2)
return varchar2
as
resposta varchar2(4000):='';
begin
for x in reverse 1 .. length(valor) loop
resposta := resposta ||substr(valor, x, 1);
end loop;
return resposta;
end;
/
WHILE - essa é uma estrutura de repetição que permite o teste com valores de qualquer natureza
(números, textos, datas e até boleanos). Assim como no FOR essa estrutura também faz o teste
logo no início e só executará as instruções se a condição for VERDADEIRA. Essa estrutura se
repetirá enquanto o teste de condição for VERDADE.
FIQUE ATENTO: o while não tem variável própria, se você precisar de alguma será necessário
declará-la no local adequado.
SINTAXE:
WHILE <condição de teste> LOOP
corpo do WHILE contendo as intruções
que serão executadas
a cada interação do FOR
END LOOP;
FIQUE ATENTO: o loop só será interrompido se o resultado da condição de
teste for FALSO.
EXEMPLO1:
declare
contador number:=1;
begin
while contador <= 3 loop
dbms_output.put_line('o valor atual de contador é ===> '|| contador);
contador:= contador + 1;
end loop;
end;
/
Prof. Gilberto Assis
PL/SQL
O resultado do bloco de comandos acima resultará na saída:
o valor atual de contador é ===> 1
o valor atual de contador é ===> 2
o valor atual de contador é ===> 3
Uma boa vantagem desse comando é que você incrementar a variável de controle (contador) da
forma que desejar.
Exemplo 3:
declare
contador number:=1;
begin
while contador <= 3 loop
dbms_output.put_line('o valor atual de contador é ===> '|| contador);
contador:= contador + 3;
end loop;
end;
/
o resultado do bloco de comandos acima resultará na saída, isto porque já no primeiro incremento
tornará o contador maior do que 3, fazendo a condição FALSA:
o valor atual de x é ===> 1
Naturalmente, você também pode decrementar a variável de controle:
Exemplo 4:
declare
contador number:=1;
begin
while contador <= 3 loop
dbms_output.put_line('o valor atual de contador é ===> '|| contador);
contador:= contador - 1;
end loop;
end;
/
o resultado do bloco de comandos acima resultará na saída:
o valor atual de contador é ===> 3
o valor atual de contador é ===> 2
o valor atual de contador é ===> 1
Prof. Gilberto Assis
PL/SQL
LOOP - estrutura de repetição equivalente ao REPEAT de outras linguagens de programação. A
grande diferença dessa estrutura se dá pelo fato do teste de condição ser o oposto as demais, ou
seja, ele permanecerá dentro da estrutura de repetição até que a condição seja VERDADE.
Perceba que a condição de saída também pode ser de qualquer natureza.
Outra característica bastante interessante é que ele pode conter várias condições de teste em
pontos diferentes e com valores diferentes.
FIQUE ATENTO: o LOOP repete suas instruções enquanto o teste for FALSO, oposto aos
demais.
Exemplo 1:
declare
contador number:=1;
begin
loop
dbms_output.put_line('o valor atual de contador é ===> '|| contador);
contador:= contador + 1;
exit when contador > 3
end loop;
end;
/
o resultado do bloco de comandos acima resultará na saída:
o valor atual de contador é ===> 1
o valor atual de contador é ===> 2
o valor atual de contador é ===> 3
Exemplo 2:
declare
contador number:=1;
begin
loop
exit when to_char(sysdate, 'HH24') > 13;
dbms_output.put_line('o valor atual de contador é ===> '|| contador);
contador:= contador + 1;
exit when contador > 3
end loop;
end;
/
o resultado do bloco de comandos acima resultará na saída, MAS somente se a hora de
execução for menor do que
13hs:
o valor atual de contador é ===> 1
o valor atual de contador é ===> 2
o valor atual de contador é ===> 3
Prof. Gilberto Assis
PL/SQL
Packages
Os packages são coleções de procedures, functions, variáveis e outros elementos PL/SQL
agrupados logicamente. Eles são úteis para organizar e modularizar o código PL/SQL.
Exemplo de Declaração de Package
CREATE OR REPLACE PACKAGE pacote_exemplo IS
PROCEDURE pr_saudar_usuario(p_nome IN VARCHAR2);
FUNCTION fn_calcular_idade(p_ano_nascimento IN NUMBER) RETURN NUMBER;
END pacote_exemplo;
/
Exemplo de Implementação de Package
CREATE OR REPLACE PACKAGE BODY pacote_exemplo IS
PROCEDURE pr_saudar_usuario(p_nome IN VARCHAR2) IS
BEGIN
DBMS_OUTPUT.PUT_LINE('Olá, ' || p_nome);
END pr_saudar_usuario;
FUNCTION fn_calcular_idade(p_ano_nascimento IN NUMBER) RETURN NUMBER
IS
v_idade NUMBER;
BEGIN
v_idade := EXTRACT(YEAR FROM SYSDATE) - p_ano_nascimento;
RETURN v_idade;
END fn_calcular_idade;
END pacote_exemplo;
/
Chamadas de Procedures e Functions
Para chamar uma procedure:
call pr_saudar_usuario('Maria');
ou
exec pr_saudar_usuario('Maria');
Para chamar uma function:
select fn_calcular_idade(1990) from dual;
Prof. Gilberto Assis
PL/SQL
Tratamento de Exceções
O tratamento de exceções em PL/SQL é feito na seção 'EXCEPTION' de um bloco PL/SQL. As
exceções podem ser pré-definidas (como 'NO_DATA_FOUND' e 'TOO_MANY_ROWS') ou
definidas pelo usuário.
Exemplo de Tratamento de Exceções
BEGIN
-- Código que pode gerar exceções
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nenhum dado encontrado.');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Muitas linhas retornadas.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro: ' || SQLERRM);
END;
/
Triggers
Triggers são blocos de código PL/SQL que são automaticamente executados (ou "disparados")
em resposta a certos eventos ocorridos na tabela base (alvo). Esse tema também será explorado
em momento próprio, sendo esse texto apenas uma introdução.
Os triggers são usados para manter a integridade dos dados, auditar mudanças, e implementar
regras de negócios complexas.
Tipos de Triggers
1. Triggers de DML (Data Manipulation Language): Disparados por eventos de manipulação de
dados, como 'INSERT', 'UPDATE' e 'DELETE'.
2. Triggers de DDL (Data Definition Language): Disparados por eventos de definição de dados,
como 'CREATE', 'ALTER' e 'DROP'.
3. Triggers de Logon/Logoff: Disparados quando um usuário se conecta ou desconecta do banco
de dados.
4. Triggers de Comprometimento (Commit): Disparados por eventos de 'COMMIT' ou
'ROLLBACK'.
Estrutura de um Trigger
A estrutura básica de um trigger é a seguinte:
CREATE OR REPLACE TRIGGER nome_do_trigger
[BEFORE | AFTER] [INSERT | UPDATE | DELETE] ON nome_da_tabela
[FOR EACH ROW]
BEGIN
-- Código PL/SQL
END;
/
Prof. Gilberto Assis
PL/SQL
Exemplo de Trigger de DML
Este exemplo cria um trigger que é disparado antes de uma atualização na tabela 'emp':
CREATE OR REPLACE TRIGGER tg_atualizacao
BEFORE UPDATE ON empregado
FOR EACH ROW
BEGIN
:NEW.data_atualizacao := SYSDATE;
END;
/
Neste exemplo, o trigger atualiza a coluna 'data_atualizacao' com a data e hora atuais
('SYSDATE') sempre que uma linha na tabela EMPREGADO é atualizada.
Melhores Práticas em PL/SQL
Modularização
Divida seu código em pequenos blocos reutilizáveis, como procedures, functions e packages. Isso
facilita a manutenção e a reutilização do código.
Comentários
Use comentários para explicar o propósito e a lógica do seu código. Isso ajuda outros
desenvolvedores (e você mesmo no futuro) a entenderem o que o código faz.
-- Este bloco PL/SQL calcula a idade de um empregado
DECLARE
v_ano_nascimento NUMBER := 1985;
v_idade NUMBER;
BEGIN
v_idade := EXTRACT(YEAR FROM SYSDATE) - v_ano_nascimento;
DBMS_OUTPUT.PUT_LINE('Idade: ' || v_idade);
END;
/
Prof. Gilberto Assis
PL/SQL
Tratamento de Exceções
Sempre trate exceções para garantir que seu programa possa lidar com erros de forma elegante e
eficiente.
BEGIN
-- Código que pode gerar exceções
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nenhum dado encontrado.');
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('Muitas linhas retornadas.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Erro: ' || SQLERRM);
END;
/