Banco de Dados - Oracle

Definições básicas - PL/SQL

Nesta coluna vou descrever uma visão geral sobre definição, estrutura, blocos, conceitos e secção em pl/sql.

por Márcio Novelli



Nesta coluna vou descrever uma visão geral sobre definição, estrutura, blocos, conceitos e secção em pl/sql.

Definições básicas - PL/SQL

  • Linguagem proprietária da Oracle, criada para conferir possibilidades procedimentais aos programas de tratamento de dados

  • Dois tipos de instruções:
    • Construtores programáticos
    • Comandos DML (SQL)

  • Possui todas as capacidades programáticas das linguagens de terceira geração, com a flexibilidade, simplicidade e controlo avançado de erros, próprios de uma linguagem de quarta geração

Estrutura base

  • Secções do PL/SQL:
    • Secção declarativa
    • Secção de execução
    • Secção de tratamento de excepções

  • Sintaxe da única secção obrigatória (execução):
    <<nome_do_bloco>>
    DECLARE
    <declaração de variáveis>
    BEGIN
    <comandos procedimentais>
    <comandos SQL>
    EXCEPTION
    <tratamento de excepções>
    END;
    
    Estrutura base
    
    Begin
    Null;
    End;
    /
    Execute null;
    Exec null;
    

  • Blocos PL/SQL aninhados:
    Begin
    Null;
    begin
    null;
    end;
    Null;
    End;
    /
    

  • Comentários:

    - De linha (--)
    - Multi-linha (/* */)

    set verify off 
    set serveroutput on --para mostrar mensagens no ecran (TELA)
    begin
    
    /*
    package que vem com o Oracle e que permite
    escrever mensagens.
    É útil para fazer debug
    */
    
    dbms_output.put_line("Olá a todos!");
    end;
    /
    set verify on
    set serveroutput off
    
Secção declarativa

  • Tipos de dados escalares

  • Declaração de variáveis e constantes:
    set verify off
    set serveroutput on
    def pl="dbms_output.put_line"
    <<teste>>
    declare
    x number(7,2);
    cidade varchar2(50) := "São Paulo";
    texto varchar2(30) default "Márcio Novelli=";
    pi constant number(3,2) := 3.14;
    data date default sysdate;
    begin
    x:=3*pi;
    &pl(texto||nome||" e o 3*PI="||to_char(x));
    &pl("A data é "||to_char(data,"dd/mm/yyyy"));
    declare
    x number(7,2);
    begin
    teste.x:=2;
    end;
    &pl(texto||nome||" e o 2*PI="||to_char(x));
    end;
    /
    set verify on
    set serveroutput off
    

  • Atributo de declaração por referência (%TYPE)
    • Baseado numa variável
      Declare
      preco number;
      pvp preco%TYPE;
      begin
      ...
      

    • Baseado numa coluna de uma tabela
      Declare
      nome tabela.livro%TYPE;
      begin
      ...
      

  • Tipos de dados não escalares
    • Tipos de dados compostos
      • RECORD
      • TABLE (com os métodos: EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, EXTEND, TRIM e DELETE)
    • Outros tipos de dados não escalares (REF e LOB)

Secção declarativa

- Tipos de dados compostos:

declare
type morada is record
(
rua varchar2(50) not null,
numero tabela_var_morada.num%TYPE, 
andar varchar2(12),
localidade varchar2(80) default "SÃO PAULO",
cod_postal varchar2(13)
);
...
declare
type aniversarios is table of date;
declare
type var_morada_tab is table of var_morada;
declare
type var_morada_tab is table of
tabela_var_morada%ROWTYPE;

Nota: só existem duas colunas no tipo table que são o seu o seu índice de acesso (do tipo binary_integer) e o seu tipo de dados que pode ser escalar ou pode ser composto.

- Tipos de dados compostos (record):

set verify off
set serveroutput on
declare
type morada is record
(
rua varchar2(50),
numero number(5),
andar varchar2(12),
localidade varchar2(80) default "SÃO PAULO",
cod_postal varchar2(13)
);

var_morada morada;
begin
var_morada.rua:="WWW.FREECODE.COM.BR - Coluna ORACLE";
dbms_output.put_line(var_morada.rua);
dbms_output.put_line(var_morada.localidade);
end;
/
set verify on
set serveroutput off

- Tipos de dados compostos (table):

. TABLE (com os métodos: EXISTS, COUNT, FIRST, LAST, PRIOR, NEXT, EXTEND, TRIM e DELETE)

set verify off
set serveroutput on
declare
type aniversarios is table of date index by
binary_integer;
var_aniversario;
i binary_integer:=1;
begin
var_aniversario(1):=to_date("16/05/2004","dd/mm/yyyy");
var_aniversario (2):=to_date("17/06/2004","dd/mm/yyyy");
var_aniversario (3):=to_date("18/07/2004","dd/mm/yyyy");
var_aniversario (4):=to_date("19/08/2004","dd/mm/yyyy");
var_aniversario.delete(2); --apaga o elemento
da posição 2
for i in 1.. var_aniversario.last loop
if var_aniversario.exists(i) then
dbms_output.put_line("Na posição "||to_char(i)||" está o valor 
"||to_char(var_aniversario(i),"dd/mm/yyyy"));
end if;
end loop;
dbms_output.put_line("Nº de elementos ="||to_char(var_aniversario.count));
dbms_output.put_line("Primeiro ="||to_char(var_aniversario.first));
dbms_output.put_line("Último="||to_char(var_aniversario.last ));
dbms_output.put_line("Anterior a 3 -"||to_char(var_aniversario.prior(3)));
dbms_output.put_line("Seguinte 1 -"||to_char(var_aniversario.next(1)));
end;
/
set verify on
set serveroutput off

Por hoje é só pessoal, darei continuidade no próximo artigo.

Um forte abraços a todos , e até a próxima coluna !!!!!!!

Márcio Novelli

Márcio Novelli - Analista de Sistemas, Consultor Oracle 8i e 9i e chefe dos projetos do banco de dados Oracle pela empresa Walnut Telecomunicação e Informática LTDA - www.walnut.com.br. Bacharel em Ciência da Computação pela Universidade de Marília (UNIMAR). Especialização em Oracle 8i na Faculdade de Tecnologia IBTA (Instituto Brasileiro de Tecnologia Avançada - S.P). Certificado Introduction to Oracle9i: SQL Oracle9i Database Administration: Fundamentals I
Escreve artigos também para os sites da revista SQL Magazine (www.sqlmagazine.com.br), Portal Fire Masters (http://www.portalfiremasters.com.br/) e Freecode (www.freecode.com.br).