Escolar Documentos
Profissional Documentos
Cultura Documentos
PL/SQL Referncias
PL/SQL - Conceito
A PL/SQL uma linguagem de programao sofisticada utilizada para acessar um banco de dados Oracle a partir de vrios ambientes. Ela integrada com o servidor do banco de dados de modo que o cdigo PL/SQL possa ser processado de maneira rpida e eficiente. 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.
PL/SQL - Conceito
Um cdigo PL/SQL pode ser armazenado como um objeto dentro do banco de dados. Seriam as famosas Procedures, Functions e Triggers. Esses objetos podem ainda ser agrupados em Packages (pacotes), para facilitar a lgica e o gerenciamento de um grupo de blocos que possuem relacionamento entre si ou compartilham fatores em comum. Eventualmente, podemos sentir a necessidade de executar um cdigo PL/SQL apenas uma vez, para algum teste ou para uma correo de um dado, por exemplo. Nesses casos (e em outros que julgar necessrio) voc pode usar um bloco annimo. um bloco PL/SQL que no ser armazenado definitivamente no banco. O bloco ser interpretado, executado e depois ser descartado.
PL/SQL - Performance
A PL/SQL pode:
Reduzir o trfego na rede pelo envio de um bloco contendo
quando estabelecemos aes que podem ser compartilhadas em diversas aplicaes (uso de stored procedure).
A PL/SQL uma estrutura em blocos, ou seja, as unidades bsicas (procedures, funes, etc.) podem conter qualquer nmero de subblocos. Cada bloco composto de trs partes:
DECLARE
opcional <definio dos objetos PL/SQL que sero utilizados neste bloco>
BEGIN
obrigatrio
EXCEPTION opcional
< o que fazer se uma ao executada causar um erro > END; termina a definio do bloco
PL/SQL Identificadores
Um identificador consiste em uma letra seguida de outras letras, nmeros, $ (dlar), _ (sublinhado) e # (smbolo numrico). Possui um limite mximo de 30 caracteres. As letras podem ser maisculas ou minsculas indiscriminadamente. No utilize palavras reservadas na declarao de variveis como IF, END, DO, WHILE, ELSE, etc...., mas caso seja necessrio, coloque a palavra entre aspas. Ex: IF Evite usar o mesmo nome de colunas das tabelas
Dica: use v_nome para diferenciar o nome da coluna da tabela com o nome da varivel
PL/SQL Comentrios
comentrio (--)
(quando o comentrio utiliza mais de uma linha ou o comentrio est no meio de um comando)
Exemplo: SQL> DECLARE 2 v_valor VARCHAR(10); 3 v_end VARCHAR(20); 4 BEGIN 5 v_valor := -- A atribuio ser feita na outra linha 6 Rua A; 7 v_end := /* A atribuio vir a seguir */ Rua B; 8 END; 9 .
8
A indicao de fim de linha de comando em PL/SQL feita com um ponto-e-vrgula (;). Um ponto (.) termina a entrada do bloco PL/SQL. Para executar o bloco, coloque uma barra (/) no prompt do SQL. Se desejar executar de imediato, coloque uma barra (/) na ltima linha de comando de um bloco PL/SQL, pois o mesmo entende que para fechar o bloco e execut-lo.
A PL/SQL no tem nenhuma funcionalidade de entrada ou de sada construda diretamente na linguagem. Para retificar isso, o SQL*Plus, em combinao com o pacote DBMS_OUTPUT, fornece a capacidade de dar sada para mensagens em tela. Isso feito em dois passos:
Permitir a sada no SQL*Plus com o comandoset
serveroutput on:
sada :
DBMS_OUTPUT.PUT_LINE (mensagem)
10
Armazenar dados temporrios Manipulao de valores armazenados Reusabilidade (no necessrio consultar repetidas vezes os dados armazenados) Facilidade de manuteno
11
Variveis PL/SQL suportam todos os tipos de dados da linguagem SQL e novos tipos definidos para o PL/SQL, como BOOLEAN (admite os valores TRUE, FALSE ou NULL). As variveis podem receber ou no valor inicial. Caso a declarao da varivel receba a clusula Not Null, a atribuio de valor inicial se torna obrigatria. Quando no informamos valor inicial para uma varivel, seu valor considerado desconhecido, ou seja, Null.
Uma varivel declarada em um bloco visvel nesse e em todos os blocos subordinados a ele.
Uma varivel declarada em um bloco deixa de existir quando o bloco termina.
12
As variveis e constantes so criadas e recebem seu valor inicial cada vez que for iniciado o bloco no qual esto declaradas.
A PL/SQL no declara, implicitamente, variveis como ocorre em outras linguagens. muito importante, portanto, que as variveis sejam inicializadas antes do uso. Se um identificador de uma expresso de um comando SQL no um coluna, ento o ORACLE assume que ele uma varivel (ou constante) PL/SQL.
13
14
PL/SQL Constantes
:=
3.141592;
15
Exemplo:
16
O atributo %TYPE copia o tipo de dado de uma varivel ou coluna de uma tabela do banco de dados, podendo, dessa forma, declarar variveis baseadas no tipo de outras variveis ou de campos de tabelas.
Isso bastante utilizado quando uma varivel recebe valor vindo de campo de uma tabela.
A utilizao de %TYPE favorece a independncia de dados, uma vez que no precisamos saber exatamente o tipo de dado da varivel a ser declarada e, caso haja modificaes no objeto original, a modificao da varivel CPIA feita automaticamente.
17
PL/SQL foi criado para flexibilizar a manipulao de dados atravs de comandos SQL.
S possvel utilizar os comandos SQL de manipulao de dados (SELECT, INSERT, UPDATE e DELETE) dentro de PL/SQL, alm dos comandos de controle de transaes (ROLLBACK, COMMIT e SAVEPOINT). Tudo o que se pode utilizar em clusulas WHERE na linguagem SQL pode-se utilizar tambm em PL/SQL. possvel utilizar todas as funes numricas, de caracteres, datas e converses de dados disponveis na linguagem SQL. possvel utilizar as funes de grupo da linguagem SQL.
18
este exemplo, os comandos CREATE TABLE e INSERT abaixo devem ser executados fora do bloco PL/SQL).
CREATE TABLE ALUNO ( RA NUMBER(5), NOME VARCHAR2(40)); INSERT INTO ALUNO VALUES (1,'ANTONIO');
DECLARE
V_RA V_NOME ALUNO.RA%TYPE; ALUNO.NOME%TYPE;
BEGIN
SELECT RA, NOME INTO V_RA, V_NOME FROM ALUNO WHERE RA=1; DBMS_OUTPUT.PUT_LINE(V_RA ||' - '|| V_NOME); END; /
Obs: Este tipo de construo s funciona quando o SELECT devolva uma nica linha. No caso de vrias linhas, ser usado um CURSOR, explicado posteriormente.
19
O comando SELECT dentro da PL/SQL dever receber obrigatoriamente a clusula INTO para que o resultado seja armazenado em variveis e dessa forma, poder manusear os dados obtidos. Devemos informar uma rea de recepo capaz de comportar todos os dados lidos; caso contrrio, receberemos erro na execuo. A clusula Into segue imediatamente a lista de variveis da clusula Select e precede a clusula From. O comando SELECT dever retornar apenas uma linha. Caso mais de uma linha seja retornada apresentar o erro too_many_rows e se no retornar nenhuma linha apresentar o erro no_data_found.
20
SELECT RA, NOME INTO V_RA, V_NOME FROM ALUNO WHERE RA=1;
Caso a clusula WHERE fosse alterada para: WHERE RA=1 OR RA=2 o comando SELECT retornaria mais de uma linha, exibindo a mensagem:
ORA-01422: a extrao exata retorna mais do que o nmero solicitado de linhas
Caso a clusula WHERE fosse alterada para: WHERE RA=3 o comando SELECT no encontraria linha para retornar, exibindo a mensagem:
ORA-01403: dados no encontrados
Caso a clusula WHERE fosse alterada para: WHERE RA=&V_RA_Aluno e a varivel V_RA_Aluno tivesse sido declarada, o programa pediria para que o usurio informasse o valor do RA, entendendo o uso do & como parmetro a ser informado em tempo de execuo.
21
tabela ALUNO
BEGIN
END;
/
BEGIN
DELETE FROM ALUNO WHERE RA=2 ;
END;
/
22
O comando IF verifica uma condio e dependendo do resultado realiza uma ou outra ao. Permite a execuo condicional de uma determinada ao. Existem trs sintaxes vlidas de IF em PL/SQL.
IF IF
CONDIO THEN [CORPO DE COMANDOS] ELSE [CORPO DE COMANDOS DO ELSE] END IF; CONDIO THEN [CORPO DE COMANDOS] ELSIF CONDIO THEN [CORPO DE COMANDOS] END IF;
IF
onde: Condio uma expresso booleana que, quando nula (NULL) tratada como FALSE. Comando qualquer comando PL/SQL (inclusive IF).
23
Exemplo 1:
DECLARE var1 number(4) := &var1; var2 number(4); BEGIN IF var1 > 10 THEN var2 := var1 + 20; END IF; dbms_output.put_line('O valor de var2 : ' || var2); END;
Exemplo 2:
DECLARE var1 number(4) := &var1; var2 number(4); BEGIN IF var1 > 10 THEN var2 := var1 + 20; ELSE var2 := var1 * var1; END IF; dbms_output.put_line('O valor de var2 : ' || var2); END;
24
IF condio THEN comandos; ELSIF condio THEN comandos; ELSE comandos; END IF;
25
DECLARE var1 number(4) := &var1; var2 number(4); BEGIN IF var1 > 10 THEN var2 := var1 + 20; ElsIF var1 between 7 and 9 THEN var2 := var1 * 2; ELSE var2 := var1 * var1; END IF; dbms_output.put_line('O valor de var2 : ' || var2); END;
26
DECLARE VALOR NUMBER := &VAL; BEGIN IF VALOR > 0 THEN DBMS_OUTPUT.PUT_LINE( VALOR|| Este valor maior que zero); ELSIF VALOR = 0 THEN DBMS_OUTPUT.PUT_LINE( VALOR || Este valor igual a zero); ELSE DBMS_OUTPUT.PUT_LINE( VALOR || Este valor menor que zero); END IF; END;
27
DECLARE V_RA ALUNO.RA%TYPE := 1; V_NOTA ALUNO.NOTA%TYPE; V_CONCEITO VARCHAR2(12); BEGIN SELECT NOTA INTO V_NOTA FROM ALUNO WHERE RA = V_RA; IF V_NOTA <= 5 THEN V_CONCEITO := 'REGULAR'; ELSIF V_NOTA < 7 THEN V_CONCEITO := 'BOM'; ELSE V_CONCEITO := 'EXCELENTE'; END IF; DBMS_OUTPUT.PUT_LINE ('Conceito: ' || V_CONCEITO); END;
28
VARIVEL :=
CASE WHEN expresso_1 THEN declarao_1 WHEN expresso_2 THEN declarao_2 .... ELSE declarao_n END;
29
DECLARE var1 number(4) := &var1; var2 number(4); BEGIN var2 := CASE WHEN var1 > 10 THEN var1 + 20 WHEN var1 between 7 and 9 THEN var1 * 2 ELSE var1 * var1 END; dbms_output.put_line('O valor de var2 : ' || var2); END;
30
DECLARE v_ra ALUNO.RA%TYPE := 1; v_nota ALUNO.NOTA%TYPE; v_conceito VARCHAR(12); BEGIN SELECT nota INTO v_nota FROM ALUNO WHERE RA = v_ra; v_conceito := CASE WHEN v_nota <= 5 THEN REGULAR WHEN v_nota < 7 THEN BOM ELSE EXCELENTE END; dbms_output.put_line(Conceito: || v_conceito); END;
31
Caso no seja colocada a clusula ELSE e nenhuma condio da estrutura CASE for validada, a PL/SQL interromper a execuo com o erro CASE_NOT_FOUND ou ORA-6592.
Exemplo:
DECLARE v_TestVar NUMBER := 1; BEGIN CASE v_TestVar WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Two!'); WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Three!'); WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('Four!'); END CASE; END; /
* ERRO na linha 1: ORA-06592: CASE no encontrado ao executar a instruo CASE
Obs: Usar EXCEPTION para tratar o erro substitui o uso da clusula ELSE (veja Tratamento de Excees na prxima pgina).
32
CASE finalizado com END - usado quando a estrutura vai retornar um valor
Exemplo:
DECLARE v_ra ALUNO.RA%TYPE := 1; v_nota ALUNO.NOTA%TYPE; v_conceito VARCHAR(12); BEGIN SELECT nota INTO v_nota FROM ALUNO WHERE RA = v_ra; v_conceito := CASE WHEN v_nota <= 5 THEN REGULAR WHEN v_nota < 7 THEN BOM ELSE EXCELENTE END; dbms_output.put_line(Conceito: || v_conceito); END;
que ser atribudo numa varivel. No deve ser colocado (;) dentro da estrutura.
33
CASE finalizado com END CASE - usado quando a estrutura apenas de controle dentro de um algoritmo para que instrues sejam executadas,
sem retornar valor. Deve ser colocado (;) dentro da estrutura. Exemplo:
DECLARE v_TestVar NUMBER := 1; BEGIN CASE v_TestVar WHEN 2 THEN DBMS_OUTPUT.PUT_LINE('Two!'); WHEN 3 THEN DBMS_OUTPUT.PUT_LINE('Three!'); WHEN 4 THEN DBMS_OUTPUT.PUT_LINE('Four!'); END CASE; END; Obs: Este tipo de estrutura similar a estrutura de deciso IF, onde todas as instrues dentro do THEN, ELSE e ELSIF tem ponto-e-vrgula (;).
34
Durante a execuo de um bloco PL/SQL, se acontecer alguma situao anormal (por exemplo, uma diviso por zero), o fluxo de execuo transferido diretamente para o tratador de excees daquele bloco (como se fosse um GOTO). Um tratador de excees definido da seguinte forma:
BEGIN : : EXCEPTION WHEN nome_exceo1 THEN COMANDO1_1 COMANDO1_2 : WHEN nome_exceo2 THEN COMANDO1_1 COMANDO1_2 : END;
35
de um INSERT ou UPDATE.
INVALID_NUMBER Quando a converso de uma cadeia de caracteres para NO_DATA_FOUND Um comando SELECT no retornou nenhuma linha. TOO_MANY_ROWS Um comando SELECT retornou mais de uma linha. VALUE_ERROR Quando acontece um erro de OVERFLOW ou uma cadeia
de caracteres TRUNCADA.
ZERO_DIVIDE Quando h uma tentativa de diviso por zero. OTHERS Qualquer outra exceo no especificada anteriormente. Deve ser a
36
DECLARE V_RA ALUNO.RA%TYPE; V_NOME ALUNO.NOME%TYPE; BEGIN SELECT RA, NOME INTO V_RA, V_NOME FROM ALUNO WHERE RA=30; DBMS_OUTPUT.PUT_LINE(V_RA ||' - '|| V_NOME); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE ('No h nenhum aluno com este RA'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE ('H mais de um aluno com este RA'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE ('Erro desconhecido'); END;
37
Alm dos erros tratados automaticamente pelo Oracle, regras de negcio especficas podem ser tratadas. As excees definidas pelo usurio devem ser declaradas e chamadas explicitamente pelo comando RAISE.
Exemplo:
DECLARE nome_excecao exception; BEGIN .... If .... then Raise nome_excecao; End IF; .... EXCEPTION When nome_excecao then ........ END;
38
Declare V_conta number(2); Conta_aluno exception; Begin Select count (Ra) into v_conta from aluno; If v_conta = 10 then Raise conta_aluno; Else Insert into aluno values (20, silva); End if; Exception When conta_aluno then Dbms_output.put_line (No foi possvel incluir, turma cheia); End;
39
FOR
WHILE
40
Executa uma relao de comandos at que uma instruo de sada (EXIT) seja encontrada.
Estutura:
LOOP
sequncia_de_instrues IF condio_de_sada THEN EXIT; END IF; END LOOP;
41
DECLARE V_AUX NUMBER(2) := 0; BEGIN LOOP V_AUX := V_AUX +1; DBMS_OUTPUT.PUT_LINE (V_AUX); IF V_AUX = 10 THEN EXIT; END IF; END LOOP; END;
42
Repete um bloco de comandos n vezes, ou seja, at que a varivel contadora atinja o seu valor final. A varivel contadora no deve ser declarada na seo DECLARE e deixar de existir aps a execuo do comando END LOOP.
Estutura:
43
FOR V_CONTADOR IN 1..10 LOOP V_AUX := V_AUX +1; DBMS_OUTPUT.PUT_LINE (V_AUX); END LOOP; END;
44
DECLARE V_RA_INICIAL ALUNO.RA%TYPE := 1; V_RA_FINAL V_RA_INICIAL%TYPE; V_AUX V_RA_INICIAL%TYPE := 0; BEGIN SELECT COUNT(RA) INTO V_RA_FINAL FROM ALUNO; FOR V_CONTADOR IN V_RA_INICIAL..V_RA_FINAL LOOP V_AUX := V_AUX +1; DBMS_OUTPUT.PUT_LINE ('Total de alunos: ' || V_AUX); END LOOP; END;
45
Se a palavra REVERSE estiver presente no loop FOR, o ndice de loop ir refazer a partir do valor alto para o valor baixo.
Exemplo:
DECLARE v_Baixo NUMBER := 10; v_Alto NUMBER := 40; BEGIN FOR v_cont IN REVERSE v_Baixo .. v_Alto LOOP INSERT INTO tab_exemplo VALUES(v_cont, Teste); DBMS_OUTPUT.PUT_LINE (V_cont = || v_cont || - Registro inserido com sucesso); END LOOP; END;
Obs: Antes de executar o bloco PL/SQL acima, crie a tabela tab_exemplo, conforme comando abaixo:
CREATE TABLE tab_exemplo (Cod NUMBER(2), Descricao VARCHAR(10));
46
Repete um bloco de comandos enquanto a condio que segue o comando WHILE for verdadeira.
Estrutura:
Obs: Se a condio de loop no for avaliada como TRUE na primeira vez que ela for verificada, o loop no ser executado.
47
DECLARE V_AUX NUMBER(2) := 0; BEGIN WHILE V_AUX < 10 LOOP V_AUX := V_AUX + 1; DBMS_OUTPUT.PUT_LINE (V_AUX); END LOOP; END;
48
DECLARE V_RA_FINAL ALUNO.RA%TYPE := 1; V_AUX V_RA_FINAL%TYPE := 0; BEGIN SELECT COUNT(RA) INTO V_RA_FINAL FROM ALUNO; WHILE V_AUX < V_RA_FINAL LOOP V_AUX := V_AUX +1; DBMS_OUTPUT.PUT_LINE ('Total de alunos: ' || V_AUX); END LOOP; END;
49
Se desejado, as instrues EXIT ou EXIT WHEN podem ainda ser utilizadas dentro de qualquer estrutura de repetio (LOOP, FOR, WHILE) para sair prematuramente do loop.
Exemplo 1: Utilizando
EXIT
DECLARE V_AUX NUMBER(2) := 0; BEGIN FOR V_CONTADOR IN 1..15 LOOP V_AUX := V_AUX +1; DBMS_OUTPUT.PUT_LINE (V_AUX); IF V_CONTADOR = 10 THEN EXIT; END IF; END LOOP; END;
50
EXIT WHEN
DECLARE V_AUX NUMBER(2) := 0; BEGIN FOR V_CONTADOR IN 1..15 LOOP V_AUX := V_AUX +1; DBMS_OUTPUT.PUT_LINE (V_AUX); EXIT WHEN V_CONTADOR = 10; END LOOP; END;
51
PL/SQL Labels
Utilizados para nomear blocos ou sub-blocos. Devem localizar-se antes do incio do bloco e preceder pelo menos um comando. Se no houver necessidade de nenhum comando aps o label, deve-se utilizar o comando NULL.
Exemplo:
PL/SQL Labels
<<PRINCIAL>> LOOP ... LOOP ... -- SAIR DOS DOIS LOOPS EXIT PRINCIPAL WHEN ... END LOOP; END LOOP PRINCIPAL;
53
PL/SQL GOTO
Utilizado para desviar um fluxo de um bloco PL/SQL para determinado label. GOTO nome_do_label
Nota: Um Label deve ser codificado entre <<L>>. No comando GOTO, os smbolos <<L>> no devem ser usados
54
PL/SQL GOTO
Exemplo 1:
<<PRINCIPAL>> DECLARE V_NOME ALUNO.NOME%TYPE; BEGIN SELECT COUNT(RA) INTO V_CONTA FROM ALUNO; IF V_CONTA = 10 GOTO FIM; ELSE INSERT INTO ALUNO VALUES (20,'SILVA'); END IF; <<FIM>> DBMS_OUTPUT.PUT_LINE('Fim do programa'); END;
55
PL/SQL GOTO
Exemplo 2:
<<PRINCIPAL>> DECLARE V_NOME ALUNO.NOME%TYPE; BEGIN SELECT NOME INTO V_NOME FROM ALUNO WHERE NOME LIKE &NOME_ALUNO'; FOR V_CONTADOR IN 1..5 LOOP <<SECUNDARIO>> DECLARE V_NOME VARCHAR2(40); BEGIN SELECT NOME INTO V_NOME FROM ALUNO WHERE RA=V_CONTADOR; IF V_NOME = PRINCIPAL.V_NOME THEN DBMS_OUTPUT.PUT_LINE('Est entre os 5 primeiros'); GOTO FIM; END IF; END; END LOOP;
56
PL/SQL GOTO
Existem algumas situaes em que o comando Goto no pode ser usado: (Veja exemplo na prxima pgina)
Desviar o fluxo para dentro de um IF ou LOOP;
Para_Fora)
57
PL/SQL GOTO
Exemplo:
SQL> 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 DECLARE PROCEDURE DESVIO IS BEGIN GOTO PARA_FORA; END; BEGIN <<INICIO>> IF TRUE THEN GOTO PROXIMO_IF; END IF; IF FALSE THEN <<PROXIMO_IF>> GOTO SUBBLOCO; END IF; <<PARA_FORA>> BEGIN <<SUBBLOCO>> NULL; END; EXCEPTION WHEN OTHERS THEN GOTO INICIO; END;
GOTO PROXIMO_IF; * ERRO na linha 9: ORA-06550: linha 9, coluna 7: PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o label 'PROXIMO_IF ORA-06550: linha 11, coluna 13: PL/SQL: Statement ignored ORA-06550: linha 4, coluna 5: PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o label 'PARA_FORA' ORA-06550: linha 6, coluna 1: PL/SQL: Statement ignored ORA-06550: linha 22, coluna 5: PLS-00375: instruo GOTO invlida; este GOTO no pode ser ramificado para o label 'INICIO' ORA-06550: linha 22, coluna 5: PL/SQL: Statement ignored
58
PL/SQL GOTO
O comando NULL, explicitamente, indica que no h ao a ser feita. Serve para compor certas situaes em que um comando exigido, mas nenhuma ao , realmente, necessria. Exemplo:
DECLARE VEZ NUMBER := 1 BEGIN << INICIO >> VEZ := VEZ + 1; IF VEZ > 10 THEN GOTO FIM; ELSE VEZ := VEZ**2 - 1; END IF; GOTO INICIO; <<FIM>> NULL; END;
J vimos anteriormente que todo Label deve preceder um comando ou um bloco de PL/SQL. No exemplo ao lado, a presena do comando Null teve a finalidade de validar o posicionamento do Label Fim. Caso o comando no fosse acionado, no poderamos programar o Fim antes de End (no um comando), que , na verdade, fim de bloco.
59
Tambm possvel, em PL/SQL, declarar registros (%ROWTYPE) com a mesma estrutura de uma tabela, viso ou conjunto de colunas retornadas por um cursor. No necessrio conhecer a estrutura ou tipos de dados. A estrutura e os tipos de dados podem ser alterados. %ROWTYPE til para recuperar um registro em um comando SELECT. Como com %TYPE, qualquer restrio NOT NULL definida na coluna no copiada para o registro.
60
Nome da tabela
O registro criado tem campos com o mesmo nome e tipo das colunas da tabela ou viso.
Registros tambm so utilizados para a manipulao de cursores, que sero vistos na sequncia.
A varivel Reg_conta herdou o tipo correspondente a uma linha inteira da tabela Conta.
61
A fim de processar uma instruo SQL, o Oracle alocar uma rea de memria conhecida como rea de contexto. A rea de contexto contm as informaes necessrias para completar o processamento, incluindo o nmero de linhas processadas pela instruo e, no caso de uma consulta, o conjunto ativo, que o conjunto de linhas retornadas pela consulta. Portanto, cursores so reas compostas de linhas e colunas em memria que servem para armazenar o resultado de uma expresso que retorna 0(zero) ou mais linhas.
Cursores so trechos alocados de memria destinados a processar as declaraes SELECT. Podem ser definidos pelo prprio PL/SQL, chamados de Cursores Implcitos, ou podem ser definidos manualmente, so os chamados de Cursores Explcitos.
62
automaticamente (implicitamente) abre um cursor interno no SGBD sempre identificado como SQL.
til para testar o que aconteceu com o ltimo comando DML executado, atravs das "propriedades" do cursor, chamadas de atributos do cursor. Todos eles tm seu nome comeando com o smbolo % e so referenciados colocando-se o nome do cursor antes do %.
Pode
ser usado com algumas propriedades (FOUND, NOTFOUND, ROWCOUNT). Esse ltimo fornece quantas linhas foram afetadas pelo ltimo comando DML utilizado antes do IF.
Exemplo utilizando: SQL%FOUND
BEGIN Update FUNC set VL_SAL=240 where VL_SAL < 200; IF SQL%FOUND then commit; ELSE dbms_output.put_line('Valores nao encontrados'); END IF; END;
63
Atravs dos atributos do cursor implcito (chamado SQL) podemos testar a sada produzida por um comando SQL:
SQL%ROWCOUNT - n de linhas afetadas pelo ltimo comando
DML executado
SQL%FOUND - TRUE se o ltimo comando DML afetou uma ou
mais linhas
SQL%NOTFOUND - TRUE se o ltimo comando DML no afetou
nenhuma linha
SQL%ISOPEN - Sempre FALSE porque o PL/SQL fecha sempre os
64
Os cursores explcitos so chamados dessa forma porque so declarados formalmente na rea de declaraes do mdulo, ao contrrio do que ocorre com os cursores implcitos. So tipicamente mais flexveis e poderosos que os cursores implcitos, podendo substitu-los em qualquer situao. So utilizados para execuo de consultas que possam retornar nenhuma ou mais de uma linha. Neste caso, o cursor deve ser explicitamente declarado na rea Declare. O nome do cursor no pode ser igual ao da tabela.
Exemplo:
DECLARE
CURSOR <nome do cursor> IS <declarao SELECT>; BEGIN . END;
65
Dentro de um cursor, o comando SELECT no utiliza a clusula INTO. Ao fazermos a declarao, apenas foi definida uma estrutura que ser utilizada posteriormente, quando o SELECT for executado e a recuperao das linhas for realizada.
A primeira instruo realmente executvel relativa ao cursor a sua abertura, feita na rea de instrues atravs do comando OPEN.
no momento da abertura que o SELECT executado e as linhas recuperadas tornam-se disponveis para uso.
66
OPEN
FETCH
Abre o cursor
Disponibiliza a linha corrente e posiciona na prxima linha do cursor. As linhas armazenadas no cursor somente podero ser processadas quando o seu contedo for transferido para variveis que possam ser manipuladas no PL/SQL. Fecha o cursor.
67
CLOSE
NO
DECLARE
OPEN
FETCH
EMPTY ?
YES
CLOSE
68
Aps declarar uma varivel como sendo do tipo nome_do_cursor%rowtype, essa varivel ser um tipo de registro (varivel composta de diversas subvariveis) cujas subvariveis tero os mesmos nomes, tipos e tamanhos e estaro na mesma ordem dos campos especificados no comando SELECT do cursor. O contedo da varivel desse tipo referenciado com nome_do_registro.nome da subvarivel. Para cada cursor, quatro atributos podem ser verificados, e seus valores podem ser alterados a cada execuo de um comando FETCH. Esses atributos so:
nome_cursor%FOUND
retorna TRUE caso FETCH consiga retornar alguma linha e FALSE caso contrrio. Se nenhum FETCH tiver sido executado, ser retornado NULL. retorna FALSE caso FETCH consiga retornar alguma linha e TRUE caso contrrio. Se nenhum FETCH tiver sido executado, ser retornado NULL retorna o nmero de linhas j processadas pelo cursor. Se nenhum FETCH tiver sido executado, ser retornado 0 (zero). retorna TRUE caso o cursor esteja aberto e FALSE caso contrrio. 69
nome_cursor%NOTFOUND
nome_cursor%ROWCOUNT nome_cursor%ISOPEN
O comando FETCH recupera a prxima linha de um cursor e pode ser utilizado com variveis ou registro
FETCH nome_cursor INTO var1, var2, ...;
Ou
FETCH nome_cursor INTO reg_declarado;
onde:
var1, var2 so as variveis que vo receber os valores recuperados
pelo cursor. Estas variveis devem ser previamente declaradas e devem concordar em nmero e tipo com as expresses do comando SELECT do cursor. reg_declarado nome de registro pr-declarado compatvel com o cursor que ir receber os valores recuperados. Esse registro pode ser declarado da seguinte forma: reg_declarado nome_cursor%ROWTYPE;
70
Exemplo 1: Utilizando cursor com registro DECLARE CURSOR c_cliente IS SELECT codigo, nome FROM cliente; v_cliente c_cliente%rowtype; BEGIN OPEN c_cliente; LOOP FETCH c_cliente INTO v_cliente; EXIT when c_cliente%notfound; DBMS_OUTPUT.PUT_LINE('Cliente: '||v_cliente.nome); END LOOP; CLOSE c_cliente; END; Obs: Convm fechar todo cursor. Mximo de cursores abertos (50).
71
Nota:
exceo NO_DATA_FOUND levantada apenas em instrues SELECT...INTO, quando a clusula WHERE da consulta no corresponde a nenhuma linha. Quando nenhuma linha retornada por um cursor explcito ou uma instruo UPDATE ou DELETE, o atributo %NOTFOUND configurado como TRUE, no levantando a exceo NO_DATA_FOUND. A
72
O comando FOR ... LOOP, quando aplicado a um cursor, executa automaticamente as seguintes aes: Cria a varivel do tipo registro que receber os dados (DECLARE); Abre (OPEN) o cursor; Copia as linhas uma a uma (FETCH), a cada interao do comando; Controla o final do cursor; Fecha (CLOSE) o cursor. FOR <nome do registro> IN <nome do cursor> LOOP ... ; END LOOP ;
NOTA: Caso seja necessrio sair do loop do comando FOR durante sua execuo, o cursor dever ser fechado explicitamente com o comando CLOSE.
73
Exemplo: DECLARE CURSOR c_cliente IS SELECT codigo, nome FROM cliente; BEGIN FOR v_cliente IN c_cliente LOOP; DBMS_OUTPUT.PUT_LINE('Cliente: '||v_cliente.nome); END LOOP; END;
74
Parmetros de cursor - Geralmente o comando SELECT de um cursor possui uma clusula WHERE que especifica uma seleo de linhas a serem retornadas. Muitas vezes, temos necessidade de variar um dado a ser comparado nessa clusula, e isso pode ser feito atravs de uma espcie de parmetro passado para o cursor no momento de sua abertura.
Exemplo: DECLARE CURSOR c_emp (p_Dept emp.deptno%TYPE, p_Job emp.job%TYPE) IS SELECT * FROM emp WHERE deptno = p_Dept and job = p_Job; v_emp c_emp%rowtype; BEGIN OPEN c_emp(30, SALESMAN); LOOP FETCH c_emp INTO v_emp; EXIT when c_emp%notfound; DBMS_OUTPUT.PUT_LINE('Nome Empreg: ' || v_emp.ename); END LOOP; CLOSE c_emp; END;
75
PL/SQL PROCEDURE
armazenado diretamente no banco de dados e nem pode ser chamado diretamente de outros blocos PL/SQL.
[DECLARE] BEGIN
--statements
[EXCEPTION] END;
executado quando apropriado. Referem-se as seguintes construes: procedures, functions, packages e triggers.
CREATE PROCEDURE name IS BEGIN
--statements
[EXCEPTION] END;
76
PL/SQL PROCEDURE
PROCEDURES so subprogramas que executam uma determinada ao. No retornam valores, portanto, no so utilizadas para atribuir valores a variveis ou como argumento em um comando SELECT. Devemos utilizar a instruo CREATE OR REPLACE PROCEDURE para criar ou substituir uma procedure (neste ltimo caso a procedure anterior descartada sem nenhum aviso prvio). Se a procedure existir e as palavras-chave OR REPLACE no estiverem presentes, a instruo CREATE retornar o erro Oracle: ORA-955: Nome j est sendo usado por outro objeto. A procedure ser ento compilada e armazenada no banco de dados. O cdigo-fonte e a forma compilada ficam armazenados no servidor de banco de dados.
77
PL/SQL PROCEDURE
Sintaxe:
CREATE [OR REPLACE] PROCEDURE nome_procedure
[(argumento1 modo tipo_de_dados, argumento2 modo tipo_de_dados, ... argumentoN modo tipo_de_dados)] IS ou AS [variveis locais, constantes, ...] BEGIN ... END [nome_procedure]; /
78
corpo da procedure
PL/SQL PROCEDURE
PL/SQL PROCEDURE
Argumento - Nome da varivel que ser enviada ou retornada do ambiente chamador para a procedure. Pode ser passado em um dos trs modos a seguir:
IN (padro): Passa um valor do ambiente chamador para
procedure e este valor no pode ser alterado dentro da mesma. Seu valor inicial dentro da procedure NULL.
procedure. Esse valor pode ser alterado dentro da mesma e retornar com o valor atualizado para o ambiente chamador.
PL/SQL PROCEDURE
81
PL/SQL PROCEDURE
Corpo da procedure - O corpo de uma procedure um bloco PL/SQL com sees executveis declarativas e de exceo.
A seo declarativa est localizada entre as palavras-chave IS ou AS e a
palavra-chave BEGIN.
A seo executvel (a
palavras-chave BEGIN e EXCEPTION ou entre as palavras-chave BEGIN e END, caso no exista nenhuma seo de tratamento de excees. entre as palavras-chave EXCEPTION e END.
Exemplo:
CREATE OR REPLACE PROCEDURE nome_da_procedure [lista_de_parametros] AS /* A seo declarativa entra aqui*/ BEGIN /* A seo executvel entra aqui*/ EXCEPTION /* A seo de exceo entra aqui*/ END [nome_da_procedure];
82
PL/SQL PROCEDURE
CREATE OR REPLACE PROCEDURE novos_empregados (v_emp_no IN emp.empno%TYPE, v_emp_name IN emp.ename%TYPE, v_emp_job IN emp.job%TYPE, v_emp_hiredate IN emp.hiredate%TYPE, v_emp_sal IN emp.sal%TYPE, v_dept_no IN emp.deptno%TYPE) IS BEGIN INSERT INTO emp (empno, ename, job, hiredate, sal, deptno )
VALUES
v_emp_job,
v_emp_hiredate,
v_emp_sal,
83
PL/SQL PROCEDURE
A execuo do CREATE PROCEDURE apenas compila e armazena o procedimento no banco. Para execut-lo no SQL*Plus digite o comando: EXECUTE nome_da_procedure (argum1, argumN) Executando a procedure NOVOS_EMPREGADOS comando: a partir da linha de
: :
84
PL/SQL PROCEDURE
v_emp_sal
v_emp_comm BEGIN SELECT
emp.sal%TYPE;
emp.comm%TYPE; v_emp_sal,
ename, sal, comm INTO v_emp_name, v_emp_comm FROM emp WHERE empno = v_emp_no;
DBMS_OUTPUT.PUT_LINE('Nome: ' || v_emp_name || ' - Salario: ' || v_emp_sal || ' - Comissao: ' || v_emp_comm); END pesquisa_empregado; /
85
PL/SQL PROCEDURE
Executando a procedure PESQUISA_EMPREGADO da pgina anterior atravs de um bloco PL/SQL DECLARE v_emp emp.empno%type := &v_emp; BEGIN pesquisa_empregado(v_emp); END; /
Nota: Para executar uma procedure dentro de um bloco PL/SQL, escreva apenas seu nome seguido dos argumentos dentro do parnteses, conforme exemplo acima. O comando EXEC s utilizado quando a procedure executada na linha de comando do SQL/Plus.
86
PL/SQL PROCEDURE
nmero de telefone.
IS
BEGIN v_phone_no := SUBSTR (v_phone_no,1,4) || - || SUBSTR (v_phone_no,5,4); Dbms_output.put_line(Telefone: || v_phone_no);
END formata_telefone;
/ Nota: Procedures com argumentos do tipo OUT ou IN OUT s podero ser chamadas de dentro de um bloco PL/SQL, nunca pela linha de comando com o comando EXEC.
87
PL/SQL PROCEDURE
Executar a procedure
FORMATA_TELEFONE
da pgina anterior,
88
PL/SQL PROCEDURE
Exemplo 1:
END aumenta_valor;
/ 89
PL/SQL PROCEDURE
Executar a procedure AUMENTA_VALOR , da pgina anterior, passando os argumentos 10 e 8 para Cdigo da Categoria e Percentual, respectivamente: EXEC aumenta_valor ( 10 , 8 );
Visualizao da tabela PRODUTO aps execuo da procedure AUMENTA_VALOR, atribuindo um aumento de 8% sobre os produtos da categoria 10. SELECT * FROM produto;
CODIGO ---------1 2 3 NOME ---------------produto1 produto2 produto3 VALOR ---------54,00 120,00 80,00 CATEGORIA ----------------10 20 30
90
PL/SQL PROCEDURE
Exemplo 2: Cria uma procedure que recebe dois valores inteiros p_1 e
CREATE OR REPLACE PROCEDURE soma (p_1 IN NUMBER, p_2 IN NUMBER, p_t OUT NUMBER) IS BEGIN p_t := p_1 + p_2; DBMS_OUTPUT.PUT_LINE(p_1 || + || p_2 || = || p_t); END soma; /
Nota: Observe acima que os parmetros p_1 e p_2 foram definidos com o modo IN, pois representam valores que no sero alterados dentro da procedure. J o parmetro p_t foi definido com o modo OUT, pois o valor ser alterado no corpo da procedure.
91
PL/SQL PROCEDURE
Ainda sobre o exemplo da pgina anterior, outro detalhe a ser observado o nome da procedure (SOMA) depois da instruo END. Sua utilizao, embora opcional, recomendvel, pois torna a procedure mais fcil de ler e permite que o compilador sinalize pares BEGIN-END que no se correspondem, logo que possvel. A procedure SOMA poder ser chamada por um bloco PL/SQL annimo. Neste caso, escreva apenas o nome da procedure seguida de seus parmetros (argumentos).
DECLARE v_1 NUMBER := 4; v_2 NUMBER := 6; v_t NUMBER; BEGIN SOMA (v_1, v_2, v_t); END; /
Nota: Se no houver nenhum parmetro em uma procedure, no se deve utilizar parnteses na declarao, nem na chamada da procedure.
92
PL/SQL PROCEDURE
Visualizar erros de compilao de uma procedure durante sua criao: SHOW ERRORS PROCEDURE nome_procedure
Assim como outras instrues CREATE, criar uma procedure uma operao de DDL, portanto, um COMMIT implcito feito aps a execuo do comando CREATE PROCEDURE.
93
PL/SQL FUNCTION
FUNCTIONS so subprogramas que executam uma determinada ao e retornam valores. Alm das funes pr-definidas, como TO_CHAR, UPPER, ROUND, etc, podemos definir nossas prprias funes com cdigos PL/SQL e utiliz-las em outros cdigos ou mesmo dentro de comandos SQL padro, como o SELECT. Toda FUNCTION retorna valor. Caso seja feita uma FUNCTION sem o RETURN, o SQL/PLUS apresentar erro.
A FUNCTION retornar apenas um valor. Se for necessrio retornar vrios valores, substitua a FUNCTION por uma PROCEDURE com argumentos do tipo OUT.
94
PL/SQL FUNCTION
As funes tornam o banco mais lento, pois, cada vez que so chamadas so executadas e devolvem valor, consumindo memria e processador. Dependendo do que se deseja, a PROCEDURE mais indicada e o banco trabalha melhor. Se uma funo for utilizada para retornar como uma determinada coluna de um comando select, ela ser chamada exatamente a quantidade de vezes correspondente ao nmero de registros da tabela Se a tabela tiver 1.000.000 de registros, esta funo ser executada 1.000.000 de vezes.
95
PL/SQL FUNCTION
Sintaxe:
CREATE [OR REPLACE] FUNCTION nome_funcao [(argumento1 modo tipo_de_dados, argumento2 modo tipo_de_dados, ... argumentoN modo tipo_de_dados)] RETURN tipo_de_dados IS ou AS [variveis locais, constantes, ...] BEGIN ... END [nome_funcao]; /
96
PL/SQL FUNCTION
Exemplo: Criar uma funo que recebe um nmero de RA de aluno como
Criar a tabela ALUNO e inserir os registros antes de criar a FUNO. CREATE TABLE ALUNO (RA NUMBER, NOME VARCHAR2(20), SOBRENOME VARCHAR2(30)); INSERT INTO ALUNO VALUES (1,'ANTONIO','ALVES'); INSERT INTO ALUNO VALUES (2,'BEATRIZ','BERNARDES');
97
PL/SQL FUNCTION
V_NOMECOMPLETO VARCHAR2(60);
BEGIN SELECT NOME || ' ' || SOBRENOME INTO V_NOMECOMPLETO FROM ALUNO WHERE RA = P_RA; RETURN V_NOMECOMPLETO; END NOME_ALUNO; /
Executar a funo atravs de um comando SELECT: SELECT RA, NOME_ALUNO(RA) "NOME COMPLETO FROM ALUNO;
RA NOME COMPLETO ---------- ----------------------1 ANTONIO ALVES 2 BEATRIZ BERNARDES
98
PL/SQL FUNCTION
Visualizar erros de compilao de uma funo durante sua criao: SHOW ERRORS FUNCTION nome_funcao
Assim como outras instrues CREATE, criar uma funo uma operao de DDL, portanto, um COMMIT implcito feito aps a execuo do comando CREATE FUNCTION.
99
FUNCTION
como parte de uma
dado
Pode retornar nenhum, um, ou muitos Tem de retornar um valor nico valores
100
PL/SQL TRIGGER
TRIGGERS (gatilhos) so blocos PL/SQL disparados automtica e implicitamente sempre que ocorrer um evento associado a uma tabela (INSERT, UPDATE ou DELETE). Utilizadas para:
Manuteno de tabelas Implementao de nveis de segurana mais complexos Gerao de valores de colunas
(Exemplo: gerar o valor total do pedido a cada incluso, alterao ou excluso na tabela item_pedido)
101
PL/SQL TRIGGER
Sintaxe:
CREATE [OR REPLACE] TRIGGER nome_trigger {BEFORE/AFTER} {INSERT,UPDATE,DELETE} OF (nome_coluna1, nome_coluna2, ...) ON nome_tabela FOR EACH ROW REFERENCING, OLD AS ANTIGO NEW AS NOVO WHEN condio DECLARE ... BEGIN ... END; NOTA: A clusula REFERENCING est substituindo as reas de memria OLD e NEW por ANTIGO e NOVO.
102
PL/SQL TRIGGER
UPDATE
DELETE
103
PL/SQL TRIGGER
TIPO - Indica quantas vezes a trigger poder ser disparada. Os tipos podem ser: Comando: acionada antes ou depois de um comando, independentemente deste afetar uma ou mais linhas.
No permite acesso as linhas atualizadas por meio dos prefixos
:OLD e :NEW. No utiliza a clusula FOR EACH ROW no cabealho de criao. ao qual a trigger estiver associada.
Linha: acionada uma vez para cada linha afetada pelo comando
clusulas REFERENCING e WHEN em seu cabealho. Deve-se incluir a clusula FOR EACH ROW no cabealho.
Clusula WHEN - Utilizada para restringir as linhas que iro disparar a trigger. 104
PL/SQL TRIGGER
Exemplo: Criar uma trigger que adicione registros na tabela
VALOR_PRODUTO sempre que uma linha for atualizada na tabela PRODUTO ao ser executado o comando UPDATE.
Criar as tabelas PRODUTO e VALOR_PRODUTO antes de executar
a trigger. CREATE TABLE PRODUTO (codigo NUMBER(4), valor NUMBER(7,2)); CREATE TABLE VALOR_PRODUTO (codigo NUMBER(4), valor_anterior NUMBER(7,2), valor_novo NUMBER(7,2));
105
PL/SQL TRIGGER
VALUES
(:OLD.codigo, :OLD.valor, :NEW.valor); END; /
106
PL/SQL TRIGGER
Inserindo registros na tabela PRODUTO: INSERT INTO produto VALUES (1,2.5); INSERT INTO produto VALUES (2,3.2); INSERT INTO produto VALUES (3,5.8);
Atualizando dados na tabela PRODUTO. Neste momento, antes do comando UPDATE ser concludo, a trigger ser disparada e um novo registro ser inserido na tabela VALOR_PRODUTO para armazenar o valor antigo e o novo valor do produto mencionado na clusula WHERE do comando UPDATE, conforme corpo da trigger na pgina anterior: UPDATE produto SET valor = 5.4 WHERE codigo = 3;
---------3
VALOR_ANTERIOR
------------------5.8
VALOR_NOVO
--------------5.4
107
PL/SQL TRIGGER
podendo ser 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). inclusive em procedures e functions chamadas pela trigger.
No podem ser alteradas chaves primrias, nicas ou estrangeiras. No podem ser feitas referncias a campos do tipo LONG E LONG
RAW.
108
PL/SQL TRIGGER
Contedo das reas OLD e NEW (apenas triggers de linha) EVENTO INSERT UPDATE DELETE
Em triggers com clusula de tempo BEFORE possvel consultar e alterar o valor de :NEW. Em triggers com clusula de tempo AFTER possvel apenas consultar o valor de :NEW.
109
PL/SQL TRIGGER
comando INSERT.
110
PL/SQL TRIGGER
Exemplo:
CREATE OR REPLACE TRIGGER audit_emp BEFORE DELETE OR INSERT OR UPDATE ON emp FOR EACH ROW BEGIN IF DELETING THEN UPDATE audit_table SET del = del + 1 WHERE user_name = user AND table_name = `EMP` AND column_name IS NULL; ELSIF INSERTING THEN UPDATE audit_table SET ins = ins + 1 WHERE user_name = user AND table_name = `EMP` AND column_name IS NULL; ELSIF UPDATING THEN UPDATE audit_table SET upd = upd + 1 WHERE user_name = user AND table_name = `EMP` AND column_name IS NULL; END IF; END 111
PL/SQL TRIGGER
Um trigger pode ser desativado sem ser excludo. Quanto uma trigger desativada, ela ainda existe no dicionrio de dados, porm nunca acionada.
ALTER TRIGGER nome_da_trigger DISABLE; ALTER TRIGGER nome_da_trigger ENABLE;
Todas as triggers para uma tabela particular tambm podem ser ativadas ou desativadas utilizando o comando ALTER TABLE. ALTER TABLE nome_da_tabela DISABLE ALL TRIGGERS; ALTER TABLE nome_da_tabela ENABLE ALL TRIGGERS; Views do dicionrio de dados que contm informaes sobre as triggers e seus status: USER_TRIGGERS, ALL_TRIGGERS, DBA_TRIGGERS. 112
Um bloco PL/SQL no executa comandos DDL (CREATE TABLE, DROP TABLE,TRUNCATE, etc.), por isso, o Oracle oferece um recurso conhecido como NDS (Native Dynamic SQL) que permite, por meio da linguagem PL/SQL, executar dinamicamente comandos DDL. SQL dinmico um comando vlido, codificado dentro de uma string e executado atravs do comando EXECUTE IMMEDIATE. A procedure abaixo utiliza um comando DDL (CREATE TABLE) e no poder ser criada.
Exemplo:
CREATE OR REPLACE PROCEDURE cria_tabela IS BEGIN create table teste (coluna1 number(5)); END cria_tabela;
113
114
Inserindo linhas na tabela TESTE criada atravs da procedure CRIA_TABELA da pgina anterior:
INSERT INTO teste VALUES (1); INSERT INTO teste VALUES (2); INSERT INTO teste VALUES (3);
115
116
PL/SQL PACKAGE
Objetos do banco de dados equivalentes as bibliotecas que armazenam: procedures functions definies de cursores variveis e constantes definies de excees
117
PL/SQL PACKAGE
As variveis, constantes, cursores, excees e subprogramas estaro disponveis para uso externo ao package.
Corpo - rea onde so feitas as declaraes privadas que estaro
disponveis apenas dentro do package e a definio de aes para os subprogramas pblicos e privados.
O Corpo do package um objeto do dicionrio de dados separado da Especificao (cabealho). Ele no poder ser compilado com sucesso a menos que a Especificao j tenha sido compilada.
118
PL/SQL PACKAGE
ESPECIFICAO (Cabealho):
IS
PROCEDURE nome_procedure (lista_de_parametros); FUNCTION nome_function (lista_de_parametros); Declarao de variveis, constantes, excees e cursores pblicos
END nome_package;
119
PL/SQL PACKAGE
CORPO: CREATE OR REPLACE PACKAGE BODY nome_package IS Declarao de variveis, constantes, excees e cursores privados PROCEDURE nome_procedure (lista_de_parametros) IS ... BEGIN ... END nome_procedure; FUNCTION nome_function (lista_de_parametros) RETURN tipo_de_dado IS ... BEGIN ... RETURN END nome_funcao; END;
120
PL/SQL PACKAGE
Exemplo 1: Criando um package chamado PACK_1
Criando a ESPECIFICAO (Cabealho) do package CREATE OR REPLACE PACKAGE pack_1 IS PROCEDURE proc_1; FUNCTION func_1 RETURN VARCHAR2;
END pack_1;
/
121
PL/SQL PACKAGE
Criando o CORPO do package
PL/SQL PACKAGE
Executando a PROCEDURE dentro do PACKAGE PACK_1, criada
anteriormente:
EXEC pack_1.proc_1;
Executando a FUNCTION dentro do PACKAGE PACK_1, criada
anteriormente:
123
PL/SQL PACKAGE
Exemplo 2: Criando um package chamado PACK_ALUNO
Criando a ESPECIFICAO (Cabealho) do package CREATE OR REPLACE PACKAGE pack_aluno IS PROCEDURE adiciona_aluno (v_ra IN aluno.ra%TYPE, v_nome IN aluno.nome%TYPE );
END pack_aluno;
/
124
PL/SQL PACKAGE
Criando o CORPO do package
CREATE OR REPLACE PACKAGE BODY pack_aluno IS PROCEDURE adiciona_aluno (v_ra IN aluno.ra%TYPE, v_nome IN aluno.nome%TYPE) IS BEGIN INSERT INTO aluno (ra, nome) VALUES (v_ra, v_nome); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('RA j cadastrado'); END adiciona_aluno; END pack_aluno; /
PL/SQL PACKAGE
Quando um subprograma criado com CREATE OR REPLACE, ele armazenado no dicionrio de dados. Alm do texto de origem, o subprograma armazenado de uma forma compilada, conhecida como p-code (lido a partir do disco e armazenado na SGA podendo ser acessado por vrios usurios). A viso user_objects contm informaes sobre todos os objetos possudos pelo usurio atual, incluindo subprogramas armazenados (data de criao, ultima modificao, tipo de objeto, validade do objeto, etc.)
126
PL/SQL PACKAGE
Visualizar erros de compilao de um pacote (ESPECIFICAO) durante sua criao: SHOW ERRORS PACKAGE nome_pacote
Visualizar erros de compilao de um pacote (CORPO) durante sua criao: SHOW ERRORS PACKAGE BODYnome_pacote
Quando se elimina um pacote pela sua especificao, o corpo do pacote eliminado automaticamente. Para eliminar um pacote: DROP PACKAGE nome_do_pacote;