Você está na página 1de 13

O L I M P I U S I NFORMTICA

Sumrio

Programando em PL/SQL........................................................................................................................1 Tipo de Dados e Operadores ................................................................................................................1 Operadores e Smbolos.........................................................................................................................2 Estrutura de Bloco.................................................................................................................................2 Declarando Variveis e constantes.......................................................................................................3 Criando CURSOR..................................................................................................................................4 Atributos de CURSOR .......................................................................................................................4 Instrues de Controle de Fluxo ...........................................................................................................4 IF ... THEN..........................................................................................................................................5 LOOP..................................................................................................................................................5 WHILE ... LOOP.................................................................................................................................5 FOR ... LOOP.....................................................................................................................................6 GOTO.................................................................................................................................................6 Controle de Excees ...........................................................................................................................7 Criando PROCEDURES e FUNES de banco de dados .................................................................8 Criando TRIGGERS ............................................................................................................................11

NOME END. FONE

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

PROGRAMANDO EM PL/SQL
Por ser uma linguagem no procedural, o SQL fcil de usar porque esconde todos os detalhes do processamento de dados. As linguagens procedurais exigem que o usurio saiba como acessar dados e criar programas, usando um projeto estruturado. Apesar de serem mais complexas, as linguagens procedurais oferecem mais recursos e flexibilidade no desenvolvimento de aplicaes cliente/servidor.

Tipo de Dados e Operadores


Antes de comear a escrever um programa em PL/SQL, o usurio dever conhecer os tipos de dados e operadores que a linguagem oferece . Tipo CHAR VARCHAR2 NUMBER Sub Tipo CHARACTER STRING VARCHAR STRING DEC DECIMAL DOLBLE PRECISION INTEGER INT NUMERIC REAL SMALLINT Descrio Cria variveis e constantes de tamanho fixo. O tamanho mximo 32.767 bytes. Cria variveis e constantes de tamanho fixo. O tamanho mximo 32.767 bytes. Cria variveis e constantes de ponto fixo e de ponto flutuante. Para este tipo, o usurio pode especificar uma escala (numero de dgitos direita do ponto decimal).

DATE LONG RAW LONGRAW ROWID BOOLEAN

Cria variveis e constantes do tipo datas e horas. Cria variveis e constantes com tamanho mximo de 32767 bytes. Cria variveis e constantes com tamanho mximo de 32767 bytes. Cria variveis e constantes com tamanho mximo de 32767 bytes. Cria variveis e constantes com tamanho mximo de 256 bytes. Cria variveis e constantes do tipo lgica podendo ser somente (TRUE/FALSE).

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Operadores e Smbolos
Caractere + * / = ,<, >, <=, >=, <> ; , ** := || << >> /* .. */ Descrio Operador de adio Operador de subtrao Operador de multiplicao Operador de diviso Operadores relacionais Indicador de fim de instruo Item separador (vrgula) Delimitador de string (aspa simples/apstrofo) Delimitador de identificao de cotas (aspas) Operador exponencial Atribuio em linha Caracter de concatenao Incio e fim de um label Comentrio em uma linha Comentrio em mltiplas linhas

Estrutura de Bloco
Por ser uma linguagem estruturada, o PL/SQL agrupa instrues atravs de blocos para facilitar o entendimento da programao. A forma como o PL/SQL estrutura um bloco atravs de sees declarativas conforme exemplo abaixo: DECLARE ... instrues BEGIN ... instrues BEGIN ... instrues END ... instrues EXCEPTION ... instrues END; DECLARE a se o onde o usurio dever definir as variveis, constantes e tipo de dados que o programa utilizar durante o processamento. BEGIN ... END marca o inicio e fim de um bloco de instrues dentro de um programa PL/SQL. EXCEPTION a seo onde o usurio trata erros ocorridos durante o processo do programa PL/SQL.

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Declarando Variveis e constantes


Para declarar variveis e constantes, o usurio dever usar a seo DECLARE dentro de um bloco de programa PL/SQL. Exemplo: DECLARE ntotal smensagem npercentual BEGIN ... instrues BEGIN ... instrues END ... instrues EXCEPTION ... instrues END; NUMBER(3); VARCHAR2(500); CONSTANT REAL := 0,25;

