Você está na página 1de 8

Conceito A PL/SQL uma linguagem procedural do ORACLE, extenso ao SQL.

. Este captulo da apostila tem o objetivo de dar uma viso geral da linguagem e suas potencialidades. Atravs de exemplos simples veremos a aplicabilidade da linguagem. No fim do captulo esto transcritos os principais comandos e sua sintaxe. Com a PL/SQL pode-se usar comandos SQL para manipular os dados da base ORACLE e fluxos de controle para processar os dados. Pode-se declarar constantes e variveis, definir subprogramas (procedures ou funes) e controlar erros de execuo. Estrutura A PL/SQL uma estrutura em blocos, ou seja, as unidades bsicas (procedures, funes, etc.) podem conter qualquer nmero de sub-blocos. Um bloco permite que se faam declaraes associadas ao bloco e que deixam de existir quando o bloco termina. Cada bloco composto basicamente de 3 partes: DECLARE <declaraes> ______________ opcional BEGIN <lgica> ___________________ obrigatria EXCEPTION <erros> _____________ opcional END; A ordem das partes lgica, ou seja, primeiro deve-se efetuar as declaraes, para depois utilizar (na lgica) as variveis criadas. As excees ocorridas durante a execuo podem ser resolvidas na parte referente a erros. Exemplo: DECLARE w_salario NUMBER(5); BEGIN SELECT vl_sal INTO w_salario FROM func where cd_mat = 150 FOR UPDATE OF; IF w_salario < 800 THEN UPDATE func SET salario = w_salario * 1.3 WHERE cd_mat = 150; ELSE UPDATE func

SET vl_sal = w_salario * 1.15 WHERE cd_mat = 150; END IF; COMMIT; END; PALAVRAS RESERVADAS Palavras que possuam um significado especial para a SQL. Ex.: BEGIN END

LITERAIS uma representao explcita de um nmero, caracter, string ou boleano, no representado por um identificador. Ex.: Numricos Caracteres Strings Boleanos 030 Z 10-NOV-91 TRUE 6 % hello,world FALSE -14 7 +32767 . 12.0 . .5 z 2E5 ( -9.5E-3

COMENTRIOS: O incio do comentrio marcado por dois hfens em qualquer ponto da linha. O restante da linha considerado comentrio. Para comentrios que ultrapassem uma linha, pode-se usar a notao /* (inicio) e */(fim). Ex.: SELECT vl_sal INTO w_salario obtm o salrio atual /* calculo da bonificao */ IF w_salario > 50000

DECLARAES TIPOS DE VARIAVEIS Cada constante ou varivel possui um tipo que especifica o formato de armazenamento, restries e intervalo de valores. O dado pode ser simples ou composto. SUBTIPOS So associados aos tipos com uma restrio, que indiquem um subconjunto de valores. VARIVEIS SIMPLES BINARY INTEGER numrico, para armazenamento de valores inteiros de -2**31 a (2**31) - 1 sintaxe: subtipos: binary_integer natural positive -de 0 a (2**31) -1 -de 1 a (2**31) -1

NUMBER numrico, para armazenamento de valores em ponto flutuante com preciso de at 38 dgitos. sintaxe: subtipos: number [ (<preciso>,<escala>) ] dec decimal double precision float integer int numeric real smallint idem a number idem a number idem a number idem a number idem a number idem a number idem a number idem a number idem a number

CHAR alfanumrico de tamanho fixo com at 32767 caracteres. sintaxe: subtipo: char [ (<comprimento>) ] string idem a char

LONG alfanumrico de tamanho varivel com comprimento de at 32760. sintaxe: long

VARCHAR2 alfanumrico de tamanho varivel com comprimento de at 32767. sintaxe: subtipo: varchar2 [(<comprimento>) ] varchar idem a varchar2

RAW para armazenamento de dados binrios (tam.mx. at 32767). sintaxe: raw (<comprimento>)

LONG RAW para armazenamento de dados binrios at o tamanho de 32760. sintaxe: long raw

BOOLEAN valores boleanos (true, false, ou null). DATE armazenamento de datas. sintaxe: date

ROWID valores de rowiddo Oracle (em hexadecimal). sintaxe: formato: onde: BBBBBBBBB - bloco dentro do arquivo (database file) RRRR - row dentro do bloco ( primeira row 0) FFFF - nmero do arquivo (database file) ATRIBUTOS ESPECIAIS As variveis PL/SQL e constantes possuem atributos, que so propriedades que permitem a referncia ao tipo e estrutura do objeto sem necessidade de repetio de sua definio. As tabelas e colunas do database possuem atributos similares, que podemos usar para facilitar a manuteno. rowid BBBBBBBBB.RRRR.FFFF

%TYPE este atributo copia os atributos de uma varivel, constante ou coluna do database. particularmente usado quando declaramos variveis que pertenam as colunas do database. sintaxe: Ex.: DECLARE W_CODIGO NUMBER(3) W_CODIGO2 W_CODIGO%TYPE; - varivel de tipo idntico a cdigo W_COD_DEP DEPTO.CD_DEPTO %TYPE /* varivel de tipo idntico varivel da base de dados cd_depto */ IF THEN ELSE A seqncia de comandos s ser executada se a condio for verdadeira. sintaxe: IF <condio> THEN <seqncia de comandos> END IF; ou IF <condio> THEN <seqncia de comandos> ELSE <seqncia de comandos> END IF; ou IF <condio> THEN <seqncia de comandos> ELSIF <condio> THEN <seqncia de comandos> ELSE <seqncia de comandos END IF; FOR LOOP <varivel>/<constante>/<coluna>%TYPE

A seqncia de comandos executada um nmero fixo de vezes estabelecido no comando. No incio do comando a quantidade de vezes que o mesmo ser executado j conhecida, uma vez que no se pode alterar o valor de <contador> durante a iterao.
sintaxe: [<< <label> >>] FOR <contador> IN [REVERSE] <inferior>..<superior> LOOP <seqncia da comandos> END LOOP; Ex.: FOR i IN 1..3 LOOP <seqncias de comandos> END LOOP; s Vezes := i +1 FOR i IN incio..fim LOOP <seqncia de comandos> END LOOP; Fim := 1; FOR i IN 3..fim LOOP <seqncia de comandos> END LOOP; existe no escopo do comando FOR <seqncia de comandos> <executada n vezes dependendo do valor de incio e fim <seqncia de comados> no ser executada <seqncia de comandos> executa 3 vezes o comando vezes invlido, pois i

SUBPROGRAMAS Subprogramas so blocos PL/SQL com nome, que podem receber parmetros e ser invocados. A PL/SQL possui dois tipos de subprogramas chamados procedures e funes. Geralmente usa-se uma procedure para executar uma ao e uma funo para calcular um valor. Da mesma forma que qualquer outro bloco (annimo) PL/SQL, os subprogramas possuem uma parte declarativa, uma parte executvel e uma parte opcional para tratamento de exceo. Os subprogramas podem ser definidos em qualquer ferramenta ORACLE que suporte PL/SQL. Podem ser declaradas dentro de blocos, procedures, funes e packages. Os subprogramas devem ser declarados no fim da parte declarativa, aps todos os outros objetos do programa. PROCEDURES As procedures so subprogramas que executam uma ao especfica.
sintaxe: IS PROCEDURE <nome da procedure> [(<parmetro>[,<parmetro>,])] BEGIN <comandos> [EXCEPTION <tratamento das excees>]

END <nome da procedure>]; Ex: PROCEDURE calc_ir (val_sal NUMBER, val_ir NUMBER) IS BEGIN IF val_sal < 300.00 THEN val_ir := 0; ELSIF val_sal BETWENN 300.01 AND 1000.00 THEN val_ir := val_sal * .10; ELSIF val_sal BETWEEN 1000.01 AND 3000.00 THEN val_ir := val_sal *.20; ELSE val_ir := val_sal *.30; END calc_ir;

