- Vanessa Moura
INTRODUÇÃO AO PL/SQL
A linguagem PL/SQL é uma extensão da linguagem SQL com recursos de design de linguagens de programação. As instruções de consulta e a manipulação de dados em SQL estão incluídas nas unidades procedurais de código.

PL/SQL significa “Procedural Language extensions to the Structured Query Language" que em português significa "Extensões da Linguagem Procedural para a Linguagem de Consulta Estruturada”. SQL é uma linguagem popular para consulta e atualização de dados nos sistemas de gerenciamento de banco de dados relacional (RDBMS). > PL/SQL adiciona muitas construções procedurais à linguagem SQL para superar algumas limitações do SQL. Além disso, a PL/SQL fornece uma solução de linguagem de programação mais abrangente para a construção de aplicativos de missão crítica em bancos de dados Oracle.
> PL/SQL é uma linguagem altamente estruturada e legível. Suas construções expressam a intenção do código claramente. Além disso, PL/SQL é uma linguagem simples de aprender.
> PL/SQL é uma linguagem padrão e portátil para desenvolvimento de banco de dados Oracle. Se você desenvolver um programa que é executado em um banco de dados Oracle, poderá movê-lo rapidamente para outro banco de dados Oracle compatível sem nenhuma alteração.
> PL/SQL é uma linguagem embutida. e só pode ser executado em um banco de dados Oracle. Ele não foi projetado para ser usado como uma linguagem autônoma como Java, C # e C ++. Em outras palavras, você não pode desenvolver um programa PL/SQL que seja executado em um sistema que não tenha um banco de dados Oracle.
> PL/SQL é uma linguagem de banco de dados de alto desempenho e altamente integrada. Além de PL/SQL, você pode usar outras linguagens de programação, como Java, C # e C ++. No entanto, é mais fácil escrever código eficiente em PL/SQL do que em outras linguagens de programação quando se trata de interagir com o banco de dados Oracle. Em particular, você pode usar construções específicas de PL/SQL como a instrução FORALL que ajuda a melhorar o desempenho do banco de dados.

O mecanismo PL/SQL é responsável por compilar o código PL/SQL em código de bytes e executar o código executável. O mecanismo PL/SQL só pode ser instalado em um servidor de banco de dados Oracle ou em uma ferramenta de desenvolvimento de aplicativos como por exemplo, o Oracle Forms.
Depois de enviar um bloco PL/SQL ao servidor de banco de dados Oracle, o mecanismo PL/SQL colabora com o mecanismo SQL para compilar e executar o código. O mecanismo PL/SQL executa os elementos procedurais enquanto o mecanismo SQL processa as instruções SQL.
Bloco anônimo PL/SQL

PL/SQL é uma linguagem estruturada em blocos. Um bloco PL/SQL consiste em três seções:
- declaração
- executável
- tratamento de exceções.
Em um bloco, a seção executável é obrigatória, enquanto as seções de declaração e tratamento de exceções são opcionais.
Um bloco PL/SQL tem um nome. Functions ou Procedures são exemplos de um bloco nomeado. Um bloco nomeado é armazenado no servidor de banco de dados Oracle e pode ser reutilizado posteriormente.
Um bloco sem nome é um bloco anônimo e ele não é alocado no servidor de banco de dados Oracle, portanto, é apenas para uso único. No entanto, os blocos anônimos PL/SQL podem ser muito úteis para fins de teste.
A imagem a seguir ilustra a estrutura de um bloco PL/SQL:

