Procedimentos e Funções

Slides:



Advertisements
Apresentações semelhantes
III – Oracle 9i Coleções.
Advertisements

Estudo de Caso, modelo Oracle 10g
Gerenciamento de Dados e Informação Estudo de caso – PL/SQL
Shop Notas de implementação [Exercício da Disciplina de ADAV]
Triggers Marilde Santos.
Sequences Marilde Santos. O que são Sequences? Valores sequenciais podem ser gerados automaticamente pelo Oracle com o uso de sequences. A sequence gera.
SQL Structured Query Language Juliano Brito da Justa Neves PESCD – Programa de Estágio Supervisionado de Capacitação Docente.
SQL Exercícios de Revisão Profa. Sandra de Amo Programa de Pós-graduação em Ciência da Computação – UFU
VHDL Very High Speed Integrated Circuit Hardware Description Language Prof. Eduardo Todt 2008.
Subprogramas Procedimentos e Funções MO801/MC912.
1 A Linguagem SQL Todo Banco de Dados apresenta uma Linguagem para definição e uma para manipulação de dados. Com relação aos Bancos de Dados Relacionais,
Prof. José Fernando Rodrigues Júnior Pacotes Material original: Profa. Elaine Parros Machado de Sousa SCC Bancos de Dados e Suas Aplicações.
SCC Bancos de Dados e Suas Aplicações
PL/SQL (Procedural Language/Structured Query Language)
SCC Bancos de Dados e Suas Aplicações
SCC Bancos de Dados e Suas Aplicações
SCC Bancos de Dados e Suas Aplicações
Ronaldo Celso Messias Correia
Html5- Desenvolvendo Aplicações. Html5- Introdução a SQL Métodos OpenDatabase (utilizado para criar ou abrir uma Base de Dados); Transaction (permite.
FORTRAN 90 Denise Yumi Takamura.
SQL Procedural Junho/2006.
SQL procedural – parte 2.
Subconsultas em SQL. Subconsulta Estrutura geral SELECT.... FROM.... WHERE [at] OPERADOR ( SELECT... FROM... [WHERE... ]) Declaração SELECT localizada.
BDOO. Modelos tradicionais (relacional, rede e hierárquico) : aplicações tradicionais Novas aplicações para : Sistemas CAD Manufatura Experimentos científicos.
Funções de Linha 17/04/06. Funções de Linha Gerar ou construir novo valor não existente na tabela inicial. Valor construído a partir de dados de uma ou.
Introdução à Consulta 24/3/06. Categorias de comandos DDL : estruturação de objetos de BD Ex. create table, drop index, alter table... DML: manipulação.
Funções de Linha 24/04/06. Funções de Linha Gerar ou construir novo valor não existente na tabela inicial. Valor construído a partir de dados de uma ou.
SQL-3. Novo contexto e necessidade de : Manipular imagens Outros tipos de dados além de texto e números Recuperação de dados mais complexos Níveis distintos.
Objeto de BD: visão Há 2 tipos de tabelas Tabela base
Sql-3 ( final ).
Teste Estrutural de Software
Formação de Administradores de Redes Linux LPI – level 1 SENAC TI Fernando Costa SQL (Structure Query Language)
Tecnologia para Web JavaScript Enrique Pimentel Leite de Oliveira
Stored Procedure, Function and Trigger
Transporte Escolar Fluvial
Banco de dados Profª Kelly Medeiros.
PostgreSQL.
Usando Java no Oracle Por Edson Almeida Junior
Prof. Eduardo Mantovani Prof. Fábio de P. Santos AES 2007.
PL/SQL, Procedures e Funções
Monitoria GDI Aula Prática
Equipe de monitoria Aula prática 3.  Caso de estudo  Igualando situações  Cursor  Function  Procedure  Trigger  Package  Surpresa...
Primeira aula de PL/SQL Parte II
Especialização em Tecnologia da Informação
XQuery Dário Pinheiro (DSMP).
Oracle 9i: SQL e PL/SQL Bruno Celso Cunha de Freitas
Funções ou procedures Professor Esp. Diego André Sant’Ana
Cursor Professor Esp. Diego André Sant’Ana
III – Oracle 10g Coleções. Introdução Coleção: formada de objetos do mesmo tipo, cada um com um índice (posição) único dentro da coleção –NESTED TABLE.
III – O Modelo OR Estudo de Caso, modelo Oracle 10g.
III – Oracle 10g Herança.
Com coleções, cursor não é mais necessário
RT-EXPERT Artis Corp. C calling program RTSUB [rule set subroutine] RTSUB [rule set subroutine] RTSUB [rule set subroutine]... DSL Decision Support Language.
SEQUENCE, PROCEDURE, FUNÇÃO, TRIGGER
Monitoria GDI Aula Prática
Desenvolvendo um script SQL
Criação de Tabelas. CREATE TABLE nome_da_tabela ( >>. >> ) Ex.: SQL SERVER 2008 CREATE TABLE pessoa ( CPF VARCHAR(11) NOT NULL, NOME VARCHAR(100) NOT.
Monitoria GDI Aula Prática Aula 2: PL 1. Estudo de caso - continuação Pegar arquivo GDI.zip em Descompactar arquivo: o criacaoTabelas.SQL.
Triggers (Gatilhos) Professor Esp. Diego André Sant’Ana
III – Oracle 9i Indexação. Índices Baseados em Funções É um índice baseado no valor de retorno de uma expressão ou função –A função pode ser um método.
CASE WHEN THEN ELSE END Professor Esp. Diego André Sant’Ana Disciplina: Banco de Dados II professordiegosantana.wordpress.com.
Aula 13 - Triggers. Triggers no SGBD Postgres  Os Triggers (Gatilhos) são funções preparadas para serem disparadas no caso de alguma alteração ocorrer.
Banco de Dados II Prof: Márcio Soussa Curso de Sistemas de Informação Faculdades Jorge Amado.
2/6/2016 José Antônio da Cunha - CEFET - RN1 Programação de Banco de Dados Funções.
Recursos de Programação
BANCO DE DADOS Araújo Lima Out / 2017 Araújo.
BANCO DE DADOS Araújo Lima Outubro / 2017 Araújo.
Transcrição da apresentação:

Procedimentos e Funções SCC0141 - Bancos de Dados e Suas Aplicações Prof. José Fernando Rodrigues Júnior Procedimentos e Funções Material original: Profa. Elaine Parros Machado de Sousa ver como funciona privilégios se o procedure acessa alguma tabela – como fica o user que só recebeu permissão de execuçao do procedimento?

Procedimentos e Funções Subprogramas PL/SQL armazenados no SGBD locais em código PL/SQL anônimo em subprogramas armazenados OBS: procedimentos locais ou procedimentos em pacotes podem ser sobrecarregados. OBS: Oracle suporta recursão em procedimento e função

Procedimentos e Funções Armazenados Stored Procedures/Functions armazenados no SGBD código fonte código compilado (bytecode-like ou nativo)

Procedimentos armazenados CREATE OR REPLACE PROCEDURE insere_matricula ( p_disciplina Matricula.Sigla%TYPE, p_turma Matricula.Numero%TYPE, p_aluno Matricula.Aluno%TYPE ) AS /*pode ser IS*/ v_count NUMBER; e_lotada EXCEPTION; BEGIN SELECT COUNT(*) INTO v_count FROM matricula M WHERE M.sigla = p_disciplina and M.numero = p_turma and M.ano = EXTRACT (YEAR FROM SYSDATE); IF v_count < 70 THEN insert into matricula values (p_disciplina, p_turma, p_aluno, EXTRACT (YEAR FROM SYSDATE), NULL); ELSE RAISE e_lotada; END IF; EXCEPTION WHEN e_lotada THEN ...../*NUNCA imprimir msg de erro dentro do proc.*/ END insere_matricula; /*boa prática de programação*/ /*controle retorna para o bloco que chamou o proc.*/ procedimentos/funções sem parâmetros: sem parênteses

Procedimentos armazenados /*Programa Principal – PL/SQL anônimo*/ DECLARE v_disciplina Matricula.Sigla%TYPE; v_turma Matricula.Numero%TYPE; v_aluno Matricula.Aluno%TYPE; BEGIN v_disciplina := 'SCC241'; v_turma := 1; v_aluno := 222; /*Parâmetros: notação posicional*/ insere_matricula(v_disciplina, v_turma, v_aluno); END;

Procedimentos armazenados /*Programa Principal – PL/SQL anônimo*/ DECLARE v_disciplina Matricula.Sigla%TYPE; v_turma Matricula.Numero%TYPE; v_aluno Matricula.Aluno%TYPE; BEGIN v_disciplina := 'SCC241'; v_turma := 1; v_aluno := 222; /*Parâmetros: notação identificada*/ insere_matricula(p_aluno => v_aluno, p_disciplina => v_disciplina, p_turma => v_turma); END;

Funções armazenadas /*E se não existir o aluno?*/ CREATE OR REPLACE FUNCTION media ( p_aluno Matricula.Aluno%TYPE ) RETURN NUMBER IS /*pode ser AS*/ v_media NUMBER; BEGIN SELECT AVG(nota) INTO v_media FROM MATRICULA WHERE aluno = p_aluno; RETURN v_media; /* RETURN obrigatório para sair da função*/ END media; NO_DATA_FOUND é lançado OBS: NO_DATA_FOUND não é lançada quando há somente função de agregação.... Só se sai da função com RETURN… é preciso garantir que pelo menos um return será executado, inclusive dentro do tratamento de Exceções. /*E se não existir o aluno?*/

Funções armazenadas DECLARE v_media NUMBER; /*Programa Principal – PL/SQL anônimo*/ DECLARE v_media NUMBER; v_aluno Matricula.Aluno%TYPE; BEGIN v_aluno := 222; v_media := media(v_aluno); dbms_output.put_line('Média de ' || v_aluno || ' = ' || v_media); END;

Exemplo: parâmetros com valor default CREATE OR REPLACE PROCEDURE insere_matricula_2 ( p_disciplina Matricula.Sigla%TYPE, p_turma Matricula.Numero%TYPE, p_aluno Matricula.Aluno%TYPE, p_nota Matricula.Nota%TYPE DEFAULT 0.0 ) IS /*boa prática: parâmetros default sempre no final da lista*/ v_count NUMBER; e_lotada EXCEPTION; BEGIN SELECT COUNT(*) INTO v_count FROM matricula M WHERE M.sigla = p_disciplina and M.numero = p_turma and M.ano = EXTRACT (YEAR FROM SYSDATE); IF v_count < 70 THEN insert into matricula values (p_disciplina, p_turma, p_aluno, EXTRACT (YEAR FROM SYSDATE), p_nota); ELSE RAISE e_lotada; END IF; EXCEPTION WHEN e_lotada THEN .....; END insere_matricula_2;

Exemplo: parâmetros com valor default /*Programa Principal – PL/SQL anônimo*/ DECLARE v_disciplina Matricula.Sigla%TYPE; v_turma Matricula.Numero%TYPE; v_aluno Matricula.Aluno%TYPE; BEGIN v_disciplina := 'SCC241'; v_turma := 1; v_aluno := 222; /*Parâmetros: notação posicional – parâmetro default, no final da lista, é omitido*/ insere_matricula_2(v_disciplina, v_turma, v_aluno); END;

Exemplo: parâmetros com valor default /*Programa Principal – PL/SQL anônimo*/ DECLARE v_disciplina Matricula.Sigla%TYPE; v_turma Matricula.Numero%TYPE; v_aluno Matricula.Aluno%TYPE; BEGIN v_disciplina := 'SCC241'; v_turma := 1; v_aluno := 222; /*Parâmetros: notação identificada – qualquer ordem*/ insere_matricula_2(p_aluno => v_aluno, p_disciplina => v_disciplina, p_turma => v_turma); END;

Procedures e Functions Terminologia PL/SQL Formais - parâmetros na declaração Reais – valores passados como argumentos

Procedures e Functions Exemplo: PROCEDURE raise_salary (emp_id INTEGER, amount REAL) IS BEGIN UPDATE emp SET sal = sal + amount WHERE empno = emp_id; END raise_salary; raise_salary(emp_num, amount); raise_salary(emp_num, merit + cola); raise_salary(emp_num, ’2500’); /*Cast*/ 13

Procedures e Functions Parâmetros Formais Exemplo: PROCEDURE raise_salary (emp_id INTEGER, amount REAL) IS BEGIN UPDATE emp SET sal = sal + amount WHERE empno = emp_id; END raise_salary; raise_salary(emp_num, amount); raise_salary(emp_num, merit + bonus); raise_salary(emp_num, ’2500’); /*Cast*/ Parâmetros Reais 14

Procedures e Functions Parâmetros - Modos IN (padrão) Passagem de parâmetros apenas para dentro do procedimento/função OUT Passagem de parâmetros apenas para for a do procedimento/função IN OUT Passagem de parâmetros para dentro e para fora do procedimento/função 15

Procedures e Functions Procedure CalculaNotaFinal(nota1 IN NUMBER, nota2 IN NUMBER, notafinal OUT NUMBER) BEGIN notafinal := (nota1 + nota2) / 2; END; //------------------------------------ DECLARE nota NUMBER; CalculaNotaFinal(3.4, 7.8, nota); dbms_output.put_line(nota); 16

Procedures e Functions Parâmetros - Modos IN (padrão) parâmetro formal: atua como uma constante parâmetro real: constante, variável inicializada, literal ou expressão OUT parâmetro formal: atua como uma variável não inicializada (tem valor NULL dentro do proc/func., mesmo que o parâmetro real tenha sido inicializado) parâmetro real: variável IN OUT parâmetro formal: atua como uma variável inicializada

Procedures e Functions Procedure CalculaNotaFinal(nota1 IN NUMBER, nota2 IN NUMBER, notafinal OUT NUMBER) BEGIN nota1 := 5.0; /*Erro*/ notafinal := (nota1 + nota2) / 2; END; //------------------------------------ DECLARE nota NUMBER; nota := 10.00; /*Não tem efeito*/ CalculaNotaFinal(3.4, 7.8, nota); dbms_output.put_line(nota); nota := 10.00; /*Não tem efeito*/ Pois como o parâmetro formal notafinal é do tipo OUT, dentro do procedimento CalculaNotaFinal, notafinal terá valor NULL até receber uma atribuição. 18

Exemplo CREATE OR REPLACE PROCEDURE media ( p_aluno IN Matricula.Aluno%TYPE, /*parâmetros formais*/ p_media OUT NUMBER) IS BEGIN SELECT AVG(nota) INTO p_media FROM MATRICULA WHERE aluno = p_aluno; END media; /*Programa Principal – PL/SQL anônimo*/ DECLARE v_media NUMBER(2,1); v_aluno Matricula.Aluno%TYPE; v_aluno := 222; media(v_aluno, v_media); /*parâmetros reais*/ dbms_output.put_line('Média de ' || v_aluno || ' = ' || v_media); END;

Procedures e Functions Passagem de parâmetros por valor padrão para OUT e IN OUT parâmetros reais não são perdidos se uma exceção não tratada for levantada no procedimento ou na função por referência padrão para IN NOCOPY tenta passar parâmetro OUT e IN OUT por referência dica de compilador, ou seja, nem sempre é executado problema com exceções não tratadas Restrições em que o NOCOPY é ignorado: Procedimento em uma RPC – transferência de dados reais pela rede Parâmetro real com restrições de precisão, escala ou NOT NULL (não se aplica para restrição de tamanho de cadeia de caracter) Parâmetro real é membro de tabela index-by Parâmetros real e formal são registros declarados implicitamente (ou como variável de controle de loop ou com RowType) com restrições diferentes nos campos correspondentes Passagem de parâmetros requer conversão de tipos

Procedures e Functions O PL/SQL contraria a intuição de que parâmetros IN seriam passados por valor, e parâmetros OUT seriam passados por referência. IN são sempre por referência. OUT são por valor, copiados para o parâmetro formal na chamada, e copiados de volta para o parâmetro real ao final do procedimento. OUT NOCOPY, usam-se valores por referência sem operações de cópia. Passagem de parâmetros por valor padrão para OUT e IN OUT parâmetros reais não são perdidos se uma exceção não tratada for levantada no procedimento ou na função por referência padrão para IN NOCOPY tenta passar parâmetro OUT e IN OUT por referência dica de compilador, ou seja, nem sempre é executado problema com exceções não tratadas Restrições em que o NOCOPY é ignorado: Procedimento em uma RPC – transferência de dados reais pela rede Parâmetro real com restrições de precisão, escala ou NOT NULL (não se aplica para restrição de tamanho de cadeia de caracter) Parâmetro real é membro de tabela index-by Parâmetros real e formal são registros declarados implicitamente (ou como variável de controle de loop ou com RowType) com restrições diferentes nos campos correspondentes Passagem de parâmetros requer conversão de tipos 21

Outros comandos Por alguma razão o SQLDeveloper não exibe os erros de compilação de funções e procedimentos Usar: / select * from user_errors where type = ‘PROCEDURE' AND -- ou FUNCTION name = ‘NOME_PROC_OU_FUNCAO_EM_MAIUSCULAS';

Outros comandos Pesquise: alter/drop procedure alter/drop function Ex: ALTER PROCEDURE insere_matricula COMPILE; Por que talvez alguma configuração do sistema possa ter sido alterada. Por exemplo, um novo interpretador, ou um novo compilador para código nativo. Também é possível pedir uma recompilação para verificar se o código ainda é válido após alterações da estrutura do banco. /*Por que recompilar um procedimento/função armazenado?*/

PL/SQL Manual de consulta: PL/SQL User’s Guide and Reference

PL/SQL – Exemplo de aula 1 SET SERVEROUTPUT ON; / CREATE OR REPLACE PROCEDURE consulta_universal(p_table VARCHAR2) IS sql_text VARCHAR2(300); total NUMBER; BEGIN sql_text := 'SELECT COUNT(*) FROM '||p_table; EXECUTE IMMEDIATE sql_text INTO total; dbms_output.put_line('Total: '||total); END; select * from user_errors where type = 'PROCEDURE' AND name = 'CONSULTA_UNIVERSAL'; DECLARE consulta_universal('LBD01_VINCULO_USP');

PL/SQL – Exemplo de aula 2 CREATE OR REPLACE PROCEDURE consulta_universal(p_table VARCHAR2, p_nome VARCHAR2 DEFAULT NULL, p_valor VARCHAR2 DEFAULT NULL) IS sql_text VARCHAR2(300); total NUMBER; BEGIN sql_text := 'SELECT COUNT(*) FROM '||p_table; IF(p_nome IS NOT NULL) AND (p_valor IS NOT NULL) THEN sql_text := sql_text || ' WHERE ' || p_nome || ' = ' || p_valor; END IF; EXECUTE IMMEDIATE sql_text INTO total; dbms_output.put_line('Total: '||total); END; / select * from user_errors where type = 'PROCEDURE' AND name = 'CONSULTA_UNIVERSAL'; DECLARE consulta_universal('LBD01_VINCULO_USP'); consulta_universal('LBD03_ALUNO', 'IDADE','18'); consulta_universal('LBD11_GRUPO', 'CODCURSO','1');

PL/SQL – Exemplo de aula 3 CREATE OR REPLACE FUNCTION consulta_universal_f(p_table VARCHAR2, p_nome VARCHAR2 DEFAULT NULL, p_valor VARCHAR2 DEFAULT NULL) RETURN NUMBER IS sql_text VARCHAR2(300); total NUMBER; BEGIN sql_text := 'SELECT COUNT(*) FROM '||p_table; IF(p_nome IS NOT NULL) AND (p_valor IS NOT NULL) THEN sql_text := sql_text || ' WHERE ' || p_nome || ' = ' || p_valor; END IF; EXECUTE IMMEDIATE sql_text INTO total; RETURN total; END; / select * from user_errors where type = 'PROCEDURE' AND name = 'CONSULTA_UNIVERSAL'; DECLARE dbms_output.put_line('Total: '||consulta_universal_f('LBD01_VINCULO_USP')); dbms_output.put_line('Total: '||consulta_universal_f('LBD03_ALUNO', 'IDADE','18')); dbms_output.put_line('Total: '||consulta_universal_f('LBD11_GRUPO', 'CODCURSO','1'));

PL/SQL – Exemplo de aula 4 CREATE OR REPLACE PROCEDURE insere_leciona(p_prof LBD06_LECIONA.NROUSPPROF%TYPE, p_cod LBD06_LECIONA.CODDISC%TYPE) IS BEGIN INSERT INTO lbd06_leciona VALUES(p_prof, p_cod); EXCEPTION WHEN OTHERS THEN CASE WHEN (SQLERRM LIKE '%PK_LECIONA%') THEN raise_application_error(-20001,'O relacionamento já existe.'); WHEN (SQLERRM LIKE '%FK_LECIONA_PROF%') THEN raise_application_error(-20001,'O professor não existe.'); WHEN (SQLERRM LIKE '%FK_LECIONA_DISC%') THEN raise_application_error(-20001,'A disciplina não existe.'); ELSE raise_application_error(-20001, SQLERRM); END CASE; END; / select * from user_errors where type = 'PROCEDURE' AND name = 'INSERE_LECIONA'; DECLARE insere_leciona(31,'SCC0261');