Atravs da instruo SELECT ... INTO, o PL/SQL possibilita o usurio a transferir valores das colunas de uma tabela para variveis dentro de um programa PL/SQL. Exemplo: DECLARE ntotal NUMBER(3); smensagem VARCHAR2(500); npercentual CONSTANT REAL := 0,25; BEGIN /* Atribui a varivel apontamento */ SELECT SUM(valor) INTO :ntotal FROM apontamento; BEGIN ... instrues END ... instrues EXCEPTION ... instrues END Obs: As variveis da clusula INTO deve ser precedidas do sinal : (dois pontos). ntotal a soma da coluna valor da tabela de

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Criando CURSOR
O PL/SQL possibilita ao usurio manipular linhas de uma consulta SQL atravs do mecanismo chamado CURSOR. Um CURSOR um nome dado a consulta onde podemos processar linha de registros individualmente. O cursor deve ser declarado na seo DECLARE dentro de um programa PL/SQL. Exemplo: /* Cria um cursor selecionando todos os registro da tabela apontamento onde servio seja igual a 1 */ CURSOR cursor_apontamento IS SELECT * FROM apontamento WHERE servico = 1;

Atributos de CURSOR
Para facilitar ainda mais o uso de cursores dentro de um programa PL/SQL devemos observar os seguintes atributos de cursores Atributo OPEN cursor CLOSE cursor FETCH cursor INTO varivel %ROWTYPE %TYPE %ISOPEN %ROWCOUNT %NOTFOUND %FOUND Descrio Abre um cursor declarado. Fecha um cursor declarado. Carrega a prxima linha de um cursor para uma varivel. Cria uma varivel do tipo linha de registro de um cursor. Cria uma varivel do mesmo tipo de dado de uma coluna de uma tabela ou de um cursor. Retorna TRUE se um cursor est aberto. Conta a quantidade de linhas processada de um cursor. Retorna TRUE se na busca da uma linha de um cursor for o fim da consulta. Retorna TRUE na carga de uma linha do cursor para uma varivel.

Instrues de Controle de Fluxo


A maioria das linguagens possuem instrues de controle de fluxo. Elas possibilitam o usurio a controlar o fluxo de execuo do programa, podendo desviar a rotina para um outro ponto com base em uma condio ou ainda utilizar laos para repetir uma ou mais instrues vrias vezes dentro de um programa. O PL/SQL disponibiliza para o usurio os seguintes tipos de instrues de controle de fluxo.

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

IF ... THEN
Permite que o usurio examine uma determinada condio para executar um bloco de instrues. O resultado desta condio deve ser do tipo Boolean. Exemplo 1: IF nquantidade = 0 THEN nquantidade := 10; ELSE nquantidade := 20 END IF;

Exemplo 2: IF nvalor > 10 THEN nresultado := nvalor * 1.10; ELSIF (nvalor > 10) AND (nvalor <= 20) THEN nresultado := nvalor * 1.20; ELSE nresultado := nvalor * 1.30; END IF;

LOOP
LOOP utilizado para executar um grupo de instrues durante um certo nmero de vezes. Esta instruo muito utilizada para processar linha de um cursor. Exemplo 1: Este exemplo acumula na varivel total OPEN cursor_apontamento LOOP FETCH curso_apontamento INTO total_linha; EXIT WHEN cursos_apontamento%NOTFOUND; ... instrues END LOOP; CLOSE cursor_apontamento;

WHILE ... LOOP


Esta instruo executa um grupo de instrues enquanto um condio estiver sendo atendida. Exemplo: WHILE cursor_apontamento%FOUND LOOP FETCH curso_apontamento INTO total_linha; ... instrues END LOOP;

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

FOR ... LOOP


Esta instruo permite o usurio criar loops com definio de quantas vezes ter que executar um grupo de instrues. Exemplo: FOR nvezes IN 1 .. 10 LOOP ... instrues END LOOP;

A instruo FOR LOOP tambm possibilita o usurio trabalhar com cursores. Exemplo: Linha_reg BEGIN FOR linha_reg IN cursor_apontamento LOOP ... instrues END LOOP; END; curso_apontamento%ROWTYPE;

GOTO
Esta instruo permite o usurio desviar o processamento de um programa para executar um outro grupo de instrues a partir da declarao de um label dentro de um programa PL/SQL. Exemplo: <<loop_Inicio>> - - Declara o label LOOP FETCH cursor_apontamento INTO linha_reg; IF cursor_apontamento%NOTFOUND THEN EXIT ...instrues END LOOP loop_inicio ...instrues ...instrues ...instrues IF (condicao) THEN GOTO loop_inicio - - Desvia o processo para o label ...instrues

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Controle de Excees
A linguagem de programao PL/SQL dispem de um mecanismo de tratamento de erros chamado EXCEPTION. Este mecanismo possibilita o usurio tratar eventuais erros ocorridos dentro de um programa. O PL/SQL possui um conjunto de excees predefinidas para tratar condies de erros comuns. Abaixo segue a lista das excees predefinidas do PL/SQL. Exceo CURSOR_ALREADY_OPEN DUP_VAL_ON_INDEX INVALID_CURSOR NVALID_NUMBER LOGIN_DENIED NO_DATA_FOUND NOT_LOGGED_ON PROGRAM_ERROR STORAGE_ERROR TIME_OUT_ON_RESOURCE TOO_MANY_ROWS TRANSACTION_BACKED_OUT VALUE_ERROR ZERO_DIVIDE OTHERS Descrio Tentativa de abrir um cursor que j est aberto. Insero de valor duplicado em uma coluna definida com UNIQUE. Referncia a um cursor que no existe. Atribuio de valores no numricos a variveis do tipo numrica. Erro durante a conexo. Nenhum dado retornado pela instruo SELECT INTO. Ausncia de conexo. Erro interno do PL/SQL. Erro de memria provocado pelo PL/SQL. Tempo de espera atingido durante a espera de um recurso Oracle. Retorno de mais de uma linha na instruo SELECT INTO. Um servidor remoto desfez sua transao. Erro provocado por um clculo, converso ou restrio. Tentativa de diviso por zero. Possibilita ao usurio tratar erros no definidos.

