Sunteți pe pagina 1din 17

Oracle Database 11g: PL/SQL

FUNCTION
Objetivos
 Diferenciar entre procedure e função;
 Descrever o objetivo de usar uma função;
 Criar, editar e executar funções;
 Invocar funções;
 Remover funções.
Agenda
 Trabalhando com funções:
 Diferenciar entre procedure e função;
 Descrever as possibilidades de uso de função;
 Criar, invocar e remover funções.
Criando função
 Uma função deve ter obrigatoriamente uma instrução de
RETURN. Porém, é possível incluir mais de um RETURN no
código (depende da lógica inserida).
Diferença entre procedure e função
Procedures Funções
Executado como uma instrução PL/SQL. Invocado como parte de uma
expressão
Não deve conter a instrução RETURN Deve conter a instrução RETURN
no cabeçalho. no cabeçalho.
Pode passar valores usam um Pode retornar somente um único
parâmetro de saída. valor.
Pode conter uma expressão RETURN Deve conter pelo menos uma
sem conter um valor. instrução RETURN
Criando Função

SIM

Criar e editar Compilação com Visualizar


função advertências e/ ou erros? advertências
e/ ou erros de
NÃO compilação

Executar função
Criando Função
CREATE OR REPLACE FUNCTION verifica_gerente (
p_employee_id employees.employee_id%TYPE) RETURN NUMBER
IS
v_gerente employees.manager_id%TYPE;
BEGIN
SELECT manager_id
INTO v_gerente
FROM employees
WHERE employee_id = p_employee_id;
RETURN v_gerente;
END;

7
Invocando Função
SET SERVEROUTPUT ON
DECLARE
v_gerente employees.manager_id%TYPE;
BEGIN
v_gerente := verifica_gerente(101);
DBMS_OUTPUT.PUT_LINE('ID do gerente: ' || v_gerente);
END;
/

EXEC dbms_output.put_line(verifica_gerente(200));

8
Invocando Função em expressão SELECT

SELECT first_name || ' ' || last_name, employee_id,


verifica_gerente(employee_id)
FROM employees
WHERE employee_id IN (100, 101, 200);

9
Chamada de função criada pelo
usuário em instrução SQL
 Função criada pelo usuário atua como uma função de linha
simples, ou seja, cada registro da instrução SELECT é analisado
pela função definida na lista SELECT.
 Pode ser usada em:
 Lista SELECT;
 Utilizada na cláusula condicional do WHERE ou HAVING;
 Cláusula CONNECT BY, START WITH, ORDER BY e
GROUP BY;
 Cláusula VALUES da instrução de INSERT;
 Cláusula SET da instrução de UPDATE.
Restrições da chamada de função a
partir de instruções SQL
 Para uma função definida pelo usuário ser chamada a partir de
instruções SQL faz-se necessário o seguinte:
 A função precisa estar definida como função armazenada
(deve existir em um esquema do banco de dados);
 Deve aceitar somente parâmetros IN (faz parte da regra da
função usar este tipo de parâmetro);
 Retornar um tipo de dados válido, não um tipo PL/SQL
especificado.

 Para que uma função seja executada em instrução SQL:


 Quem esta invocando deve ser o criador da função
(esquema) ou ter o privilégio de EXECUTE sobre ela.
Restrições da chamada de função a
partir de instruções SQL (cont.)
A instrução SELECT não pode conter uma instrução
DML;

Se a instrução que chamar a função estiver


executando uma instrução DML (UPDATE ou DELETE)
sobre a tabela T, a função usada não pode realizar
SELECT ou DML sobre a mesma tabela T;

A função não pode finalizar uma transação, ou seja,


executar COMMIT ou ROLLBACK.
Restrições da chamada de função a
partir de instruções SQL (cont.)
CREATE OR REPLACE FUNCTION dml_call_sql (
p_salario NUMBER) RETURN NUMBER
IS
BEGIN
INSERT INTO employees
(employee_id, last_name, email, hire_date,
job_id, salary)
VALUES (employees_seq.NEXTVAL, 'SILVA',
'silva@teste.com', SYSDATE, 'SH_CLERK', p_salario +
200);
RETURN (p_salario + 200);
END;

UPDATE employees
SET salary = dml_call_sql(4000)
WHERE employee_id = 180;
Notação de parâmetros para
função em SQL
 PL/SQL permite que os argumentos na chamada das subrotinas
sejam especificados em notação posicional, nomeada ou
mista;

 Antes do Oracle 11g, somente a notação posicional era


suportada na chamada em SQL;

 A partir do Oracle 11g as notações nomeada e mista podem


ser usadas na chamada em rotinas PL/SQL a partir de
expressões SQL.
Notação de parâmetros para função
em SQL: Exemplos
CREATE OR REPLACE FUNCTION realiza_calculo (
p_valor01 IN NUMBER DEFAULT 1,
p_valor02 IN NUMBER DEFAULT 5)
RETURN NUMBER
IS
v_resultado NUMBER;
BEGIN
v_resultado := p_valor01 + (p_valor02 * 6);
RETURN v_resultado;
END;

SELECT realiza_calculo(10, 12) posicional,


realiza_calculo(p_valor02 => 15) nomeada,
realiza_calculo(10, p_valor02 => 15) mista
FROM dual;
Visualizando função a partir do
dicionário de dados
SELECT *
FROM user_source
WHERE name LIKE UPPER('realiza_calculo')
AND type = 'FUNCTION'
ORDER BY line;
Removendo Função
 Remover uma função usando o comando DROP todos os
usuários perderão o seu privilégio de EXECUTE sobre ela;

DROP FUNCTION NOME_DA_FUNÇÃO;

 Usando a instrução CREATE OR REPLACE as permissões


serão mantidas.

CREATE OR REPLACE FUNCTION;

S-ar putea să vă placă și