Você está na página 1de 26

Engenharia da Computao

BANCO DE DADOS II
Aula 8
(10/06) mario.godoy@univasf.edu.br

Universidade Federal do Vale do So Francisco - UNIVASF Colegiado de Engenharia de Computao CECOMP

PL/SQL Procedural Language/Structured Query Language

Linguagem PL/SQL
A linguagem PL/SQL permite: Constantes; Variveis; Subprogramas (procedures e funes); Instrues condicionais; Controle de erros de execuo; Encapsulamento; Interface com rotinas escritas em outras linguagens.

Prof. Mario Godoy

PL/SQL - Sintaxe

Declare

ooo
Begin

Variveis PL/SQL utilizadas Aes executveis Opcional! O que fazer em caso de erro.

ooo
Exception

ooo
End;

Prof. Mario Godoy

PL/SQL - Benefcios
PERFORMANCE A PL/SQL pode: Reduzir o trfego na rede pelo envio de um bloco contendo diversos comandos de SQL agrupados; Melhor performance; Reuso de programao o cdigo pode ser compartilhado com diversas aplicaes (Stored Procedure); Portabilidade este cdigo roda em qualquer sistema operacional e plataforma, desde que exista o Oracle instalado.

Prof. Mario Godoy

Comentrios
Comentrios em PL/SQL: Comentrio de linha: -- Comentrio de bloco de cdigo:

/* (incio) */ (fim)

Prof. Mario Godoy

PL/SQL Palavras Reservadas


No devem ser utilizados na declarao de variveis. if, end, do, while, else, entre outras. Evite usar os mesmos nomes das colunas das tabelas. Boa prtica varNome

Prof. Mario Godoy

PL/SQL Declarando Contantes


Exemplo: DECLARE varPI ... BEGIN ... END; CONSTANT NUMBER(9,7) := 3.1415927;

Prof. Mario Godoy

PL/SQL Declarando Variveis


Exemplos: DECLARE v1 v2 v3 ... BEGIN ... END; Obs.: no inicializadas recebem o valor NULL (v4). NUMBER(4):= 1; NUMBER(4):= DEFAULT 1; NUMBER(4) NOT NULL := 1;

v4 NUMBER(4);

Prof. Mario Godoy

PL/SQL Atribuio
Podemos atribuir valores s variveis de duas maneiras: Utilizando o operador de atribuio: total

:= varQuant * varValor;

Utilizando um comando SELECT com a clusula INTO: SELECT matricula_aluno, nome_aluno INTO FROM varMatricula, varNome aluno

Where ...; SELECT INTO utilizado para que o resultado seja

armazenado em variveis;

Prof. Mario Godoy

10

Comentrios - Exemplo
Exemplo de cdigo PL/SQL. SQL> DECLARE 2 3 4 5 6 VALOR END_CASA BEGIN VALOR := -- A atribuio ser feita na outra linha 'RUA A'; VARCHAR2(10); VARCHAR2(20);

7 END_CASA := /* a atribuio vir a seguir */ 'RUA B S/N'; 8 END; 9 / Procedimento PL/SQL concludo com sucesso

Prof. Mario Godoy

11

PL/SQL Select Into


Caractersticas do Select Into Manipular os dados obtidos pelo select; Faz somente leitura de uma linha.

Prof. Mario Godoy

12

PL/SQL Tipos de Dados


Constantes e variveis podem herdar o tipo de outras variveis, de colunas ou at da linha inteira de uma tabela. Herdando o tipo de uma varivel previamente declarada: nome_da_variavel_2 nome_da_variavel_1%Type;

Herdando o tipo de uma coluna de uma tabela: nome_da_variavel nome_da_tabela.nome_da_coluna%Type;

Herdando o tipo de uma linha inteira de uma tabela: nome_da_variavel nome_da_tabela%Rowtype;

Prof. Mario Godoy

13

PL/SQL Tipo de Dado - %ROWTYPE


Herda a definio de um registro; Varivel composta de diversas subvariveis; Mesmos Nomes, Tipos, Tamanhos e Ordem dos campos especificados no comando SELECT; Desnecessrio conhecer em detalhe a tabela base. DECLARE varRegistro_emp BEGIN SELECT * INTO varRegistro_emp FROM t_empregado WHERE... Referenciar: varRegistro_emp.nome_da_subvarivel
Prof. Mario Godoy
14

t_empregado%ROWTYPE

