Faculdades Network Oracle PL/SQL Overview Prof. Edinelson
PL/SQL Linguagem de Programação Procedural Language / Structured Query Language Une o estilo modular de linguagens de programação à versatilidade no acesso a banco de dados obtidas via SQL. PL/SQL é proprietária da Oracle
PL/SQL É uma extensão da linguagem SQL e que incorpora recursos procedurais à mesma. Variáveis e tipos Estruturas de Controle Stored procedures Procedures e functions Packages Tratamento de erros As instruções SQL podem ser utilizadas normalmente nos programas e blocos PL/SQL.
Pode-se escrever programas e criar bibliotecas que podem ser reutilizadas em diferentes ambientes.
Benefícios Os programas podem ser transportados para qualquer ambiente (SO ou plataforma) que suporte o servidor Oracle e PL/SQL, ou seja, os programas PL/SQL podem ser executados em qualquer lugar onde o servidor Oracle está rodando.
Ambiente Servidor Oracle 10g Cliente SQL Plus SQL Developer
Estrutura de um bloco PL/SQL DECLARE -- declarações BEGIN -- instruções END;
Estrutura de um bloco PL/SQL DECLARE (opcional) - Declarações de variáveis, constantes, cursores e exceções definidas pelo usuário BEGIN (obrigatório) - Instruções SQL - Instruções/comandos PL/SQL EXCEPTION (opcional) - Ações a serem desempenhadadas quando ocorrem erros END; (obrigatório)
Pode existir bloco dentro de bloco Blocos PL/SQL
Declaração de variáveis
Uso de variáveis Armazenamento temporário Manipulação de valores armazenados Reutilização Facilidade de manutenção
Manipulando Variáveis em PL/SQL Declarar e inicializar as variáveis na seção declare. Atribuir novos valores às variáveis na seção executável. Passar valores aos blocos PL/SQL através de parâmetros (variáveis de ligação). Ver os resultados pelas variáveis de saída (variáveis do ambiente de chamada).
Variáveis PL/SQL Variáveis PL/SQL: Escalar (valores únicos =>char, varchar2, number, date, etc) Composta (registros) Referência (ponteiros) LOB (objetos grandes) (especificam a localização de objetos grandes. Ex: imagens) Variáveis Não-PL/SQL: bind or host variables Usadas para passar valores obtidos durante a execução de PL/SQL para o ambiente SQL*Plus
Tipos de variáveis
Tipos de dados escalares básicos CHAR [(tam máximo)] VARCHAR2 (tam máximo) LONG LONG RAW Number [(precisão,casas decimais)] BOOLEAN (true, false, null) DATE TIMESTAMP BINARY_INTEGER e PLS_INTEGER (requer menos espaço de armazenamento que NUMBER)
Declaração e atribuição Delimitada por ;
PL/SQL Declaração de Variáveis Cada variável deve ser declarada seguida de seu tipo, isto é, não é possível reaproveitar uma declaração de tipo. Ex.: Correto: salario_anual Number(5,2); salario_mensal Number(5,2); dta_nasc Date := Sysdate; Errado: salario_anual, salario_mensal Number(5,2);
Regras de nomeação Duas variáveis podem ter o mesmo nome, contanto que elas estejam em blocos diferentes. O nome da variável não deve ser igual ao nome das colunas de tabela usado no bloco.
Constantes A declaração de constantes é idêntica a de variáveis; com um adendo, a utilização da palavra CONSTANT. Ex.: novopreco CONSTANT real :=3.54;
Inicialização e palavras chave Operador de atribuição ( := ) Palavra chave DEFAULT Restrição NOT NULL
Mais exemplos
PL/SQL Declaração de Variáveis O atributo %Type permite que se utilize: O tipo de outra variável anteriormente declarada O tipo de uma coluna de uma tabela Ex: v_ultimo_nome v_prim_nome Func.nome%Type; v_ultimo_nome%type;
Vamos analisar o exemplo
Exemplo1.sql Testando - 1º. Exemplo Set serveroutput on DECLARE v_inv_value number(10,2); v_price number(8,2) := 10.25; v_quantity number(8,0) := 10; BEGIN v_inv_value := v_price * v_quantity; dbms_output.put('o valor é '); dbms_output.put_line(v_inv_value); END; /
Atenção PL/SQL not designed for user interface programming
Estruturas de Controle IF / Then / Else IF / Then / Elsif
Controlando o Fluxo de Execução PL/SQL Pode-se alterar o fluxo lógico de instruções usando estruturas para controle de loop e instruções IF condicionais. Instruções IF condicionais: IF-THEN-END IF IF-THEN-ELSE-END IF IF-THEN-ELSIF-END IF
Instrução IF
Instrução IF
Instrução IF
Instruções IF-THEN-ELSE
Instruções IF-THEN-ELSE
If Var1 > 10 then Var2 := Var1 + 20 ; Else Var2 := Var1 * Var1 ; End If ; If Var1 > 10 then Var2 := Var1 + 20 ; Else If Var1 between 7 and 8 then Var2 := 2 * Var1; Else Var2 := Var1 * Var1 ; End If ; End If ;
PL/SQL ESTRUTURA DA LINGUAGEM CARACTERES SUPORTADOS Todo alfabeto maiúsculo e minúsculo Algarismos de 0 a 9 Símbolos especiais: ( ) + - * / < > =! ~ ; : @ %, # & $ _ { }? [ ]. OPERADORES ARITMÉTICOS + Adição - Subtração * Multiplicação / Divisão ** Exponenciação OPERAÇÕES RELACIONAIS < > Diferente > Maior ^ = Diferente < Menor! = Diferente > = Maior Igual = Igual < = Menor Igual
Controle Interativo
Controle Interativo: Instruções Loop
Loop Básico
Loop Básico
Loop WHILE
Loop WHILE
Loop FOR
Loop FOR - Exemplo
Loop FOR
Diretrizes para o uso de Loops Use um Loop básico quando os comandos dentro do mesmo precisam ser executados ao menos uma vez Use um While se a condição deve ser avaliada primeiro Use o FOR quando você conhece a quantidade de iterações
Começando a programar em PL/SQL Exemplo2.sql: Criação da tabela teste Create table teste (num number(4), data date, observação varchar2(100));
Exemplo3.sql Começando a programar em PL/SQL declare cont int:=0; begin for cont in 1..10 loop insert into teste values (cont, sysdate, 'Numero ' cont); end loop; end;
exemplo4.sql Exemplo do comando While declare cont int:=0; begin delete from teste; while cont <= 5 loop insert into teste values (cont, sysdate, 'Numero ' cont); cont:=cont+1; end loop; end;
exemplo5.sql Mais um exemplo. declare cont int:=0; Begin delete teste; for cont in 1..10 loop if mod(cont,2) = 0 then insert into teste values (cont, sysdate, 'PAR'); else insert into teste values (cont, sysdate, 'IMPAR'); end if; end loop; end;
Instruções SQL em PL/SQL
Select em PL/SQL Extrair apenas uma linha de dados de um banco de dados usando o comando SELECT. Fazer alterações nas linhas no banco de dados usando os comandos DML. Comportamento de uma transação (COMMIT, ROLLBACK ou SAVEPOINT) em PL/SQL.
Select em PL/SQL
Select em PL/SQL
Select em PL/SQL
Insert
Cursores Cursores são trechos alocados de memória destinados a processar as declarações SELECT. Podem ser definidos pelo próprio PL/SQL, chamados de Cursores Implícitos, ou podem ser definidos manualmente, são os chamados de Cursores Explícitos.
Cursores Explícitos Esta técnica exige que o cursor seja declarado manualmente na seção DECLARE, e deve conter somente declarações SELECT. Para a sua utilização os seguintes passos devem ser observados: 1. Declarar o Cursor 2. Abrir o Cursor ( Preparar para sua utilização ) Open 3. Buscar os dados Fetch 4. Liberar memória após o uso ( Fechar o Cursor ) Close
Cursores Explícitos
Cursores Explícitos
Declarando o Curso
Exemplo Exemplo6.sql DECLARE v_empno employees.employee_id%type; v_ename employees.last_name%type; CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; BEGIN OPEN emp_cursor; FOR i IN 1..10 LOOP FETCH emp_cursor INTO v_empno, v_ename; DBMS_OUTPUT.PUT_LINE (TO_CHAR(v_empno) ' ' v_ename); END LOOP; END; /
Exemplo7.sql Cursor Exemplo DECLARE CURSOR emp_cursor IS SELECT employee_id, last_name FROM employees; emp_record emp_cursor%rowtype; BEGIN OPEN emp_cursor; LOOP FETCH emp_cursor INTO emp_record; EXIT WHEN emp_cursor%notfound; INSERT INTO temp_list (empid, empname) VALUES (emp_record.employee_id, emp_record.last_name); END LOOP; COMMIT; CLOSE emp_cursor; END; /
Procedures Uma procedure nada mais é do um bloco PL/SQL nomeado. A grande vantagem sobre um bloco PL/SQL anônimo é que pode ser compilado e armazenado no banco de dados como um objeto de schema. Graças a essa característica as procedures são de fácil manutenção, o código é reutilizável e permitem que trabalhemos com módulos de programa. Uma procedure é, então, um bloco PL/SQL nomeado que pode aceitar argumentos (também chamado de parâmetros) e pode ser chamada por um programa, uma sessão SQL ou uma trigger.
Sintaxe: Exemplo: Procedimentos CREATE [OR REPLACE] PROCEDURE procedure_name (parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, ) IS AS PL/SQL Block SQL> CREATE OR REPLACE PROCEDURE raise_salary 2 (v_id in emp.empno%type) 3 IS 4 BEGIN 5 UPDATE emp 6 SET sal = sal * 1.1 7 WHERE empno = v_id; 8 END raise_salary; 9 / Executar: SQL> EXECUTE raise_salary (7369) PL/SQL> raise_salary(7369)
Sintaxe: Funções CREATE [OR REPLACE] FUNCTION function_name (parameter1 [mode1] datatype1, parameter2 [mode2] datatype2, ) RETURN datatype IS AS PL/SQL Block Exemplo: SQL> CREATE OR REPLACE FUNCTION get_sal 2 (v_id IN emp.empno%type) 3 RETURN NUMBER 4 IS v_salary emp.sal%type :=0; 5 BEGIN 6 SELECT sal INTO v_salary 7 FROM emp WHERE empno = v_id; 8 RETURN (v_salary); 9 END get_sal; 10 /