A linguagem de programao PL/SQL tambm possibilita ao usurio enviar mensagens de erros tratadas ao usurio final atravs da funo RAISE_APPLICATION_ERROR. Esta funo possui dois parmetros onde o primeiro parmetro o numero do erro e o segundo a mensagem que ser apresentada ao usurio. O usurio tambm pode criar seus prprios cdigos de erro e suas respectiva mensagens. Esta codificao dever variar entre 20000 a 20999 onde o usurio ter at mil cdigos de erros disponveis para otimizar sua aplicao. Exemplo: Avisa ao usurio que a consulta no retornou dados DECLARE ... instrues BEGIN SELECT FROM WHERE * servicos codigo = 1;

EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001, No encontrou registros); END;

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Alm das excees definidas pelo PL/SQL, o usurio tambm pode definir excees para condicionar desvios dentro de um programa. Para isto, o usurio dever declarar a nova exceo na seo DECLARE. Exemplo: Cria uma exceo do usurio DECLARE stipo meu_erro BEGIN VARCHAR2(1); EXCEPTION;

SELECT TIPO INTO stipo FROM SERVICOS WHERE CODIGO = 1; IF stipo <> C THEN RAISE meu_erro; END IF; EXCEPTION WHEN meu_erro THEN RAISE_APPLICATION_ERROR(-20001, Tipo no e C); END;

Criando PROCEDURES e FUNES de banco de dados


O Oracle permite ao usurio criar e armazenar blocos de programa PL/SQL no banco de dados. Estes programas so denominados de PROCEDURES e FUNCTIONS. Procedures so blocos de instrues que processam o que lhe foi determinado e no retorna nada ao ponto de onde foi chamada. Functions funcionam de maneira semelhante s Procedures e retornam um resultado para o ponto de onde foram chamadas. Alguns benefcios so adquiridos na utilizao dos programas armazenados no banco de dados. Produtividade O usurio codifica, testa e depura toda lgica comum da aplicao e armazena no banco de dados disponibilizando os recursos para que as aplicaes clientes possam utiliz-las. Desempenho Ao contrrio dos comando SQL, os blocos de comando PL/SQL so compilados e armazenados no banco de dados, proporcionando assim maior desempenho para as aplicaes clientes. Trfego de rede Por estarem compilados no banco de dados, os procedimentos recebem parmetros enviados pelos clientes e efetuam o processamento no prprio servidor diminuindo o trfego de solicitao e resposta na rede.

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Para criarmos uma PROCEDURE no banco de dados devemos observar a seguinte sintaxe: Sintaxe: CREATE OR REPLACE PROCEDURE nome_proc (parametro [IN/OUT/IN OUT] [tipo de dado], ...) IS BEGIN . . . instrucoes END nome_procedimento; / Onde: Sintaxe CREATE OR REPLACE PROCEDURE nome_proc parametro IN OUT IN OUT tipo de dado / Descrio Cria ou altera uma procedure no banco de dados. Nome da procedure que ser criada no bando de dados. Nome do parmetro ou parmetros que a procedure ir receber para efetuar o processamento. Especifica que o parmetro somente de entrada e que deve ser passado. Especifica que o parmetro pode no ser passado e seu valor atribudo dento do procedimento. Especifica que o paramento pode ser passado e modificado dentro do procedimento. Tipo de dado do parmetro conforme tabela disponvel no PL/SQL. Avisa ao Oracle que o procedimento encerrou e que deve ser compilado.

Exemplo: CREATE OR REPLACE PROCEDURE patualiza_valor (nservico IN NUMBER, npercentual IN REAL) IS BEGIN /* Atualiza todos os valores do servio informado conforme % passado */ IF npercentual > 0 THEN UPDATE apontamento SET valor = valor * (npercentual / 100); WHERE servico = nservico; COMMIT; END IF; END patualiza_valor; / Teste: /* Como executar a procedure */ EXECUTE patualiza_valor( 1, 1.25);

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

