{"id":1636,"date":"2026-07-18T18:12:24","date_gmt":"2026-07-18T21:12:24","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/"},"modified":"2026-07-18T18:12:24","modified_gmt":"2026-07-18T21:12:24","slug":"aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/","title":{"rendered":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo"},"content":{"rendered":"<p>Bem-vindo \u00e0 d\u00e9cima s\u00e9tima aula do curso <strong>Oracle SQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Se voc\u00ea acompanhou as aulas anteriores, j\u00e1 domina consultas complexas, jun\u00e7\u00f5es, subqueries, fun\u00e7\u00f5es anal\u00edticas e opera\u00e7\u00f5es DML. Agora, chegou o momento de cruzar a fronteira entre o SQL puro e o mundo da programa\u00e7\u00e3o dentro do banco de dados. Hoje vamos mergulhar no <strong>PL\/SQL b\u00e1sico<\/strong>, a linguagem procedural da Oracle que transforma o SGBD em uma verdadeira plataforma de desenvolvimento. Esta \u00e9, sem d\u00favida, uma das aulas mais transformadoras do curso \u2014 depois dela, sua forma de pensar sobre o Oracle Database mudar\u00e1 completamente.<\/p>\n<p>O <strong>PL\/SQL b\u00e1sico<\/strong> \u00e9 o fundamento sobre o qual se constroem procedures, functions, packages e triggers. Compreender blocos an\u00f4nimos, declara\u00e7\u00e3o de vari\u00e1veis e estruturas de controle de fluxo \u00e9 o primeiro passo para automatizar tarefas que, em SQL puro, seriam imposs\u00edveis ou extremamente trabalhosas. Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, utilizamos diariamente blocos PL\/SQL para valida\u00e7\u00e3o de dados, migra\u00e7\u00f5es, rotinas de manuten\u00e7\u00e3o e integra\u00e7\u00e3o entre sistemas \u2014 e \u00e9 exatamente essa capacidade que voc\u00ea come\u00e7ar\u00e1 a adquirir hoje.<\/p>\n<p>Nesta aula, voc\u00ea construir\u00e1 seus primeiros blocos an\u00f4nimos do zero. Vamos come\u00e7ar com a anatomia de um bloco PL\/SQL, avan\u00e7ar pela declara\u00e7\u00e3o de vari\u00e1veis de diferentes tipos, explorar comandos condicionais (<code>IF<\/code>, <code>CASE<\/code>) e dominar as estruturas de repeti\u00e7\u00e3o (<code>LOOP<\/code>, <code>WHILE<\/code>, <code>FOR<\/code>). Tudo isso com exemplos 100% pr\u00e1ticos e execut\u00e1veis no seu ambiente Oracle, seja ele o <strong>SQL*Plus<\/strong>, o <strong>SQL Developer<\/strong> ou qualquer cliente compat\u00edvel. Ao final, voc\u00ea ter\u00e1 condi\u00e7\u00f5es reais de escrever scripts PL\/SQL para resolver problemas do dia a dia de um DBA ou desenvolvedor Oracle.<\/p>\n<p>Prepare seu ambiente: voc\u00ea precisar\u00e1 de uma inst\u00e2ncia Oracle funcional (19c ou superior recomend\u00e1vel, mas os conceitos se aplicam desde o 11g) e acesso a um schema com privil\u00e9gios b\u00e1sicos de <code>CREATE SESSION<\/code>, <code>CREATE TABLE<\/code> e <code>INSERT<\/code>. Se voc\u00ea realizou os laborat\u00f3rios das aulas anteriores, j\u00e1 tem a base <code>HR<\/code> ou um schema pr\u00f3prio para testes. Vamos codificar juntos \u2014 abra seu cliente SQL e venha dominar o <strong>PL\/SQL b\u00e1sico<\/strong>.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>A anatomia completa de um <strong>bloco an\u00f4nimo PL\/SQL<\/strong> e suas se\u00e7\u00f5es obrigat\u00f3rias e opcionais<\/li>\n<li>Como declarar e inicializar <strong>vari\u00e1veis escalares, compostas e reference types<\/strong><\/li>\n<li>O uso correto do comando <code>SELECT INTO<\/code> para popular vari\u00e1veis a partir de tabelas<\/li>\n<li>Controle de fluxo condicional com <code>IF\/ELSIF\/ELSE<\/code> e <code>CASE<\/code><\/li>\n<li>Estruturas de repeti\u00e7\u00e3o: <code>LOOP<\/code> simples, <code>WHILE<\/code> e <code>FOR<\/code><\/li>\n<li>Introdu\u00e7\u00e3o ao tratamento de exce\u00e7\u00f5es com <code>EXCEPTION<\/code><\/li>\n<li>Como depurar blocos utilizando <code>DBMS_OUTPUT.PUT_LINE<\/code><\/li>\n<li>Erros frequentes de iniciantes em <strong>PL\/SQL b\u00e1sico<\/strong> e como corrigi-los rapidamente<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Para executar todos os exemplos desta aula sem interrup\u00e7\u00f5es, voc\u00ea precisa ter uma inst\u00e2ncia Oracle Database em funcionamento. Pode ser uma instala\u00e7\u00e3o local (Windows, Linux), um container Docker com a imagem oficial <code>container-registry.oracle.com\/database\/express:21.3.0<\/code>, ou at\u00e9 mesmo uma inst\u00e2ncia no Oracle Cloud (Always Free Tier). Os exemplos foram testados no <strong>Oracle Database 19c Enterprise Edition<\/strong> e <strong>21c Express Edition<\/strong>, ambos compat\u00edveis com o conte\u00fado apresentado.<\/p>\n<p>Confirme que o par\u00e2metro <code>SERVEROUTPUT<\/code> est\u00e1 habilitado ou prepare-se para ativ\u00e1-lo no in\u00edcio de cada sess\u00e3o. Esse par\u00e2metro controla a exibi\u00e7\u00e3o das mensagens enviadas pelo pacote <code>DBMS_OUTPUT<\/code>, que usaremos extensivamente para depura\u00e7\u00e3o. Se voc\u00ea estiver no <strong>SQL*Plus<\/strong>, execute <code>SET SERVEROUTPUT ON<\/code>; no <strong>SQL Developer<\/strong>, ative a aba <code>DBMS Output<\/code> clicando no \u00edcone verde de &#8220;+&#8221; e selecionando sua conex\u00e3o. Este passo \u00e9 essencial \u2014 sem ele, voc\u00ea n\u00e3o ver\u00e1 os resultados dos exemplos e poder\u00e1 pensar erroneamente que o c\u00f3digo n\u00e3o funcionou.<\/p>\n<p>Recomendamos tamb\u00e9m criar uma tabela simples para os exerc\u00edcios de <code>SELECT INTO<\/code> e loops. Se voc\u00ea j\u00e1 possui o schema <code>HR<\/code> desbloqueado, \u00f3timo. Caso contr\u00e1rio, execute o script abaixo para criar uma tabela de exemplo chamada <code>FUNCIONARIOS<\/code>:<\/p>\n<pre><code>-- Conecte-se como seu usu\u00e1rio de pr\u00e1tica (ex: STUDENT, DEV, etc.)\nCREATE TABLE funcionarios (\n    id        NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n    nome      VARCHAR2(100) NOT NULL,\n    cargo     VARCHAR2(50),\n    salario   NUMBER(10,2),\n    data_adm  DATE DEFAULT SYSDATE\n);\n\n-- Inserindo dados de exemplo\nINSERT INTO funcionarios (nome, cargo, salario) VALUES ('Ana Silva', 'Analista', 5200.00);\nINSERT INTO funcionarios (nome, cargo, salario) VALUES ('Bruno Costa', 'Desenvolvedor', 4800.50);\nINSERT INTO funcionarios (nome, cargo, salario) VALUES ('Carla Mendes', 'DBA', 7500.00);\nINSERT INTO funcionarios (nome, cargo, salario) VALUES ('Diego Alves', 'Estagi\u00e1rio', 1800.00);\nINSERT INTO funcionarios (nome, cargo, salario) VALUES ('Elena Ferreira', 'Gerente', 9200.00);\nCOMMIT;\n<\/code><\/pre>\n<pre><code class=\"output\">Tabela criada.\n\n1 linha inserida.\n1 linha inserida.\n1 linha inserida.\n1 linha inserida.\n1 linha inserida.\n\nCommit conclu\u00eddo.<\/code><\/pre>\n<p>Com o ambiente preparado e a tabela populada, estamos prontos para iniciar nossa jornada no <strong>PL\/SQL b\u00e1sico<\/strong>. Lembre-se: cada bloco de c\u00f3digo mostrado foi projetado para ser executado exatamente como est\u00e1. Copie, cole e execute \u2014 a verifica\u00e7\u00e3o imediata da sa\u00edda \u00e9 o segredo para fixar o aprendizado.<\/p>\n<h3>O que \u00e9 PL\/SQL e como ele se diferencia do SQL puro<\/h3>\n<p><strong>PL\/SQL<\/strong> (Procedural Language\/Structured Query Language) \u00e9 a extens\u00e3o procedural da Oracle para o SQL padr\u00e3o. Enquanto o SQL \u00e9 uma linguagem declarativa \u2014 voc\u00ea descreve <em>o que<\/em> quer, e o otimizador decide <em>como<\/em> obter \u2014, o PL\/SQL adiciona l\u00f3gica imperativa: vari\u00e1veis, condicionais, loops, tratamento de exce\u00e7\u00f5es e modulariza\u00e7\u00e3o. Isso significa que voc\u00ea pode escrever programas completos que residem dentro do banco de dados, pr\u00f3ximos dos dados, reduzindo tr\u00e1fego de rede e aumentando performance. Na <strong>JRT Technology Solutions<\/strong>, nossos especialistas utilizam PL\/SQL diariamente para construir APIs de banco, rotinas ETL e processos batch que processam milh\u00f5es de registros com efici\u00eancia.<\/p>\n<p>A unidade fundamental do <strong>PL\/SQL b\u00e1sico<\/strong> \u00e9 o <strong>bloco<\/strong>. Um bloco pode ser <strong>an\u00f4nimo<\/strong> (executado uma \u00fanica vez, sem nome) ou <strong>nomeado<\/strong> (procedures, functions, packages, triggers \u2014 que veremos nas aulas seguintes). O bloco an\u00f4nimo \u00e9 o ponto de partida ideal porque permite testar l\u00f3gica sem criar objetos permanentes no banco. Ele segue uma estrutura r\u00edgida de tr\u00eas se\u00e7\u00f5es: <code>DECLARE<\/code> (opcional, para vari\u00e1veis), <code>BEGIN<\/code> (obrigat\u00f3ria, para comandos execut\u00e1veis) e <code>EXCEPTION<\/code> (opcional, para tratamento de erros), finalizando com <code>END;<\/code>.<\/p>\n<p>Uma diferen\u00e7a crucial que muitos iniciantes demoram a entender \u00e9 que o PL\/SQL <strong>n\u00e3o retorna resultados de consultas diretamente como o SQL<\/strong>. Para visualizar dados dentro de um bloco, voc\u00ea precisa explicitamente captur\u00e1-los em vari\u00e1veis (com <code>SELECT INTO<\/code>) e depois exibi-los (com <code>DBMS_OUTPUT<\/code>) ou inseri-los em tabelas. Esta mudan\u00e7a de paradigma \u2014 de &#8220;result set&#8221; para &#8220;processamento linha a linha&#8221; \u2014 \u00e9 o que confere ao PL\/SQL seu poder de automa\u00e7\u00e3o.<\/p>\n<p>Outro ponto fundamental: o PL\/SQL \u00e9 <strong>fortemente integrado ao SQL<\/strong>. Voc\u00ea pode embutir qualquer comando DML (<code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code>, <code>MERGE<\/code>) e consultas <code>SELECT<\/code> dentro dos blocos, utilizando vari\u00e1veis para amarrar par\u00e2metros. Essa simbiose elimina a necessidade de &#8220;context switching&#8221; excessivo entre aplica\u00e7\u00e3o e banco de dados, um dos principais gargalos de performance em sistemas corporativos. Ao final desta aula, voc\u00ea compreender\u00e1 perfeitamente por que o <strong>PL\/SQL b\u00e1sico<\/strong> \u00e9 considerado uma habilidade indispens\u00e1vel para qualquer profissional Oracle.<\/p>\n<h3>Anatomia do Bloco An\u00f4nimo no PL\/SQL b\u00e1sico<\/h3>\n<p>Todo bloco PL\/SQL, por mais complexo que seja, obedece \u00e0 mesma estrutura fundamental. Compreender cada se\u00e7\u00e3o \u00e9 essencial antes de avan\u00e7armos para t\u00f3picos mais elaborados. Vamos dissecar o esqueleto de um bloco an\u00f4nimo:<\/p>\n<pre><code>-- Estrutura m\u00ednima de um bloco an\u00f4nimo PL\/SQL\nDECLARE\n    -- [OPCIONAL] Declara\u00e7\u00e3o de vari\u00e1veis, constantes, cursores, tipos\n    v_mensagem VARCHAR2(100);\nBEGIN\n    -- [OBRIGAT\u00d3RIO] Comandos execut\u00e1veis (SQL, la\u00e7os, condicionais)\n    v_mensagem := 'Meu primeiro bloco PL\/SQL!';\n    DBMS_OUTPUT.PUT_LINE(v_mensagem);\nEXCEPTION\n    -- [OPCIONAL] Captura e tratamento de exce\u00e7\u00f5es\n    WHEN OTHERS THEN\n        DBMS_OUTPUT.PUT_LINE('Erro: ' || SQLERRM);\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">Meu primeiro bloco PL\/SQL!\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>Vamos analisar cada elemento. A palavra-chave <strong><code>DECLARE<\/code><\/strong> inicia a zona de declara\u00e7\u00f5es \u2014 aqui voc\u00ea define todas as vari\u00e1veis e objetos que ser\u00e3o utilizados no bloco. Se o bloco n\u00e3o precisar de vari\u00e1veis, esta se\u00e7\u00e3o pode ser completamente omitida (blocos &#8220;BEGIN&#8230;END;&#8221; direto). A se\u00e7\u00e3o <strong><code>BEGIN<\/code><\/strong> \u00e9 o cora\u00e7\u00e3o do bloco: cont\u00e9m as instru\u00e7\u00f5es que ser\u00e3o executadas sequencialmente. Note que em PL\/SQL, a atribui\u00e7\u00e3o de valores a vari\u00e1veis utiliza o operador <strong><code>:=<\/code><\/strong> (dois-pontos seguido de igual), n\u00e3o o <code>=<\/code> simples (que \u00e9 reservado para compara\u00e7\u00f5es).<\/p>\n<p>A se\u00e7\u00e3o <strong><code>EXCEPTION<\/code><\/strong> \u00e9 um dos recursos mais poderosos do <strong>PL\/SQL b\u00e1sico<\/strong>. Ela permite capturar erros que ocorrem durante a execu\u00e7\u00e3o e trat\u00e1-los de forma elegante, sem quebrar a aplica\u00e7\u00e3o. O handler <code>WHEN OTHERS THEN<\/code> captura qualquer exce\u00e7\u00e3o n\u00e3o tratada explicitamente \u2014 veremos mais sobre exce\u00e7\u00f5es espec\u00edficas adiante. Finalmente, o bloco \u00e9 encerrado com <strong><code>END;<\/code><\/strong> e, no SQL*Plus, a execu\u00e7\u00e3o \u00e9 disparada pela <strong>barra (<code>\/<\/code>)<\/strong> na linha seguinte. Esta barra \u00e9 espec\u00edfica do SQL*Plus e do SQL Developer (em modo script); se voc\u00ea estiver usando a interface gr\u00e1fica do SQL Developer e executando com F5 ou Ctrl+Enter, ela pode ser omitida. No entanto, recomendamos sempre inclu\u00ed-la para compatibilidade.<\/p>\n<p>Um detalhe que confunde muitos alunos: o PL\/SQL permite aninhamento de blocos. Dentro da se\u00e7\u00e3o <code>BEGIN<\/code> de um bloco externo, voc\u00ea pode declarar um novo <code>DECLARE...BEGIN...END<\/code> interno, criando escopos l\u00e9xicos onde vari\u00e1veis do bloco interno n\u00e3o s\u00e3o vis\u00edveis ao bloco externo e vice-versa (a menos que referenciadas explicitamente). Esta t\u00e9cnica \u00e9 amplamente utilizada em nossos projetos na JRT para isolar l\u00f3gicas complexas e evitar polui\u00e7\u00e3o do namespace. No <strong>PL\/SQL b\u00e1sico<\/strong>, no entanto, focaremos em blocos simples e lineares.<\/p>\n<h3>Declara\u00e7\u00e3o de Vari\u00e1veis e Tipos no PL\/SQL b\u00e1sico<\/h3>\n<p>Vari\u00e1veis s\u00e3o cont\u00eaineres nomeados que armazenam valores manipul\u00e1veis durante a execu\u00e7\u00e3o do bloco. No <strong>PL\/SQL b\u00e1sico<\/strong>, a declara\u00e7\u00e3o segue o formato <code>nome_variavel [CONSTANT] tipo [NOT NULL] [:= valor_inicial];<\/code>. A Oracle oferece uma ampla gama de tipos de dados, muitos deles equivalentes aos tipos SQL que voc\u00ea j\u00e1 conhece, mas com extens\u00f5es espec\u00edficas para programa\u00e7\u00e3o. A tabela abaixo resume os tipos mais utilizados no dia a dia:<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr style=\"background-color: #f0f0f0;\">\n<th>Tipo PL\/SQL<\/th>\n<th>Descri\u00e7\u00e3o<\/th>\n<th>Exemplo de Declara\u00e7\u00e3o<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>VARCHAR2(n)<\/code><\/td>\n<td>String de comprimento vari\u00e1vel, m\u00e1ximo <code>n<\/code> bytes (at\u00e9 32767 em PL\/SQL)<\/td>\n<td><code>v_nome VARCHAR2(100) := 'Oracle';<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>NUMBER(p,s)<\/code><\/td>\n<td>Num\u00e9rico com precis\u00e3o <code>p<\/code> e escala <code>s<\/code><\/td>\n<td><code>v_salario NUMBER(10,2) := 5000.00;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>DATE<\/code><\/td>\n<td>Data e hora (at\u00e9 segundos)<\/td>\n<td><code>v_hoje DATE := SYSDATE;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>BOOLEAN<\/code><\/td>\n<td>L\u00f3gico: <code>TRUE<\/code>, <code>FALSE<\/code> ou <code>NULL<\/code> (exclusivo PL\/SQL, n\u00e3o existe em SQL)<\/td>\n<td><code>v_flag BOOLEAN := TRUE;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>INTEGER<\/code><\/td>\n<td>Sub-tipo de NUMBER para inteiros<\/td>\n<td><code>v_cont INTEGER := 0;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>tabela.coluna%TYPE<\/code><\/td>\n<td>&#8220;Anchored type&#8221;: herda o tipo da coluna da tabela<\/td>\n<td><code>v_sal func.salario%TYPE;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>tabela%ROWTYPE<\/code><\/td>\n<td>Registro completo com a estrutura de uma linha da tabela<\/td>\n<td><code>v_reg func%ROWTYPE;<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>O uso de <strong><code>%TYPE<\/code><\/strong> e <strong><code>%ROWTYPE<\/code><\/strong> \u00e9 uma das melhores pr\u00e1ticas mais recomendadas no <strong>PL\/SQL b\u00e1sico<\/strong>. Ao ancorar uma vari\u00e1vel a uma coluna de tabela, voc\u00ea blinda seu c\u00f3digo contra altera\u00e7\u00f5es estruturais futuras \u2014 se a coluna <code>SALARIO<\/code> mudar de <code>NUMBER(10,2)<\/code> para <code>NUMBER(12,4)<\/code>, sua vari\u00e1vel automaticamente acompanha a mudan\u00e7a, sem necessidade de refatora\u00e7\u00e3o. Essa \u00e9 uma t\u00e9cnica que nossos arquitetos da <strong>JRT Technology Solutions<\/strong> exigem em todas as entregas de c\u00f3digo PL\/SQL.<\/p>\n<p>Constantes s\u00e3o declaradas com a palavra-chave <code>CONSTANT<\/code> e devem ser inicializadas obrigatoriamente na declara\u00e7\u00e3o. Uma vez atribu\u00eddo, seu valor n\u00e3o pode ser alterado durante toda a execu\u00e7\u00e3o do bloco. Exemplo t\u00edpico: <code>v_taxa_imposto CONSTANT NUMBER(5,2) := 0.15;<\/code>. Tentativas de reatribui\u00e7\u00e3o geram o erro <code>PLS-00363<\/code>. J\u00e1 vari\u00e1veis com a constraint <code>NOT NULL<\/code> tamb\u00e9m exigem inicializa\u00e7\u00e3o na declara\u00e7\u00e3o e n\u00e3o podem receber <code>NULL<\/code> posteriormente \u2014 uma salvaguarda valiosa para l\u00f3gica de neg\u00f3cio.<\/p>\n<p>Veja um bloco completo que demonstra diferentes tipos de vari\u00e1veis e o uso de <code>%TYPE<\/code> e <code>%ROWTYPE<\/code>:<\/p>\n<pre><code>DECLARE\n    v_id        funcionarios.id%TYPE;\n    v_nome      funcionarios.nome%TYPE;\n    v_salario   funcionarios.salario%TYPE;\n    v_reg       funcionarios%ROWTYPE;         -- Registro completo\n    v_msg       VARCHAR2(200);\n    v_bonus     CONSTANT NUMBER(5,2) := 0.10; -- 10% fixo\nBEGIN\n    -- SELECT INTO para popular vari\u00e1veis escalares\n    SELECT id, nome, salario\n    INTO   v_id, v_nome, v_salario\n    FROM   funcionarios\n    WHERE  id = 1;\n\n    v_msg := 'Funcion\u00e1rio ' || v_nome || ' (ID:' || v_id || ') ganha R$ ' || v_salario;\n    DBMS_OUTPUT.PUT_LINE(v_msg);\n    DBMS_OUTPUT.PUT_LINE('B\u00f4nus previsto: R$ ' || ROUND(v_salario * v_bonus, 2));\n\n    -- SELECT INTO para popular um ROWTYPE inteiro\n    SELECT * INTO v_reg FROM funcionarios WHERE id = 3;\n    DBMS_OUTPUT.PUT_LINE('Registro completo: ' || v_reg.nome || ' - ' || v_reg.cargo);\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">Funcion\u00e1rio Ana Silva (ID:1) ganha R$ 5200\nB\u00f4nus previsto: R$ 520\nRegistro completo: Carla Mendes - DBA\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>Observe que no segundo <code>SELECT INTO<\/code> utilizamos o curinga <code>*<\/code> para preencher todas as colunas do registro <code>v_reg<\/code> de uma s\u00f3 vez. O acesso aos campos individuais \u00e9 feito com a nota\u00e7\u00e3o de ponto (<code>v_reg.nome<\/code>). Essa t\u00e9cnica \u00e9 extremamente produtiva em rotinas que manipulam linhas completas, como migra\u00e7\u00f5es e valida\u00e7\u00f5es.<\/p>\n<h3>Controle de Fluxo Condicional: IF, ELSIF e ELSE no PL\/SQL b\u00e1sico<\/h3>\n<p>O comando <code>IF<\/code> \u00e9 a estrutura condicional mais b\u00e1sica e vers\u00e1til do <strong>PL\/SQL b\u00e1sico<\/strong>. Sua sintaxe \u00e9 intuitiva para quem j\u00e1 programa em qualquer linguagem, mas possui particularidades importantes. O formato completo \u00e9: <code>IF condicao1 THEN ... ELSIF condicao2 THEN ... ELSE ... END IF;<\/code>. Note que o <strong>ELSIF<\/strong> do Oracle \u00e9 uma palavra s\u00f3 (sem o segundo &#8220;E&#8221;), e que todo bloco <code>IF<\/code> deve ser finalizado com <strong><code>END IF;<\/code><\/strong> (com espa\u00e7o e ponto-e-v\u00edrgula). Esquecer o <code>END IF<\/code> \u00e9 um dos erros de sintaxe mais comuns entre iniciantes.<\/p>\n<p>As condi\u00e7\u00f5es podem usar todos os operadores relacionais padr\u00e3o (<code>=<\/code>, <code><<\/code>, <code>><\/code>, <code><=<\/code>, <code>>=<\/code>, <code><><\/code> ou <code>!=<\/code>) e operadores l\u00f3gicos (<code>AND<\/code>, <code>OR<\/code>, <code>NOT<\/code>). Uma peculiaridade importante: valores <code>NULL<\/code> em condi\u00e7\u00f5es produzem resultados desconhecidos (<code>UNKNOWN<\/code>) e n\u00e3o s\u00e3o tratados como <code>FALSE<\/code>. Por isso, sempre utilize <code>IS NULL<\/code> ou <code>IS NOT NULL<\/code> explicitamente, ou fun\u00e7\u00f5es como <code>NVL()<\/code> para evitar comportamentos inesperados.<\/p>\n<p>Vamos construir um exemplo que classifica funcion\u00e1rios por faixa salarial utilizando <code>IF\/ELSIF\/ELSE<\/code>:<\/p>\n<pre><code>DECLARE\n    v_nome      funcionarios.nome%TYPE;\n    v_salario   funcionarios.salario%TYPE;\n    v_faixa     VARCHAR2(20);\nBEGIN\n    SELECT nome, salario\n    INTO   v_nome, v_salario\n    FROM   funcionarios\n    WHERE  id = 2;  -- Bruno Costa, sal\u00e1rio 4800.50\n\n    IF v_salario > 7000 THEN\n        v_faixa := 'Premium';\n    ELSIF v_salario >= 4000 THEN\n        v_faixa := 'Pleno';\n    ELSIF v_salario >= 2000 THEN\n        v_faixa := 'J\u00fanior';\n    ELSE\n        v_faixa := 'Estagi\u00e1rio';\n    END IF;\n\n    DBMS_OUTPUT.PUT_LINE(v_nome || ' est\u00e1 na faixa: ' || v_faixa);\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">Bruno Costa est\u00e1 na faixa: Pleno\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>Perceba que as condi\u00e7\u00f5es s\u00e3o avaliadas em ordem \u2014 a primeira que retornar <code>TRUE<\/code> dispara o bloco correspondente, e as demais s\u00e3o ignoradas. Isso torna a ordem dos <code>ELSIF<\/code> relevante: se a condi\u00e7\u00e3o <code>>= 4000<\/code> viesse antes de <code>> 7000<\/code>, valores acima de 7000 cairiam na faixa \"Pleno\", o que seria incorreto. Em l\u00f3gica de classifica\u00e7\u00e3o, sempre ordene os testes do mais restritivo para o menos restritivo. Esta \u00e9 uma pr\u00e1tica di\u00e1ria dos analistas da <strong>JRT Technology Solutions<\/strong> em rotinas de categoriza\u00e7\u00e3o de clientes, incidentes e ativos.<\/p>\n<h3>Express\u00e3o CASE no PL\/SQL b\u00e1sico: alternativa elegante ao IF<\/h3>\n<p>Quando voc\u00ea precisa testar m\u00faltiplos valores de uma mesma vari\u00e1vel, a express\u00e3o <strong><code>CASE<\/code><\/strong> oferece uma sintaxe mais limpa e leg\u00edvel que longas cadeias de <code>IF\/ELSIF<\/code>. O PL\/SQL suporta duas formas de <code>CASE<\/code>: o <strong>CASE simples<\/strong> (compara uma express\u00e3o contra valores fixos) e o <strong>CASE searched<\/strong> (avalia condi\u00e7\u00f5es booleanas, similar ao <code>IF<\/code>). Ambos s\u00e3o encerrados com <code>END CASE;<\/code>.<\/p>\n<p>O <code>CASE<\/code> como express\u00e3o tamb\u00e9m pode retornar valores diretamente para vari\u00e1veis, eliminando a necessidade de m\u00faltiplas atribui\u00e7\u00f5es. Veja o mesmo exemplo de faixa salarial reescrito com <code>CASE<\/code> searched:<\/p>\n<pre><code>DECLARE\n    v_nome      funcionarios.nome%TYPE;\n    v_salario   funcionarios.salario%TYPE;\n    v_faixa     VARCHAR2(20);\nBEGIN\n    SELECT nome, salario INTO v_nome, v_salario FROM funcionarios WHERE id = 4; -- Diego\n\n    v_faixa := CASE\n                   WHEN v_salario > 7000 THEN 'Premium'\n                   WHEN v_salario >= 4000 THEN 'Pleno'\n                   WHEN v_salario >= 2000 THEN 'J\u00fanior'\n                   ELSE 'Estagi\u00e1rio'\n               END;\n\n    DBMS_OUTPUT.PUT_LINE(v_nome || ' est\u00e1 na faixa: ' || v_faixa);\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">Diego Alves est\u00e1 na faixa: Estagi\u00e1rio\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>Note que a atribui\u00e7\u00e3o <code>v_faixa := CASE ... END;<\/code> em uma \u00fanica linha \u00e9 poss\u00edvel porque o <code>CASE<\/code> \u00e9 uma express\u00e3o que retorna valor. Isso torna o c\u00f3digo mais conciso e f\u00e1cil de manter. O <code>CASE<\/code> simples, por outro lado, \u00e9 \u00fatil quando voc\u00ea testa uma \u00fanica vari\u00e1vel contra v\u00e1rios valores discretos \u2014 por exemplo, mapear c\u00f3digos de erro para mensagens amig\u00e1veis.<\/p>\n<p>Abaixo, uma tabela comparativa para ajudar voc\u00ea a decidir quando usar cada estrutura:<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr style=\"background-color: #f0f0f0;\">\n<th>Crit\u00e9rio<\/th>\n<th>IF \/ ELSIF \/ ELSE<\/th>\n<th>CASE (express\u00e3o)<\/th>\n<th>CASE (comando)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Complexidade das condi\u00e7\u00f5es<\/strong><\/td>\n<td>Alta \u2014 permite qualquer express\u00e3o booleana<\/td>\n<td>M\u00e9dia \u2014 condi\u00e7\u00f5es nos WHEN<\/td>\n<td>M\u00e9dia \u2014 condi\u00e7\u00f5es nos WHEN<\/td>\n<\/tr>\n<tr>\n<td><strong>Retorna valor para vari\u00e1vel<\/strong><\/td>\n<td>N\u00e3o diretamente (precisa de atribui\u00e7\u00e3o interna)<\/td>\n<td>Sim, como express\u00e3o<\/td>\n<td>N\u00e3o (controle de fluxo puro)<\/td>\n<\/tr>\n<tr>\n<td><strong>Legibilidade com muitos casos<\/strong><\/td>\n<td>Baixa (muitos ELSIF aninhados)<\/td>\n<td>Alta<\/td>\n<td>Alta<\/td>\n<\/tr>\n<tr>\n<td><strong>Uso t\u00edpico<\/strong><\/td>\n<td>L\u00f3gica de neg\u00f3cio complexa com m\u00faltiplas vari\u00e1veis<\/td>\n<td>Mapeamento de valores, decodifica\u00e7\u00e3o<\/td>\n<td>Execu\u00e7\u00e3o condicional de blocos de comando<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Em nossos projetos na <strong>JRT<\/strong>, tendemos a preferir <code>CASE<\/code> para mapeamentos e decodifica\u00e7\u00f5es, e <code>IF<\/code> para l\u00f3gica de decis\u00e3o que envolve m\u00faltiplas vari\u00e1veis ou efeitos colaterais (como execu\u00e7\u00f5es de DML condicionais). N\u00e3o existe uma regra absoluta \u2014 a legibilidade e a manutenibilidade do c\u00f3digo devem ser o guia principal.<\/p>\n<h3>Estruturas de Repeti\u00e7\u00e3o no PL\/SQL b\u00e1sico: LOOP, WHILE e FOR<\/h3>\n<p>As estruturas de repeti\u00e7\u00e3o (ou la\u00e7os) s\u00e3o o que realmente diferencia o <strong>PL\/SQL b\u00e1sico<\/strong> do SQL declarativo. Elas permitem processar conjuntos de dados linha a linha, executar opera\u00e7\u00f5es repetitivas at\u00e9 que uma condi\u00e7\u00e3o seja satisfeita e iterar sobre ranges num\u00e9ricos. O Oracle PL\/SQL oferece tr\u00eas constru\u00e7\u00f5es principais: <strong><code>LOOP<\/code> simples<\/strong> (infinito, requer <code>EXIT<\/code> expl\u00edcito), <strong><code>WHILE...LOOP<\/code><\/strong> (pr\u00e9-condi\u00e7\u00e3o) e <strong><code>FOR...LOOP<\/code><\/strong> (itera\u00e7\u00e3o com contador).<\/p>\n<p>O <strong><code>LOOP<\/code> simples<\/strong> \u00e9 a forma mais b\u00e1sica. Ele executa indefinidamente at\u00e9 encontrar um comando <code>EXIT<\/code> ou <code>EXIT WHEN<\/code>. \u00c9 ideal para situa\u00e7\u00f5es onde a condi\u00e7\u00e3o de sa\u00edda s\u00f3 pode ser avaliada no meio do processamento (ex: leitura de arquivos, polling de status). Sem um <code>EXIT<\/code>, o bloco executar\u00e1 para sempre \u2014 em ambiente Oracle, isso geralmente resulta em timeout ou estouro de recursos, n\u00e3o em travamento total (o DBA pode matar a sess\u00e3o).<\/p>\n<p>O <strong><code>WHILE...LOOP<\/code><\/strong> avalia a condi\u00e7\u00e3o antes de cada itera\u00e7\u00e3o. Se a condi\u00e7\u00e3o for falsa j\u00e1 na primeira verifica\u00e7\u00e3o, o corpo do la\u00e7o n\u00e3o \u00e9 executado nenhuma vez. \u00c9 a escolha certa quando o n\u00famero de itera\u00e7\u00f5es \u00e9 desconhecido mas a condi\u00e7\u00e3o de continua\u00e7\u00e3o \u00e9 clara.<\/p>\n<p>O <strong><code>FOR...LOOP<\/code><\/strong> \u00e9 o mais utilizado no dia a dia. Ele itera sobre um range num\u00e9rico (<code>FOR i IN 1..10<\/code>) ou sobre os resultados de um cursor (<code>FOR registro IN (SELECT ...)<\/code>). A vari\u00e1vel do contador \u00e9 impl\u00edcita \u2014 voc\u00ea n\u00e3o precisa declar\u00e1-la no <code>DECLARE<\/code>, e ela \u00e9 acess\u00edvel somente dentro do loop. Vejam um exemplo abrangente que demonstra os tr\u00eas tipos:<\/p>\n<pre><code>DECLARE\n    v_contador  INTEGER := 0;\n    v_soma      NUMBER := 0;\nBEGIN\n    DBMS_OUTPUT.PUT_LINE('=== LOOP simples com EXIT WHEN ===');\n    LOOP\n        v_contador := v_contador + 1;\n        DBMS_OUTPUT.PUT_LINE('Itera\u00e7\u00e3o: ' || v_contador);\n        EXIT WHEN v_contador >= 3;  -- Sai quando atinge 3\n    END LOOP;\n\n    DBMS_OUTPUT.PUT_LINE('=== WHILE LOOP ===');\n    v_contador := 0;  -- Reset\n    WHILE v_contador < 3 LOOP\n        v_contador := v_contador + 1;\n        DBMS_OUTPUT.PUT_LINE('While itera\u00e7\u00e3o: ' || v_contador);\n    END LOOP;\n\n    DBMS_OUTPUT.PUT_LINE('=== FOR LOOP com range num\u00e9rico ===');\n    FOR i IN 1..3 LOOP\n        v_soma := v_soma + i;\n        DBMS_OUTPUT.PUT_LINE('i=' || i || ', soma parcial=' || v_soma);\n    END LOOP;\n\n    DBMS_OUTPUT.PUT_LINE('=== FOR LOOP sobre consulta (cursor impl\u00edcito) ===');\n    FOR rec IN (SELECT nome, salario FROM funcionarios WHERE salario > 4000 ORDER BY salario) LOOP\n        DBMS_OUTPUT.PUT_LINE(rec.nome || ' ganha R$ ' || rec.salario);\n    END LOOP;\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">=== LOOP simples com EXIT WHEN ===\nItera\u00e7\u00e3o: 1\nItera\u00e7\u00e3o: 2\nItera\u00e7\u00e3o: 3\n=== WHILE LOOP ===\nWhile itera\u00e7\u00e3o: 1\nWhile itera\u00e7\u00e3o: 2\nWhile itera\u00e7\u00e3o: 3\n=== FOR LOOP com range num\u00e9rico ===\ni=1, soma parcial=1\ni=2, soma parcial=3\ni=3, soma parcial=6\n=== FOR LOOP sobre consulta (cursor impl\u00edcito) ===\nAna Silva ganha R$ 5200\nCarla Mendes ganha R$ 7500\nElena Ferreira ganha R$ 9200\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>O <strong>FOR LOOP sobre cursor impl\u00edcito<\/strong> merece destaque especial. Ele abre, percorre e fecha o cursor automaticamente \u2014 voc\u00ea n\u00e3o precisa se preocupar com <code>OPEN<\/code>, <code>FETCH<\/code> ou <code>CLOSE<\/code>. A cada itera\u00e7\u00e3o, a vari\u00e1vel <code>rec<\/code> (que voc\u00ea nomeia como quiser) cont\u00e9m uma linha do resultado da consulta, e seus campos s\u00e3o acessados com a nota\u00e7\u00e3o de ponto. Este \u00e9, de longe, o padr\u00e3o mais comum em scripts PL\/SQL nas empresas que a <strong>JRT Technology Solutions<\/strong> atende, sendo utilizado para processamento batch de dados, migra\u00e7\u00f5es e relat\u00f3rios.<\/p>\n<p>Um cuidado importante: dentro de loops que cont\u00eam DML (<code>INSERT<\/code>, <code>UPDATE<\/code>, <code>DELETE<\/code>), \u00e9 mandat\u00f3rio gerenciar transa\u00e7\u00f5es com <code>COMMIT<\/code> peri\u00f3dicos para evitar esgotamento do undo tablespace. A cada 10.000 ou 50.000 registros (dependendo do volume), insira um <code>COMMIT<\/code> e, se necess\u00e1rio, mantenha um contador para retomar de onde parou em caso de falha. Essa t\u00e9cnica de \"commit em lote\" \u00e9 padr\u00e3o em qualquer rotina de produ\u00e7\u00e3o robusta.<\/p>\n<h3>Tratamento de Exce\u00e7\u00f5es no PL\/SQL b\u00e1sico<\/h3>\n<p>Nenhum programa profissional est\u00e1 completo sem tratamento adequado de erros, e o <strong>PL\/SQL b\u00e1sico<\/strong> oferece um sistema de exce\u00e7\u00f5es maduro e flex\u00edvel. As exce\u00e7\u00f5es em Oracle se dividem em duas categorias: <strong>predefinidas<\/strong> (como <code>NO_DATA_FOUND<\/code>, <code>TOO_MANY_ROWS<\/code>, <code>ZERO_DIVIDE<\/code>) e <strong>definidas pelo usu\u00e1rio<\/strong> (declaradas com nome e c\u00f3digo de erro, ou geradas com <code>RAISE_APPLICATION_ERROR<\/code>). A se\u00e7\u00e3o <code>EXCEPTION<\/code> captura os erros que ocorrem no bloco <code>BEGIN<\/code> e permite uma sa\u00edda controlada.<\/p>\n<p>A exce\u00e7\u00e3o mais encontrada por iniciantes \u00e9 a <strong><code>NO_DATA_FOUND<\/code><\/strong> (ORA-01403), que ocorre quando um <code>SELECT INTO<\/code> n\u00e3o retorna nenhuma linha. Diferente do SQL puro \u2014 onde uma consulta vazia simplesmente retorna \"zero linhas\" sem erro \u2014, o <code>SELECT INTO<\/code> em PL\/SQL <strong>exige<\/strong> que exatamente uma linha seja retornada. Zero linhas causa <code>NO_DATA_FOUND<\/code>; mais de uma linha causa <code>TOO_MANY_ROWS<\/code>. Por isso, sempre envolva <code>SELECT INTO<\/code> em blocos com tratamento de exce\u00e7\u00e3o apropriado ou utilize cursores quando m\u00faltiplas linhas forem esperadas.<\/p>\n<p>Veja um exemplo robusto que captura ambas as exce\u00e7\u00f5es:<\/p>\n<pre><code>DECLARE\n    v_nome funcionarios.nome%TYPE;\n    v_id   NUMBER := &amp;id_consulta;  -- &amp; solicita input no SQL*Plus \/ SQL Developer\nBEGIN\n    SELECT nome INTO v_nome FROM funcionarios WHERE id = v_id;\n    DBMS_OUTPUT.PUT_LINE('Funcion\u00e1rio encontrado: ' || v_nome);\nEXCEPTION\n    WHEN NO_DATA_FOUND THEN\n        DBMS_OUTPUT.PUT_LINE('Erro: Nenhum funcion\u00e1rio com ID ' || v_id);\n    WHEN TOO_MANY_ROWS THEN\n        DBMS_OUTPUT.PUT_LINE('Erro: Mais de um funcion\u00e1rio retornado (estranho para ID \u00fanico)');\n    WHEN OTHERS THEN\n        DBMS_OUTPUT.PUT_LINE('Erro inesperado: ' || SQLERRM);\n        DBMS_OUTPUT.PUT_LINE('C\u00f3digo Oracle: ' || SQLCODE);\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">-- Supondo que o usu\u00e1rio digitou 99 (ID inexistente):\nErro: Nenhum funcion\u00e1rio com ID 99\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>A fun\u00e7\u00e3o <strong><code>SQLERRM<\/code><\/strong> retorna a mensagem de erro associada \u00e0 exce\u00e7\u00e3o capturada, e <strong><code>SQLCODE<\/code><\/strong> retorna o c\u00f3digo num\u00e9rico (por exemplo, +100 para <code>NO_DATA_FOUND<\/code>, -1403 se n\u00e3o capturada). Em projetos da <strong>JRT<\/strong>, utilizamos exce\u00e7\u00f5es personalizadas disparadas via <code>RAISE_APPLICATION_ERROR(-20001, 'Mensagem customizada')<\/code> para validar regras de neg\u00f3cio diretamente no banco, evitando que dados inconsistentes cheguem \u00e0 aplica\u00e7\u00e3o. Este t\u00f3pico ser\u00e1 aprofundado na aula sobre procedures e functions.<\/p>\n<p>Jamais deixe um bloco de produ\u00e7\u00e3o com <code>WHEN OTHERS THEN NULL;<\/code> (o famoso \"engolir exce\u00e7\u00e3o\"), a menos que haja uma raz\u00e3o extremamente bem documentada. Exce\u00e7\u00f5es silenciadas s\u00e3o a causa raiz de incont\u00e1veis bugs dif\u00edceis de rastrear. No m\u00ednimo, registre o erro em uma tabela de log \u2014 pr\u00e1tica que j\u00e1 salvou in\u00fameros sistemas administrados por nossos especialistas.<\/p>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Nesta se\u00e7\u00e3o, voc\u00ea executar\u00e1 comandos de verifica\u00e7\u00e3o para garantir que seu ambiente est\u00e1 corretamente configurado para o <strong>PL\/SQL b\u00e1sico<\/strong>. Esses testes n\u00e3o apenas validam a conectividade, mas tamb\u00e9m demonstram que o recurso <code>DBMS_OUTPUT<\/code> est\u00e1 funcional \u2014 essencial para acompanhar os exemplos da aula.<\/p>\n<p>Execute os comandos abaixo exatamente na ordem apresentada. Se qualquer sa\u00edda divergir significativamente, verifique os pr\u00e9-requisitos no in\u00edcio da aula antes de prosseguir.<\/p>\n<pre><code>-- Teste 1: Verificar vers\u00e3o do Oracle e conectividade\nSELECT banner FROM v$version WHERE banner LIKE 'Oracle%';\n<\/code><\/pre>\n<pre><code class=\"output\">BANNER\n--------------------------------------------------------------------------------\nOracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production\n\n1 linha selecionada.<\/code><\/pre>\n<pre><code>-- Teste 2: Habilitar sa\u00edda do DBMS_OUTPUT e executar bloco m\u00ednimo\nSET SERVEROUTPUT ON;\n\nBEGIN\n    DBMS_OUTPUT.PUT_LINE('Ambiente PL\/SQL operacional em ' || TO_CHAR(SYSDATE, 'DD\/MM\/YYYY HH24:MI:SS'));\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">Ambiente PL\/SQL operacional em 18\/07\/2026 14:35:22\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<pre><code>-- Teste 3: Verificar exist\u00eancia da tabela de apoio\nSELECT COUNT(*) AS total_registros FROM funcionarios;\n<\/code><\/pre>\n<pre><code class=\"output\">TOTAL_REGISTROS\n--------------\n             5\n\n1 linha selecionada.<\/code><\/pre>\n<pre><code>-- Teste 4: Executar bloco com SELECT INTO para validar permiss\u00f5es\nDECLARE\n    v_teste VARCHAR2(50);\nBEGIN\n    SELECT nome INTO v_teste FROM funcionarios WHERE id = 1;\n    DBMS_OUTPUT.PUT_LINE('Teste SELECT INTO OK: ' || v_teste);\nEND;\n\/\n<\/code><\/pre>\n<pre><code class=\"output\">Teste SELECT INTO OK: Ana Silva\n\nProcedimento PL\/SQL conclu\u00eddo com sucesso.<\/code><\/pre>\n<p>Se todos os quatro testes retornarem sa\u00eddas similares \u00e0s mostradas acima, seu ambiente est\u00e1 perfeitamente configurado para acompanhar esta aula de <strong>PL\/SQL b\u00e1sico<\/strong>. Caso enfrente problemas, revise a se\u00e7\u00e3o de pr\u00e9-requisitos e a tabela de erros comuns abaixo.<\/p>\n<h3>Erros Comuns e Como Resolver<\/h3>\n<p>Durante a jornada de aprendizado do <strong>PL\/SQL b\u00e1sico<\/strong>, alguns trope\u00e7os s\u00e3o praticamente universais. Compilamos aqui os erros mais frequentes que nossos instrutores da <strong>JRT Technology Solutions<\/strong> observam nos treinamentos, junto com diagn\u00f3sticos precisos e solu\u00e7\u00f5es imediatas.<\/p>\n<ul>\n<li>\n        <strong>Erro: <code>PLS-00201: identifier '...' must be declared<\/code><\/strong><br \/>\n        <em>Causa:<\/em> Voc\u00ea referenciou uma vari\u00e1vel que n\u00e3o foi declarada na se\u00e7\u00e3o <code>DECLARE<\/code>, ou cometeu um erro de digita\u00e7\u00e3o no nome.<br \/>\n        <em>Sintoma:<\/em> O bloco nem chega a executar; o erro \u00e9 lan\u00e7ado em tempo de compila\u00e7\u00e3o.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Verifique a declara\u00e7\u00e3o de todas as vari\u00e1veis usadas no bloco. Lembre-se que PL\/SQL \u00e9 <strong>case-insensitive<\/strong> para identificadores, mas erros de ortografia s\u00e3o a causa mais comum. Se voc\u00ea declarou <code>v_contador<\/code> e est\u00e1 tentando usar <code>v_cont<\/code>, o erro aparecer\u00e1. Use um editor com autocomplete (como o SQL Developer) para minimizar esse problema.\n    <\/li>\n<p><\/p>\n<li>\n        <strong>Erro: <code>ORA-01403: no data found<\/code> no SELECT INTO<\/strong><br \/>\n        <em>Causa:<\/em> O <code>SELECT INTO<\/code> n\u00e3o encontrou nenhuma linha que satisfizesse a condi\u00e7\u00e3o <code>WHERE<\/code>.<br \/>\n        <em>Sintoma:<\/em> O bloco compila mas aborta na linha do <code>SELECT INTO<\/code> com exce\u00e7\u00e3o n\u00e3o tratada.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Sempre envolva <code>SELECT INTO<\/code> em um bloco <code>BEGIN...EXCEPTION...END<\/code> interno (bloco aninhado) para capturar <code>NO_DATA_FOUND<\/code>, ou utilize um cursor com <code>FETCH<\/code> que permite verificar <code>%NOTFOUND<\/code>. Alternativamente, fun\u00e7\u00f5es agregadas como <code>MAX()<\/code> ou <code>MIN()<\/code> garantem retorno (NULL se n\u00e3o houver dados), eliminando o risco de <code>NO_DATA_FOUND<\/code>.\n    <\/li>\n<p><\/p>\n<li>\n        <strong>Erro: <code>PLS-00103: Encountered the symbol \"...\" when expecting one of the following<\/code><\/strong><br \/>\n        <em>Causa:<\/em> Erro de sintaxe \u2014 geralmente falta de ponto-e-v\u00edrgula, <code>END IF<\/code> n\u00e3o fechado, ou barra (<code>\/<\/code>) em local errado.<br \/>\n        <em>Sintoma:<\/em> O erro aponta para uma linha pr\u00f3xima ao problema real, mas nem sempre exatamente na linha certa.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Revise a estrutura do bloco: cada comando dentro do <code>BEGIN<\/code> termina com <code>;<\/code>; cada <code>IF<\/code> tem seu <code>END IF;<\/code> correspondente; cada <code>LOOP<\/code> tem seu <code>END LOOP;<\/code>. Use indenta\u00e7\u00e3o consistente para facilitar a visualiza\u00e7\u00e3o de blocos n\u00e3o fechados.\n    <\/li>\n<p><\/p>\n<li>\n        <strong>Erro: <code>ORA-06502: PL\/SQL: numeric or value error: character string buffer too small<\/code><\/strong><br \/>\n        <em>Causa:<\/em> Voc\u00ea declarou uma vari\u00e1vel <code>VARCHAR2<\/code> com tamanho insuficiente para o valor que est\u00e1 tentando armazenar.<br \/>\n        <em>Sintoma:<\/em> O erro ocorre em tempo de execu\u00e7\u00e3o, na linha de atribui\u00e7\u00e3o ou concatena\u00e7\u00e3o.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Aumente o tamanho m\u00e1ximo da vari\u00e1vel. Considere usar <code>VARCHAR2(4000)<\/code> para strings de prop\u00f3sito geral, ou <code>CLOB<\/code> para textos muito longos. Lembre-se que em PL\/SQL, diferentemente do SQL, <code>VARCHAR2<\/code> pode ter at\u00e9 32767 bytes \u2014 use essa capacidade a seu favor.\n    <\/li>\n<p><\/p>\n<li>\n        <strong>Erro: <code>SP2-0042: unknown command \"END\" - rest of line ignored<\/code> (SQL*Plus)<\/strong><br \/>\n        <em>Causa:<\/em> Falta de ponto-e-v\u00edrgula antes do <code>END;<\/code>, ou execu\u00e7\u00e3o linha a linha sem estar em modo bloco.<br \/>\n        <em>Sintoma:<\/em> O bloco n\u00e3o \u00e9 reconhecido como PL\/SQL e o SQL*Plus tenta interpretar cada linha como comando aut\u00f4nomo.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Sempre garanta que o <code>END;<\/code> seja precedido por um ponto-e-v\u00edrgula nos comandos anteriores. Digite o bloco completo e finalize com a barra (<code>\/<\/code>) em uma nova linha. No SQL Developer, execute com <code>F9<\/code> (Run Statement) ou <code>F5<\/code> (Run Script).\n    <\/li>\n<\/ul>\n<h3>Boas Pr\u00e1ticas e Dicas Avan\u00e7adas da JRT Technology Solutions<\/h3>\n<p>Ao longo de mais de uma d\u00e9cada implementando solu\u00e7\u00f5es Oracle para clientes de todos os portes, a equipe da <strong>JRT<\/strong> consolidou um conjunto de boas pr\u00e1<\/p>\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de Oracle SQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20Oracle%20SQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!<\/p>\n","protected":false},"author":1,"featured_media":1635,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"iawp_total_views":0,"footnotes":""},"categories":[75],"tags":[2693,2695,2093,2692,2696,2694],"class_list":["post-1636","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-blocos-anonimos-pl-sql","tag-controle-de-fluxo-pl-sql","tag-oracle-sql","tag-pl-sql-basico","tag-programacao-pl-sql","tag-variaveis-pl-sql"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Thiago Paes Rodrigues\"\/>\n\t<meta name=\"google-site-verification\" content=\"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_BR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"100\" \/>\n\t\t<meta property=\"og:image:height\" content=\"75\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-07-18T21:12:24+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-18T21:12:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61590814880509\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#blogposting\",\"name\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo\",\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/ai-image-1784409136551.jpg\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo\"},\"datePublished\":\"2026-07-18T18:12:24-03:00\",\"dateModified\":\"2026-07-18T18:12:24-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#webpage\"},\"articleSection\":\"DevOps, blocos an\\u00f4nimos PL\\\/SQL, controle de fluxo PL\\\/SQL, oracle sql, PL\\\/SQL b\\u00e1sico, programa\\u00e7\\u00e3o PL\\\/SQL, vari\\u00e1veis PL\\\/SQL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#listItem\",\"name\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#listItem\",\"position\":3,\"name\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"telephone\":\"+552138277513\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-logo-mini.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61590814880509\",\"https:\\\/\\\/www.instagram.com\\\/jrtx.tech\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/\",\"name\":\"Thiago Paes Rodrigues\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3cdfdf5f766c59d9c9acab959751c31c3442acd94d4b2927c51d2a0c31b50822?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"Thiago Paes Rodrigues\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/\",\"name\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions\",\"description\":\"Aprenda PL\\\/SQL b\\u00e1sico com blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\\u00e7ado. Clique e comece agora!\",\"inLanguage\":\"pt-BR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/ai-image-1784409136551.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#mainImage\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 17: PL\\\/SQL b\\u00e1sico \\u2014 blocos an\\u00f4nimos, vari\\u00e1veis e controle de fluxo\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/18\\\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\\\/#mainImage\"},\"datePublished\":\"2026-07-18T18:12:24-03:00\",\"dateModified\":\"2026-07-18T18:12:24-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"alternateName\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"inLanguage\":\"pt-BR\",\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions","description":"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#blogposting","name":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions","headline":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo","author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/07\/ai-image-1784409136551.jpg","width":1440,"height":1024,"caption":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo"},"datePublished":"2026-07-18T18:12:24-03:00","dateModified":"2026-07-18T18:12:24-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#webpage"},"articleSection":"DevOps, blocos an\u00f4nimos PL\/SQL, controle de fluxo PL\/SQL, oracle sql, PL\/SQL b\u00e1sico, programa\u00e7\u00e3o PL\/SQL, vari\u00e1veis PL\/SQL"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","position":1,"name":"Home","item":"https:\/\/jrtx.com.br\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","position":2,"name":"DevOps","item":"https:\/\/jrtx.com.br\/blog\/category\/devops\/","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#listItem","name":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#listItem","position":3,"name":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo","previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}}]},{"@type":"Organization","@id":"https:\/\/jrtx.com.br\/blog\/#organization","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","url":"https:\/\/jrtx.com.br\/blog\/","telephone":"+552138277513","logo":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61590814880509","https:\/\/www.instagram.com\/jrtx.tech\/"]},{"@type":"Person","@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author","url":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/","name":"Thiago Paes Rodrigues","image":{"@type":"ImageObject","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/3cdfdf5f766c59d9c9acab959751c31c3442acd94d4b2927c51d2a0c31b50822?s=96&d=mm&r=g","width":96,"height":96,"caption":"Thiago Paes Rodrigues"}},{"@type":"WebPage","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/","name":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions","description":"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!","inLanguage":"pt-BR","isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#breadcrumblist"},"author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"creator":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/07\/ai-image-1784409136551.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#mainImage","width":1440,"height":1024,"caption":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/#mainImage"},"datePublished":"2026-07-18T18:12:24-03:00","dateModified":"2026-07-18T18:12:24-03:00"},{"@type":"WebSite","@id":"https:\/\/jrtx.com.br\/blog\/#website","url":"https:\/\/jrtx.com.br\/blog\/","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","alternateName":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","inLanguage":"pt-BR","publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"}}]},"og:locale":"pt_BR","og:site_name":"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","og:type":"article","og:title":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions","og:description":"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/","og:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:secure_url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:width":100,"og:image:height":75,"article:published_time":"2026-07-18T21:12:24+00:00","article:modified_time":"2026-07-18T21:12:24+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo - BLOG - JRT Technology Solutions","twitter:description":"Aprenda PL\/SQL b\u00e1sico com blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo. Domine Oracle SQL do zero ao avan\u00e7ado. Clique e comece agora!","twitter:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg"},"aioseo_meta_data":{"post_id":"1636","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-07-30 22:58:58","updated":"2026-07-30 22:58:58","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\/category\/devops\/\" title=\"DevOps\">DevOps<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/jrtx.com.br\/blog"},{"label":"DevOps","link":"https:\/\/jrtx.com.br\/blog\/category\/devops\/"},{"label":"Aula 17: PL\/SQL b\u00e1sico \u2014 blocos an\u00f4nimos, vari\u00e1veis e controle de fluxo","link":"https:\/\/jrtx.com.br\/blog\/2026\/07\/18\/aula-17-plsql-basico-blocos-anonimos-variaveis-e-controle-de\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1636","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=1636"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1636\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1635"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1636"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1636"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1636"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}