660 likes | 894 Views
BANCO DE DADOS (Fundamentos e Projeto) Asterio K. Tanaka http://www.uniriotec.br/~tanaka tanaka@rjnet.com.br. MODELO RELACIONAL E LINGUAGEM SQL. Sistemas de arquivos. BD hierárquico. BD modelo em rede. BD relacional. Modelos semânticos. Objetos complexos. Linguagens OO. Information
E N D
BANCO DE DADOS(Fundamentos e Projeto)Asterio K. Tanakahttp://www.uniriotec.br/~tanakatanaka@rjnet.com.br MODELO RELACIONAL E LINGUAGEM SQL
Sistemas de arquivos BD hierárquico BD modelo em rede BD relacional Modelos semânticos Objetos complexos Linguagens OO Information retrieval Inteligência artificial BD/OO Hipermídia BD “inteligente” Evolução dos Bancos de Dados (Khoshafian 1995)
Categorias de Modelos de Dados • Modelos conceituais: • representam a realidade a um nível alto de abstração (ex: ER, modelos semânticos, OO) • Modelos lógicos ou de implementação: • suportam descrições de dados que possam ser processadas por computador (ex: hierárquico, em rede, relacional, relacional-objeto, OO). • Modelos físicos: • descrevem como os dados são armazenados no computador através de informações como tipos de arquivos, formatos e ordenação de registros, caminhos de acesso (ex: várias formas de estruturas de arquivos).
Modelo Relacional • Introduzido pelo pesquisador da IBM, Edward Codd, em 1970 • Características marcantes: modelo formal por natureza, estrutura de dados simples e uniforme. • O modelo relacional representa os dados num banco de dados como uma coleção de relações ou tabelas. • É o modelo mais utilizado comercialmente.
atributos nome da relação ESTUDANTE Nome CPF Tel_Res Cidade Tel_Trab Idade CR Benjamim 305612435-20 (021)373-1616 Caxias 19 3,21 Catarina 381621245-10 (021)375-4409 Niteroi 18 2,89 Ricardo 422112320-00 Santos (021)749-1253 25 3,53 Carlos 489221110-02 (011)376-9821 São Paulo (021)749-6492 28 3,93 Barbara 533691238-11 (021)839-8461 Rio de Janeiro 19 3,25 • Domínio, tipo de dado, formato • Esquema, grau, atributo • Instância, tupla • Intensão, extensão • Relação = subconjunto do produto cartesiano • Super-chave, chave candidata, chave primária, chave alternativa tuplas
Restrições de Integridade no Modelo Relacional • Restrições de domínio • O valor de cada atributo A deve ser um valor atômico pertencente ao domínio dom(A), de acordo com seu tipo de dados • Restrições de chave • Valores de chaves candidatas devem ser distintos (“unique”). • Restrição de integridade de entidade • Nenhum valor de chave primária pode ser nulo (“not null”). • Restrição de integridade referencial • Chave estrangeira ( “foreign key”).
Restrições de integridade referencial EMPREGADO Nome CPF Data-Nasc Endereço Sexo Salário Supervisor Dept DEPARTAMENTO Nome Número LOCALIZACAO GERENCIA Num-Dept Localidade Gerente Num Dept Data-Inicio PROJETO Nome Número Local Dept TRABALHO CPF-Emp Num-Proj Horas DEPENDENTE CPF-Emp Nome-Dep Sexo Data-Nasc Relacionamento
Uma instância de banco de dados relacional EMPREGADO LOCALIZACAO Nome CPF Data-Nasc Endereço Sexo Salário Supervisor Dept Num-Dept Localidade Joao Frank Alicia Jane Ramon Joyce Ahmad James 123456789 333445555 999887777 987654321 666884444 453453453 987987987 888665555 09Jan55 08Dez45 19Jul58 20Jun31 15Set52 31Jul62 29Mar59 10Nov27 Santos,SP Santos,SP Tatui,SP Lins,SP Marilia,SP Santos,SP Santos,SP Santos,SP M M F F M F M M 30000 40000 25000 43000 38000 25000 25000 55000 333445555 888665555 987654321 888665555 333445555 333445555 987654321 nulo 5 5 4 4 5 5 4 1 Santos Campinas Lins Bauru Santos 1 4 5 5 5 GERENCIA Num CPF Inicio PROJETO 5 4 1 333445555 987654321 888665555 22Mai88 01Jan92 19Jun91 TRABALHO Nome Núm Local Dept CPF-Emp Num-Proj Horas 1 2 3 10 20 30 Lins Bauru Santos Campinas Santos Campinas 5 5 5 4 1 4 ProdutoX ProdutoY ProdutoZ Informat. Reorgan. Beneficios DEPARTAMENTO 123456789 123456789 666884444 453453453 453453453 333445555 333445555 333445555 333445555 999887777 999887777 987987987 987987987 987654321 987654321 888665555 1 2 3 1 2 2 3 10 20 30 10 10 30 30 20 20 32,5 7,5 40,0 20,0 20,0 10,0 10,0 10,0 10,0 30,0 10,0 35,0 5,0 20,0 15,0 nulo Num Nome 5 4 1 Pesquisa Administracao Sede DEPENDENTE CPF-Emp Nome-Dep Sexo Data-Nasc Relacionamento 333445555 333445555 333445555 987654321 123456789 123456789 123456789 Alice Teo Joy Abner Miguel Alice Beth F M F M M F F 05Abr76 25Out73 03Mai48 29Fev32 01Jan78 31Dez78 05Mai57 Filha Filho Esposa Esposo Filho Filha Esposa
Operações de Atualização sobre Relações • Três operações básicas: • INSERIR - DELETAR - MODIFICAR • (“Insert”, “Delete”, “Update”) • Sempre que operações de atualização são aplicadas, deve-se verificar as restrições de integridade (chave, entidade e referencial).
Álgebra Relacional • Coleção de operações usadas para manipular relações inteiras. O resultado dessas operações é uma nova relação, que por sua vez pode ser manipulada pelas operações da álgebra relaciona (propriedade de fechamento da álgebra relacional)l. • Dois grupos de operações: • Operações da Teoria Matemática dos Conjuntos • UNIÃO - INTERSEÇÃO - DIFERENÇA - PRODUTO CARTESIANO • Operações desenvolvidas especificamente para bancos de dados relacionais • SELEÇÃO - PROJEÇÃO - JUNÇÃO - funções agregadas
Operações da Teoria dos Conjuntos UNIÃO R1 R2 INTERSEÇÃO R1R2 DIFERENÇA R1R2 PRODUTO CARTESIANO R1 X R2
Operações de Bancos de Dados Relacionais SELEÇÃO<condição de seleção> (R) PROJEÇÃO<lista de atributos> (R) JUNÇÃO R1<condição de junção> R2
Conjunto Completo de Operações da Álgebra Relacional • Pode ser demonstrado que o conjunto de operações da álgebra relacional { seleção, projeção, união, diferença, produto cartesiano } • { X } • é um conjunto completo, isto é, qualquer uma das outras operações pode ser expressa como uma seqüência de operações deste conjunto. • Exemplos: • R S (R S) - ( (R - S) (S - R) ) • R <condição > S <condiçao > (R X S)
Funções Pré-definidas Funções de agregações matemáticas sobre coleções de valores do banco de dados. SOMA - SUM(atributo) MÉDIA - AVG (atributo) MÁXIMO - MAX(atributo) MÍNIMO- MIN(atributo) CONTAGEM - COUNT(atributo) ou COUNT(*)
SQL (Structured Query Language) • Linguagem de alto nível declarativa • Padrão norte-americano (ANSI 1986) e internacional (ISO 1989) para os SGBDs relacionais. • Originário do Sistema R da IBM, embrião dos SGBDs comerciais da IBM, SQL/DS e DB2. • Atualmente, todos os SGBDs relacionais provêm uma variação da linguagem SQL. • Padrões: SQL-86 (ANSI) e SQL-89 (ISO) • SQL-2 ou SQL-92 (ANSI/ISO em vigor) • SQL-3 (aprovada em 2000)
Definição de Dados em SQL Definição de domínios CREATE DOMAIN <domínio> <tipo de dado primitivo> [ DEFAULT <valor default> ] [ <lista de restrições de domínio> ] DROP DOMAIN <domínio> ( CASCADE | RESTRICT ) CREATE DOMAIN CORES CHAR (8) DEFAULT ‘Branco’ CONSTRAINT CORES_VALIDAS CHECK ( VALUEIN (‘Branco’, ‘Azul’, ‘Vermelho’, ‘Verde’) )
Criação, Alteração, Remoção de Tabelas CREATE TABLE <tabela> ‘(‘ <coluna> <tipo da coluna> [ restrição do atributo ] { , <coluna> <tipo da coluna> [ restrição do atributo ] } [ <restrição da tabela> { , <restrição da tabela> } ] ‘)’ ALTER TABLE <tabela> <lista de alterações na tabela> DROP TABLE <tabela> ( CASCADE | RESTRICT ) • CREATE TABLE DEPARTAMENTO (Nome VARCHAR(15) NOT NULL, • Numero INTEGERPRIMARY KEY); • CREATE TABLE EMPREGADO (Nome VARCHAR(30) NOT NULL, • CPF CHAR(9) NOT NULL, • Data-Nasc DATE, • Endereço VARCHAR(30), • Sexo CHAR(1), • Salário INTEGER, • Supervisor CHAR(9) REFERENCES EMPREGADO, • Dept INTEGERREFERENCES DEPARTAMENTO, • PRIMARY KEY (CPF), • UNIQUE (Nome));
Criação, Alteração, Remoção de Tabelas ALTER TABLE EMPREGADO ADD COLUMN Cor_predileta CORES; ALTER TABLE EMPREGADO ADD FOREIGN KEY chave_dept REFERENCES DEPARTAMENTO ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE EMPREGADO ADD CONSTRAINT salario_minimo CHECK (Salario >= 10000);
Consultas em SQL <comando-de-seleção> ::= SELECT [DISTINCT] <lista de atributos> FROM <lista de tabelas ou visões> [WHERE <condição de seleção ou de junção>] [GROUP BY <lista de atributos> [HAVING <condição de seleção>]] [ORDER BY <coluna> [(ASC | DESC)] {,<coluna> [(ASC | DESC)]} A condição de junção pode ser especificada em cláusula fora da cláusula WHERE como junções do tipo INNER JOIN, LEFT JOIN, RIGHT JOIN ou OUTER JOIN.
Definição de visões • CREATE VIEW <nome-de-visão> [ (lista-de-colunas) ] • AS <comando-de-seleção> CREATE VIEW empregados_sede ASSELECT (Nome, Endereco, Sexo, Data-nasc) FROM EMPREGADO, DEPARTAMENTO WHERE EMPREGADO.Dept = DEPARTAMENTO.Numero AND DEPARTAMENTO.Nome = “Sede”;
Condições de junção em SQL SELECT EMPREGADO.Nome, Sexo,Data_Nasc, Salário, DEPARTAMENTO.Nome FROM DEPARTAMENTO, EMPREGADO WHERE DEPARTAMENTO.Número = EMPREGADO.Dept AND Salário>=30000; SELECT EMPREGADO.Nome, Sexo,Data_Nasc, Salário, DEPARTAMENTO.Nome FROM DEPARTAMENTO INNER JOIN EMPREGADO ON DEPARTAMENTO.Número = EMPREGADO.Dept WHERE Salário>=30000; As consultas acima são equivalentes
SQL como linguagem de consulta para usuários finais A proposta inicial da SQL era prover uma interface de consulta “natural” para usuários finais através do comando SELECT. Logo se percebeu que isto só seria possível em consultas muito simples, devido à complexidade da linguagem. Consulta: Para cada departamento com mais de 2 empregados, obtenha o nome do departamento e o número de empregados que ganham mais de 30.000. SELECT D.Nome, COUNT(*) FROM DEPARTAMENTO AS D, EMPREGADO AS E WHERE D.Número=E.Dept AND E.Salário > 30000 AND E.Dept IN (SELECT Dept FROM EMPREGADO GROUPBY Dept HAVINGCOUNT(*) > 2) GROUP BY D.Nome;
Comandos de Manipulação de Dados INSERT INTO <tabela> [ ( <lista de colunas> ) ] ( VALUES ( <lista de valores> ) | <comando SELECT> ) UPDATE <tabela> SET <coluna> = <valor> {, <coluna> = <valor>} [ WHERE <condição de seleção> ] DELETE FROM <tabela> [ WHERE <condição de seleção> ]
INSERT INTO EMPREGADO • VALUES (‘Ricardo’, ‘653298653’, 30Dez52, ‘Tupã’, ‘M’, 37000, ‘987654321’, 4). • INSERT INTO EMPREGADO (CPF,Nome,Sexo) VALUES (‘Joana’,126126126-00,‘F’) • DELETE FROM EMPREGADO • WHERE CPF = ‘123456789’. • DELETE FROM EMPREGADO • WHERE Dept IN (SELECT Número • FROM DEPARTAMENTO • WHERE Nome = ‘Pesquisa’). • UPDATE PROJETO • SET Local = ‘Bauru’, Dept = 5 • WHERE Número = 10. • UPDATE EMPREGADO • SET Salário = Salário * 1.1 • WHERE Dept IN (SELECT Número • FROM DEPARTAMENTO • WHERE Nome = ‘Pesquisa’).
Programação usando SQL • SQL não é linguagem de programação! • Duas abordagens para programação com SQL • linguagem procedural hospedeira • C, C++, COBOL, FORTRAN, Java, Pascal, etc... • extensões procedurais à SQL • Access Basic (VB) no MS Access • TRANSACT SQL no MS SQL Server e Sybase • PL/SQL no Oracle • etc ...
Oracle PL/SQL O PL/SQL é uma linguagem de 3a. geração que tem por objetivo processar informações do banco de dados Oracle. • Características: • Permite recuperar, incluir, atualizar e excluir dados de tabelas • Permite criar variáveis e constantes • Permite utilizar comandos condicionais e de repetição
PL/SQL Estrutura de Um Bloco PL/SQL: DECLARE /*Opcional*/ Variáveis, cursores, exceções definidas pelo usuário BEGIN /*Mandatório*/ Comandos SQL e PL/SQL EXCEPTION /* Opcional */ Ações a serem executadas quando ocorrem erros END; /*Mandatório*/
PL/SQL Definição de Variáveis e Constantes: VARIÁVEIS São áreas em memórias que servem para armazenar dados, podendo conter diversos valores ao longo da execução do programa. CONSTANTES Também são áreas de memória que servem para armazenar dados, mas que possui valor fixo e deve ser inicializado no ato da declaração e seguido da palavra "CONSTANT". • Na definição de variáveis ou constantes, deve-se especificar o tipo de dado e o tamanho. Pode-se especificar também que uma variável não pode conter valor nulo utilizando a restrição "NOT NULL". Neste caso ela deve ser iniciada com um valor no ato da definição.
TIPOS DE DADOS CHAR Variáveis ou constantes que armazenam valores alfanuméricos com no máximo de 255 caracteres. Exemplo: Pagamento CHAR(40); VARCHAR2 Variáveis que armazenam valores alfanuméricos de tamanho variável até o tamanho máximo de 2000. Exemplo: Nome VARCHAR2(45);
TIPOS DE DADOS NUMBER Variáveis ou constantes que armazenam valores numéricos com no máximo de 38 caracteres. Caso não seja informado o tamanho, o default é 38. Também pode ser definido precisão escalar. Exemplos: Recibo NUMBER(2); Codigo CONSTANT NUMBER(4) :=1; Preco NUMBER(7,2)
TIPOS DE DADOS DATE Variáveis ou constantes que armazenam data, hora (com minutos e segundo e o século). Exemplo: Data_receb DATE; BOOLEAN Variáveis ou constantes que armazenam TRUE, FALSE ou NULL. Exemplo: Flag BOOLEAN;
DECLARAÇÃO DE VARIÁVEIS COM TIPOS DE ATRIBUTOS Para declarar uma variável, constante ou coluna com a mesma definição da coluna de uma tabela, o atributo %TYPE pode ser utilizado. Formato nome_tabela.nome_coluna%TYPE; Exemplo: v_CPFemp empregado.CPF%TYPE;
COMANDOS DE MANIPULAÇÃO DE DADOS EM PL/SQL INSERT, DELETE, UPDATE e SELECT. O comando SELECT tem que ter a cláusula INTO para relacionar as variáveis onde serão armazenados os valores selecionados. Para controlar as transações com o banco de dados (iniciadas implicitamente com qualquer comando de modificação de dados), utiliza-se os comandos COMMIT, SAVEPOINT e ROLLBACK. Para garantir que os dados a serem manipulados não serão alterados ou excluídos por outros usuários, utiliza-se o comandos LOCK TABLE ou o comando SELECT com a cláusula FOR UPDATE.
COMANDOS DE CONTROLE DE SEQÜÊNCIA • Condicional • IF ... THEN ... ELSE ... END IF • IF ... ELSEIF ... END IF • Repetição • FOR ... LOOP ... END LOOP • WHILE ... LOOP ... END LOOP • LOOP ... END LOOP • Exit • EXIT • EXIT[WHEN condição]
Sintaxe de comando condicional: • IF condição THEN • comandos.... • [ELSEIF condição THEN comandos] • [ELSE comandos] • END IF • Exemplo: • DECLARE • estoque NUMBER(5); • BEGIN • SELECT quantidade INTO estoque • FROM inventario • WHERE produto = ’Raquete de tenis' • FOR UPDATE OF quantidade; • IF estoque > 0 THEN -- verifica quantidade • UPDATE inventario SET quantidade= quantidade- 1 • WHERE produto = 'TENNIS RACKET'; • INSERT INTO historico_vendas • VALUES (’Raquete de tenis vendida',SYSDATE); • ELSE • INSERT INTO historico_vendas • VALUES (’Rquete de tenis fora sem estoque', SYSDATE); • END IF; • COMMIT • END; • /
Sintaxe de comandos de repetição: • FOR contador IN [REVERSE] inicial...final LOOP • relação_de_comandos • END LOOP; • WHILE condição LOOP • relação_de_comandos • END LOOP; • LOOP • relação_de_comandos • END LOOP;
Exemplo de comando de repetição: • -- Este bloco encontra o primeiro empregado que tenha salario acima de 40000 • -- e esteja acima do empregado ‘333445555’ na cadeia de supervisão • DECLARE • v_sal empregado.salario%TYPE; • v_sup empregado.supervisor%TYPE; • v_nome empregado.nome%TYPE; • sup_inicial CONSTANT CHAR(9) := ‘333445555’; • BEGIN • SELECT salario, supervisor INTO v_sal, v_sup • FROM empregado • WHERE CPF = sup_inicial; • WHILE v_sal < 40000 LOOP • SELECT salario, supervisor, nome INTO v_sal, v_sup, v_nome • FROM empregado • WHERE CPF = v_sup; • END LOOP; • INSERT INTO temp VALUES (NULL, v_sal, v_nome); • COMMIT; • END; • /
PL/SQL Estrutura de Um Bloco PL/SQL: DECLARE /*Opcional*/ Variáveis, cursores, exceções definidas pelo usuário BEGIN /*Mandatório*/ Comandos SQL e PL/SQL EXCEPTION /* Opcional */ Ações a serem executadas quando ocorrem erros END; /*Mandatório*/
TRATAMENTO DE ERROS (EXCEPTION HANDLERS) Utilizando o EXCEPTION, quando ocorre um erro interno (EXCEPTION), a execução normal do bloco PL/SQL é parada e o controle é transferido para a parte do bloco PL/SQL que trata os erros, que é o EXCEPTION. Quando terminar o tratamento do erro, o controle da execução retorna o próximo comando executável do bloco PL/SQL.
Tratadores de EXCEPTION PRÉ-DEFINIDOS NO_DATA_FOUND Quando não existirem dados para retornar no comando select. OTHERS Quando ocorrem outros erros. Sintaxe: WHEN tratador_exception THEN comando1; comando2; comandon;
Exemplo: -- bloco PL/SQL que imprime dados sobre empregado que tem o maior salario DECLARE v_nome empregado.nome%TYPE; v_endereco empregado.endereco%TYPE; v_salario empregado.salario%TYPE; BEGIN SELECT nome, endereco, salario INTO v_nome, v_endereco, v_salario FROM empregado WHERE salario = (SELECT MAX (salario) FROM empregado); DBMS_OUTPUT.PUT_LINE (v_nome, v_endereco, v_salario ); EXCEPTION WHEN OTHERS DBMS_OUTPUT.PUT_LINE (‘Erro Detectado’); END;
Exemplo: -- bloco PL/SQL que aumenta em 10% os salarios dos empregados cujos salarios -- sejam menores do que a media salarial de todos os empregados -- o programa recalcula e imprime a media salarial se esta exceder 50000 DECLARE v_salmedio NUMBER; BEGIN SELECT AVG(salario) INTO v_salmedio FROM empregado; UPDATE empregado SET salario = salario*1.1 WHERE salario < v_salmedio; SELECT AVG(salario) INTO v_salmedio FROM empregado; IF v_salmedio > 50000 THEN DBMS_OUTPUT.PUT_LINE (‘Salario medio = ‘ | | v_salmedio ); END IF; COMMIT; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE (‘Erro na atualizacao de salario‘) ROLLBACK; END;
CURSORES EM PL/SQL O conjunto de linhas retornadas por uma consulta SELECT pode ter zero, uma ou múltiplas linhas, dependendo de quantas satisfazem a condição de seleção. O PL/SQL necessita de uma área de trabalho para armazenar o conjunto de linhas retornadas por uma consulta SELECT . Esta área recebe um nome, e é conhecido como CURSOR.
CURSORES A) Declarando o Cursor: CURSOR nome_cursor IS comando_select; B) Abrindo o Cursor: OPEN nome_cursor; C) Buscando os dados armazenados no Cursor: FETCH nome_cursor INTO variáveis_declaradas; D) Fechando o Cursor: CLOSE nome_cursor;
-- exibe os CPFs de empregados cujos salarios são maiores do que os salarios de seus supervidores DECLARE v_salario NUMBER; v_salsuper NUMBER; v_CPF CHAR (9); v_CPFsuper CHAR (9); CURSOR c_salario IS SELECT CPF, salario, supervisor FROM empregado; BEGIN OPEN c_salario; LOOP FETCH c_salario INTO v_CPF, v_salario, v_CPFsuper; EXIT WHEN c_salario%NOTFOUND; IF v_CPFsuper IS NOT NULL THEN SELECT salario INTO v_salsuper FROM empregado WHERE CPF = v_CPFsuper; IF v_salario> v_salsuper THEN DBMS_OUTPUT.PUT_LINE(v_CPF); END IF; END IF; END LOOP; IF c_salario%ISOPEN THEN CLOSE c_salario; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE (‘Erro no CPF ‘ | | v_CPF); IF c_salario%ISOPEN THEN CLOSE c_salario; END;
-- lista todos os emrpegados, aumenta os salarios em 10%, e mostra o antigo e o novo salario DECLARE v_CPF empregado.CPF%TYPE; v_nome empregado.nome%TYPE; v_salario empregado.salario%TYPE; CURSOR emp IS SELECT CPF, nome, salario FROM empregado; BEGIN OPEN emp; LOOP FETCH emp INTO v_CPF, v_nome, v_salario; EXIT WHEN emp%NOTFOUND; DBMS_OUTPUT.PUTLINE(‘CPF:’ | | v_CPF | | ‘Antigo salario :’ | | v_salario); UPDATE empregado SET salario = salario*1.1 WHERE CPF = v_CPF; COMMIT; DBMS_OUTPUT.PUTLINE(‘CPF:’ | | v_CPF | | ‘Novo salario :’ | | v_salario*1.1); END LOOP; CLOSE emp; EXCEPTION WHEN OTHERS DBMS_OUTPUT.PUT_LINE (‘Erro Detectado’); END:
Restrições de integridade embutidas nos sistemas de informação formam um componente importante de programas de aplicação, que podem ser distribuídas por todo o sistema. Isto pode gerar incompletude e redundância dessas restrições, que podem ser especificadas diferentemente. Desta forma, existem fortes argumentos para implementação centralizada das restrições de integridade relevantes do sistema de informação no banco de dados, como procedimentos armazenados ("stored procedures"), gatilhos("triggers") e funções definidas por usuários. TRIGGER, STORED PROCEDURE e FUNÇÕES
Uma função definida pelo usuário computa e retorna um resultado baseado num conjunto de valores de entrada. Uma vez definida e criada dentro do SGBD, torna-se disponível para ser utilizada até mesmo em sentenças SQL Funções
Oracle PL/SQL CREATE [OR REPLACE]FUNCTION nomefunc [ (parâmetro,...) ] RETURN tiporetorno IS resultado tiporetorno corpo da função: [declarações] (bloco PL/SQL) BEGIN ............ RETURN resultado [EXCEPTION] END; onde o parâmetro é do tipo IN