PL/SQL Exemplo
DECLARE Var_RA ALUNO.cod_aluno%TYPE; Var_NOME ALUNO.NOME%TYPE; BEGIN SELECT cod_aluno, NOME INTO Var_RA, Var_NOME FROM ALUNO WHERE cod_aluno=1; DBMS_OUTPUT.PUT_LINE(Var_RA ||' - '|| Var_NOME); END; Obs.: || utilizado para concatenao.

Prof. Mario Godoy

15

Exerccios 1 - Utilizando PL/SQL


Adicione o seguinte registro na tabela t_departamento: cod_depto=d0020, Localizacao=Aracaju, Nome_Depto=Testes
BEGIN INSERT INTO t_departamento (cod_depto, localizacao, Nome_Depto) VALUES ('d0020','Aracaju', 'Testes'); END;

Prof. Mario Godoy

16

Exerccios 2 - Utilizando PL/SQL


Altere a localizao do departamento d0020 para Paulo Afonso, na tabela t_departamento abaixo:

BEGIN update t_departamento set localizacao='Paulo Afonso' where cod_depto='d0020'; END;

Prof. Mario Godoy

17

Exerccios 3 - Utilizando PL/SQL


Exclua da tabela cod_depto=d0020. t_departamento, o registro cujo

BEGIN DELETE FROM t_departamento WHERE cod_depto='d0020'; END;

Prof. Mario Godoy

18

PL/SQL Comandos de deciso Condicional

PL/SQL - IF
O comando IF verifica uma condio. Sintaxe

IF (CONDIO) THEN <Intruo> ELSE / [ELSEIF] <Intruo> END IF;

IF (CONDIO) THEN <Intruo> END IF;

Prof. Mario Godoy

20

PL/SQL - IF
Exemplos:

If Var1 > 10 then Var2 := Var1 + 20 ; Else Var2 := Var1 * Var1 ; End If ;

If Var1 > 10 then Var2 := Var1 + 20; Else IF Var1 between 5 and 8 then Var2 := 2 * Var1 ; Else Var2 := Var1 * Var1; End If; End If;

Prof. Mario Godoy

21

PL/SQL - GoTo
Caractersticas do GoTo: Desvio incondicional para um Label; O Label deve ser nico dentro do escopo; Raramente utilizado, existem recursos mais recomendados.

Prof. Mario Godoy

22

PL/SQL Goto - Exemplo


DECLARE varConta BEGIN <<INICIO>> varConta := varConta + 1; DBMS_OUTPUT.PUT_LINE(varConta); IF varConta < 5 THEN GOTO INICIO; END IF; END;
Procedimento PL/SQL concludo com sucesso.

NUMBER := 0;

LABEL

Executa a ao de Desvio

Prof. Mario Godoy

23

PL/SQL Goto - Restries


Quando no pode utilizar Goto: Desvio para dentro de um IF ou Loop (GoTo Proximo_IF). Desvio para dentro de um sub-bloco (GoTo sub bloco). Desvio para fora de um subprograma (GoTo Para_Fora). Desvio para dentro de um bloco a partir da rea de exceo (GoTo Incio).

Prof. Mario Godoy

24

PL/SQL Estruturas de controle


LOOP FOR WHILE

Prof. Mario Godoy

25

PL/SQL Estruturas de controle - LOOP


Sintaxe LOOP Instruo_n; EXIT [WHEN condio]; END LOOP;

Condio - uma varivel booleana ou uma expresso que evolui para (TRUE, FALSE ou NULL).

Prof. Mario Godoy

26

PL/SQL Estruturas de controle - LOOP


Exemplo de um cdigo para Inserir 10 registros na tabela T_Itens: Exemplo DECLARE varNomeItem T_ITENS.Nome_item%TYPE := Caneta; varContador number(2) := 1; BEGIN LOOP INSERT INTO T_ITENS(Nome_Item) values (varNomeItem); varContador:= varcontador+1; Exit when varcontador >10; END LOOP; END;
Prof. Mario Godoy
27

Exerccio.
Atravs de uma instruo PL/SQL insira na tabela FUNCAO (da esquerda) os registros exibidos na figura da direita.

Prof. Mario Godoy

28

Exerccio.
Atravs de uma instruo PL/SQL insira na tabela FUNCAO (da esquerda) os registros exibidos na figura da direita.

