{"id":1869,"date":"2026-07-28T17:44:19","date_gmt":"2026-07-28T20:44:19","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/"},"modified":"2026-07-28T17:44:19","modified_gmt":"2026-07-28T20:44:19","slug":"aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/","title":{"rendered":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco"},"content":{"rendered":"<p>\n    Bem-vindo \u00e0 d\u00e9cima oitava aula do curso <strong>Oracle SQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Hoje vamos tratar de um dos pilares da produtividade e da seguran\u00e7a em bancos de dados Oracle: o desenvolvimento de <strong>Procedures e Functions em PL\/SQL<\/strong>. Se voc\u00ea trabalha com infraestrutura, seguran\u00e7a da informa\u00e7\u00e3o ou administra\u00e7\u00e3o de sistemas, certamente j\u00e1 se deparou com a necessidade de mover l\u00f3gica de neg\u00f3cio da camada de aplica\u00e7\u00e3o para dentro do banco de dados. Esta aula \u00e9 o ponto de virada que transforma voc\u00ea de um simples executor de queries para um desenvolvedor de solu\u00e7\u00f5es robustas, encapsuladas e reutiliz\u00e1veis diretamente no SGBD.\n<\/p>\n<p>\n    Procedures e Functions em PL\/SQL s\u00e3o blocos nomeados que residem no banco e podem ser invocados sob demanda. A diferen\u00e7a fundamental entre eles \u2014 que exploraremos com profundidade ao longo da aula \u2014 est\u00e1 no retorno: functions devolvem um valor escalar, procedures n\u00e3o. Mas essa \u00e9 apenas a ponta do iceberg. Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, nossos especialistas utilizam diariamente esses objetos para centralizar regras de valida\u00e7\u00e3o, automatizar rotinas de manuten\u00e7\u00e3o e reduzir drasticamente o tr\u00e1fego de rede em ambientes de miss\u00e3o cr\u00edtica. Nesta aula voc\u00ea aprender\u00e1 n\u00e3o apenas a sintaxe, mas o racioc\u00ednio por tr\u00e1s de cada decis\u00e3o de design.\n<\/p>\n<p>\n    Ao final desta aula, voc\u00ea ser\u00e1 capaz de criar procedures com par\u00e2metros de entrada e sa\u00edda, construir functions escalares que participam de SELECTs, tratar exce\u00e7\u00f5es com eleg\u00e2ncia e testar cada bloco de forma isolada. Tudo isso seguindo boas pr\u00e1ticas que aplicamos em implementa\u00e7\u00f5es reais na JRT Technology Solutions. Vamos mergulhar no mundo da l\u00f3gica de banco de dados com Oracle SQL Developer e SQL*Plus, garantindo que cada passo funcione exatamente como descrito.\n<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>Diferen\u00e7as conceituais e pr\u00e1ticas entre <strong>Procedures e Functions em<\/strong> PL\/SQL<\/li>\n<li>Cria\u00e7\u00e3o, compila\u00e7\u00e3o e invoca\u00e7\u00e3o de procedures com par\u00e2metros <strong>IN<\/strong>, <strong>OUT<\/strong> e <strong>IN OUT<\/strong><\/li>\n<li>Constru\u00e7\u00e3o de functions escalares e seu uso em consultas SQL<\/li>\n<li>Tratamento de exce\u00e7\u00f5es com <strong>EXCEPTION<\/strong> e blocos <strong>WHEN<\/strong><\/li>\n<li>Verifica\u00e7\u00e3o de objetos compilados e diagn\u00f3stico de erros de compila\u00e7\u00e3o<\/li>\n<li>Boas pr\u00e1ticas de nomenclatura, documenta\u00e7\u00e3o e controle de privil\u00e9gios<\/li>\n<li>Estrat\u00e9gias de otimiza\u00e7\u00e3o e debugging que usamos na JRT Technology Solutions<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>\n    Esta aula assume que voc\u00ea j\u00e1 possui um banco Oracle acess\u00edvel (vers\u00e3o 19c ou superior \u00e9 recomendada, mas o conte\u00fado \u00e9 compat\u00edvel a partir da 11gR2), com permiss\u00e3o para criar objetos no seu schema. Voc\u00ea precisar\u00e1 de acesso via <strong>SQL*Plus<\/strong>, <strong>SQLcl<\/strong> ou <strong>Oracle SQL Developer<\/strong>. Todos os exemplos foram testados em Oracle Database 21c Express Edition, tanto em Windows Server 2022 quanto em Oracle Linux 9 \u2014 em ambientes que montamos frequentemente nos laborat\u00f3rios da JRT Technology Solutions. Verifique se o par\u00e2metro <strong>PLSQL_CCFLAGS<\/strong> est\u00e1 em branco (padr\u00e3o) e se voc\u00ea tem as roles <strong>RESOURCE<\/strong> e <strong>CONNECT<\/strong> concedidas.\n<\/p>\n<p>\n    Antes de prosseguir, confirme que o seu ambiente est\u00e1 funcional com o comando de verifica\u00e7\u00e3o abaixo. Ele deve retornar a vers\u00e3o do banco e o status do cat\u00e1logo PL\/SQL.\n<\/p>\n<pre><code>-- Verifica\u00e7\u00e3o do ambiente Oracle e PL\/SQL\nSELECT banner FROM v$version WHERE ROWNUM = 1;\nSELECT object_name, status FROM user_objects WHERE object_type IN ('PROCEDURE','FUNCTION') AND ROWNUM &lt;= 5;\nSHOW USER;<\/code><\/pre>\n<pre><code class=\"output\">BANNER\n----------------------------------------------------------------------\nOracle Database 21c Express Edition Release 21.0.0.0.0 - Production\n\nno rows selected\n\nUSER is \"HR\"<\/code><\/pre>\n<h3>1. Conceitos Fundamentais de Procedures e Functions em PL\/SQL<\/h3>\n<p>\n    Antes de criarmos nosso primeiro objeto, precisamos alinhar a terminologia. Em PL\/SQL, tanto procedures quanto functions s\u00e3o <strong>subprogramas<\/strong> armazenados no banco. Eles compartilham a mesma estrutura b\u00e1sica de bloco (<strong>DECLARE<\/strong>, <strong>BEGIN<\/strong>, <strong>EXCEPTION<\/strong>, <strong>END<\/strong>), mas diferem em tr\u00eas aspectos essenciais. Primeiro, <strong>Functions retornam um valor<\/strong> via cl\u00e1usula <strong>RETURN<\/strong>, enquanto procedures n\u00e3o. Segundo, functions podem ser invocadas diretamente em express\u00f5es SQL (como <code>SELECT minha_funcao(col) FROM tabela<\/code>), desde que atendam a crit\u00e9rios de pureza. Terceiro, procedures s\u00e3o tipicamente usadas para realizar a\u00e7\u00f5es (opera\u00e7\u00f5es DML, envio de e-mails, chamadas a APIs), enquanto functions processam e devolvem dados. A escolha errada entre procedure e function pode levar a gargalos de performance e problemas de manuten\u00e7\u00e3o \u2014 vemos isso com frequ\u00eancia nos diagn\u00f3sticos que realizamos na JRT Technology Solutions.\n<\/p>\n<p>\n    Outro conceito crucial \u00e9 o de <strong>par\u00e2metros formais<\/strong>. Procedures e functions podem declarar par\u00e2metros nos modos <strong>IN<\/strong> (entrada \u2014 somente leitura), <strong>OUT<\/strong> (sa\u00edda \u2014 escrito pelo subprograma) e <strong>IN OUT<\/strong> (leitura e escrita). O modo padr\u00e3o, quando omitido, \u00e9 IN. Em functions, a boa pr\u00e1tica recomenda evitar par\u00e2metros OUT, pois a comunica\u00e7\u00e3o de volta ao chamador j\u00e1 \u00e9 feita pelo retorno da fun\u00e7\u00e3o. Contudo, o Oracle permite, e h\u00e1 cen\u00e1rios legados onde isso aparece. A regra que seguimos na JRT Technology Solutions \u00e9 clara: se a rotina precisa devolver mais de um valor, uma procedure com m\u00faltiplos par\u00e2metros OUT \u00e9 mais idiom\u00e1tica do que uma function com OUT disfar\u00e7ado.\n<\/p>\n<p>\n    A tabela a seguir resume as diferen\u00e7as cr\u00edticas que voc\u00ea deve internalizar antes de programar:\n<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr>\n<th>Caracter\u00edstica<\/th>\n<th>Procedure<\/th>\n<th>Function<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Retorno expl\u00edcito<\/td>\n<td>N\u00e3o possui<\/td>\n<td>Obrigat\u00f3rio (RETURN tipo)<\/td>\n<\/tr>\n<tr>\n<td>Uso em SQL<\/td>\n<td>N\u00e3o permitido<\/td>\n<td>Permitido (com restri\u00e7\u00f5es de pureza)<\/td>\n<\/tr>\n<tr>\n<td>Chamada t\u00edpica<\/td>\n<td>EXECUTE proc; ou CALL proc();<\/td>\n<td>SELECT func(&#8230;) FROM dual;<\/td>\n<\/tr>\n<tr>\n<td>Par\u00e2metros OUT<\/td>\n<td>Recomendado<\/td>\n<td>Desencorajado<\/td>\n<\/tr>\n<tr>\n<td>Prop\u00f3sito<\/td>\n<td>A\u00e7\u00f5es e efeitos colaterais<\/td>\n<td>C\u00e1lculos e transforma\u00e7\u00f5es<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>2. Criando sua Primeira Procedure em PL\/SQL<\/h3>\n<p>\n    Vamos ao primeiro exemplo pr\u00e1tico: uma procedure que insere um registro em uma tabela de log com data\/hora e uma mensagem. Primeiro, crie a tabela de apoio <strong>execution_log<\/strong>. \u00c9 fundamental que voc\u00ea execute cada comando na ordem apresentada. Em nossos treinamentos na JRT Technology Solutions, sempre come\u00e7amos com a infraestrutura de monitoramento \u2014 isso salva horas de debugging posterior.\n<\/p>\n<ol>\n<li>Conecte-se ao banco com seu usu\u00e1rio (neste exemplo, <strong>HR<\/strong>).<\/li>\n<li>Crie a tabela <strong>execution_log<\/strong> com colunas <strong>id<\/strong> (autoincremento via sequence e trigger, ou identidade no 12c+), <strong>log_date<\/strong> e <strong>message<\/strong>.<\/li>\n<li>Crie uma sequence e um trigger para preencher o ID, caso n\u00e3o esteja usando coluna identidade.<\/li>\n<li>Crie a procedure <strong>log_message<\/strong> que recebe uma string e insere na tabela.<\/li>\n<li>Execute a procedure e confira o resultado.<\/li>\n<\/ol>\n<pre><code>-- Cria\u00e7\u00e3o da tabela de log (compat\u00edvel com 12c+)\nCREATE TABLE execution_log (\n    id        NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,\n    log_date  TIMESTAMP DEFAULT SYSTIMESTAMP,\n    message   VARCHAR2(4000)\n);\n\n-- Procedure que insere uma mensagem de log\nCREATE OR REPLACE PROCEDURE log_message (\n    p_message IN VARCHAR2\n) IS\n    PRAGMA AUTONOMOUS_TRANSACTION; -- Permite commit independente\nBEGIN\n    INSERT INTO execution_log (message) VALUES (p_message);\n    COMMIT; -- Essencial para persistir imediatamente\nEND log_message;\n\/<\/code><\/pre>\n<pre><code class=\"output\">Table EXECUTION_LOG created.\n\nProcedure LOG_MESSAGE compiled<\/code><\/pre>\n<p>\n    Note o uso de <strong>PRAGMA AUTONOMOUS_TRANSACTION<\/strong>. Essa diretiva diz ao Oracle que a procedure roda em uma transa\u00e7\u00e3o independente da sess\u00e3o chamadora. Sem ela, um <strong>COMMIT<\/strong> dentro da procedure afetaria toda a transa\u00e7\u00e3o do chamador, o que raramente \u00e9 desej\u00e1vel em procedimentos de log. Na JRT Technology Solutions, tratamos essa pragma como obrigat\u00f3ria para qualquer rotina de auditoria ou logging, evitando efeitos colaterais em transa\u00e7\u00f5es de neg\u00f3cio. Ap\u00f3s compilar, invocamos a procedure com <strong>EXEC<\/strong> ou <strong>CALL<\/strong> e verificamos a tabela.\n<\/p>\n<pre><code>-- Execu\u00e7\u00e3o da procedure\nEXEC log_message('Aula 18 - primeira procedure executada com sucesso');\n\n-- Verifica\u00e7\u00e3o do log\nSELECT * FROM execution_log ORDER BY id DESC FETCH FIRST 3 ROWS ONLY;<\/code><\/pre>\n<pre><code class=\"output\">PL\/SQL procedure successfully completed.\n\nID   LOG_DATE                          MESSAGE\n--   -------------------------------  -----------------------------------------\n1    28-JUL-26 10.23.45.123456 AM     Aula 18 - primeira procedure executada com sucesso<\/code><\/pre>\n<h3>3. Criando Functions e Entendendo o Mecanismo de Retorno<\/h3>\n<p>\n    Agora que dominamos uma procedure simples, vamos construir uma <strong>function<\/strong> que calcula o d\u00edgito verificador de um CPF \u2014 um exemplo cl\u00e1ssico que reaproveitamos em diversas implementa\u00e7\u00f5es na JRT Technology Solutions para valida\u00e7\u00e3o de dados cadastrais. A function receber\u00e1 os 9 primeiros d\u00edgitos como n\u00famero e retornar\u00e1 o d\u00edgito verificador completo (dois caracteres).\n<\/p>\n<p>\n    Functions s\u00e3o definidas com a sintaxe <strong>CREATE OR REPLACE FUNCTION nome (&#8230;) RETURN tipo<\/strong>. Dentro do corpo, em algum ponto deve existir um comando <strong>RETURN express\u00e3o;<\/strong>. O tipo de retorno pode ser qualquer tipo SQL escalar (<strong>NUMBER<\/strong>, <strong>VARCHAR2<\/strong>, <strong>DATE<\/strong>) ou tipos PL\/SQL, desde que compat\u00edveis com SQL. Uma vez compilada, a function pode ser testada com <strong>SELECT func FROM dual;<\/strong>. Essa \u00e9 uma das grandes vantagens: voc\u00ea pode incorporar a l\u00f3gica diretamente em queries, sem precisar de cursores expl\u00edcitos.\n<\/p>\n<pre><code>-- Function para calcular d\u00edgito verificador de CPF\nCREATE OR REPLACE FUNCTION calc_cpf_dv (\n    p_base IN NUMBER\n) RETURN VARCHAR2\nIS\n    v_base_str  VARCHAR2(9);\n    v_sum       NUMBER := 0;\n    v_dv        VARCHAR2(2);\n    v_d1        NUMBER;\n    v_d2        NUMBER;\nBEGIN\n    -- Preenche com zeros \u00e0 esquerda at\u00e9 9 d\u00edgitos\n    v_base_str := LPAD(TO_CHAR(p_base), 9, '0');\n\n    -- Primeiro d\u00edgito\n    FOR i IN 1..9 LOOP\n        v_sum := v_sum + TO_NUMBER(SUBSTR(v_base_str, i, 1)) * (11 - i);\n    END LOOP;\n    v_d1 := MOD(v_sum * 10, 11);\n    IF v_d1 = 10 THEN v_d1 := 0; END IF;\n\n    -- Segundo d\u00edgito\n    v_sum := 0;\n    FOR i IN 1..9 LOOP\n        v_sum := v_sum + TO_NUMBER(SUBSTR(v_base_str, i, 1)) * (12 - i);\n    END LOOP;\n    v_sum := v_sum + v_d1 * 2;\n    v_d2 := MOD(v_sum * 10, 11);\n    IF v_d2 = 10 THEN v_d2 := 0; END IF;\n\n    v_dv := TO_CHAR(v_d1) || TO_CHAR(v_d2);\n    RETURN v_dv;\nEND calc_cpf_dv;\n\/<\/code><\/pre>\n<pre><code class=\"output\">Function CALC_CPF_DV compiled<\/code><\/pre>\n<p>\n    Para testar, utilizamos um CPF base conhecido. O n\u00famero 123456789, por exemplo, tem d\u00edgitos verificadores calcul\u00e1veis. Vamos invocar a function e ver o retorno.\n<\/p>\n<pre><code>SELECT calc_cpf_dv(123456789) AS digito_verificador FROM dual;<\/code><\/pre>\n<pre><code class=\"output\">DIGITO_VERIFICADOR\n------------------\n09<\/code><\/pre>\n<h3>4. Par\u00e2metros em Procedures e Functions em PL\/SQL \u2014 Modos e Boas Pr\u00e1ticas<\/h3>\n<p>\n    Um dos pontos que mais gera confus\u00e3o em iniciantes \u2014 e que revisamos exaustivamente nos treinamentos da JRT Technology Solutions \u2014 \u00e9 o uso correto dos modos de par\u00e2metro. Cada modo tem implica\u00e7\u00f5es de performance e seguran\u00e7a. O modo <strong>IN<\/strong> \u00e9 o padr\u00e3o: o valor \u00e9 copiado para uma vari\u00e1vel local e pode ser lido, mas n\u00e3o alterado de forma que reflita no chamador. O modo <strong>OUT<\/strong> permite que a procedure escreva um valor que estar\u00e1 dispon\u00edvel para o chamador ap\u00f3s a execu\u00e7\u00e3o. J\u00e1 o modo <strong>IN OUT<\/strong> combina ambos, mas deve ser evitado quando poss\u00edvel, pois obscurece a inten\u00e7\u00e3o do c\u00f3digo.\n<\/p>\n<p>\n    Vamos criar uma procedure que recebe um sal\u00e1rio (IN), um percentual de reajuste (IN) e devolve o novo sal\u00e1rio (OUT) e o valor do aumento (OUT). Esse padr\u00e3o \u00e9 muito comum em rotinas de RH que migramos para dentro do banco nos projetos da JRT Technology Solutions, eliminando c\u00e1lculos inconsistentes na aplica\u00e7\u00e3o.\n<\/p>\n<pre><code>-- Procedure com m\u00faltiplos par\u00e2metros OUT\nCREATE OR REPLACE PROCEDURE reajustar_salario (\n    p_salario_atual  IN  NUMBER,\n    p_percentual     IN  NUMBER,\n    p_novo_salario   OUT NUMBER,\n    p_valor_aumento  OUT NUMBER\n) IS\nBEGIN\n    p_valor_aumento := ROUND(p_salario_atual * p_percentual \/ 100, 2);\n    p_novo_salario  := p_salario_atual + p_valor_aumento;\nEND reajustar_salario;\n\/<\/code><\/pre>\n<p>\n    Para invocar uma procedure com par\u00e2metros OUT em SQL*Plus, precisamos declarar vari\u00e1veis de bind com <strong>VARIABLE<\/strong>. Isso \u00e9 um detalhe que faz muita diferen\u00e7a na pr\u00e1tica: sem as vari\u00e1veis de bind, voc\u00ea n\u00e3o consegue capturar os valores de sa\u00edda.\n<\/p>\n<pre><code>-- Teste da procedure com par\u00e2metros OUT\nVARIABLE v_novo NUMBER;\nVARIABLE v_aumento NUMBER;\n\nEXEC reajustar_salario(5000, 10, :v_novo, :v_aumento);\n\nPRINT v_novo;\nPRINT v_aumento;<\/code><\/pre>\n<pre><code class=\"output\">PL\/SQL procedure successfully completed.\n\nV_NOVO\n----------\n5500\n\nV_AUMENTO\n----------\n500<\/code><\/pre>\n<p>\n    A tabela abaixo compila os modos de par\u00e2metro e suas caracter\u00edsticas, servindo como refer\u00eancia r\u00e1pida para qualquer projeto:\n<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr>\n<th>Modo<\/th>\n<th>Inicializa\u00e7\u00e3o pelo chamador<\/th>\n<th>Valor ap\u00f3s execu\u00e7\u00e3o<\/th>\n<th>Uso t\u00edpico<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>IN<\/td>\n<td>Obrigat\u00f3ria<\/td>\n<td>Inalterado<\/td>\n<td>Filtros, chaves, par\u00e2metros de configura\u00e7\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>OUT<\/td>\n<td>Opcional (nulo)<\/td>\n<td>Escrito pela rotina<\/td>\n<td>Retornos m\u00faltiplos, status de execu\u00e7\u00e3o<\/td>\n<\/tr>\n<tr>\n<td>IN OUT<\/td>\n<td>Obrigat\u00f3ria<\/td>\n<td>Pode ser alterado<\/td>\n<td>Acumuladores, buffers de processo<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>5. Tratamento de Exce\u00e7\u00f5es em Blocos PL\/SQL<\/h3>\n<p>\n    Nenhum c\u00f3digo de produ\u00e7\u00e3o sobrevive sem tratamento de erros. Em PL\/SQL, utilizamos a se\u00e7\u00e3o <strong>EXCEPTION<\/strong> para capturar exce\u00e7\u00f5es predefinidas do Oracle (como <strong>NO_DATA_FOUND<\/strong>, <strong>TOO_MANY_ROWS<\/strong>, <strong>DUP_VAL_ON_INDEX<\/strong>) ou exce\u00e7\u00f5es definidas pelo usu\u00e1rio. Na JRT Technology Solutions, implementamos um padr\u00e3o onde toda procedure de neg\u00f3cio registra erros em uma tabela de auditoria, facilitando a rastreabilidade. Vamos construir uma function que busca o nome de um departamento pelo ID e trata a aus\u00eancia de dados de forma elegante, sem propagar exce\u00e7\u00e3o n\u00e3o tratada.\n<\/p>\n<pre><code>-- Function com tratamento de exce\u00e7\u00e3o\nCREATE OR REPLACE FUNCTION get_department_name (\n    p_dept_id IN departments.department_id%TYPE\n) RETURN VARCHAR2\nIS\n    v_name departments.department_name%TYPE;\nBEGIN\n    SELECT department_name INTO v_name\n    FROM departments\n    WHERE department_id = p_dept_id;\n    \n    RETURN v_name;\nEXCEPTION\n    WHEN NO_DATA_FOUND THEN\n        RETURN 'Departamento inexistente';\n    WHEN TOO_MANY_ROWS THEN\n        -- Este caso \u00e9 improv\u00e1vel com PK, mas serve de exemplo\n        RETURN 'M\u00faltiplos departamentos encontrados';\n    WHEN OTHERS THEN\n        -- Log gen\u00e9rico; em produ\u00e7\u00e3o, usaria PRAGMA AUTONOMOUS_TRANSACTION\n        RETURN 'Erro inesperado: ' || SQLERRM;\nEND get_department_name;\n\/<\/code><\/pre>\n<pre><code class=\"output\">Function GET_DEPARTMENT_NAME compiled<\/code><\/pre>\n<p>\n    Testamos com um ID existente e com um ID inv\u00e1lido, demonstrando que a function nunca lan\u00e7a exce\u00e7\u00e3o para o chamador, mas sim retorna mensagens amig\u00e1veis. Essa abordagem melhora a experi\u00eancia do usu\u00e1rio e simplifica a depura\u00e7\u00e3o.\n<\/p>\n<pre><code>-- Teste com ID existente (assumindo departamento 50)\nSELECT get_department_name(50) AS dept FROM dual;\n\n-- Teste com ID inexistente\nSELECT get_department_name(9999) AS dept FROM dual;<\/code><\/pre>\n<pre><code class=\"output\">DEPT\n-------------------------\nShipping\n\nDEPT\n-------------------------\nDepartamento inexistente<\/code><\/pre>\n<h3>6. Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>\n    Para garantir que todos os objetos foram criados corretamente e est\u00e3o compilados, utilizamos as views do dicion\u00e1rio de dados. Esta etapa \u00e9 obrigat\u00f3ria antes de entregar qualquer c\u00f3digo em produ\u00e7\u00e3o \u2014 e faz parte do checklist que mantemos na JRT Technology Solutions. Execute os comandos abaixo e confira se o status \u00e9 <strong>VALID<\/strong> e se n\u00e3o h\u00e1 erros de compila\u00e7\u00e3o.\n<\/p>\n<pre><code>-- Listar procedures e functions do usu\u00e1rio e seu status\nSELECT object_name, object_type, status, created\nFROM user_objects\nWHERE object_type IN ('PROCEDURE', 'FUNCTION')\nORDER BY object_type, object_name;<\/code><\/pre>\n<pre><code class=\"output\">OBJECT_NAME          OBJECT_TYPE   STATUS   CREATED\n-------------------- ------------- -------- ------------------------\nLOG_MESSAGE          PROCEDURE     VALID    28-JUL-2026 10:20:30\nREAJUSTAR_SALARIO    PROCEDURE     VALID    28-JUL-2026 11:05:00\nCALC_CPF_DV          FUNCTION      VALID    28-JUL-2026 10:35:12\nGET_DEPARTMENT_NAME  FUNCTION      VALID    28-JUL-2026 11:10:45<\/code><\/pre>\n<p>\n    Caso algum objeto apare\u00e7a com status <strong>INVALID<\/strong>, voc\u00ea deve consultar a view <strong>USER_ERRORS<\/strong> para obter detalhes do problema de compila\u00e7\u00e3o. O comando a seguir exibe os erros com indica\u00e7\u00e3o de linha e coluna, essencial para troubleshooting.\n<\/p>\n<pre><code>-- Verificar erros de compila\u00e7\u00e3o (se houver)\nSELECT name, type, line, position, text\nFROM user_errors\nWHERE name IN ('LOG_MESSAGE','REAJUSTAR_SALARIO','CALC_CPF_DV','GET_DEPARTMENT_NAME')\nORDER BY name, sequence;<\/code><\/pre>\n<pre><code class=\"output\">no rows selected<\/code><\/pre>\n<h3>7. Erros Comuns e Como Resolver<\/h3>\n<p>\n    Durante os anos de consultoria na JRT Technology Solutions, catalogamos os erros mais frequentes que profissionais enfrentam ao criar Procedures e Functions em PL\/SQL. Abaixo, listamos quatro situa\u00e7\u00f5es reais com sintoma, causa e solu\u00e7\u00e3o detalhada.\n<\/p>\n<ul>\n<li>\n        <strong>PLS-00103: Encountered the symbol &#8220;CREATE&#8221;<\/strong><br \/>\n        <em>Sintoma:<\/em> O SQL*Plus rejeita a cria\u00e7\u00e3o do objeto e exibe esse erro logo na primeira linha.<br \/>\n        <em>Causa:<\/em> O comando <strong>CREATE OR REPLACE<\/strong> precisa ser a primeira instru\u00e7\u00e3o de um bloco PL\/SQL, mas h\u00e1 um caractere n\u00e3o imprim\u00edvel ou uma instru\u00e7\u00e3o anterior sem terminador adequado (falta de <strong>\/<\/strong> ou <strong>;<\/strong>).<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> No SQL*Plus, sempre encerre o bloco com uma linha contendo apenas <strong>\/<\/strong>. Se o erro persistir, digite <strong>LIST<\/strong> e verifique caracteres estranhos. Em ferramentas gr\u00e1ficas, remova espa\u00e7os extras antes do CREATE.\n    <\/li>\n<li>\n        <strong>PLS-00904: insufficient privilege to access object<\/strong><br \/>\n        <em>Sintoma:<\/em> A compila\u00e7\u00e3o falha mesmo com sintaxe correta, especialmente ao referenciar tabelas de outros schemas.<br \/>\n        <em>Causa:<\/em> Privil\u00e9gios concedidos via role n\u00e3o se aplicam a objetos PL\/SQL definidos com <strong>AUTHID DEFINER<\/strong> (padr\u00e3o). As roles s\u00e3o desabilitadas durante a compila\u00e7\u00e3o.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Conceda o privil\u00e9gio diretamente ao usu\u00e1rio (<strong>GRANT SELECT ON schema.tabela TO usuario;<\/strong>), n\u00e3o via role. Se necess\u00e1rio, use <strong>AUTHID CURRENT_USER<\/strong> para herdar privil\u00e9gios de roles no momento da execu\u00e7\u00e3o, mas avalie impactos de seguran\u00e7a.\n    <\/li>\n<li>\n        <strong>ORA-06503: PL\/SQL: Function returned without value<\/strong><br \/>\n        <em>Sintoma:<\/em> Ao executar uma function, o Oracle retorna esse erro em tempo de execu\u00e7\u00e3o, mesmo que a compila\u00e7\u00e3o tenha sido bem-sucedida.<br \/>\n        <em>Causa:<\/em> H\u00e1 um caminho de execu\u00e7\u00e3o dentro da function que n\u00e3o atinge um comando <strong>RETURN<\/strong>. Por exemplo, um IF sem ELSE que deixa o fluxo cair para o final do bloco.<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Garanta que todos os blocos condicionais convirjam para um RETURN ou que haja um RETURN padr\u00e3o antes do <strong>EXCEPTION<\/strong>. Use ferramentas de cobertura de c\u00f3digo para identificar branches descobertos.\n    <\/li>\n<li>\n        <strong>PLS-00306: wrong number or types of arguments in call<\/strong><br \/>\n        <em>Sintoma:<\/em> A chamada da procedure\/function falha informando n\u00famero ou tipo incorreto de argumentos.<br \/>\n        <em>Causa:<\/em> Par\u00e2metros obrigat\u00f3rios omitidos, troca de posi\u00e7\u00e3o de argumentos ou incompatibilidade de tipos (ex.: passar NUMBER onde se espera VARCHAR2 sem convers\u00e3o impl\u00edcita segura).<br \/>\n        <em>Solu\u00e7\u00e3o:<\/em> Utilize nota\u00e7\u00e3o nomeada (<strong>p_param =&gt; valor<\/strong>) para evitar depend\u00eancia de ordem. Verifique as assinaturas com <strong>DESCRIBE nome_objeto<\/strong> e confirme os tipos de dados exatos.\n    <\/li>\n<\/ul>\n<h3>8. Boas Pr\u00e1ticas e Dicas Avan\u00e7adas de Procedures e Functions em PL\/SQL<\/h3>\n<p>\n    Escrever c\u00f3digo que funciona \u00e9 o primeiro passo; escrever c\u00f3digo que escala e se mant\u00e9m \u00e9 o diferencial. Na JRT Technology Solutions, seguimos um conjunto de diretrizes que compartilho agora. <strong>Primeiro<\/strong>, sempre prefixe par\u00e2metros com <strong>p_<\/strong> e vari\u00e1veis locais com <strong>v_<\/strong>. Isso evita colis\u00e3o com nomes de colunas e torna o c\u00f3digo autoexplicativo. <strong>Segundo<\/strong>, utilize <strong>%TYPE<\/strong> e <strong>%ROWTYPE<\/strong> sempre que poss\u00edvel, ancorando vari\u00e1veis a colunas de tabelas ou cursores. Isso protege seu c\u00f3digo contra altera\u00e7\u00f5es futuras no modelo de dados. <strong>Terceiro<\/strong>, evite <strong>WHEN OTHERS<\/strong> sem registro de log; capture exce\u00e7\u00f5es espec\u00edficas e relance o erro se n\u00e3o puder trat\u00e1-lo adequadamente com <strong>RAISE<\/strong> ou <strong>RAISE_APPLICATION_ERROR<\/strong>.\n<\/p>\n<p>\n    Para debugging, o Oracle oferece o pacote <strong>DBMS_OUTPUT.PUT_LINE<\/strong>, que exige <strong>SET SERVEROUTPUT ON<\/strong> no SQL*Plus. Em nossas f\u00e1bricas de c\u00f3digo, tamb\u00e9m utilizamos o pacote <strong>DBMS_UTILITY.FORMAT_CALL_STACK<\/strong> para rastrear a pilha de chamadas em exce\u00e7\u00f5es. Outra t\u00e9cnica avan\u00e7ada \u00e9 o uso de <strong>RESULT_CACHE<\/strong> em functions determin\u00edsticas que s\u00e3o invocadas repetidamente com os mesmos par\u00e2metros \u2014 isso pode reduzir drasticamente o consumo de CPU em ambientes concorridos.\n<\/p>\n<p>\n    Por fim, considere empacotar procedures e functions relacionadas em <strong>packages<\/strong> \u2014 t\u00f3pico que ser\u00e1 abordado na pr\u00f3xima aula. Packages permitem sobrecarga, estado compartilhado e melhor organiza\u00e7\u00e3o do c\u00f3digo. Mas mesmo em scripts independentes, manter a coes\u00e3o e documentar cada objeto com coment\u00e1rios sobre prop\u00f3sito, autor e data de cria\u00e7\u00e3o \u00e9 um h\u00e1bito que recomendamos fortemente nos treinamentos da JRT Technology Solutions.\n<\/p>\n<h3>Resumo da Aula 18<\/h3>\n<p>\n    Nesta aula, voc\u00ea aprendeu a criar <strong>Procedures e Functions em PL\/SQL<\/strong> do zero, entendendo suas diferen\u00e7as, modos de par\u00e2metros, tratamento de exce\u00e7\u00f5es e boas pr\u00e1ticas. Come\u00e7amos com uma procedure de log usando <strong>PRAGMA AUTONOMOUS_TRANSACTION<\/strong>, passamos por uma function de c\u00e1lculo de d\u00edgito verificador e exploramos par\u00e2metros OUT com vari\u00e1veis de bind no SQL*Plus. Verificamos a compila\u00e7\u00e3o via dicion\u00e1rio de dados e discutimos os quatro erros mais comuns e suas solu\u00e7\u00f5es, baseados na experi\u00eancia real da JRT Technology Solutions.\n<\/p>\n<p>\n    A tabela de refer\u00eancia r\u00e1pida abaixo consolida os comandos essenciais que voc\u00ea deve ter \u00e0 m\u00e3o:\n<\/p>\n<table border=\"1\" cellpadding=\"8\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%;\">\n<thead>\n<tr>\n<th>Opera\u00e7\u00e3o<\/th>\n<th>Comando\/Exemplo<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Criar procedure<\/td>\n<td><code>CREATE OR REPLACE PROCEDURE nome (p IN tipo) IS BEGIN ... END;<\/code><\/td>\n<\/tr>\n<tr>\n<td>Criar function<\/td>\n<td><code>CREATE OR REPLACE FUNCTION nome (p IN tipo) RETURN tipo IS BEGIN ... RETURN valor; END;<\/code><\/td>\n<\/tr>\n<tr>\n<td>Executar procedure<\/td>\n<td><code>EXEC nome(param);<\/code><\/td>\n<\/tr>\n<tr>\n<td>Testar function<\/td>\n<td><code>SELECT nome(param) FROM dual;<\/code><\/td>\n<\/tr>\n<tr>\n<td>Verificar status<\/td>\n<td><code>SELECT object_name, status FROM user_objects WHERE object_type IN ('PROCEDURE','FUNCTION');<\/code><\/td>\n<\/tr>\n<tr>\n<td>Ver erros de compila\u00e7\u00e3o<\/td>\n<td><code>SELECT * FROM user_errors WHERE name = 'NOME';<\/code><\/td>\n<\/tr>\n<tr>\n<td>Descrever assinatura<\/td>\n<td><code>DESC nome;<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\n    Com essa base s\u00f3lida, voc\u00ea est\u00e1 pronto para projetos mais complexos. Na <strong>Aula 19<\/strong>, vamos elevar o n\u00edvel: mergulharemos em <strong>Packages<\/strong>, onde agruparemos procedures e functions relacionadas, exploraremos sobrecarga de subprogramas e vari\u00e1veis de estado persistente \u2014 um dos recursos mais poderosos do PL\/SQL para construir APIs de banco de dados coesas e profissionais. At\u00e9 l\u00e1!\n<\/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 criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL do zero ao avan\u00e7ado! Clique e descubra!<\/p>\n","protected":false},"author":1,"featured_media":1868,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"iawp_total_views":1,"footnotes":""},"categories":[75],"tags":[3002,2999,3000,2093,2998,3001],"class_list":["post-1869","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-desenvolvimento-de-banco-de-dados","tag-functions-em-pl-sql","tag-logica-no-banco-de-dados","tag-oracle-sql","tag-procedures-em-pl-sql","tag-programacao-em-pl-sql"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL 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\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.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 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL do zero ao avan\u00e7ado! Clique e descubra!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/\" \/>\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-28T20:44:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-07-28T20:44:19+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 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL 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\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#blogposting\",\"name\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco\",\"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-1785271453125.jpg\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco\"},\"datePublished\":\"2026-07-28T17:44:19-03:00\",\"dateModified\":\"2026-07-28T17:44:19-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#webpage\"},\"articleSection\":\"DevOps, desenvolvimento de banco de dados, functions em PL\\\/SQL, l\\u00f3gica no banco de dados, oracle sql, procedures em PL\\\/SQL, programa\\u00e7\\u00e3o em PL\\\/SQL\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#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\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#listItem\",\"name\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#listItem\",\"position\":3,\"name\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco\",\"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\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#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\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#authorImage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/cropped-foto-rascunho3-96x96.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Thiago Paes Rodrigues\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/\",\"name\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco - BLOG - JRT Technology Solutions\",\"description\":\"Aprenda a criar l\\u00f3gica no banco com Procedures e Functions em PL\\\/SQL. Domine Oracle SQL 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\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#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-1785271453125.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#mainImage\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 18: Procedures e Functions em PL\\\/SQL \\u2014 criando l\\u00f3gica no banco\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/07\\\/28\\\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\\\/#mainImage\"},\"datePublished\":\"2026-07-28T17:44:19-03:00\",\"dateModified\":\"2026-07-28T17:44:19-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 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions","description":"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL do zero ao avan\u00e7ado! Clique e descubra!","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/","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\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#blogposting","name":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions","headline":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco","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-1785271453125.jpg","width":1440,"height":1024,"caption":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco"},"datePublished":"2026-07-28T17:44:19-03:00","dateModified":"2026-07-28T17:44:19-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#webpage"},"articleSection":"DevOps, desenvolvimento de banco de dados, functions em PL\/SQL, l\u00f3gica no banco de dados, oracle sql, procedures em PL\/SQL, programa\u00e7\u00e3o em PL\/SQL"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#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\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#listItem","name":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#listItem","position":3,"name":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco","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\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#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\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#authorImage","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/cropped-foto-rascunho3-96x96.jpeg","width":96,"height":96,"caption":"Thiago Paes Rodrigues"}},{"@type":"WebPage","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/","name":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions","description":"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL 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\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#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-1785271453125.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#mainImage","width":1440,"height":1024,"caption":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/#mainImage"},"datePublished":"2026-07-28T17:44:19-03:00","dateModified":"2026-07-28T17:44:19-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 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions","og:description":"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL do zero ao avan\u00e7ado! Clique e descubra!","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/","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-28T20:44:19+00:00","article:modified_time":"2026-07-28T20:44:19+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco - BLOG - JRT Technology Solutions","twitter:description":"Aprenda a criar l\u00f3gica no banco com Procedures e Functions em PL\/SQL. Domine Oracle SQL 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":"1869","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 23:29:47","updated":"2026-07-30 23:29:47","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 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco\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 18: Procedures e Functions em PL\/SQL \u2014 criando l\u00f3gica no banco","link":"https:\/\/jrtx.com.br\/blog\/2026\/07\/28\/aula-18-procedures-e-functions-em-plsql-criando-logica-no-ba\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1869","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=1869"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1869\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1868"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1869"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1869"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}