FUNCTIONS Uma funo um subprograma que calcula um valor. Funes e procedures so estruturalmente iguais, exceto que as funes possuem uma clusula RETURN que especifica o tipo de retorno da funo.
sintaxe: ])] FUNCTION <nome da funo> [(<parmetro>[,<parmetro>, RETURN <tipo da funo> IS [<variveis locais>] BEGIN <comando> [EXCEPTION <tratamento das excees>] END <nome da funo>];

DATABASE TRIGGERS
Um DATABASE TRIGGER um programa PL/SQL armazenado em um banco ORACLE, associado com uma tabela especfica. O ORACLE ir disparar a execuo do DATABASE TRIGGER automaticamente quando uma determinada operao SQL afeta a tabela. Deste forma, pode-se usar um DATABASE TRIGGER para:

Logar modificaes garantir crticas complexas Gerar o valor de colunas Implementar nveis de segurana mais complexos Manter tabelas duplicadas

Pode-se associar at 12 DATABASE TRIGGERS a cada tabela, um de cada tipo (BEFORE UPDATE <row>, BEFORE DELETE <row>, BEFORE INSERT <row>, BEFORE INSERT <comando>, BEFORE UPDATE <comando>,

BEFORE DELETE <comando> e as mesmas sintaxes para AFTER). Um DATABASE TRIGGER composto de 3 partes:

evento constraint (opcional) ao


Quando o evento ocorre, o trigger disparado e um bloco PL/SQL annimo executa a ao. Deve-se observar que os DATABASE TRIGGERS executam com os privilgios do OWNER e no do usurio corrente. sintaxe: CREATE [OR REPLACE] TRIGGER <nome trigger> {BEFORE | AFTER} {DELETE | INSERT | UPDATE [OF <coluna>[,<coluna>] [OR DELETE | INSERT | UPDATE [OF <coluna>[,<coluna>]} ON <tabela> [REFERENCING {OLD [AS] <nome> | NEW [AS] <nome> [OLD [AS] <nome> | NEW [AS] <nome>]} FOR EACH ROW [WHEN (<condio>)]] <bloco PL/SQL/>

Você também pode gostar