DECLARE varContador FUNCAO.cod_funcao%TYPE := 7; BEGIN LOOP INSERT INTO funcao(cod_funcao, nome_funcao, salario) values (varContador, 'padrao', 0.0); varContador:= varContador + 1; Exit when varContador > 10; END LOOP; Prof. Mario Godoy END;

29

PL/SQL Estruturas de controle - FOR


O comando FOR permite que controle o nmero de vezes que as aes foram repetidas e define quando termina essa repetio. Sintaxe:
FOR variavel_de_controle IN [REVERSE ( menor_valor .. maior_valor )] LOOP Instruo 1; Instruo n; END LOOP;

Exemplo: Declare varX number; Begin FOR varX IN 1..10 LOOP dbms_output.put_line ('Loop num: ' || varX); END LOOP; End;
Prof. Mario Godoy
30

PL/SQL Estruturas de controle - FOR


O comando FOR permite que controle o nmero de vezes que as aes foram repetidas e define quando termina essa repetio. Sintaxe:
FOR variavel_de_controle IN [REVERSE ( menor_valor .. maior_valor )] LOOP Instruo 1; Instruo n; END LOOP;

Exemplo 2:

Declare varX number; varIni number := 10; varFim number := 25; Begin FOR varX IN varIni..varFim LOOP dbms_output.put_line ('Loop num: ' || varX); END LOOP; End;

Prof. Mario Godoy

31

PL/SQL Estruturas de controle - WHILE


O comando WHILE verifica uma condio a cada incio de execuo. Sintaxe WHILE condio LOOP Instruo 1; Instruo n; END LOOP; Exemplo: Declare varX number := 0; Begin WHILE varX < 10 LOOP dbms_output.put_line(varX); varX := varX + 1; END LOOP; End;
Prof. Mario Godoy
32

Stored Procedure

Stored Procedure
Stored Procedure (procedimentos armazenados), um conjunto de comandos SQL armazenados; Procedures podem utilizadas programao PL/SQL; atravs da linguagem de

Diferena bsica entre Procedure e Function no Oracle: OBRIGATRIAMENTE uma Function deve retornar um valor; Procedures podem ou no retornar valores; Funes s retornam um nico resultado; Procedures podem retornar mais de um resultado.

Prof. Mario Godoy

34

Stored Procedure Criao


SINTAXE
CRIA [ou Substitui] Nome da Procedure

IS ou AS

CREATE [OR REPLACE] PROCEDURE procedure_name [ (parametro modo tipo_de_dado) ] IS IN , OUT ou IN OUT [declaration_section] Incio do corpo do PL/SQL. BEGIN Aes executadas na procedure executable_section; uma declarao necessria [EXCEPTION Opcional exception_section] END procedure_name;

Fim da instruo
Prof. Mario Godoy
35

Stored Procedure Modos de Parmetro


Existem trs modos de parmetros que podem ser declarados: IN - Indica que o parmetro de entrada (Default); OUT - Indica que o parmetro de sada; IN OUT - Indica que o parmetro de entrada e sada. Exemplo: Se uma procedure declarada como a seguir: Create or replace procedure add_bonus (var_cod_func IN t_funcionario.cod_func%TYPE) ... Um dado deve ser informado na chamada da procedure add_bonus(00001);

Prof. Mario Godoy

36

Stored Procedure Tipos de Dados


Os TIPOS de dados de parmetro pode ser: Qualquer tipo de dado do Oracle ou do PL/SQL; Referencias como %TYPE, %ROWTYPE;

Se uma procedure declarada como a seguir: Create or replace procedure add_salario (var_cod_func IN t_funcionario.cod_func%TYPE)

Referencia o mesmo tipo e tamanho de dado da coluna cod_func da tabela t_funcionario

Prof. Mario Godoy

37

Stored Procedure Criao da estrutura bsica


Estrutura bsica para criao de uma procedure; Obs.: este trecho pode ser utilizado como modelo para futuras procedures. CREATE OR REPLACE PROCEDURE procBasico IS BEGIN NULL; END; O cdigo abaixo exibe uma mensagem para o usurio. CREATE OR REPLACE PROCEDURE procMensagem IS BEGIN DBMS_OUTPUT.PUT_LINE('Minha mensagem qualquer!'); END; begin procMensagem(); Prof. Mario Godoy end;

38

Stored Procedure - Executando