O Oracle tambm permite ao usurio criar procedimentos annimos. Exemplo: DECLARE npercentual REAL := 1.25; nservico NUMBER := 10; BEGIN /* Atualiza todos os valores do servio informado conforme % passado */ IF npercentual > 0 THEN UPDATE apontamento SET valor = valor * (npercentual / 100) WHERE servico = nservico; COMMIT; END IF; END; / Para criarmos uma FUNO no banco de dados devemos observar a seguinte sintaxe: Sintaxe: CREATE OR REPLACE FUNCTION nome_func (parametro [IN/OUT/IN OUT] [tipo de dado], ...) RETURN tipo de dado retorno IS BEGIN . . . instrucoes END nome_procedimento; / Onde: Sintaxe CREATE OR REPLACE FUNCTION nome_func parametro IN OUT IN OUT tipo de dado RETURN Tipo de dado retorno / Descrio Cria ou altera uma procedure no banco de dados. Nome da procedure que ser criada no banco de dados Nome do parmetro ou parmetros que a procedure ir receber para efetuar o processamento. Especifica que o parmetro somente de entrada e que deve ser passado. Especifica que o parmetro pode no ser passado e seu valor atribudo dento do procedimento. Especifica que o parmetro pode ser passado e modificado dentro do procedimento. Tipo de dado do parmetro conforme tabela disponvel no PL/SQL. Tipo de dado que a funo ir retornar. Avisa ao Oracle que o procedimento encerrou e que deve ser compilado.

10

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Exemplo: CREATE OR REPLACE FUNCTION fTOTAL(nservico IN NUMBER) RETURN REAL IS Ntotal REAL; BEGIN SELECT INTO FROM WHERE SUM(nvl(valor, 0)) ntotal apontamento servico = nservico;

RETURN ntotal; END; / Teste: /* Como chamar a funcao */ SELECT DESCRICAO, FTOTAL(CODIGO) FROM SERVICO;

Criando TRIGGERS
Trigger um procedimento de banco de dados associado a tabelas ou a colunas de uma tabela. Este procedimento disparado quando a tabela associada sofre uma das seguintes aes: INSERT, DELETE e UPDATE. Sintaxe: CREATE OR REPLACE TRIGGER nome_trig [BEFORE/AFTER] DELETE [OR INSERT] [OR UPDATE [OF coluna1,...]] ON tabela FOR EACH ROW [WHEN condicao] [REFERENCING [OLD AS antigo] [NEW AS novo]] [WHEN condicao] [DECLARE] BEGIN . . . instrucoes END; / Onde: Sintaxe CREATE OR REPLACE TRIGGER Nome_trig BEFORE/AFTER Descrio Cria ou altera uma trigger no banco de dados. Nome da trigger que ser criada no banco de dados Especifica se as instrues definidas para a trigger sero executadas antes ou depois da ao. DELETE [OR INSERT] [OR UPDATE [OF Aes que disparam a trigger. q A clusula OR possibilita o usurio definir mais de uma coluna1,...]]
q

ao para que a trrigger seja executada. A clusula OF da ao UPDATE dispara a trigger toda vez que uma ou mais colunas especificadas sofrerem atualizaes. (Se OF for omitido, a trigger ser disparada quando qualquer coluna for atualizada).
Continua

11

OLIMPIUS INFORMTIC A

C u r s o B s i c o d e S Q L Pr o g r a m a n d o e m P L / S Q L

Sintaxe tabela FOR EACH ROW REFERENCING

WHEN DECLARE / Exemplo:

Descrio Nome da tabela proprietria da trigger. Dispara a trigger para cada linha da tabela. Permite que o usurio crie nomes de correlao de uma tabela para referenciar valores velhos e novos de um coluna no registro atual. q antigo - Especifica o valor antigo da coluna. q novo - Especifica o valor novo para a coluna. Especifica uma condio para que a trigger seja disparada. Seo de declarao de variveis (Opcional). Avisa ao Oracle que o procedimento encerrou e que deve ser compilado.

CREATE OR REPLACE TRIGGER NOVO_COD BEFORE INSERT ON servico REFERENCING OLD AS velho NEW AS novo FOR EACH ROW BEGIN SELECT sq_cadastro.NEXTVAL INTO :novo.codigo FROM DUAL; END; / Teste: /* Insere um novo registro na tabela de servico sem informar o codigo */ INSERT INTO SERVICO(DESCRICAO, TIPO) VALUES ('SSS3', 'C');

12

Você também pode gostar