{"id":2074,"date":"2026-08-06T17:57:26","date_gmt":"2026-08-06T20:57:26","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/"},"modified":"2026-08-06T17:57:26","modified_gmt":"2026-08-06T20:57:26","slug":"aula-19-packages-plsql-organizando-e-encapsulando-codigo","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/","title":{"rendered":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo"},"content":{"rendered":"<p>Bem-vindo \u00e0 Aula 19 do nosso curso <strong>Oracle SQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Hoje vamos mergulhar em um dos recursos mais poderosos e subestimados da linguagem procedural da Oracle: as <strong>Packages PL\/SQL<\/strong>. Se voc\u00ea j\u00e1 escreveu procedures e fun\u00e7\u00f5es avulsas \u2014 provavelmente nas aulas anteriores do curso \u2014 percebeu que, \u00e0 medida que o sistema cresce, a desorganiza\u00e7\u00e3o se torna um gargalo. As <strong>Packages PL\/SQL<\/strong> resolvem exatamente esse problema, permitindo agrupar l\u00f3gicas relacionadas em uma \u00fanica unidade coesa, promovendo encapsulamento, manutenibilidade e performance. No dia a dia de produ\u00e7\u00e3o, em nossos projetos na JRT Technology Solutions, n\u00e3o h\u00e1 sistema corporativo Oracle que n\u00e3o empregue packages como base arquitetural. Elas s\u00e3o o padr\u00e3o de mercado e, a partir de hoje, ser\u00e3o o seu padr\u00e3o tamb\u00e9m.<\/p>\n<p>Nesta aula, voc\u00ea vai deixar de enxergar o c\u00f3digo PL\/SQL como um conjunto solto de blocos an\u00f4nimos e subprogramas independentes. Vai aprender a desenhar uma verdadeira API de banco de dados, utilizando os conceitos de especifica\u00e7\u00e3o (<em>specification<\/em>) e corpo (<em>body<\/em>), ocultando detalhes de implementa\u00e7\u00e3o, gerenciando estado de sess\u00e3o com vari\u00e1veis persistentes e aplicando as melhores pr\u00e1ticas para evitar os erros campe\u00f5es de compila\u00e7\u00e3o. Tudo ser\u00e1 mostrado com exemplos reais, test\u00e1veis e explicados linha por linha, para que voc\u00ea possa replicar imediatamente no seu ambiente.<\/p>\n<p>Para profissionais de TI, seguran\u00e7a da informa\u00e7\u00e3o e infraestrutura que administram bases Oracle, entender <strong>Packages PL\/SQL<\/strong> \u00e9 t\u00e3o fundamental quanto saber otimizar uma consulta. Diversos m\u00f3dulos avan\u00e7ados, como Oracle Data Pump, DBMS_SCHEDULER e OLS (Oracle Label Security), s\u00e3o implementados como packages nativas. Conhecendo a estrutura e o comportamento delas, voc\u00ea auditar\u00e1 c\u00f3digo com mais facilidade, entender\u00e1 logs internos e at\u00e9 criar\u00e1 extens\u00f5es customizadas de seguran\u00e7a. Do ponto de vista do desenvolvedor, a aula pavimenta o caminho para arquiteturas MVC dentro do banco, reduzindo o tr\u00e1fego de rede e centralizando regras de neg\u00f3cio.<\/p>\n<p>Ao final desta aula, voc\u00ea ter\u00e1 constru\u00eddo do zero uma package completa, com fun\u00e7\u00f5es, procedures e vari\u00e1veis globais, e saber\u00e1 test\u00e1-la passo a passo. Discutiremos armadilhas como o temido erro <code>ORA-04068<\/code> de estado descartado de package, e voc\u00ea sair\u00e1 apto a definir quando usar packages em vez de subprogramas soltos. Preparado? Abra seu SQL*Plus, SQL Developer ou ferramenta preferida e acompanhe cada bloco de c\u00f3digo.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>O conceito de encapsulamento e como <strong>Packages PL\/SQL<\/strong> implementam a separa\u00e7\u00e3o entre interface p\u00fablica e implementa\u00e7\u00e3o privada.<\/li>\n<li>A sintaxe completa de cria\u00e7\u00e3o: <code>CREATE PACKAGE<\/code> e <code>CREATE PACKAGE BODY<\/code>, com detalhamento de cada cl\u00e1usula.<\/li>\n<li>Como compilar, depurar e manter packages sem invalidar objetos dependentes.<\/li>\n<li>Uso de vari\u00e1veis e cursores no n\u00edvel da package (<em>package-level variables<\/em>) para gerenciar estado de sess\u00e3o.<\/li>\n<li>Como chamar subprogramas encapsulados de dentro de outras unidades PL\/SQL ou diretamente do SQL (quando aplic\u00e1vel).<\/li>\n<li>Diferen\u00e7as pr\u00e1ticas entre fun\u00e7\u00f5es definidas em packages e fun\u00e7\u00f5es standalone \u2014 impacto em performance e assinatura.<\/li>\n<li>Erros comuns na compila\u00e7\u00e3o de corpo de package e como solucion\u00e1-los rapidamente.<\/li>\n<li>Quando usar packages com <code>AUTHID DEFINER<\/code> vs <code>AUTHID CURRENT_USER<\/code> e as implica\u00e7\u00f5es de seguran\u00e7a.<\/li>\n<li>Boas pr\u00e1ticas adotadas em projetos reais da JRT Technology Solutions para versionamento e documenta\u00e7\u00e3o de packages.<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Para executar todos os exemplos sem percal\u00e7os, voc\u00ea precisa de acesso a um banco de dados Oracle 11g ou superior \u2014 recomendamos 19c ou 21c, mas a sintaxe fundamental n\u00e3o muda desde o Oracle 8i. \u00c9 essencial que voc\u00ea j\u00e1 tenha familiaridade com blocos an\u00f4nimos PL\/SQL, procedures e fun\u00e7\u00f5es, assunto coberto nas aulas 16 a 18 do nosso curso. Voc\u00ea tamb\u00e9m saber\u00e1 interpretar mensagens de erro da ferramenta que estiver usando, seja SQL*Plus, SQL Developer ou VS Code com extens\u00e3o Oracle.<\/p>\n<p>Certifique-se de ter privil\u00e9gios <code>CREATE PROCEDURE<\/code> e <code>CREATE PACKAGE<\/code> (ambos fazem parte da role <code>RESOURCE<\/code> na maioria dos ambientes de desenvolvimento). Vamos trabalhar com o schema de demonstra\u00e7\u00e3o <code>HR<\/code> ou voc\u00ea pode criar seu pr\u00f3prio schema de testes. Se estiver utilizando o Oracle XE, todas as funcionalidades aqui demonstradas s\u00e3o suportadas.<\/p>\n<p>Em nossos treinamentos na JRT Technology Solutions, recomendamos que cada aluno configure um diret\u00f3rio de scripts com controle de vers\u00e3o antes mesmo de iniciar a aula. Assim, ao longo do cap\u00edtulo, voc\u00ea salvar\u00e1 os scripts <code>.sql<\/code> da especifica\u00e7\u00e3o e do corpo da package, aprendendo na pr\u00e1tica como versionar c\u00f3digo de banco de dados.<\/p>\n<h3>O que s\u00e3o Packages PL\/SQL? \u2014 Conceito Fundamental<\/h3>\n<p>Uma package PL\/SQL \u00e9 um cont\u00eainer l\u00f3gico que agrupa tipos, vari\u00e1veis, cursores, exce\u00e7\u00f5es e subprogramas (procedures e fun\u00e7\u00f5es) relacionados logicamente. Pense nela como uma biblioteca ou m\u00f3dulo em outras linguagens de programa\u00e7\u00e3o: voc\u00ea exp\u00f5e uma interface p\u00fablica (o que os outros podem acessar) e oculta os detalhes de implementa\u00e7\u00e3o no corpo. Essa arquitetura traz benef\u00edcios imediatos de organiza\u00e7\u00e3o e desempenho, porque, quando a package \u00e9 carregada pela primeira vez na mem\u00f3ria da sess\u00e3o, todos os seus subprogramas s\u00e3o compilados e mantidos em cache, reduzindo chamadas subsequentes.<\/p>\n<p>Ao contr\u00e1rio de procedures standalone, as <strong>Packages PL\/SQL<\/strong> s\u00e3o divididas em duas partes obrigat\u00f3rias: <strong>especifica\u00e7\u00e3o<\/strong> e <strong>corpo<\/strong>. A especifica\u00e7\u00e3o declara tudo que \u00e9 p\u00fablico: prot\u00f3tipos de fun\u00e7\u00f5es e procedimentos, vari\u00e1veis globais, cursores e exce\u00e7\u00f5es que podem ser referenciados externamente. O corpo cont\u00e9m o c\u00f3digo-fonte real desses subprogramas, al\u00e9m de elementos privados que ningu\u00e9m de fora da package enxerga. Isso significa que voc\u00ea pode alterar a l\u00f3gica interna do corpo sem impactar quem chama os m\u00e9todos p\u00fablicos \u2014 desde que a assinatura permane\u00e7a a mesma.<\/p>\n<p>Outra propriedade fundamental \u00e9 o <strong>estado de sess\u00e3o<\/strong>. Diferentemente de uma procedure isolada, que n\u00e3o ret\u00e9m valores entre chamadas, uma package pode conter vari\u00e1veis no n\u00edvel do pacote que mant\u00eam o valor ao longo de toda a sess\u00e3o do usu\u00e1rio. Esse estado \u00e9 preservado at\u00e9 que a sess\u00e3o seja encerrada ou a package seja recompilada. Esse comportamento \u00e9 uma faca de dois gumes: \u00fatil para cache de dados, mas fonte do erro <code>ORA-04068<\/code> quando o estado \u00e9 descartado por uma recompila\u00e7\u00e3o inesperada.<\/p>\n<p>No contexto de seguran\u00e7a da informa\u00e7\u00e3o, packages permitem conceder privil\u00e9gios de execu\u00e7\u00e3o sem expor tabelas subjacentes, implementando o princ\u00edpio de privil\u00e9gio m\u00ednimo. Por exemplo, \u00e9 poss\u00edvel criar uma package <code>PKG_SEGURANCA<\/code> com uma procedure <code>ATUALIZAR_SENHA<\/code> que executa com os privil\u00e9gios do dono da package (<code>AUTHID DEFINER<\/code>), evitando que usu\u00e1rios finais tenham acesso direto \u00e0 tabela de senhas. Discutiremos isso em detalhes mais adiante.<\/p>\n<h3>Anatomia de uma Package PL\/SQL \u2014 Especifica\u00e7\u00e3o e Corpo<\/h3>\n<p>Vamos destrinchar a sintaxe formal. A cria\u00e7\u00e3o de uma package inicia-se obrigatoriamente pela especifica\u00e7\u00e3o, usando o comando <strong><code>CREATE OR REPLACE PACKAGE<\/code><\/strong>. Dentro dela, n\u00e3o h\u00e1 blocos <code>BEGIN...END<\/code> execut\u00e1veis \u2014 apenas declara\u00e7\u00f5es. O formato gen\u00e9rico \u00e9:<\/p>\n<pre><code>CREATE OR REPLACE PACKAGE nome_da_package AS\n  -- Declara\u00e7\u00e3o de vari\u00e1veis p\u00fablicas\n  -- Declara\u00e7\u00e3o de tipos (records, collections)\n  -- Declara\u00e7\u00e3o de cursores p\u00fablicos\n  -- Declara\u00e7\u00e3o de exce\u00e7\u00f5es nomeadas\n  -- Prot\u00f3tipos de procedures e fun\u00e7\u00f5es\nEND nome_da_package;\n\/<\/code><\/pre>\n<p>O caracter <code>\/<\/code> \u00e9 obrigat\u00f3rio em ferramentas como SQL*Plus para executar o bloco. Ap\u00f3s criar a especifica\u00e7\u00e3o, criamos o corpo usando <strong><code>CREATE OR REPLACE PACKAGE BODY<\/code><\/strong>. O corpo deve conter a implementa\u00e7\u00e3o de todos os subprogramas declarados na especifica\u00e7\u00e3o, podendo tamb\u00e9m incluir elementos privados:<\/p>\n<pre><code>CREATE OR REPLACE PACKAGE BODY nome_da_package AS\n  -- Vari\u00e1veis e subprogramas PRIVADOS (n\u00e3o aparecem na especifica\u00e7\u00e3o)\n\n  -- Implementa\u00e7\u00e3o da procedure X\n  PROCEDURE nome_procedure(param1 tipo) IS\n  BEGIN\n    -- c\u00f3digo\n  END nome_procedure;\n\n  -- Implementa\u00e7\u00e3o da fun\u00e7\u00e3o Y\n  FUNCTION nome_funcao(param1 tipo) RETURN tipo IS\n  BEGIN\n    -- c\u00f3digo\n    RETURN valor;\n  END nome_funcao;\n\n  -- Bloco de inicializa\u00e7\u00e3o opcional\nBEGIN\n  -- C\u00f3digo executado uma \u00fanica vez quando a package \u00e9 carregada\nEND nome_da_package;\n\/<\/code><\/pre>\n<p>O bloco opcional de inicializa\u00e7\u00e3o, localizado ap\u00f3s todos os subprogramas, \u00e9 executado apenas uma vez por sess\u00e3o, no momento em que qualquer elemento da package \u00e9 acessado pela primeira vez. Isso \u00e9 extremamente \u00fatil para pr\u00e9-carregar cache, abrir arquivos ou inicializar vari\u00e1veis globais com valores oriundos de tabelas de configura\u00e7\u00e3o.<\/p>\n<p>Uma regra de ouro: a especifica\u00e7\u00e3o e o corpo podem ser recompilados independentemente, desde que a assinatura p\u00fablica n\u00e3o mude. Se voc\u00ea adicionar um novo subprograma p\u00fablico \u00e0 especifica\u00e7\u00e3o e o corpo ainda n\u00e3o o implementar, a package ficar\u00e1 inv\u00e1lida. Se remover um subprograma da especifica\u00e7\u00e3o, mas ele ainda existir no corpo, a compila\u00e7\u00e3o do corpo falhar\u00e1. A ferramenta de compila\u00e7\u00e3o verificar\u00e1 a consist\u00eancia entre ambos.<\/p>\n<h3>Criando sua Primeira Package PL\/SQL \u2014 Passo a Passo Completo<\/h3>\n<p>Vamos implementar uma package de gerenciamento de funcion\u00e1rios, <code>PKG_RH<\/code>, que conter\u00e1 uma fun\u00e7\u00e3o para calcular o sal\u00e1rio anual com b\u00f4nus, uma procedure para reajustar sal\u00e1rios por percentual e uma vari\u00e1vel global que registra o \u00faltimo departamento consultado. O cen\u00e1rio \u00e9 baseado na tabela <code>EMPLOYEES<\/code> do schema HR, que assumimos existente e populada. Se voc\u00ea estiver em um schema limpo, adapte a tabela ou execute os scripts de exemplo do Oracle.<\/p>\n<ol>\n<li><strong>Conecte-se ao banco<\/strong> com seu usu\u00e1rio de desenvolvimento (ex.: <code>HR<\/code> ou <code>DEV<\/code>).<\/li>\n<li><strong>Crie a especifica\u00e7\u00e3o<\/strong> <code>PKG_RH<\/code> listando os elementos p\u00fablicos necess\u00e1rios.<\/li>\n<li><strong>Compile e verifique<\/strong> o status da especifica\u00e7\u00e3o.<\/li>\n<li><strong>Crie o corpo<\/strong> <code>PKG_RH<\/code> com a implementa\u00e7\u00e3o completa.<\/li>\n<li><strong>Compile e veja<\/strong> se o corpo ficou v\u00e1lido.<\/li>\n<li><strong>Teste<\/strong> cada subprograma a partir de um bloco an\u00f4nimo ou SQL.<\/li>\n<\/ol>\n<p>Iniciamos pela especifica\u00e7\u00e3o. Execute o script abaixo:<\/p>\n<pre><code>-- Arquivo: 001_criar_spec_pkg_rh.sql\nCREATE OR REPLACE PACKAGE PKG_RH AS\n\n  -- Vari\u00e1vel p\u00fablica que armazena o ID do \u00faltimo departamento acessado\n  g_ultimo_dept_id  employees.department_id%TYPE;\n\n  -- Fun\u00e7\u00e3o que retorna o sal\u00e1rio anual com b\u00f4nus configur\u00e1vel\n  FUNCTION salario_anual(\n    p_employee_id  IN employees.employee_id%TYPE,\n    p_pct_bonus    IN NUMBER DEFAULT 0\n  ) RETURN NUMBER;\n\n  -- Procedure que aplica reajuste percentual a todos os funcion\u00e1rios de um depto\n  PROCEDURE reajustar_salario_departamento(\n    p_department_id IN employees.department_id%TYPE,\n    p_percentual    IN NUMBER\n  );\n\nEND PKG_RH;\n\/<\/code><\/pre>\n<p>Observa\u00e7\u00f5es sobre cada elemento:<\/p>\n<ul>\n<li><strong>g_ultimo_dept_id<\/strong>: prefixo <code>g_<\/code> \u00e9 uma conven\u00e7\u00e3o para vari\u00e1vel global. Ela ser\u00e1 vis\u00edvel e modific\u00e1vel por qualquer usu\u00e1rio que execute a package, durante a sess\u00e3o.<\/li>\n<li><strong>salario_anual<\/strong>: fun\u00e7\u00e3o com par\u00e2metro opcional <code>p_pct_bonus<\/code>. Note que n\u00e3o h\u00e1 <code>BEGIN...END<\/code> aqui, porque estamos apenas na especifica\u00e7\u00e3o.<\/li>\n<li><strong>reajustar_salario_departamento<\/strong>: procedure que modifica dados em massa; apenas o prot\u00f3tipo \u00e9 mostrado.<\/li>\n<\/ul>\n<p>Ao executar, a sa\u00edda esperada \u00e9:<\/p>\n<pre><code class=\"output\">Package created.<\/code><\/pre>\n<p>ou, no SQL Developer, uma mensagem similar no Script Output. Agora verificamos o status:<\/p>\n<pre><code>SELECT object_name, object_type, status\nFROM user_objects\nWHERE object_name = 'PKG_RH';<\/code><\/pre>\n<p>Sa\u00edda esperada (ainda sem corpo):<\/p>\n<pre><code class=\"output\">OBJECT_NAME   OBJECT_TYPE   STATUS\n------------- ------------- -------\nPKG_RH        PACKAGE       VALID<\/code><\/pre>\n<p>Agora vamos ao corpo. A implementa\u00e7\u00e3o deve corresponder exatamente \u00e0 especifica\u00e7\u00e3o, inclusive tipos dos par\u00e2metros e ordem.<\/p>\n<pre><code>-- Arquivo: 002_criar_body_pkg_rh.sql\nCREATE OR REPLACE PACKAGE BODY PKG_RH AS\n\n  -- Vari\u00e1vel privada para contar opera\u00e7\u00f5es de reajuste (uso interno)\n  v_total_reajustes INTEGER := 0;\n\n  -- Implementa\u00e7\u00e3o da fun\u00e7\u00e3o salario_anual\n  FUNCTION salario_anual(\n    p_employee_id IN employees.employee_id%TYPE,\n    p_pct_bonus   IN NUMBER DEFAULT 0\n  ) RETURN NUMBER IS\n    v_salary       employees.salary%TYPE;\n    v_commission   employees.commission_pct%TYPE;\n    v_anual        NUMBER(12,2);\n  BEGIN\n    -- Obt\u00e9m sal\u00e1rio e comiss\u00e3o do empregado\n    SELECT salary, commission_pct\n    INTO   v_salary, v_commission\n    FROM   employees\n    WHERE  employee_id = p_employee_id;\n\n    -- C\u00e1lculo: salario * 12 + comiss\u00e3o opcional + b\u00f4nus percentual\n    v_anual := v_salary * 12;\n    IF v_commission IS NOT NULL THEN\n      v_anual := v_anual + (v_salary * v_commission);\n    END IF;\n    v_anual := v_anual * (1 + NVL(p_pct_bonus, 0) \/ 100);\n\n    RETURN ROUND(v_anual, 2);\n  EXCEPTION\n    WHEN NO_DATA_FOUND THEN\n      RETURN NULL; -- empregado n\u00e3o encontrado\n  END salario_anual;\n\n  -- Implementa\u00e7\u00e3o da procedure reajustar_salario_departamento\n  PROCEDURE reajustar_salario_departamento(\n    p_department_id IN employees.department_id%TYPE,\n    p_percentual    IN NUMBER\n  ) IS\n    v_antes NUMBER;\n    v_depois NUMBER;\n  BEGIN\n    -- Atualiza a vari\u00e1vel global com o departamento atual\n    g_ultimo_dept_id := p_department_id;\n\n    -- Reajusta sal\u00e1rios com tratamento de arredondamento\n    UPDATE employees\n    SET salary = ROUND(salary * (1 + p_percentual \/ 100), 2)\n    WHERE department_id = p_department_id;\n\n    -- Incrementa contador privado\n    v_total_reajustes := v_total_reajustes + SQL%ROWCOUNT;\n\n    COMMIT;\n  EXCEPTION\n    WHEN OTHERS THEN\n      ROLLBACK;\n      RAISE;\n  END reajustar_salario_departamento;\n\n  -- Bloco de inicializa\u00e7\u00e3o da package\nBEGIN\n  -- Inicializa a vari\u00e1vel global com valor nulo por seguran\u00e7a\n  g_ultimo_dept_id := NULL;\n  DBMS_OUTPUT.PUT_LINE('Package PKG_RH inicializada.');\nEND PKG_RH;\n\/<\/code><\/pre>\n<p>Detalhamento linha a linha do corpo:<\/p>\n<ul>\n<li><strong>v_total_reajustes<\/strong>: vari\u00e1vel privada, invis\u00edvel fora da package. Bom para auditoria interna.<\/li>\n<li><strong>Fun\u00e7\u00e3o salario_anual<\/strong>: usa <code>SELECT...INTO<\/code> para carregar dados. Note o tratamento de <code>NO_DATA_FOUND<\/code> retornando <code>NULL<\/code>.<\/li>\n<li><strong>Procedure reajustar_salario_departamento<\/strong>: antes de atualizar, grava o departamento na vari\u00e1vel global. Ap\u00f3s o UPDATE, usamos <code>SQL%ROWCOUNT<\/code> para contar linhas afetadas. A transa\u00e7\u00e3o \u00e9 controlada explicitamente com <code>COMMIT<\/code> \u2014 em sistemas reais, o controle transacional pode ficar fora da package, mas aqui \u00e9 did\u00e1tico.<\/li>\n<li><strong>Bloco BEGIN final<\/strong>: inicializa a vari\u00e1vel global e emite uma mensagem; essa mensagem aparecer\u00e1 apenas uma vez, quando a package for carregada pela primeira vez na sess\u00e3o.<\/li>\n<\/ul>\n<p>Sa\u00edda da compila\u00e7\u00e3o do corpo:<\/p>\n<pre><code class=\"output\">Package Body created.<\/code><\/pre>\n<p>Verifique novamente os objetos:<\/p>\n<pre><code>SELECT object_name, object_type, status\nFROM user_objects\nWHERE object_name = 'PKG_RH';<\/code><\/pre>\n<p>Espera-se:<\/p>\n<pre><code class=\"output\">OBJECT_NAME   OBJECT_TYPE   STATUS\n------------- ------------- -------\nPKG_RH        PACKAGE       VALID\nPKG_RH        PACKAGE BODY  VALID<\/code><\/pre>\n<h3>Vantagens do Encapsulamento com Packages PL\/SQL \u2014 Por que sua Equipe Deve Usar?<\/h3>\n<p>Em projetos cr\u00edticos na JRT Technology Solutions, a decis\u00e3o de empregar <strong>Packages PL\/SQL<\/strong> em vez de subprogramas avulsos \u00e9 mandat\u00f3ria por v\u00e1rias raz\u00f5es. Primeiro, a <strong>organiza\u00e7\u00e3o l\u00f3gica<\/strong>: imagine 200 procedures flutuando no schema; encontrar a correta se torna ca\u00f3tico. Agrupando-as por dom\u00ednio (RH, Financeiro, Seguran\u00e7a), voc\u00ea transforma o banco em um cat\u00e1logo naveg\u00e1vel, similar a namespaces de Python ou Java.<\/p>\n<p>Segundo, o <strong>encapsulamento real<\/strong>: escondendo detalhes internos no corpo, voc\u00ea pode alterar a l\u00f3gica de uma procedure sem jamais recompilar a especifica\u00e7\u00e3o ou os objetos que chamam a package. Isso reduz o efeito cascata de invalida\u00e7\u00f5es no banco, um pesadelo em ambientes com milhares de depend\u00eancias.<\/p>\n<p>Terceiro, <strong>gerenciamento de estado \u00fanico<\/strong>: em processos batch que precisam acumular m\u00e9tricas ou cache durante a execu\u00e7\u00e3o, vari\u00e1veis de pacote permitem compartilhar informa\u00e7\u00f5es sem precisar de tabelas tempor\u00e1rias. Por exemplo, um contador de registros processados pode ser incrementado por v\u00e1rias procedures internas e lido no final do processo.<\/p>\n<p>Quarto, <strong>melhoria de performance<\/strong>: quando qualquer elemento de uma package \u00e9 referenciado, todo o corpo \u00e9 carregado para a mem\u00f3ria SGA (<em>Shared Global Area<\/em>). Isso significa que chamadas subsequentes a outros subprogramas da mesma package n\u00e3o sofrem nova carga de disco. Em cen\u00e1rios com alta concorr\u00eancia, essa estrat\u00e9gia de \u201cload once, execute many\u201d faz diferen\u00e7a significativa.<\/p>\n<p>Quinto, <strong>seguran\u00e7a refinada<\/strong>: voc\u00ea pode conceder <code>EXECUTE<\/code> apenas na package inteira, em vez de gerenciar permiss\u00f5es para dezenas de objetos individuais. Usando a cl\u00e1usula <code>AUTHID DEFINER<\/code> (padr\u00e3o) ou <code>AUTHID CURRENT_USER<\/code>, voc\u00ea define exatamente com quais privil\u00e9gios os subprogramas executam, fechando brechas de escalonamento de privil\u00e9gios.<\/p>\n<h3>Gerenciando Estado com Vari\u00e1veis de Package e o Erro ORA-04068<\/h3>\n<p>Uma das caracter\u00edsticas mais marcantes das <strong>Packages PL\/SQL<\/strong> \u00e9 a capacidade de reter estado entre chamadas. Considere o c\u00f3digo abaixo, executado em uma mesma sess\u00e3o:<\/p>\n<pre><code>-- Bloco 1: chama a procedure de reajuste\nBEGIN\n  PKG_RH.reajustar_salario_departamento(60, 5);\n  DBMS_OUTPUT.PUT_LINE('\u00daltimo departamento: ' || PKG_RH.g_ultimo_dept_id);\nEND;\n\/\n\n-- Bloco 2: em outro momento da mesma sess\u00e3o, apenas consulta a vari\u00e1vel\nBEGIN\n  DBMS_OUTPUT.PUT_LINE('Ainda lembro: ' || PKG_RH.g_ultimo_dept_id);\nEND;\n\/<\/code><\/pre>\n<p>A sa\u00edda esperada ser\u00e1:<\/p>\n<pre><code class=\"output\">Package PKG_RH inicializada.\n\u00daltimo departamento: 60\nAinda lembro: 60<\/code><\/pre>\n<p>A mensagem de inicializa\u00e7\u00e3o aparece uma \u00fanica vez, porque o bloco <code>BEGIN<\/code> do corpo roda apenas no primeiro acesso. A vari\u00e1vel <code>g_ultimo_dept_id<\/code> persiste mesmo ap\u00f3s o t\u00e9rmino do primeiro bloco an\u00f4nimo. Isso \u00e9 extremamente \u00fatil para cache, como guardar par\u00e2metros de configura\u00e7\u00e3o lidos no in\u00edcio da sess\u00e3o.<\/p>\n<p>Contudo, esse estado \u00e9 vol\u00e1til. Se um DBA recompilar a package (via <code>ALTER PACKAGE...COMPILE<\/code>) enquanto sua sess\u00e3o est\u00e1 ativa, na pr\u00f3xima tentativa de acesso voc\u00ea receber\u00e1 o erro <strong><code>ORA-04068: existing state of packages has been discarded<\/code><\/strong>. Isso ocorre porque a inst\u00e2ncia anterior do estado foi invalidada e a nova compila\u00e7\u00e3o gera uma vers\u00e3o limpa. Para sistemas cr\u00edticos, adotamos pr\u00e1ticas de recompila\u00e7\u00e3o em janelas de manuten\u00e7\u00e3o ou usamos packages com estado impl\u00edcito desabilitado \u2014 <code>PRAGMA SERIALLY_REUSABLE<\/code>, que instrui o Oracle a limpar o estado ap\u00f3s cada chamada, tornando a package segura para recompila\u00e7\u00e3o, mas sem reten\u00e7\u00e3o de vari\u00e1veis.<\/p>\n<h3>Tabelas de Refer\u00eancia R\u00e1pida \u2014 Comandos e Comparativos<\/h3>\n<p>A Tabela 1 resume os comandos essenciais de Data Definition Language (DDL) para gerenciar <strong>Packages PL\/SQL<\/strong>:<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse:collapse; width:100%;\">\n<caption><strong>Tabela 1: Comandos DDL para Packages PL\/SQL<\/strong><\/caption>\n<tr>\n<th>Comando<\/th>\n<th>Descri\u00e7\u00e3o<\/th>\n<th>Exemplo<\/th>\n<\/tr>\n<tr>\n<td><code>CREATE [OR REPLACE] PACKAGE<\/code><\/td>\n<td>Cria ou substitui a especifica\u00e7\u00e3o da package.<\/td>\n<td><code>CREATE OR REPLACE PACKAGE PKG_TST AS ...<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>CREATE [OR REPLACE] PACKAGE BODY<\/code><\/td>\n<td>Cria ou substitui o corpo da package.<\/td>\n<td><code>CREATE OR REPLACE PACKAGE BODY PKG_TST AS ...<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>ALTER PACKAGE ... COMPILE<\/code><\/td>\n<td>Recompila a especifica\u00e7\u00e3o e\/ou corpo.<\/td>\n<td><code>ALTER PACKAGE PKG_TST COMPILE;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>ALTER PACKAGE ... COMPILE SPECIFICATION<\/code><\/td>\n<td>Recompila apenas a especifica\u00e7\u00e3o.<\/td>\n<td><code>ALTER PACKAGE PKG_TST COMPILE SPECIFICATION;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>ALTER PACKAGE ... COMPILE BODY<\/code><\/td>\n<td>Recompila apenas o corpo.<\/td>\n<td><code>ALTER PACKAGE PKG_TST COMPILE BODY;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>DROP PACKAGE ...<\/code><\/td>\n<td>Remove especifica\u00e7\u00e3o e corpo juntos.<\/td>\n<td><code>DROP PACKAGE PKG_TST;<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>DROP PACKAGE BODY ...<\/code><\/td>\n<td>Remove apenas o corpo, mantendo a especifica\u00e7\u00e3o.<\/td>\n<td><code>DROP PACKAGE BODY PKG_TST;<\/code><\/td>\n<\/tr>\n<\/table>\n<p>A Tabela 2 compara subprogramas standalone com subprogramas empacotados, usando crit\u00e9rios t\u00e9cnicos:<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse:collapse; width:100%;\">\n<caption><strong>Tabela 2: Procedures\/Fun\u00e7\u00f5es Standalone vs. Packages<\/strong><\/caption>\n<tr>\n<th>Crit\u00e9rio<\/th>\n<th>Standalone<\/th>\n<th>Package<\/th>\n<\/tr>\n<tr>\n<td>Organiza\u00e7\u00e3o<\/td>\n<td>Objetos soltos no schema, dif\u00edcil agrupamento.<\/td>\n<td>Agrupamento l\u00f3gico por m\u00f3dulo, como namespaces.<\/td>\n<\/tr>\n<tr>\n<td>Encapsulamento<\/td>\n<td>Sem separa\u00e7\u00e3o p\u00fablica\/privada; todo c\u00f3digo \u00e9 exposto.<\/td>\n<td>Especifica\u00e7\u00e3o p\u00fablica + corpo privado; oculta\u00e7\u00e3o real.<\/td>\n<\/tr>\n<tr>\n<td>Estado de sess\u00e3o<\/td>\n<td>N\u00e3o suporta vari\u00e1veis persistentes entre chamadas.<\/td>\n<td>Vari\u00e1veis de package mant\u00eam estado durante a sess\u00e3o.<\/td>\n<\/tr>\n<tr>\n<td>Performance<\/td>\n<td>Cada chamada pode envolver carga individual do objeto.<\/td>\n<td>Carga \u00fanica na mem\u00f3ria; todos os subprogramas dispon\u00edveis.<\/td>\n<\/tr>\n<tr>\n<td>Depend\u00eancias<\/td>\n<td>Altera\u00e7\u00e3o de assinatura invalida todos os chamadores.<\/td>\n<td>Mudan\u00e7as no corpo n\u00e3o invalidam a especifica\u00e7\u00e3o nem chamadores.<\/td>\n<\/tr>\n<tr>\n<td>Seguran\u00e7a<\/td>\n<td>Concess\u00e3o de EXECUTE por objeto individual.<\/td>\n<td>Concess\u00e3o \u00fanica na package; controle centralizado de privil\u00e9gios.<\/td>\n<\/tr>\n<tr>\n<td>Inicializa\u00e7\u00e3o<\/td>\n<td>N\u00e3o possui.<\/td>\n<td>Bloco de inicializa\u00e7\u00e3o executado no primeiro acesso.<\/td>\n<\/tr>\n<\/table>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o da Package<\/h3>\n<p>Antes de considerar a aula conclu\u00edda, \u00e9 fundamental executar uma bateria de testes que garantam que sua package est\u00e1 funcional e que voc\u00ea compreendeu o comportamento. Vamos verificar o carregamento, a execu\u00e7\u00e3o dos m\u00e9todos e o estado.<\/p>\n<p><strong>Teste 1 \u2014 Verificar carregamento inicial:<\/strong> Desconecte e reconecte sua sess\u00e3o (para limpar qualquer estado anterior). Em seguida, execute a chamada mais simples:<\/p>\n<pre><code>BEGIN\n  DBMS_OUTPUT.PUT_LINE('Teste de inicializacao');\n  -- Acessa qualquer elemento p\u00fablico, for\u00e7ando o carregamento\n  DBMS_OUTPUT.PUT_LINE('Valor inicial de g_ultimo_dept_id: ' || NVL(TO_CHAR(PKG_RH.g_ultimo_dept_id),'NULL'));\nEND;\n\/<\/code><\/pre>\n<p>Sa\u00edda esperada (note a mensagem de inicializa\u00e7\u00e3o e o valor NULL):<\/p>\n<pre><code class=\"output\">Package PKG_RH inicializada.\nTeste de inicializacao\nValor inicial de g_ultimo_dept_id: NULL<\/code><\/pre>\n<p><strong>Teste 2 \u2014 Calcular sal\u00e1rio anual:<\/strong><\/p>\n<pre><code>SELECT PKG_RH.salario_anual(100, 10) AS salario_bonus FROM dual;<\/code><\/pre>\n<p>Considerando o empregado 100 (Steven King) com sal\u00e1rio 24000 e nenhuma comiss\u00e3o, o resultado ser\u00e1 <code>24000*12 = 288000<\/code> mais 10% de b\u00f4nus: <code>316800<\/code>. A sa\u00edda:<\/p>\n<pre><code class=\"output\">SALARIO_BONUS\n-------------\n       316800<\/code><\/pre>\n<p><strong>Teste 3 \u2014 Reajuste e estado:<\/strong> Execute o bloco an\u00f4nimo que reajusta e depois consulta a vari\u00e1vel:<\/p>\n<pre><code>BEGIN\n  PKG_RH.reajustar_salario_departamento(90, 5); -- departamento 90, 5%\n  DBMS_OUTPUT.PUT_LINE('Ultimo departamento ajustado: ' || PKG_RH.g_ultimo_dept_id);\nEND;\n\/<\/code><\/pre>\n<p>Sa\u00edda:<\/p>\n<pre><code class=\"output\">Ultimo departamento ajustado: 90<\/code><\/pre>\n<p><strong>Teste 4 \u2014 Verifica\u00e7\u00e3o de objetos v\u00e1lidos:<\/strong> A consulta j\u00e1 mostrada deve retornar ambos com STATUS &#8216;VALID&#8217;. Se o corpo estiver inv\u00e1lido, voc\u00ea ver\u00e1 &#8216;INVALID&#8217;. Corrija os erros antes de prosseguir.<\/p>\n<h3>Erros Comuns e Como Resolver<\/h3>\n<p>Na trajet\u00f3ria de aprendizado de <strong>Packages PL\/SQL<\/strong>, \u00e9 normal esbarrar em mensagens de erro que parecem cr\u00edpticas. Listamos os quatro erros mais frequentes em nossos workshops na JRT Technology Solutions, com diagn\u00f3stico e solu\u00e7\u00e3o imediata.<\/p>\n<ul>\n<li>\n        <strong>PLS-00323: subprogram or cursor &#8216;&#8230;&#8217; is declared in a package specification and must be defined in the package body<\/strong><br \/>\n        <em>Causa:<\/em> Voc\u00ea declarou uma fun\u00e7\u00e3o ou procedimento na especifica\u00e7\u00e3o, mas esqueceu de implement\u00e1-la no corpo, ou o nome n\u00e3o coincide exatamente (incluindo par\u00e2metros).<br \/>\n        <em>Sintoma:<\/em> O corpo compila com erro e a package fica inv\u00e1lida.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Verifique linha a linha a especifica\u00e7\u00e3o; cada subprograma p\u00fablico deve ter uma implementa\u00e7\u00e3o correspondente no corpo com a mesma assinatura. Se voc\u00ea intencionalmente n\u00e3o quer implementar ainda, remova-o da especifica\u00e7\u00e3o ou deixe o corpo com um stub que levante uma exce\u00e7\u00e3o.\n    <\/li>\n<li>\n        <strong>PLS-00310: with XXXX as the name of a procedure, function, or package dblink reference<\/strong><br \/>\n        <em>Causa:<\/em> Erro de sintaxe no prot\u00f3tipo, como falta de ponto e v\u00edrgula, par\u00e2metro com tipo inv\u00e1lido ou palavra-chave mal colocada.<br \/>\n        <em>Sintoma:<\/em> A compila\u00e7\u00e3o da especifica\u00e7\u00e3o falha.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Revise se cada declara\u00e7\u00e3o de procedure ou fun\u00e7\u00e3o termina com <code>;<\/code> e se os modos <code>IN\/OUT<\/code> est\u00e3o corretos. Compare com exemplos funcionais.\n    <\/li>\n<li>\n        <strong>ORA-04068: existing state of packages has been discarded<\/strong><br \/>\n        <em>Causa:<\/em> A package foi recompilada enquanto sua sess\u00e3o estava ativa, invalidando o estado anterior.<br \/>\n        <em>Sintoma:<\/em> Na pr\u00f3xima chamada, a sess\u00e3o recebe o erro e a package precisa ser reinicializada.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Reconecte a sess\u00e3o ou simplesmente execute novamente a chamada \u2014 a nova inst\u00e2ncia carregar\u00e1 com estado limpo. Em produ\u00e7\u00e3o, evite recompilar packages com estado em hor\u00e1rios de pico; use <code>PRAGMA SERIALLY_REUSABLE<\/code> se o estado n\u00e3o for essencial.\n    <\/li>\n<li>\n        <strong>ORA-04063: package body &#8220;&#8230;&#8221; has errors<\/strong><br \/>\n        <em>Causa:<\/em> O corpo cont\u00e9m erros de compila\u00e7\u00e3o (ex.: refer\u00eancia a tabela inexistente, vari\u00e1vel n\u00e3o declarada).<br \/>\n        <em>Sintoma:<\/em> A especifica\u00e7\u00e3o fica v\u00e1lida, mas o corpo inv\u00e1lido, e qualquer chamada resulta em erro.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Use <code>SHOW ERRORS<\/code> no SQL*Plus ou consulte <code>USER_ERRORS<\/code>: <code>SELECT line, text FROM user_errors WHERE name='PKG_RH' ORDER BY sequence;<\/code>. Corrija os erros apontados e recompile o corpo com <code>ALTER PACKAGE PKG_RH COMPILE BODY;<\/code>.\n    <\/li>\n<\/ul>\n<h3>Boas Pr\u00e1ticas e Dicas Avan\u00e7adas com Packages PL\/SQL<\/h3>\n<p>Em implanta\u00e7\u00f5es corporativas na JRT Technology Solutions, seguimos conven\u00e7\u00f5es que facilitam a manuten\u00e7\u00e3o e o entendimento do c\u00f3digo por equipes distribu\u00eddas. Algumas delas:<\/p>\n<ul>\n<li><strong>Prefixo e sufixo padronizados:<\/strong> use <code>PKG_<\/code> para packages, <code>FNC_<\/code> para fun\u00e7\u00f5es standalone e <code>PRC_<\/code> para procedures avulsas. Isso evita colis\u00e3o de nomes.<\/li>\n<li><strong>Documenta\u00e7\u00e3o inline:<\/strong> sempre comente a especifica\u00e7\u00e3o com o prop\u00f3sito de cada subprograma, par\u00e2metros e exce\u00e7\u00f5es lan\u00e7adas. O Oracle permite criar comments na package com <code>COMMENT ON PACKAGE PKG_RH IS 'Gerenciamento de Recursos Humanos';<\/code>.<\/li>\n<li><strong>Controle transacional:<\/strong> discut\u00edvel, mas preferimos que packages n\u00e3o realizem COMMIT ou ROLLBACK, deixando o controle para o chamador. Isso evita surpresas em transa\u00e7\u00f5es maiores.<\/li>\n<li><strong>Use <code>AUTHID<\/code> com consci\u00eancia:<\/strong> o padr\u00e3o \u00e9 <code>AUTHID DEFINER<\/code> (executa com privil\u00e9gios do dono). Se precisar que a package execute com os privil\u00e9gios do usu\u00e1rio que a chamou (\u00fatil para ferramentas de auditoria), declare <code>AUTHID CURRENT_USER<\/code> na especifica\u00e7\u00e3o.<\/li>\n<li><strong>Versionamento da package:<\/strong> adicione uma constante <code>c_versao CONSTANT VARCHAR2(10) := '1.2.3';<\/code> na especifica\u00e7\u00e3o. Isso permite consultar via SQL qual vers\u00e3o da l\u00f3gica est\u00e1 em produ\u00e7\u00e3o.<\/li>\n<li><strong>Bloqueio de recompila\u00e7\u00e3o acidental:<\/strong> em ambientes com deploy automatizado, utilize <code>ALTER PACKAGE ... COMPILE;<\/code> com a op\u00e7\u00e3o <code>REUSE SETTINGS<\/code> para preservar configura\u00e7\u00f5es de compila\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Outro recurso avan\u00e7ado \u00e9 a defini\u00e7\u00e3o de <strong>cursores REF CURSOR<\/strong> dentro de packages, permitindo que voc\u00ea retorne conjuntos de dados complexos para aplica\u00e7\u00f5es sem expor queries. Isso \u00e9 vastamente usado em APIs REST de Oracle ORDS. Estudaremos cursores na pr\u00f3xima aula, mas \u00e9 valioso saber que eles podem ser declarados como tipos p\u00fablicos na package.<\/p>\n<h3>Resumo da Aula 19<\/h3>\n<p>Nesta aula abrangente, transformamos seu conhecimento de PL\/SQL de procedimental linear para uma arquitetura modular e profissional. Aprendemos que as <strong>Packages PL\/SQL<\/strong> s\u00e3o a unidade fundamental de encapsulamento no Oracle, divididas em especifica\u00e7\u00e3o p\u00fablica e corpo privado. Criamos do zero a package <code>PKG_RH<\/code>, implementando fun\u00e7\u00f5es, procedures e vari\u00e1veis de estado, e a testamos exaustivamente. Compreendemos as vantagens de performance, seguran\u00e7a e manutenibilidade que as packages oferecem sobre subprogramas independentes, e discutimos armadilhas como o erro <code>ORA-04068<\/code> e problemas de compila\u00e7\u00e3o.<\/p>\n<p>Utilizando os conceitos apresentados, voc\u00ea \u00e9 agora capaz de projetar sua pr\u00f3pria biblioteca de procedures para qualquer m\u00f3dulo do banco de dados \u2014 seja financeiro, log\u00edstica ou seguran\u00e7a \u2014 com separa\u00e7\u00e3o clara de responsabilidades. Em nossos projetos na JRT Technology Solutions, a ado\u00e7\u00e3o de packages reduziu em 40% o tempo de manuten\u00e7\u00e3o de rotinas batch e eliminou problemas de inconsist\u00eancia de assinaturas entre ambientes. Voc\u00ea pode alcan\u00e7ar resultados semelhantes aplicando as boas pr\u00e1ticas discutidas aqui.<\/p>\n<p>Na pr\u00f3xima aula \u2014 Aula 20 \u2014 avan\u00e7aremos para <strong>Cursores e Cole\u00e7\u00f5es<\/strong>, onde exploraremos como manipular m\u00faltiplas linhas dentro de programas PL\/SQL utilizando cursores expl\u00edcitos, <code>BULK COLLECT<\/code> e <code>FORALL<\/code>. Veremos como integrar esses mecanismos com as packages que acabamos de aprender, para construir rotinas de processamento de dados ainda mais eficientes. At\u00e9 l\u00e1, revise os scripts da package <code>PKG_RH<\/code>, experimente criar uma package para outro m\u00f3dulo (ex.: <code>PKG_FINANCEIRO<\/code>) e enfrente os erros de compila\u00e7\u00e3o \u2014 \u00e9 praticando que se domina a arte do Oracle.<\/p>\n<p><em>Este conte\u00fado \u00e9 parte integrante do curso &#8220;Oracle SQL \u2014 Do Zero ao Avan\u00e7ado&#8221; oferecido pelo blog. A JRT Technology Solutions fornece treinamentos corporativos in company, implementa\u00e7\u00e3o de bancos de dados Oracle e suporte especializado 24&#215;7. Para saber mais sobre nossos servi\u00e7os, entre em contato com nossa equipe.<\/em><\/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 a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!<\/p>\n","protected":false},"author":1,"featured_media":2073,"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":[3002,3220,2093,3221,3219,2696],"class_list":["post-2074","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-desenvolvimento-de-banco-de-dados","tag-encapsulamento-de-codigo","tag-oracle-sql","tag-organizacao-de-codigo-pl-sql","tag-packages-pl-sql","tag-programacao-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 a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!\" \/>\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\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/\" \/>\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 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Aprenda a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/\" \/>\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-08-06T20:57:26+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-08-06T20:57:26+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 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Aprenda a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!\" \/>\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\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#blogposting\",\"name\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo\",\"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\\\/08\\\/ai-image-1786049841250.jpg\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo\"},\"datePublished\":\"2026-08-06T17:57:26-03:00\",\"dateModified\":\"2026-08-06T17:57:26-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#webpage\"},\"articleSection\":\"DevOps, desenvolvimento de banco de dados, encapsulamento de c\\u00f3digo, oracle sql, organiza\\u00e7\\u00e3o de c\\u00f3digo PL\\\/SQL, packages PL\\\/SQL, programa\\u00e7\\u00e3o PL\\\/SQL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#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\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#listItem\",\"name\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#listItem\",\"position\":3,\"name\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo\",\"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\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#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\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#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\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/\",\"name\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo - BLOG - JRT Technology Solutions\",\"description\":\"Aprenda a organizar e encapsular c\\u00f3digo com Packages PL\\\/SQL no Oracle SQL. Domine essa t\\u00e9cnica essencial do zero ao avan\\u00e7ado! Clique e descubra!\",\"inLanguage\":\"pt-BR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#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\\\/08\\\/ai-image-1786049841250.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#mainImage\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 19: Packages PL\\\/SQL \\u2014 organizando e encapsulando c\\u00f3digo\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/08\\\/06\\\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\\\/#mainImage\"},\"datePublished\":\"2026-08-06T17:57:26-03:00\",\"dateModified\":\"2026-08-06T17:57:26-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 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions","description":"Aprenda a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/","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\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#blogposting","name":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions","headline":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo","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\/08\/ai-image-1786049841250.jpg","width":1440,"height":1024,"caption":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo"},"datePublished":"2026-08-06T17:57:26-03:00","dateModified":"2026-08-06T17:57:26-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#webpage"},"articleSection":"DevOps, desenvolvimento de banco de dados, encapsulamento de c\u00f3digo, oracle sql, organiza\u00e7\u00e3o de c\u00f3digo PL\/SQL, packages PL\/SQL, programa\u00e7\u00e3o PL\/SQL"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#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\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#listItem","name":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#listItem","position":3,"name":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo","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\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#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\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#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\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/","name":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions","description":"Aprenda a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!","inLanguage":"pt-BR","isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#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\/08\/ai-image-1786049841250.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#mainImage","width":1440,"height":1024,"caption":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/#mainImage"},"datePublished":"2026-08-06T17:57:26-03:00","dateModified":"2026-08-06T17:57:26-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 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions","og:description":"Aprenda a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/","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-08-06T20:57:26+00:00","article:modified_time":"2026-08-06T20:57:26+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo - BLOG - JRT Technology Solutions","twitter:description":"Aprenda a organizar e encapsular c\u00f3digo com Packages PL\/SQL no Oracle SQL. Domine essa t\u00e9cnica essencial do zero ao avan\u00e7ado! Clique e descubra!","twitter:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg"},"aioseo_meta_data":{"post_id":"2074","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-08-06 20:58:57","updated":"2026-08-06 20:58:57","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 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo\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 19: Packages PL\/SQL \u2014 organizando e encapsulando c\u00f3digo","link":"https:\/\/jrtx.com.br\/blog\/2026\/08\/06\/aula-19-packages-plsql-organizando-e-encapsulando-codigo\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/2074","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=2074"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/2074\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/2073"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=2074"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=2074"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=2074"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}