{"id":11796,"date":"2023-11-07T13:55:29","date_gmt":"2023-11-07T16:55:29","guid":{"rendered":"https:\/\/www.homehost.com.br\/blog\/?p=11796"},"modified":"2023-12-02T11:57:55","modified_gmt":"2023-12-02T14:57:55","slug":"pl-sql","status":"publish","type":"post","link":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/","title":{"rendered":"PL SQL: Um guia completo"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL-1024x613.png\" alt=\"PL\/SQL\" class=\"wp-image-11811\" width=\"1024\" height=\"613\" srcset=\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL-1024x613.png 1024w, https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL-300x180.png 300w, https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL-768x460.png 768w, https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png 1077w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>A linguagem SQL (Structured Query Language) \u00e9 amplamente utilizada no gerenciamento e manipula\u00e7\u00e3o de dados em sistemas de banco de dados. No entanto, em situa\u00e7\u00f5es onde \u00e9 necess\u00e1ria a realiza\u00e7\u00e3o de tarefas mais complexas. Como, por exemplo, a manipula\u00e7\u00e3o de dados em larga escala, gera\u00e7\u00e3o de relat\u00f3rios personalizados. Ou tamb\u00e9m a integra\u00e7\u00e3o com aplica\u00e7\u00f5es externas, a linguagem <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/o-que-e-sql\/\">SQL<\/a> pode se mostrar limitada.<\/p>\n\n\n\n<p>Nesse caso, \u00e9 comum recorrer \u00e0 utiliza\u00e7\u00e3o de linguagens de programa\u00e7\u00e3o procedurais. Como o <strong>PL no SQL, que permitem uma maior flexibilidade e controle sobre as opera\u00e7\u00f5es executadas.<\/strong><\/p>\n\n\n\n<p>O PL (Procedural Language) no SQL \u00e9 uma combina\u00e7\u00e3o dessas duas linguagens, proporcionando os benef\u00edcios de ambos os mundos. A sintaxe e a sem\u00e2ntica do SQL s\u00e3o mantidas, facilitando a manipula\u00e7\u00e3o e a consulta de dados. Por outro lado, o PL na SQL adiciona estruturas de controle de fluxo, sub-rotinas e fun\u00e7\u00f5es. Isso permite o desenvolvimento de procedimentos mais sofisticados e eficientes.<\/p>\n\n\n\n<p>O PL SQL \u00e9 compat\u00edvel com bancos de dados Oracle. No momento, o <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/o-que-e-mysql\/\" rel=\"noreferrer noopener\" target=\"_blank\">MySQL<\/a> n\u00e3o possui compatibilidade.<\/p>\n\n\n\n<p>Este artigo visa apresentar os fundamentos do PL na SQL, abordando aspectos como a sintaxe e sem\u00e2ntica. Al\u00e9m disso, tipos de dados, estruturas de controle de fluxo, subrotinas e fun\u00e7\u00f5es. E por fim, tratamento de exce\u00e7\u00f5es, intera\u00e7\u00e3o com o banco de dados, tabela de verifica\u00e7\u00e3o, escopos e performance.<\/p>\n\n\n\n<p>Assim, ao final deste artigo, voc\u00ea e<a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/cursos-de-sql-gratuitos\/\">star\u00e1 preparado para empregar o PL na SQL em suas atividades<\/a> de gerenciamento de dados. Proporcionando solu\u00e7\u00f5es mais eficientes e escal\u00e1veis.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_72 ez-toc-wrap-center counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Conte\u00fado<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Sintaxe_e_semantica_do_PL_no_SQL\" title=\"Sintaxe e sem\u00e2ntica do PL no SQL\">Sintaxe e sem\u00e2ntica do PL no SQL<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Sintaxe_do_PLSQL\" title=\"Sintaxe do PL\/SQL\">Sintaxe do PL\/SQL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Semantica_do_PLSQL\" title=\"Sem\u00e2ntica do PL\/SQL\">Sem\u00e2ntica do PL\/SQL<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Variaveis_e_tipos_de_dados_em_PL_no_SQL\" title=\"Vari\u00e1veis e tipos de dados em PL no SQL\">Vari\u00e1veis e tipos de dados em PL no SQL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Estruturas_de_controle_de_fluxo\" title=\"Estruturas de controle de fluxo\">Estruturas de controle de fluxo<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Subrotinas_e_funcoes_em_PL_no_SQL\" title=\"Subrotinas e fun\u00e7\u00f5es em PL no SQL\">Subrotinas e fun\u00e7\u00f5es em PL no SQL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Lidando_com_erros_e_excecoes_no_PL\" title=\"Lidando com erros e exce\u00e7\u00f5es no PL\">Lidando com erros e exce\u00e7\u00f5es no PL<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Interacao_com_o_banco_de_dados\" title=\"Intera\u00e7\u00e3o com o banco de dados\">Intera\u00e7\u00e3o com o banco de dados<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Manipulacao_de_dados\" title=\"Manipula\u00e7\u00e3o de dados\">Manipula\u00e7\u00e3o de dados<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Realizar_consultas\" title=\"Realizar consultas\">Realizar consultas<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Atualizar_dados\" title=\"Atualizar dados\">Atualizar dados<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Compreendendo_blocos_e_escopos_em_PL_no_SQL\" title=\"Compreendendo blocos e escopos em PL no SQL\">Compreendendo blocos e escopos em PL no SQL<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Blocos\" title=\"Blocos\">Blocos<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#Escopo\" title=\"Escopo\">Escopo<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Sintaxe_e_semantica_do_PL_no_SQL\"><\/span>Sintaxe e sem\u00e2ntica do PL no SQL<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>O PL\/SQL (Procedural Language\/Structured Query Language) \u00e9 um dialeto de SQL (Structured Query Language). <strong>Ele permite a escrita de procedimentos al\u00e9m de consultas e atualiza\u00e7\u00f5es de dados<\/strong>. Ele \u00e9 usado principalmente em sistemas de gerenciamento de banco de dados relacional, como o Oracle Database.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Sintaxe_do_PLSQL\"><\/span>Sintaxe do PL\/SQL<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>A sintaxe do PL\/SQL \u00e9 semelhante \u00e0 do SQL padr\u00e3o. Por\u00e9m, inclui elementos de programa\u00e7\u00e3o orientada a objetos, como vari\u00e1veis, <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/tipos-de-dados-do-mysql\/\">tipos de dados<\/a>, controladores de fluxo de programa, loops e fun\u00e7\u00f5es. Alguns exemplos de sintaxe PL\/SQL incluem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Declara\u00e7\u00e3o de vari\u00e1veis e tipos de dados:&nbsp;<code>DECLARE v_name VARCHAR2(50) := 'John';<\/code><\/li>\n\n\n\n<li>Condicional if-then-else:&nbsp;<code>IF v_age &gt; 18 THEN v_status := 'Adulto'; ELSIF v_age &gt; 65 THEN v_status := 'Idoso'; END IF;<\/code><\/li>\n\n\n\n<li>Loop while:&nbsp;<code>WHILE v_count &gt; 0 LOOP<\/code><\/li>\n\n\n\n<li>Fun\u00e7\u00f5es:&nbsp;<code>CREATE OR REPLACE FUNCTION my_function(p_param1 IN VARCHAR2, p_param2 OUT VARCHAR2) RETURN VARCHAR2 IS BEGIN ... END;<\/code><\/li>\n<\/ul>\n\n\n\n<p>A sintaxe do PL\/SQL permite que os desenvolvedores criem procedimentos. Tudo al\u00e9m das consultas e atualiza\u00e7\u00f5es de dados, tornando-os mais eficientes e flex\u00edveis.<\/p>\n\n\n\n<p>Al\u00e9m disso, o PL\/SQL suporta programa\u00e7\u00e3o orientada a objetos. Isso permite que os desenvolvedores criem bibliotecas de fun\u00e7\u00f5es reutiliz\u00e1veis e modos de programa\u00e7\u00e3o mais complexos.<\/p>\n\n\n\n<p>A sem\u00e2ntica do PL\/SQL \u00e9 a maneira como o PL\/SQL interpreta e executa o c\u00f3digo. Dessa forma, o PL no SQL \u00e9 interpretado e executado pelo motor de PL\/SQL do Oracle Database. Ele l\u00ea o c\u00f3digo e gera o c\u00f3digo de execu\u00e7\u00e3o correspondente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Semantica_do_PLSQL\"><\/span>Sem\u00e2ntica do PL\/SQL<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>A sem\u00e2ntica do PL\/SQL inclui:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tipos de dados:<\/strong> O PL\/SQL suporta muitos tipos de dados, como n\u00fameros, strings, dates, booleans, etc.<\/li>\n\n\n\n<li><strong>Vari\u00e1veis:<\/strong> As vari\u00e1veis s\u00e3o usadas para armazenar dados temporariamente durante a execu\u00e7\u00e3o do c\u00f3digo.<\/li>\n\n\n\n<li><strong>Controladores de fluxo de programa:<\/strong> O PL\/SQL suporta controladores de fluxo de programa. Por exemplo, como if-then-else, while, for e <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/case-when-sql\/\">case<\/a>, para controlar a execu\u00e7\u00e3o do c\u00f3digo.<\/li>\n\n\n\n<li><strong>Fun\u00e7\u00f5es:<\/strong> As fun\u00e7\u00f5es s\u00e3o subrotinas que podem ser chamadas dentro do c\u00f3digo principal. Dessa forma, elas podem receber par\u00e2metros e retornar valores.<\/li>\n\n\n\n<li><strong>Procedimentos:<\/strong> Podemos chamar os procedimentos dentro do bloco principal, pois s\u00e3o subrotinas. Nesse sentido, eles podem receber par\u00e2metros e executar uma s\u00e9rie de instru\u00e7\u00f5es.<\/li>\n\n\n\n<li><strong>Triggers:<\/strong> Os triggers s\u00e3o subrotinas que s\u00e3o acionados automaticamente em resposta a certas a\u00e7\u00f5es no banco de dados. Como inserir, atualizar ou excluir registros.<\/li>\n<\/ul>\n\n\n\n<p>Assim, a sintaxe e sem\u00e2ntica do PL\/SQL permitem que criarmos procedimentos e fun\u00e7\u00f5es complexos, que podemos reutiliza-los e otimizados, tornando o desenvolvimento de aplica\u00e7\u00f5es mais eficiente e eficaz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Variaveis_e_tipos_de_dados_em_PL_no_SQL\"><\/span>Vari\u00e1veis e tipos de dados em PL no SQL<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>O PL\/SQL suporta uma ampla variedade de tipos de dados, cada um com sua pr\u00f3pria sem\u00e2ntica e uso. Assim, alguns exemplos de tipos de dados suportados incluem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>N\u00fameros inteiros:<\/strong> representam n\u00fameros inteiros sem precis\u00e3o. Exemplo: <code>NUMBER(5)<\/code>, <code>NUMBER(10)<\/code><\/li>\n\n\n\n<li><strong>N\u00fameros decimais:<\/strong> representam n\u00fameros com precis\u00e3o. Exemplo: <code>NUMBER(5,2)<\/code>, <code>NUMBER(10,2)<\/code><\/li>\n\n\n\n<li><strong>Strings:<\/strong> representam sequ\u00eancias de caracteres. Exemplo: <code>VARCHAR2(50)<\/code>, <code>VARCHAR2(100)<\/code><\/li>\n\n\n\n<li><strong>Dates: <\/strong>representam datas e horas. Exemplo: <code>DATE<\/code>, <code>TIMESTAMP<\/code><\/li>\n\n\n\n<li><strong>Booleans:<\/strong> representam valores booleanos (verdadeiro ou falso). Exemplo: <code>BOOLEAN<\/code>, <code>NUMBER(1)<\/code><\/li>\n\n\n\n<li><strong>Tipos de dados de tipo PL\/SQL:<\/strong> representam tipos de dados espec\u00edficos do PL\/SQL. Como cursores, tipos de dados gen\u00e9ricos e tipos de dados de intervalo.<\/li>\n<\/ul>\n\n\n\n<p>Para definir uma vari\u00e1vel em PL\/SQL, precisamos especificar o tipo de dados e uma vari\u00e1vel. A sintaxe para definir uma vari\u00e1vel \u00e9:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE\n   v_nome_varialvel VARCHAR2(tamanho_maximo) := 'valor_inicial';\nBEGIN\n   -- c\u00f3digo PL\/SQL\nEND;<\/code><\/pre>\n\n\n\n<p>Por exemplo, para definir uma vari\u00e1vel chamada &#8220;v_idade&#8221; do tipo INTEGER com um tamanho m\u00e1ximo de 5, voc\u00ea usaria o seguinte c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE\n   v_idade INTEGER(5) := 25;\nBEGIN\n   -- c\u00f3digo PL\/SQL\nEND;<\/code><\/pre>\n\n\n\n<p>Para usar a vari\u00e1vel em uma instru\u00e7\u00e3o SQL ou PL\/SQL, voc\u00ea pode acess\u00e1-la diretamente, como no exemplo abaixo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT v_idade FROM pessoas;<\/code><\/pre>\n\n\n\n<p>ou<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>IF v_idade &gt; 18 THEN\n   dbms_output.put_line('Esta pessoa \u00e9 adulta');\nEND IF;<\/code><\/pre>\n\n\n\n<p>Dessa forma, \u00e9 importante lembrar que os tipos de dados suportados podem variar dependendo do banco de dados que voc\u00ea est\u00e1 usando. Mas a sintaxe para definir e usar vari\u00e1veis \u00e9 geralmente semelhante.<\/p>\n\n\n\n<figure class=\"wp-block-image alignleft size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/image.png\" alt=\"Estruturas de controle de fluxo do  PL\/SQL\" class=\"wp-image-11812\" width=\"740\" height=\"616\" srcset=\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/image.png 740w, https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/image-300x250.png 300w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Estruturas_de_controle_de_fluxo\"><\/span>Estruturas de controle de fluxo<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>O PL\/SQL suporta v\u00e1rias estruturas de controle de fluxo, que permitem controlar a execu\u00e7\u00e3o do c\u00f3digo de acordo com diferentes condi\u00e7\u00f5es. Assim, algumas das principais estruturas de controle de fluxo do PL\/SQL incluem:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>IF-THEN-ELSE: permite executar um bloco de c\u00f3digo se uma condi\u00e7\u00e3o for verdadeira, outro bloco de c\u00f3digo se a condi\u00e7\u00e3o for falsa. A sintaxe \u00e9 a seguir:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\nIF condicao THEN\n   -- c\u00f3digo a ser executado se condi\u00e7\u00e3o for verdadeira\nELSE\n   -- c\u00f3digo a ser executado se condi\u00e7\u00e3o for falsa\nEND IF;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>WHILE: permite executar um bloco de c\u00f3digo repetidamente enquanto uma condi\u00e7\u00e3o for verdadeira. A sintaxe \u00e9 a seguir:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>WHILE condicao LOOP\n   -- c\u00f3digo a ser executado\nEND LOOP;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>FOR: permite executar um bloco de c\u00f3digo para cada valor de uma sequ\u00eancia. A sintaxe \u00e9 a seguir:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>FOR i IN sequencia LOOP\n   -- c\u00f3digo a ser executado para cada valor de sequ\u00eancia\nEND LOOP;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>SWITCH: permite escolher entre v\u00e1rias op\u00e7\u00f5es com base em um valor. A sintaxe \u00e9 a seguir:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>\nDECLARE\n   v_opcao NUMBER;\nBEGIN\n   -- c\u00f3digo para cada op\u00e7\u00e3o\n   CASE v_opcao\n      WHEN 1 THEN\n         -- c\u00f3digo para op\u00e7\u00e3o 1\n      WHEN 2 THEN\n         -- c\u00f3digo para op\u00e7\u00e3o 2\n      WHEN 3 THEN\n         -- c\u00f3digo para op\u00e7\u00e3o 3\n      ELSE\n         -- c\u00f3digo para op\u00e7\u00e3o inv\u00e1lida\n   END CASE;\nEND;<\/code><\/pre>\n\n\n\n<p>Essas s\u00e3o algumas das principais estruturas de controle de fluxo do PL\/SQL. Elas permitem controlar a execu\u00e7\u00e3o do c\u00f3digo de acordo com diferentes condi\u00e7\u00f5es. Portanto, elas s\u00e3o extremamente \u00fateis para criar c\u00f3digo reutiliz\u00e1vel e modular, e podem ser combinadas para criar l\u00f3gicas mais complexas.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Subrotinas_e_funcoes_em_PL_no_SQL\"><\/span>Subrotinas e fun\u00e7\u00f5es em PL no SQL<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Em PL\/SQL, subrotinas e fun\u00e7\u00f5es s\u00e3o elementos importantes de programa\u00e7\u00e3o, que permitem reutilizar c\u00f3digo e simplificar a l\u00f3gica do programa. Assim, a principal diferen\u00e7a entre subrotinas e fun\u00e7\u00f5es \u00e9 que as subrotinas n\u00e3o retornam valores, enquanto as fun\u00e7\u00f5es retornam valores.<\/p>\n\n\n\n<p>Subrotinas s\u00e3o blocos de c\u00f3digo que s\u00e3o chamados dentro de outros blocos de c\u00f3digo. Dessa forma, s\u00e3o usadas para dividir o c\u00f3digo em partes menores e mais gerenci\u00e1veis. E podem ser chamadas v\u00e1rias vezes dentro do mesmo programa. Assim, a sintaxe para criar uma subrotina \u00e9 a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>PROCEDURE nome_da_subrotina IS\nBEGIN\n   -- c\u00f3digo da subrotina\nEND;<\/code><\/pre>\n\n\n\n<p>Fun\u00e7\u00f5es s\u00e3o subrotinas que retornam valores. Assim, s\u00e3o usadas para calcular e retornar valores a partir de dados de entrada. A sintaxe para criar uma fun\u00e7\u00e3o \u00e9 a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FUNCTION nome_da_funcao RETURN tipo_de_retorno IS\nBEGIN\n   -- c\u00f3digo da fun\u00e7\u00e3o\nEND;<\/code><\/pre>\n\n\n\n<p>Para chamar uma subrotina ou fun\u00e7\u00e3o, voc\u00ea usa a palavra-chave &#8220;CALL&#8221; seguida pelo nome da subrotina ou fun\u00e7\u00e3o. A sintaxe para chamar uma subrotina \u00e9 a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CALL nome_da_subrotina;<\/code><\/pre>\n\n\n\n<p>E a sintaxe para chamar uma fun\u00e7\u00e3o \u00e9 a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE\n   v_resultado tipo_de_retorno;\nBEGIN\n   v_resultado := nome_da_funcao(param1, param2, ...);\nEND;<\/code><\/pre>\n\n\n\n<p>Em resumo, subrotinas e fun\u00e7\u00f5es s\u00e3o elementos importantes em PL\/SQL, que permitem reutilizar c\u00f3digo e simplificar a l\u00f3gica do programa. Dessa forma, usamos os subrotinas para dividir o c\u00f3digo em partes menores e mais gerenci\u00e1veis. Isso ocorre, enquanto utilizamos as fun\u00e7\u00f5es para calcular e retornar valores a partir de dados de entrada.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Lidando_com_erros_e_excecoes_no_PL\"><\/span>Lidando com erros e exce\u00e7\u00f5es no PL<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>PL\/SQL suporta a lidar com erros e exce\u00e7\u00f5es usando a estrutura \u201ctry-catch-finally\u201d. Assim, a estrutura \u201ctry-catch-finally\u201d permite que voc\u00ea execute um bloco de c\u00f3digo. Al\u00e9m disso, permite retornar um valor de erro espec\u00edfico, ou executar um bloco de c\u00f3digo independentemente do resultado da tentativa anterior.<\/p>\n\n\n\n<p>A sintaxe b\u00e1sica da estrutura &#8220;try-catch-finally&#8221; \u00e9 a seguir:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>BEGIN\n   -- c\u00f3digo a ser executado\nEXCEPTION\n   -- c\u00f3digo a ser executado se ocorrer uma exce\u00e7\u00e3o\n   -- isso \u00e9 executado apenas se ocorrer uma exce\u00e7\u00e3o\nEND;<\/code><\/pre>\n\n\n\n<p>A estrutura &#8220;try-catch-finally&#8221; \u00e9 composta por tr\u00eas partes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&#8220;try&#8221;: cont\u00e9m o c\u00f3digo que ser\u00e1 executado.<\/li>\n\n\n\n<li>&#8220;catch&#8221;: cont\u00e9m o c\u00f3digo que ser\u00e1 executado se ocorrer uma exce\u00e7\u00e3o.<\/li>\n\n\n\n<li>&#8220;finally&#8221;: cont\u00e9m o c\u00f3digo que ser\u00e1 executado independentemente do resultado da tentativa anterior.<\/li>\n<\/ul>\n\n\n\n<p>A estrutura \u201ctry-catch-finally\u201d \u00e9 \u00fatil para lidar com erros e exce\u00e7\u00f5es. Permitindo que voc\u00ea execute c\u00f3digo independentemente do resultado da tentativa anterior e retornar um valor de erro espec\u00edfico.<\/p>\n\n\n\n<p>Por exemplo, aqui est\u00e1 um exemplo de como usar a estrutura \u201ctry-catch-finally\u201d. Serve para lidar com erros ao tentar acessar um registro em um banco de dados:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DECLARE\n   v_id NUMBER;\nBEGIN\n   -- Tentar acessar um registro\n   SELECT id FROM tabela WHERE id = 1 INTO v_id;\n   IF v_id IS NULL THEN\n      -- Exce\u00e7\u00e3o de registro n\u00e3o encontrado\n      RAISE_APPLICATION_ERROR(-20001, 'Registro n\u00e3o encontrado');\n   END IF;\n   -- C\u00f3digo a ser executado com sucesso\n   dbms_output.put_line(v_id);\nEND;\n<\/code><\/pre>\n\n\n\n<p>Neste exemplo, primeiro a estrutura &#8220;try-catch-finally&#8221; \u00e9 usada para tentar acessar um registro no banco de dados. Dessa forma, se o registro n\u00e3o for encontrado, a exce\u00e7\u00e3o &#8220;Registro n\u00e3o encontrado&#8221; \u00e9 levantada e o c\u00f3digo dentro do bloco &#8220;catch&#8221; \u00e9 executado. Nesse sentido, se o registro for encontrado, o c\u00f3digo dentro do bloco &#8220;finally&#8221; \u00e9 executado.<\/p>\n\n\n\n<p>Em resumo, a estrutura \u201ctry-catch-finally\u201d \u00e9 uma forma eficaz de lidar com erros e exce\u00e7\u00f5es em PL\/SQL. Ela permite que voc\u00ea execute c\u00f3digo independentemente do resultado da tentativa anterior e retornar um valor de erro espec\u00edfico.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Interacao_com_o_banco_de_dados\"><\/span>Intera\u00e7\u00e3o com o banco de dados<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>O PL\/SQL \u00e9 uma linguagem de programa\u00e7\u00e3o orientada a objetos que \u00e9 amplamente utilizada para interagir com bancos de dados. Dessa forma, ele fornece v\u00e1rias maneiras de manipular tabelas, realizar consultas e atualizar dados.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Manipulacao_de_dados\"><\/span>Manipula\u00e7\u00e3o de dados<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Para manipular tabelas, voc\u00ea pode usar a sintaxe SQL padr\u00e3o para inserir, atualizar e excluir registros. Por exemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Adicionar novos dados em uma tabela<\/li>\n<\/ul>\n\n\n\n<p>Dessa forma, Para inserir um novo registro em uma tabela utilize a seguinte sintaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>INSERT INTO tabela (coluna1, coluna2, coluna3) VALUES (valor1, valor2, valor3);\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Atualizar dados em uma tabela <\/li>\n<\/ul>\n\n\n\n<p><a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/update-sql\/\">Para atualizar um registro existente<\/a>, voc\u00ea pode usar a seguinte sintaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE tabela SET coluna1 = valor1 WHERE id = 1;\n<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Adicionar dados existente em uma tabela <\/li>\n<\/ul>\n\n\n\n<p>Portanto, podemos excluir um registro existente usando a sintaxe <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/delete-into-sql\/\">DELETE SQL<\/a>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DELETE FROM tabela WHERE id = 1;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Realizar_consultas\"><\/span>Realizar consultas<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Para realizar consultas, voc\u00ea pode usar a sintaxe SQL padr\u00e3o para selecionar, ordenar e filtrar registros. <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Todos os dados de uma tabela<\/li>\n<\/ul>\n\n\n\n<p>Por exemplo, para selecionar todos os registros de uma tabela, voc\u00ea pode usar a seguinte sintaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM tabela;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ordenar dados em uma tabela<\/li>\n<\/ul>\n\n\n\n<p>Para <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/order-by-sql\/\">ordenar os registros<\/a> por uma coluna espec\u00edfica, voc\u00ea pode usar a seguinte sintaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM tabela ORDER BY coluna1 ASC;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Filtrar dados em uma tabela<\/li>\n<\/ul>\n\n\n\n<p>Para filtrar os registros por uma condi\u00e7\u00e3o espec\u00edfica, voc\u00ea pode usar a seguinte sintaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM tabela WHERE coluna1 = 'valor';<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Atualizar_dados\"><\/span>Atualizar dados<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Para atualizar dados, voc\u00ea pode usar a sintaxe <a href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/update-sql\/\">UPADATE SQL<\/a> padr\u00e3o para atualizar valores de colunas espec\u00edficas. Por exemplo, para atualizar o valor de uma coluna para todos os registros de uma tabela, voc\u00ea pode usar a seguinte sintaxe:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>UPDATE tabela SET coluna1 = 'novo valor';<\/code><\/pre>\n\n\n\n<p>Al\u00e9m disso, o PL\/SQL permite que voc\u00ea crie procedimentos al\u00e9m de consultas e atualiza\u00e7\u00f5es de dados. Isso torna o c\u00f3digo mais eficiente e flex\u00edvel. Dessa forma, o PL\/SQL suporta programa\u00e7\u00e3o orientada a objetos. Isso permite que voc\u00ea crie bibliotecas de fun\u00e7\u00f5es reutiliz\u00e1veis e modos de programa\u00e7\u00e3o mais complexos.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Compreendendo_blocos_e_escopos_em_PL_no_SQL\"><\/span>Compreendendo blocos e escopos em PL no SQL <span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Em PL\/SQL, blocos e escopos s\u00e3o conceitos importantes na organiza\u00e7\u00e3o e gerenciamento de recursos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Blocos\"><\/span>Blocos<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Um bloco \u00e9 uma regi\u00e3o de c\u00f3digo que \u00e9 executada como um \u00fanico conjunto de instru\u00e7\u00f5es. Assim, os blocos s\u00e3o usados para agrupar v\u00e1rias instru\u00e7\u00f5es relacionadas em um \u00fanico lugar. E tamb\u00e9m para definir a especifica\u00e7\u00e3o de um procedimento ou fun\u00e7\u00e3o.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Exemplo:<\/li>\n<\/ul>\n\n\n\n<p>Suponha que tenhamos uma tabela de clientes com as seguintes colunas: ID, nome, email e endere\u00e7o. Queremos criar um procedimento que permita inserir um novo cliente na tabela. Dessa forma, neste procedimento, precisamos obter o ID do cliente mais recente. E tamb\u00e9m, increment\u00e1-lo em 1 para criar um novo ID para o novo cliente.<\/p>\n\n\n\n<p>Aqui est\u00e1 o c\u00f3digo para implementar esse procedimento, utilizando blocos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE OR REPLACE PROCEDURE insert_customer(\n   p_name IN VARCHAR,\n   p_email IN VARCHAR,\n   p_address IN VARCHAR\n)\nAS\nBEGIN\n   -- Bloco de declara\u00e7\u00e3o de vari\u00e1veis\n   DECLARE\n      l_id customer_id_type;\n      l_new_id customer_id_type;\n   BEGIN\n      -- Bloco principal\n      SELECT MAX(id) INTO l_id\n      FROM customers;\n      l_new_id := l_id + 1;\n\n      -- Inserir o novo cliente na tabela\n      INSERT INTO customers (name, email, address, id)\n      VALUES (p_name, p_email, p_address, l_new_id);\n   END;\nEND;<\/code><\/pre>\n\n\n\n<p>Neste exemplo, utilizamos dois blocos: o bloco de declara\u00e7\u00e3o de vari\u00e1veis e o bloco principal. Dessa forma, utilizamos o <em>bloco de declara\u00e7\u00e3o<\/em> de vari\u00e1veis para declarar as vari\u00e1veis necess\u00e1rias para o procedimento. Enquanto isso, usamos o <em>bloco principal<\/em> para executar as instru\u00e7\u00f5es do procedimento.<\/p>\n\n\n\n<p>Dentro do bloco principal, usamos um SELECT para obter o ID do cliente mais recente. E tamb\u00e9m um INSERT para inserir o novo cliente na tabela. Al\u00e9m disso, criamos uma vari\u00e1vel l_new_id para armazenar o novo ID gerado para o cliente inserido.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Escopo\"><\/span>Escopo<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>J\u00e1 o escopo \u00e9 a regi\u00e3o de c\u00f3digo em que uma vari\u00e1vel \u00e9 ativa e acessada. O escopo \u00e9 importante para garantir que as vari\u00e1veis estejam acess\u00edveis apenas em certas partes do c\u00f3digo. E tamb\u00e9m para evitar conflitos de nomea\u00e7\u00e3o de vari\u00e1veis.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Exemplo: <\/li>\n<\/ul>\n\n\n\n<p>Suponha que tenhamos uma tabela de vendas com as seguintes colunas: ID, produto, pre\u00e7o e data. Queremos criar um procedimento que permita calcular o valor total de vendas para um determinado produto em uma data espec\u00edfica. Neste procedimento, precisamos criar uma vari\u00e1vel para armazenar o valor total de vendas e restringir o acesso a essa vari\u00e1vel apenas dentro do bloco principal.<\/p>\n\n\n\n<p>Aqui est\u00e1 o c\u00f3digo para implementar esse procedimento, utilizando escopo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CREATE OR REPLACE PROCEDURE total_sales_by_product_on_date(\n   p_product_id IN product_id_type,\n   p_date IN date_type,\n   p_total_sales OUT sales_total_type\n)\nAS\nBEGIN\n   -- Bloco de declara\u00e7\u00e3o de vari\u00e1veis\n   DECLARE\n      l_total_sales_on_date sales_total_type;\n   BEGIN\n      -- Bloco principal\n      SELECT SUM(price) INTO l_total_sales_on_date\n      FROM sales_history\n      WHERE product_id = p_product_id AND date = p_date;\n      \n      -- Restringir o acesso \u00e0 vari\u00e1vel l_total_sales_on_date apenas dentro do bloco principal\n      p_total_sales := l_total_sales_on_date;\n   END;\nEND;<\/code><\/pre>\n\n\n\n<p>Neste exemplo, utilizamos um bloco de declara\u00e7\u00e3o de vari\u00e1veis e um bloco principal. Assim, o bloco de declara\u00e7\u00e3o de vari\u00e1veis \u00e9 usado para declarar a vari\u00e1vel l_total_sales_on_date, que armazena o valor total de vendas para o produto especificado em data espec\u00edfica.<\/p>\n\n\n\n<p><strong>A combina\u00e7\u00e3o de blocos e escopos permite que o c\u00f3digo seja organizado de maneira clara e eficiente.<\/strong> Cada bloco pode ter seu pr\u00f3prio escopo, o que permite que as vari\u00e1veis esteja declaradas e usadas apenas dentro do bloco. Dessa forma, isso aumenta a legibilidade e a manutenibilidade do c\u00f3digo, tornando-o mais f\u00e1cil de entender e de ser atualizado.<\/p>\n\n\n\n<p>Al\u00e9m disso, a utiliza\u00e7\u00e3o de blocos e escopos pode ajudar a evitar erros e a garantir que as vari\u00e1veis estejam usadas corretamente. Por exemplo, se uma vari\u00e1vel for declarada com um escopo muito amplo, ela pode ser acessada em partes do c\u00f3digo que n\u00e3o deveriam ter acesso a ela, o que pode levar a erros e bugs.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A linguagem SQL (Structured Query Language) \u00e9 amplamente utilizada no gerenciamento e manipula\u00e7\u00e3o de dados em sistemas de banco de dados. No entanto, em situa\u00e7\u00f5es onde \u00e9 necess\u00e1ria a realiza\u00e7\u00e3o de tarefas mais complexas. Como, por exemplo, a manipula\u00e7\u00e3o de dados em larga escala, gera\u00e7\u00e3o de relat\u00f3rios personalizados. Ou tamb\u00e9m a integra\u00e7\u00e3o com aplica\u00e7\u00f5es externas, [&hellip;]<\/p>\n","protected":false},"author":33,"featured_media":11811,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_helpful_status":1,"_lmt_disableupdate":"","_lmt_disable":"","_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[30],"tags":[],"class_list":["post-11796","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mysql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PL SQL: Um guia completo | Homehost<\/title>\n<meta name=\"description\" content=\"Aprenda SQL com a linguagem procedural (PL) para gerenciamento de dados eficiente e escal\u00e1vel com as melhores pr\u00e1ticas de desempenho.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PL SQL: Um guia completo | Homehost\" \/>\n<meta property=\"og:description\" content=\"Aprenda SQL com a linguagem procedural (PL) para gerenciamento de dados eficiente e escal\u00e1vel com as melhores pr\u00e1ticas de desempenho.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/\" \/>\n<meta property=\"og:site_name\" content=\"Homehost\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Homehost\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-07T16:55:29+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-02T14:57:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1077\" \/>\n\t<meta property=\"og:image:height\" content=\"645\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Sch\u00eania T\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@Homehost\" \/>\n<meta name=\"twitter:site\" content=\"@Homehost\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sch\u00eania T\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/\",\"url\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/\",\"name\":\"PL SQL: Um guia completo | Homehost\",\"isPartOf\":{\"@id\":\"https:\/\/www.homehost.com.br\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png\",\"datePublished\":\"2023-11-07T16:55:29+00:00\",\"dateModified\":\"2023-12-02T14:57:55+00:00\",\"author\":{\"@id\":\"https:\/\/www.homehost.com.br\/blog\/#\/schema\/person\/880e31fe4f09cfa53d60a46d9c2010aa\"},\"description\":\"Aprenda SQL com a linguagem procedural (PL) para gerenciamento de dados eficiente e escal\u00e1vel com as melhores pr\u00e1ticas de desempenho.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#primaryimage\",\"url\":\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png\",\"contentUrl\":\"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png\",\"width\":1077,\"height\":645,\"caption\":\"pl sql\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/www.homehost.com.br\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PL SQL: Um guia completo\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.homehost.com.br\/blog\/#website\",\"url\":\"https:\/\/www.homehost.com.br\/blog\/\",\"name\":\"Homehost\",\"description\":\"Hospedagem De Sites\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.homehost.com.br\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.homehost.com.br\/blog\/#\/schema\/person\/880e31fe4f09cfa53d60a46d9c2010aa\",\"name\":\"Sch\u00eania T\",\"description\":\"Cientista de dados, apaixonada por ferramentas de tecnologia e games. Graduanda em Estat\u00edstica pela UFPB. Seu hobby \u00e9 maratonar s\u00e9ries, curtir uma boa m\u00fasica trabalhando ou cozinhando, ir ao cinema e aprender coisas novas! Contato: schenia.blog@homehost.com.br\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PL SQL: Um guia completo | Homehost","description":"Aprenda SQL com a linguagem procedural (PL) para gerenciamento de dados eficiente e escal\u00e1vel com as melhores pr\u00e1ticas de desempenho.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/","og_locale":"pt_BR","og_type":"article","og_title":"PL SQL: Um guia completo | Homehost","og_description":"Aprenda SQL com a linguagem procedural (PL) para gerenciamento de dados eficiente e escal\u00e1vel com as melhores pr\u00e1ticas de desempenho.","og_url":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/","og_site_name":"Homehost","article_publisher":"https:\/\/www.facebook.com\/Homehost\/","article_published_time":"2023-11-07T16:55:29+00:00","article_modified_time":"2023-12-02T14:57:55+00:00","og_image":[{"width":1077,"height":645,"url":"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png","type":"image\/png"}],"author":"Sch\u00eania T","twitter_card":"summary_large_image","twitter_creator":"@Homehost","twitter_site":"@Homehost","twitter_misc":{"Escrito por":"Sch\u00eania T","Est. tempo de leitura":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/","url":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/","name":"PL SQL: Um guia completo | Homehost","isPartOf":{"@id":"https:\/\/www.homehost.com.br\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#primaryimage"},"image":{"@id":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png","datePublished":"2023-11-07T16:55:29+00:00","dateModified":"2023-12-02T14:57:55+00:00","author":{"@id":"https:\/\/www.homehost.com.br\/blog\/#\/schema\/person\/880e31fe4f09cfa53d60a46d9c2010aa"},"description":"Aprenda SQL com a linguagem procedural (PL) para gerenciamento de dados eficiente e escal\u00e1vel com as melhores pr\u00e1ticas de desempenho.","breadcrumb":{"@id":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#primaryimage","url":"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png","contentUrl":"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png","width":1077,"height":645,"caption":"pl sql"},{"@type":"BreadcrumbList","@id":"https:\/\/www.homehost.com.br\/blog\/tutoriais\/mysql\/pl-sql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/www.homehost.com.br\/blog\/"},{"@type":"ListItem","position":2,"name":"PL SQL: Um guia completo"}]},{"@type":"WebSite","@id":"https:\/\/www.homehost.com.br\/blog\/#website","url":"https:\/\/www.homehost.com.br\/blog\/","name":"Homehost","description":"Hospedagem De Sites","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.homehost.com.br\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/www.homehost.com.br\/blog\/#\/schema\/person\/880e31fe4f09cfa53d60a46d9c2010aa","name":"Sch\u00eania T","description":"Cientista de dados, apaixonada por ferramentas de tecnologia e games. Graduanda em Estat\u00edstica pela UFPB. Seu hobby \u00e9 maratonar s\u00e9ries, curtir uma boa m\u00fasica trabalhando ou cozinhando, ir ao cinema e aprender coisas novas! Contato: schenia.blog@homehost.com.br"}]}},"modified_by":"Sch\u00eania T","jetpack_featured_media_url":"https:\/\/www.homehost.com.br\/blog\/wp-content\/uploads\/2023\/11\/PL-SQL.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/posts\/11796","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/users\/33"}],"replies":[{"embeddable":true,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/comments?post=11796"}],"version-history":[{"count":17,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/posts\/11796\/revisions"}],"predecessor-version":[{"id":12478,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/posts\/11796\/revisions\/12478"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/media\/11811"}],"wp:attachment":[{"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/media?parent=11796"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/categories?post=11796"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.homehost.com.br\/blog\/wp-json\/wp\/v2\/tags?post=11796"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}