Seção de declaração
Um bloco PL/SQL tem uma seção de declaração onde você declara variáveis, aloca memória para cursores e define tipos de dados.
Seção executável
Uma seção executável começa com a palavra-chave BEGIN e termina com a palavra-chave END. A seção executável deve ter pelo menos uma instrução executável, mesmo se for a instrução NULL que não faz nada.
Seção de tratamento de exceções
Um bloco PL/SQL possui uma seção de tratamento de exceções que começa com a palavra-chave EXCEPTION. A seção de tratamento de exceções é onde você captura e trata as exceções levantadas pelo código na seção de execução.
Observe que o próprio bloco é uma instrução executável, portanto, você pode aninhar um bloco dentro de outros blocos.
Exemplos
DECLARE
v_message VARCHAR2(255) := 'Hello World!';
BEGIN
DBMS_OUTPUT.PUT_LINE(v_message);
END;
Isso te traz o resultado:
Hello World!
O próximo exemplo de bloco anônimo adiciona uma seção de tratamento de exceção que captura a exceção ZERO_DIVIDE gerada na seção executável e exibe uma mensagem de erro.
DECLARE
v_result NUMBER;
BEGIN
v_result := 1 / 0;
EXCEPTION
WHEN ZERO_DIVIDE THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
A mensagem de erro é:
ORA-01476: divisor is equal to zero
Melhoria de desempenho
Problemas com aplicações de baixa performance podem estar freqüentemente relacionados a consultas SQL mal estruturadas ou a um design de banco de dados ineficiente.
A metodologia e tuning da Oracle, tradicionalmente é focada no design da aplicação e no tuning de consultas SQL antes mesmo de analisar quaisquer tipos de problemas relacionados à configuração do banco de dados.
A otimização de uma consulta constitui em determinar a melhor estratégia para executá-la no banco de dados. O otimizador do Oracle escolhe, por exemplo, se usará um índice ou não para uma consulta especifica e que técnicas de JOIN usar na junção de múltiplas tabelas.
Estas decisões têm um impacto muito grande na performance de um SQL e por isso a otimização de uma consulta é essencial para qualquer aplicação e de extrema importância para a performance de um banco de dados relacional. E faz parte da lista de tasks e habilidades de um DBA.
É muito importante que os desenvolvedores conheçam o otimizador do Oracle como também os conceitos relativos à tuning. Tal conhecimento irá ajudar a escrever consultas muito mais eficientes e rápidas.
Caracteres Especiais
Assim como palavras reservadas, a linguagem também tem carácteres reservadas e especiais.
Símbolo Caracteres
; Ponto e vírgula: fim de comando
% Percentagem: indicador de atributo
: Dois pontos: indicador de variável host
** Asterisco duplo: operador exponencial
<> e != Operador diferente
|| Operador de concatenação
<< e >> Delimitador de rótulo (label)
:= Operador de atribuição
=> Operador de associação para notação posicional
-- Indicador de comentário
/* e */ Início e final de um bloco de comentário
Tipos de Dados
Tanto variáveis, quanto constantes devem ter um tipo de dado válido que possa especificar o seu formato de armazenagem, restrições e qual o intervalo de valores é permitido. Abaixo algumas categorias de tipos de dados:

Definição dos tipos de dados escalares
A linguagem PL/SQL também provê subtipos de dados, como é o caso do tipo de dados NUMBER que possui um subtipo de dado do tipo INTEGER. Normalmente podemos utilizar subtipos de dados quando estamos trabalhando com outras linguagens de programação, como é o caso do Java, por exemplo.


Abaixo um trecho de código, apresentando alguns dos tipos de dados na lista acima.
SET serveroutput ON;
DECLARE
IdFuncionario BINARY_INTEGER;
Salario NUMBER(10, 2);
Acrescimo FLOAT;
BEGIN
IdFuncionario := 25;
Salario := 4500;
Acrescimo := 0.25;
dbms_output.put_line(‘O novo salário do funcionário: ’
|| nSalario*(1 + Acrescimo));
END;
Definição dos tipos de dados Caracteres

Exemplo utilizando tipos acima:
SET serveroutput ON;
DECLARE
Idade NUMBER;
Nome VARCHAR2(100);
Estado CHAR(2);
BEGIN
Idade := 25;
Nome := ‘Vanessa Moura’;
Estado := ‘SP’;
dbms_output.put_line(‘Uma das colaboradoras deste site é: ’
|| Nome || ‘ e é natural do estado de ’ || Estado);
END;
Já os tipos de dados boolean armazenam apenas valores lógicos que são utilizados em operações lógicas. Estes valores lógicos podem ser de três tipos em PL/SQL, sendo estes True, False ou mesmo, o valor Null.
No entanto, a SQL não tem tipos de dados equivalentes ao boolean, portanto, os valores booleanos não podem ser usados em determinadas situações que são:
Instruções SQL.
Funções SQL embutidas, como por exemplo, utilizando o to_char().
Funções PL/SQL sendo chamadas por instruções SQL.
SET serveroutput ON;
DECLARE
IdFuncionario BINARY_INTEGER;
Salario NUMBER(10, 2);
TipoReal BOOLEAN;
BEGIN
idfuncionario := 25;
Salario := 1500;
TipoReal := TRUE;
IF TipoReal THEN
dbms_output.put_line('O salário do funcionário '|| Idfuncionario || ' é em Reais R');
Definição dos tipos de dados Datetime
Existem duas classes de tipos de dados relacionados a data e hora no PL/SQL
DATETIME
INTERVAL
Os tipos de dados DATETIME são:
DATE
TIMESTAMP
TIMESTAMP WITH TIME ZONE
TIMESTAMP WITH LOCAL TIME ZONE
Os tipos de dados INTERVAL são:
INTERVAL YEAR TO MONTH
INTERVAL DAY TO SECOND