Atravs de PL/SQL: BEGIN Nome_da_Procedure('parametro_1 ', 'parametro_n'); END; Executar um procedimento em um servidor remoto: exec nome_do_servidor.nome_do_BD.nome_do_procedimento; Outras formas de Executar uma Stored Procedure: execute BuscaCliente 'Pedro; exec BuscaCliente 'Pedro; BuscaCliente 'Pedro; CALL BuscaCliente 'Pedro;

Prof. Mario Godoy

39

Stored Procedure Excluindo uma Procedure


Excluindo uma procedure do banco: Drop PROCEDURE Nome_da_Pocedure

Prof. Mario Godoy

40

Stored Procedure Erros e Debug


Ao criar uma procedure com erros de compilao, temos: Warning: Procedure created with compilation errors.

possvel debugar erros atravs dos comandos: SHOW ERRORS PROCEDURE Nome_Da_Procedure ou SHOW ERRORS Nome_Da_Procedure

Prof. Mario Godoy

41

Stored Procedure - Usurio


Visualizar as procedures do usurio: SELECT object_name, object_type FROM user_objects WHERE object_type in ('PROCEDURE') ORDER BY object_name;

Prof. Mario Godoy

42

Stored Procedure Argumentos


Para visualizar os argumentos de uma procedure j criada: Sintaxe DESC Nome_da_Procedure; Exemplo DESC inserir_depto

Prof. Mario Godoy

43

Stored Procedure Exemplos


Tabela: T_Departamento

Prof. Mario Godoy

44

Stored Procedure Exemplo Insert


Construindo uma procedure para INSERIR dados em uma tabela: CREATE or REPLACE PROCEDURE Inserir_Depto( varCOD_DEPTO IN T_DEPARTAMENTO.cod_depto%TYPE, varLOCALIZACAO IN T_DEPARTAMENTO.Localizacao%TYPE, varNOME_DEPTO IN T_DEPARTAMENTO.nome_depto%TYPE ) IS BEGIN INSERT INTO T_DEPARTAMENTO(cod_depto, localizacao, nome_depto) values (varCOD_DEPTO, varLOCALIZACAO, varNOME_DEPTO); END Inserir_Depto;

Prof. Mario Godoy

45

Stored Procedure Exemplo Insert


Executando a procedure INSERIR_DEPTO j criada:

BEGIN Inserir_Depto('d0008', 'Paulo Afonso', 'Seguro'); Inserir_Depto('d0009', 'Delmiro Gouveia', 'Servios Gerais'); END;

Prof. Mario Godoy

46

Stored Procedure Exemplo UPDATE


Construindo uma procedure para ALTERAR dados em uma tabela: CREATE or REPLACE PROCEDURE ALTERAR_Depto( varCOD_DEPTO IN T_DEPARTAMENTO.cod_depto%TYPE, varLOCALIZACAO IN T_DEPARTAMENTO.Localizacao%TYPE, varNOME_DEPTO IN T_DEPARTAMENTO.nome_depto%TYPE ) IS BEGIN UPDATE T_DEPARTAMENTO SET localizacao = varLOCALIZACAO, nome_depto = varNOME_DEPTO WHERE cod_depto = varCOD_DEPTO; END ALTERAR_Depto;
Prof. Mario Godoy
47

Stored Procedure Exemplo UPDATE


Executando a procedure ALTERAR_DEPTO criada:

BEGIN ALTERAR_Depto('d0009','Maceio', 'Logistica'); ALTERAR_Depto('d0007','Recife', 'Produo'); END;

Prof. Mario Godoy

48

Stored Procedure Exemplo DELETE


Construindo uma procedure para APAGAR dados em uma tabela: CREATE or REPLACE PROCEDURE Apaga_Depto( varCOD_DEPTO IN T_DEPARTAMENTO.cod_depto%TYPE ) IS BEGIN DELETE FROM t_DEPARTAMENTO WHERE COD_depto = varCOD_DEPTO; END Apaga_Depto;

Prof. Mario Godoy

49

Stored Procedure Exemplo DELETE


Executando a procedure APAGA_DEPTO criada:

BEGIN Apaga_Depto('d0008'); END;

Prof. Mario Godoy

50

Materiais de apoio
http://www.htmlstaff.org/postgresqlmanual/sql-commands.html (comandos SQL - PostgreSQL) http://info.abril.com.br/download/4346.shtml download) (Oracle 10g free

http://www.w3schools.com/sql/sql_tryit.asp

Prof. Mario Godoy

51