Abaixo um exemplo usando alguns destes data typesÇ
SET serveroutput ON;
DECLARE
IdFuncionario binary_integer;
Salario NUMBER(10, 2);
TipoReal BOOLEAN;
Admissao DATE;
BEGIN
idfuncionario := 25;
Salario := 1500;
TipoReal := TRUE;
Admissao := '19/12/2013';
IF TipoReal THEN
dbms_output.put_line('O salário do funcionário '|| funcionario || ' é em Reais (...)
Tipos de dados como LOB (Large Objects) são tipos de dados que fogem dos padrões explicados anteriormente, sendo estes postos em uma nova categoria de informações, assim como text, imagens gráficas, vídeos e arquivos de áudio. O tipo de dados LOB permite de forma eficiente o acesso a estas informações de forma aleatória, o que não ocorre com os outros tipos de dados já explanados.

Subtipos definidos pelo usuário
Um subtipo é um tipo de dados que é um subconjunto de outro tipo de dados. Um subtipo tem as mesmas operações válidas que seu tipo base. Um tipo de dados e seus subtipos compreendem uma família de tipos de dados.
O PL/SQL predefine muitos tipos e subtipos no pacote STANDARD e permite que você defina seus próprios subtipos.
DECLARE
SUBTYPE nome_complero IS VARCHAR2(60);
SUBTYPE mensagem IS VARCHAR2(100);
msg mensagem;
saudacao nome_completo;
BEGIN
saudacao := ‘Vanessa Moura’;
msg := ‘Seja bem vindo!’;
dbms_output.put_line(saudacao || ‘ ‘ || msg);
END;
/
Valores NULL no PL/SQL
Em PL/SQL, valores null são como valores perdidos ou dados desconhecidos, que não são valores inteiros ou de nenhum outro tipo de dado especifico. Entendam que quando um valor é null, não estamos dizendo que isso implique que ele é um valor vazio ou 0. Null quer dizer realmente que não existe valor definido para determinado campo. Mais para frente iremos aprender como usar as condições IS NULL e IS NOT NULL para testes.
DECLARANDO VARIÁVEIS
As variáveis PL/SQL devem ser declaradas na seção de declaração ou em um package como uma variável global. Quando você declara uma variável, o PL/SQL aloca memória para o valor da variável e o local de armazenamento é identificado pelo nome dessa variável.
A sintaxe para declarar uma variável é:
Identificador [CONSTANT] tipo de dados [NOT NULL]
[:= | DEFAULT expr] ;
Exemplos:
DECLARE
v_hiredate DATE;
v_deptno NUMBER(2) NOT NULL := 10;
v_location VARCHAR( ) := ‘Atlanta’;
c_com CONSTANT NUMBER := 1400;
Declarando variáveis escalares
Exemplos:
v_job VARCHAR2(9);
v_coult BINARY_INTEGER := 0;
v_total_sal NUMBER(9,2) := 0;
v_orderdate DATE := SYSDATE + 7;
c_tax_rate CONSTANT NUMBER(2,3) := 8.25;
v_valid BOOLEAN NOT NULL := TRUE;
Ufa! Cobrimos bastante coisa neste post, né? Mas isto foi apenas uma visão geral! Teremos posts dedicados a tudo o que foi abordado neste post, assim vamos dissecar cada comando e tipo de dado juntos!
Espero que você esteja gostando e claro, se está sendo útil, não se esqueça de compartilhar em suas redes sociais para que mais pessoas possam aprender também!
Para ver o próximo post, clique aqui.