Introdução ao PL/SQL



Documentos relacionados
Oracle PL/SQL Overview

Oracle 10g: SQL e PL/SQL

Linguagem PL/SQL e Triggers

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

PL/SQL. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados PL/SQL


SQL Gatilhos (Triggers)

PROGRAMAÇÃO EM BANCO DADOS Stored Procedure e Trigger

Laboratório de Banco de Dados Prof. Luiz Vivacqua. PL/pgSQL A Linguagem de programação do PostgreSQL

FUNCTION ) RETURNS INTEGER AS $$ DECLARE

Create Sequence Cria uma sequence. Uma sequence é um objeto que permite vários usuários gerarem valores inteiros sem repetição.

SQL Procedural. Josino Rodrigues Neto

Triggers em PostgreSQL. Linguagem de Programação de Banco de Dados. Triggers em PostgreSQL. Triggers em PostgreSQL

Bases de Dados 2007/2008. Aula 8

Banco de Dados II. Triggers e Functions. Prof. Moser Fagundes. Curso TSI Instituto Federal Sul-Rio-Grandense (IFSul) Campus Charqueadas

PROGRAMAÇÃO EM BANCO DADOS Store Procedure e Trigger

Introdução às funções e procedimentos. SQL suporta funções e procedimentos úteis com tipos de dados específicos

Tarefa Orientada 18 Procedimentos armazenados

PL/pgSQL. Introdução. Introdução. Introdução

Bancos de Dados I. Integridade semântica

Logado no OracleXE vamos acessar a opção:

Tratamento de Exceções

PL/pgSQL por Diversão e Lucro

Laboratório de Banco de Dados II Aula 1. Stored Procedures

Banco de Dados. Marcio de Carvalho Victorino Exercícios SQL

Sistemas de Informação

A linguagem SQL

SQL Linguagem de Definição de Dados. Laboratório de Bases de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

António Rocha Nuno Melo e Castro

INTRODUÇÃO AO PL/SQL

DESENVOLVIMENTO DE SOFTWARE

8. Outros tipos de Transação (Modo de Transação de Autoconfirmação e Modo Implícito)

Monitoria GDI Aula Prática. DML + PL/SQL parte 1

UNINGÁ UNIDADE DE ENSINO SUPERIOR INGÁ FACULDADE INGÁ CIÊNCIA DA COMPUTAÇÃO CURSORS. Profº Erinaldo Sanches Nascimento

Neste artigo, serão apresentados os principais conceitos sobre os TRIGGERS e sua aplicabilidade.

Projeto de Banco de Dados

Triggers e Regras. Fernando Lobo. Base de Dados, Universidade do Algarve

Uma expressão básica em SQL consiste em três cláusulas: select, from e where.

PROCEDURES, FUNÇÕES, PL/SQL, CURSORES, VIEW, ÍNDICE e SEQUÊNCIA. Stored procedure PL/SQL. Procedimentos e Funções. Procedimento (procedure) Procedure

Triggers no PostgreSQL

INTRODUÇÃO À LINGUAGEM C++

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

Triggers. um trigger permite que uma determinada sequência de comandos SQL seja accionada quando um determinado evento ocorre.

Comandos de Manipulação

PROCEDIMENTOS ARMAZENADOS (Stored Procedures)

Tarefa Orientada 19 Triggers

Banco de Dados Avançados Banco de Dados Ativo

Programação SQL. Introdução

Manipulando Strings no VBA (Replace, Mid e InStr)

PHP INTEGRAÇÃO COM MYSQL PARTE 1

Consultoria e Treinamento em Bancos de Dados Relacionais

Hugo Pedro Proença, 2007

Treinamento. Sumário

BANCO DE DADOS. info 3º ano. Prof. Diemesleno Souza Carvalho

Autor: Tiago Lone Nível: Básico Criação: 19/12/2005 Última versão: 18/12/2006. PdP. Pesquisa e Desenvolvimento de Produtos

SQL e PL/SQL Oracle Dicas de preparação para certificação

Oracle 10g Dicas de PL/SQL. Conteúdo

RECUPERAÇÃO DE CONTEÚDO BANCO DE DADOS

Bases de Dados 2007/2008. Aula 9

BANCO DE DADOS II Prof. Ricardo Rodrigues Barcelar

LINGUAGEM SQL. SQL Server 2008 Comandos iniciais

GBC043 - Sistemas de Banco de Dados Funções e Gatilhos no PostgreSQL

António Rocha Nuno Melo e Castro

SQL comando SELECT. SELECT [DISTINCT] <campos> FROM <tabela> [condição] [ ; ] Paulo Damico - MDK Informática Ltda.

Banco de Dados I. Aula 12 - Prof. Bruno Moreno 04/10/2011

Linguagem SQL Sub-linguagem DDL

Introdução à Engenharia da Computação. Banco de Dados Professor Machado

Regras Métodos Identificadores Variáveis Constantes Tipos de dados Comandos de atribuição Operadores aritméticos, relacionais e lógicos

poder de manipulação de dados do SQL com poder de processamento das lp procedimentais

Analisando e comparando as funções do DBNavegator

SQL Linguagem de Definição de Dados. Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri

1.6. Tratamento de Exceções

Procedimentos armazenados

Banco de Dados. Um momento crucial na organização dos dados é a forma com que cadastramos estes dados, a estrutura de armazenamento que criamos.

MANUAL INSTALAÇÃO WEB SERVICE

FERRAMENTA DE APOIO A REESTRUTURAÇÃO DE CÓDIGO FONTE EM LINGUAGEM PL/SQL BASEADO EM PADRÕES DE LEGIBILIDADE

Banco de dados. Linguagens de Banco de Dados II. Wedson Quintanilha da Silva -

Bases de Dados 2012/2013 Funções/procedimentos e triggers. Helena Galhardas 2012 IST. Bibliografia. Manual referência PostgreSQL

Linguagem de Consulta - SQL

Ex.: INSERT INTO tmpautor (CDAUTOR, NMAUTOR) VALUES (1, Renato Araújo )

Aula 12: Funções. Pré-requisitos: Todas as aulas anteriores deste módulo. 1. Aproveitando Códigos no Programa

Incluindo, atualizando e excluindo linhas nas tabelas

SQL. Autor: Renata Viegas

Projeto de Banco de Dados: Empresa X

São 182 videoaulas de Oracle pl/sql procedures functions triggers Forms Reports

AULA 2 INTERAÇÃO COM O BANCO DE DADOS

BANCO DE DADOS -INTRODUÇÃO AO SQL. Prof. Angelo Augusto Frozza, M.Sc.

Listando itens em ComboBox e gravando os dados no Banco de Dados MySQL.

Roteiro 9 - SQL Básico: chave estrangeira, operadores de comparação e operadores booleanos

SQL Pacotes. Profa. Dra. Cristina Dutra de Aguiar Ciferri. Laboratório de Bases de Dados Pacotes

Introdução ao SQL. Aécio Costa

LINGUAGEM SQL. DML - Linguagem de Manipulação de Dados

PL/SQL. Linguagens hospedeiras

Operação de União JOIN

2. Criar um bloco PL/SQL anônimo para imprimir as tabuadas abaixo: 5 X 10 = 50 5 X 2 = X 10 = X 2 = 2...

Transcrição:

Introdução ao PL/SQL

Pág.: 2/53 SUMÁRIO 1 FUNDAMENTOS... 4 1.1 O QUE É O PL/SQL?... 4 1.2 COMO É EXECUTADO UM PL/SQL NO ORACLE SERVER... 4 1.3 ESTRUTURA DE UM BLOCO PL/SQL... 5 1.4 TIPOS DE BLOCOS PL/SQL... 6 1.5 DECLARANDO VARIÁVEIS NO PL/SQL... 7 1.6 ATRIBUINDO VALORES A VARIÁVEIS... 8 1.7 TIPOS DE VARIÁVEIS... 9 1.8 O ATRIBUTO %TYPE... 9 1.9 CONTROLANDO O FLUXO DE EXECUÇÃO (IF)... 9 1.10 LOOP... 11 1.10.1 BASIC LOOP... 11 1.10.2 FOR LOOP... 12 1.10.3 WHILE LOOP... 12 1.10.4 LOOPS Encadeados e LABELS... 13 2 TRABALHANDO COM CURSORES... 14 2.1.1 Implicit Cursor... 14 2.1.2 Explicit Cursor... 14 2.1.2.1 Controlando um Cursor Explicito... 15 2.1.2.2 Declarando um Cursor... 15 2.1.2.3 Abrindo um Cursor... 15 2.1.2.4 Buscando os dados do Cursor... 16 2.1.2.5 Fechando o Cursor... 16 2.1.2.6 Atributos para Cursores Explícitos... 16 2.1.2.7 Cursor Explícito com Parâmetros... 17 2.1.3 Cursor FOR LOOPS... 17 2.1.3.1 Cursor FOR LOOPS usando SUBQUERIES... 18 3 TRABALHANDO COM VARIÁVEIS COMPOSTAS... 19 3.1 PL/SQL RECORDS... 19 3.1.1 Referenciando e Inicializando RECORDS... 20 3.1.2 O atributo %ROWTYPE... 20 3.2 PL/SQL TABLES... 20 3.2.1 Criando uma PL/SQL TABLE... 21 3.2.2 Referenciando uma PL/SQL TABLE... 21 3.3 PL/SQL TABLES DE RECORDS... 22

Pág.: 3/53 3.3.1 Referenciando uma PL/SQL TABLE de RECORD.... 22 3.3.2 Métodos PL/TABLE... 23 3.3.3 Exceções de usuário... 23 3.3.4 RAISE_APPLICATION_ERROR... 24 4 STORED PROCEDURES... 25 4.1 PROCEDURES... 25 4.1.1 Executando uma PROCEDURE no SQL*PLUS... 26 4.1.2 Opção DEFAULT para parâmetros... 27 4.1.3 Métodos para especificar parâmetros... 27 4.1.4 Chamando um procedimento a partir de um bloco PL/SQL... 28 4.1.5 Removendo um procedimento do banco de dados... 28 4.2 FUNCTIONS... 29 4.2.1 Executando uma FUNCTION no SQL*PLUS... 30 4.2.2 Removendo uma função do banco de dados... 30 4.2.3 Diferenças entre Procedures e Functions... 32 5 PACKAGES (PACOTES)... 33 5.1 ESCOPO PÚBLICO... 33 5.2 ESCOPO PRIVADO... 33 5.3 COMPONENTES DE UMA PACKAGE... 33 5.4 CRIANDO UMA ESPECIFICAÇÃO DE PACOTE... 34 5.5 CRIANDO O CORPO DO PACOTE... 34 5.6 EXECUTANDO UM PROCEDIMENTO DE UMA PACKAGE NO SQL*PLUS... 36 5.7 VARIÁVEIS GLOBAIS... 36 5.8 REMOVENDO PACOTES... 36 6 TRIGGERS (GATILHOS)... 37 6.1 USANDO PREDICADOS CONDICIONAIS (DELETING/INSERTING/UPDATING)... 38 6.2 USANDO OS QUALIFICADORES :NEW E :OLD... 39 6.3 GERENCIANDO GATILHOS... 39 7 EXCEÇÕES NO PL/SQL... 39 7.1 O QUE É UMA EXCEÇÃO?... 39 7.2 TRATANDO UMA EXCEÇÃO... 39 7.3 PROPAGANDO EXCEÇÕES... 39 7.4 TIPOS DE EXCEÇÕES... 39 7.4.1 Pré-definidas... 39 7.4.2 Exceções não pré-definidas... 39 7.4.3 Funções para tratamento de exceções... 39 7.4.3.1 Exemplos de valores do SQLCODE... 39 8 EXERCÍCIOS... 39 CONTROLE DO FLUXO DE EXECUÇÃO(IF/LOOP)... 39 CURSORES... 39 PLSQL RECORDS,PLSQL TABLES, FUNCTIONS PROCEDURES... 39 PACKAGES, TRIGGERS... 39 EXCEPTIONS... 39

Pág.: 4/53 1 FUNDAMENTOS 1.1 O que é o PL/SQL? PROCEDURAL LANGUAGE/SQL (PL/SQL) é uma linguagem PROCEDURAL da ORACLE estendida do SQL. PL/SQL incorpora muitas características das linguagens de programação desenvolvidas durante os anos 1970 e 1980. Esta permite que a manipulação de dados e consultas seja incluída em unidades de programas, fazendo o PL/SQL uma poderosa linguagem de processamento de transação. 1.2 Como é executado um PL/SQL no ORACLE SERVER Blocos de PL/SQL são passados e processados por uma PL/SQL ENGINE, que pode residir dentro de uma ferramenta ORACLE ou dentro do ORACLE SERVER. A PL/SQL ENGINE utilizada depende de onde o bloco PL/SQL é invocado.

Pág.: 5/53 O PL/SQL ENGINE filtra os comandos SQL e manda individualmente o comando SQL para o SQL STATEMENT EXECUTOR no ORACLE SERVER. O PROCEDURAL STATEMENTS EXECUTOR processa o PL/SQL com os dados retornados do ORACLE SERVER. Isto reduz o trabalho de envio para o ORACLE SERVER (especialmente em CLIENT/SERVER). Resumo PL/SQL ENGINE :Pode estar contida dentro de ferramentas ORACLE como no ORACLE SERVER. Filtra os comandos SQL e envia para o ORACLE SERVER (SQL STATEMENT EXECUTOR). PROCEDURE STATEMENT EXECUTOR :Recebe blocos PL/SQL e dados oriundos do ORACLE SERVER e processa o PL/SQL. SQL STATEMENT EXECUTOR : Executa comandos SQL. 1.3 Estrutura de um bloco PL/SQL Um bloco PL/SQL é composto por três seções : DECLARATIVE (opcional), EXECUTABLE (obrigatória) e EXCEPTION HANDLING (opcional). Unicamente as palavras BEGIN e END são exigidas. Seção DECLARATIVE EXECUTABLE EXCEPTION HANDLING Significado Contém todas as variáveis constantes, cursores e exceções dos usuários que são utilizadas nas outras seções. Contém comandos SQL e PL/SQL Especifica ações a serem executadas quando um erro ocorre dentro de seção EXECUTABLE

Pág.: 6/53 Ex. DECLARE...(Variáveis, cursores, constantes, etc.) BEGIN...(Comandos SQL e PL/SQL) EXCEPTION...(Ações a serem executadas caso um erro aconteça) END; 1.4 Tipos de blocos PL/SQL ANONYMOUS BLOCK: ANONYMOUS BLOCK são blocos não nomeados. Eles são declarados em um ponto de uma aplicação onde eles serão executados e passados para o PL/SQL ENGINE executar. SUBPROGRAMS : SUBPROGRAMS são blocos PL/SQL nomeados que podem ser executados e invocados. Você pode declarar ele geralmente como PROCEDURES ou FUNCTIONS. Você pode armazenar SUBPROGRAMS no SERVER ou a nível de aplicação. ANONYMOUS PROCEDURE FUNCTIONS [DECLARE] PROCEDURE nome IS FUNCTION nome RETURN DATATYPE IS BEGIN BEGIN BEGIN - comandos [EXCEPTION] END; - comandos [EXCEPTIONS] END; - comandos [EXCEPTIONS] END; Obs. A função é similar a PROCEDURE, exceto que a função retorna valor.

Pág.: 7/53 1.5 Declarando variáveis no PL/SQL Variáveis são unidades de armazenamento de dados em um bloco PL/SQL, podendo seus valores serem alterados de acordo com a lógica do programa.o escopo de uma variável é o escopo da unidade de programa onde foi declarada.uma variável deve necessariamente ser declarada, definindo seu tipo e tamanho(opcional dependendo do tipo) Você precisa declarar todas as variáveis dentro da seção declarativa antes de referenciar dentro de um bloco PL/SQL. Você tem a opção de atribuir um valor inicial. Sintaxe : identifier [CONSTANT] DATATYPE [NOT NULL] [:= DEFAULT expr] Identifier CONSTANT DATATYPE NOT NULL expr é o nome da variável contém uma variável que não pode ser alterada (precisam ser inicializadas) é um scalar, composite ou lob determina que a variável não pode ser nula. (Precisam de um valor inicial) é qualquer expressão PL/SQL. Uma literal, outra variável ou uma expressão envolvendo operações ou FUNCTIONS Exemplos Declare data_nascimento DATE; cod_departamento NUMBER(2) NOT NULL := 10; cidade VARCHAR2(30) := 'PORTO ALEGRE'; dolar CONSTANT NUMBER := 1.8; cod_funcionario NUMBER (10) DEFAULT 10;

Pág.: 8/53 Obs. Identifiers não podem ser maiores que 30 caracteres e o primeiro caracter deve ser uma letra. Por DEFAULT variáveis são inicializadas com NULL 1.6 Atribuindo valores a variáveis Para atribuir valores a variáveis, use o operador :=. Sintaxe. identifier := expr; identifier expr : o nome da variável : pode ser variável, literal ou uma FUNCTION; Exemplos Obs. BEGIN dolar := 1.4; data_nascimento := '16-MAY-2000'; cod_departamento := 10; data_atual1 := SYSDATE; data_atual2 := to_date ('16-MAY-2000'); END; - Literais STRINGS são atribuídas com aspas simples - por exemplo olá. Se você deseja colocar uma aspa dentro da STRING, coloque duas. - ' olá '' '.

Pág.: 9/53 1.7 Tipos de variáveis TIPO VARCHAR2(SIZE) NUMBER (PRECISION, SCALE) DATE CHAR[(SIZE)] LONG LONG ROW BOOLEAN BINARY_INTEGER PLS_INTEGER DESCRIÇÃO Tipo base para variáveis caracter de Tamanho variável. até 32767. Não há tamanho DEFAULT para a definição de variáveis e constantes. Números fixos e com ponto flutuante Tipo base para data e hora Tipo base para variáveis de tamanho Tipo base para variáveis caracter de tamanho variável. acima de 32760 bytes. O máximo é 2147483647 bytes. Tipo base para variáveis binárias e bytes. Não é implementada no PL/SQL; TRUE,FALSE ou NULL Tipo base para números inteiros entre -2147483647 e -2147483647. Tipo base para números inteiros entre -2147483647 e -2147483647 1.8 O Atributo %TYPE Serve para declarar uma variável de acordo com uma coluna de uma tabela ou com base em outra variável já declarada. 1.9 Controlando o fluxo de execução (IF) Você pode alterar o fluxo de execução usando o comando condicional IF. Segue abaixo as três formas para o IF. - IF-THEN-END IF - IF-THEN-ELSE-END IF - IF-THEN-ELSIF-END IF

Pág.: 10/53 Sintaxe IF condição THEN comandos; [ELSIF condição THEN comandos ] [ELSE comandos;] END; Exemplos 1) 2) 3) 4)... IF ESTADO= 'RS' THEN NOME := 'RIO GRANDE DO SUL'; END IF;...... IF ESTADO = 'RS' THEN NOME := 'RIO GRANDE DO SUL'; ELSE NOME := 'OUTRO QUALQUER'; END IF;...... IF ESTADO = 'RS' THEN NOME := 'RIO GRANDE DO SUL'; ELSIF ESTADO = 'SP' THEN NOME := 'SÃO PAULO'; END IF;...... IF ESTADO = 'RS' THEN NOME := 'RIO GRANDE DO SUL'; ELSIF ESTADO = 'SP' THEN NOME := 'SÃO PAULO'; ELSE NOME := 'OUTRO QUALQUER'; END IF;...

Pág.: 11/53 1.10 LOOP Existem três tipos de LOOP : BASIC LOOP FOR LOOP WHILE LOOP 1.10.1 BASIC LOOP Sintaxe LOOP comandos EXIT [WHEN condição]; END LOOP; Ex. DECLARE contador NUMBER (2) := 1; BEGIN LOOP comandos; contador := contados + 1; EXIT WHEN contador > 10; END LOOP;

Pág.: 12/53 1.10.2 FOR LOOP Sintaxe FOR counter IN [REVERSE] lower_bound..upper_bound LOOP comandos; END LOOP; counter REVERSE é uma variável implicitamente declarada do tipo inteiro (INTEGER) com valores automaticamente incrementados ou decrementadas por 1 para cada execução do LOOP. causa um decremento no counter. O DEFAULT é Ex. FOR I IN 1..10 LOOP comandos; END LOOP; 1.10.3 WHILE LOOP Sintaxe WHILE condition LOOP comandos; END LOOP; Condition é uma variável BOOLEAN ou uma expressão Ex. WHILE I <=10 LOOP I := I + 1;; END LOOP;

Pág.: 13/53 1.10.4 LOOPS Encadeados e LABELS Você pode encadear LOOPS. Por exemplo, colocar um FOR LOOP dentro de um WHILE LOOP. Normalmente a terminação do LOOP mais interno não termina a execução do LOOP mais externo. No entanto, você pode usar um LABEL para o LOOP mais externo e forçar a saída através do comando EXIT. Exemplo BEGIN <<LOOP_EXTERNO>> LOOP contador := contador + 1; EXIT WHEN contador > 10; <<LOOP_INTERNO>> LOOP EXIT LOOP_EXTERNO WHEN... EXIT LOOP_INTERNO WHEN... END LOOP LOOP_INTERNO; END LOOP LOOP_EXTERNO; END;

Pág.: 14/53 2 TRABALHANDO COM CURSORES O ORACLE SERVER usa uma área chamada SQL áreas para executar um comando SQL e armazenar as informações. Você pode usar cursores PL/SQL para nomear um SQL e acessar as informações armazenadas. Tipos de cursores Implicit Explicit são declarados por um PL/SQL implicitamente para todos os DML e comandos SELECT que retornam um linha. para consultas que retornam mais de uma linha. Cursores explícitos são declarados e nomeados pelo programados e manipulados através de comandos específicos. 2.1.1 Implicit Cursor O ORACLE SERVER implicitamente abre um cursor para processar cada comandos SQL não associado com um cursor explicitamente declarado. 2.1.2 Explicit Cursor Um cursor explícito individualmente processa cada linha retornada por um comando SELECT. O conjunto de linhas retornadas por SELECT é chamado por result set. Ex. Result Set 2234 JOÃO 4543 PEDRO Cursor==> 3233 MARIA Linha corrente 2221 CARLOS

Pág.: 15/53 2.1.2.1 Controlando um Cursor Explicito Não -------------------- Sim DECLARE ==> OPEN ==> FETCH ==>EMPTY?==> CLOSE Cria um Abre o Lê a corrente Testa a Fecha SQL area cursor. linha para existência de cursor Seta como variáveis Linhas ativo Retorna para o FETCH se foram encontradas linhas 2.1.2.2 Declarando um Cursor Sintaxe CURSOR cursor_name IS comando_select; cursor_name comando_select é um identificador PL/SQL é um comando SELECT (sem o INTO) Ex. DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN... 2.1.2.3 Abrindo um Cursor Sintaxe OPEN cursor_name;

Pág.: 16/53 2.1.2.4 Buscando os dados do Cursor Sintaxe FETCH cursor_name INTO [variable1, variable2,...] record_name]; cursor_name variable record_name o nome do cursor previamente declarado a variável de saída para armazenar o retorno o nome do RECORD onde os dados serão armazenados. O RECORD pode ser declarado usando o %ROWTYPE. Ex. FETCH c1 INTO v_empno, v_ename; 2.1.2.5 Fechando o Cursor O comando CLOSE fecha o cursor. Desabilita o cursor e o resultado tornando-o como indefinido. Feche o cursor após completar o processamento do comando SELECT. Isto permite que o cursor seja reaberto se necessário. Se você executar o FETCH em um cursor já fechado, acontecerá a exceção INVALID_CURSOR. 2.1.2.6 Atributos para Cursores Explícitos Segue abaixo alguns atributos que podemos utilizar para auxiliar no processamento de cursores. NOME RETORNO Descrição %ISOPEN BOOLEAN Retorna TRUE e o cursor está aberto %NOTFOUND BOOLEAN Retorna TRUE se o FETCH não retornou linhas %FOUND BOOLEAN Retorna TRUE se o FETCH retornou linhas %ROWCOUNT NUMBER Retorna o total de linhas retornadas

Pág.: 17/53 2.1.2.7 Cursor Explícito com Parâmetros Você pode passar parâmetros para o cursor antes que este seja aberto. Isto significa que você pode abrir e fechar um cursor várias vezes em um bloco PL/SQL, retornando diferentes informações. Sintaxe CURSOR cursor_name [(parameter_name DATATYPE,...)] IS comando_select; cursor_name parameter_name DATATYPE comando_select é um identificador PL/SQL de um cursor previamente declarado. o nome do parâmetro um scalar DATATYPE um SELECT sem o INTO Ex. DECLARE CURSOR c1 (v_deptno NUMBER, v_job VARCHAR2) IS SELECT empno,ename FROM emp WHERE deptno = v_deptno AND job = v_job; 2.1.3 Cursor FOR LOOPS Um cursor FOR LOOP processa linhas como um cursor explícito. Ele é um fácil de utilizar porque o cursor quando aberto, as linhas são retornadas para cada interação do LOOP, e é fechado automaticamente quando todas as linhas foram processadas. O LOOP termina automaticamente no fim da ultima interação quando a ultima linha é retornada.

Pág.: 18/53 Sintaxe FOR record_name IN cursor_name LOOP comando1; comando2; END LOOP; record_name implicitamente cursor_name é um nome de um RECORD declarado é um identificador PL/SQL de u cursor previamente declarado. Ex. DECLARE CURSOR c1 IS SELECT empno,ename FROM emp; BEGIN FOR emp_record IN c1 LOOP -- O OPEN e o FETCH são implicitamente executados IF emp_record.empno = 7839 THEN... END IF; END LOOP; -- O CLOSE é executado implicitamente. END; 2.1.3.1 Cursor FOR LOOPS usando SUBQUERIES Exemplo BEGIN FOR emp_record IN ( SELECT empno,ename FROM emp) LOOP END; -- O OPEN e o FETCH são implicitamente executados IF emp_record.empno = 7839 THEN... END IF; END LOOP; -- O CLOSE é executado implicitamente.

Pág.: 19/53 3 TRABALHANDO COM VARIÁVEIS COMPOSTAS COMPOSITE DATATYPES COMPOSITE DATATYPES (também conhecida como COLLECTIONS) são RECORD, TABLE,NESTED TABLE e VARRAY. 3.1 PL/SQL RECORDS Um RECORD é um grupo de itens armazenados em um campo. Por exemplo, suponha que você tenha diferentes tipos de dados de um empregado como nome, salário, data de nascimento. Estes dados possuem diferentes tipos mas estão logicamente ligados a um empregado. Sendo assim, defini-se um RECORD para agrupar os campos do empregado. Segue abaixo algumas considerações : - cada RECORD pode ter muitos campos - RECORD pode ter atribuído valores DEFAULT e podem ser definidos como NOT NULL - campos sem valor DEFAULT são inicializados com NULL - você pode declarar e referenciar RECORDS encadeados. Um RECORD pode ser componente de outro RECORD. Sintaxe TYPE type_name IS RECORD (field_declaration [, field_declaration]...) identifier type_name O tipo do field_declaration pode ser definido de acordo a sintaxe abaixo: field_name {field_type variable%type table.column.%type table%rowtype } [[NOT NULL] {:= DEFAULT : expr] type_name o nome do tipo RECORD. Este identificador é usado para declarar registros. field_name este é o nome de um campo dentro de um RECORD.

Pág.: 20/53 field type este é o tipo do campo. Exemplo DECLARE TYPE emp_record_type IS RECORD (nome VARCHAR2(30),cargo VARCHAR2(10),salario NUMBER (13,2)); emp_record emp_record_type; 3.1.1 Referenciando e Inicializando RECORDS Campo de uma variável do tipo RECORD são acessados pelo nome. Para referenciar ou inicializar um campo de um RECORD, você precisa especificar o nome do RECORD seguido do nome do campo. Ex. emp_record.nome := 'PEDRO'; 3.1.2 O atributo %ROWTYPE Para declarar uma variável baseada em tabela ou VIEW, você deve usar o %ROWTYPE. Ex. DECLARE emp_record empregados%rowtype 3.2 PL/SQL TABLES Objetos do tipo TABLE são chamados de PL/SQL TABLES. Eles são modelados como uma TABLE (DATABASE TABLE). PL/SQL TABLE usam uma PRIMARY KEY que permite acessar os registros.

Pág.: 21/53 Uma PL/SQL TABLE : - é similar a um ARRAY - Precisa ter dois componentes - Uma PRIMARY KEY do tipo BINARY_INTEGER que indexa a PL/SQL TABLE - Uma coluna do tipo SCALAR ou RECORD Sintaxe TYPE type_name IS TABLE OF { column_type variable%type table.column%type} [NOT NULL] [INDEX BY BINARY INTEGER]; identifier type_name 3.2.1 Criando uma PL/SQL TABLE Há dois passos para criação de uma PL/SQL TABLE. 1. Declare um tipo TABLE 2. Declare uma variável do tipo criado (passo 1) DECLARE TYPE date_table_type IS TABLE OF DATE INDEX BY BINARY INTEGER; date_table date_table_type; 3.2.2 Referenciando uma PL/SQL TABLE Sintaxe PL/SQL_TABLE_NAME(primary_key_value) := value; Ex. date_table (1) := SYSDATE;

Pág.: 22/53 3.3 PL/SQL TABLES de RECORDS Você pode definir uma PL/SQL TABLE com base na estrutura de RECORD. Para isto, você pode usar o atributo %ROWTYPE ou um RECORD já definido. Exemplo DECLARE TYPE dept_table_type IS TABLE OF dept%rowtype INDEX BY BINARY_INTEGER; dept_table dept_table_type; 3.3.1 Referenciando uma PL/SQL TABLE de RECORD. Exemplo dept_table(15).location := 'Porto Alegre';

Pág.: 23/53 3.3.2 Métodos PL/TABLE Método EXISTS (n) COUNT Descrição Retorna TRUE se o elemento(n) existe na PL/SQL tabela Retorna o número de elementos da PL/SQL TABLE FIRST/LAST Retorna a primeira linha e ultima da PL/SQL TABLE. Retorna NULL se a PL/SQL TABLE está vazia PRIOR(n) Retorna o índice que precede o índice n em uma PL/SQL TABLE NEXT(n) Retorna o índice que sucede o índice n em uma PL/SQL TABLE EXTEND(n,i) Para aumentar o TABLE de uma PL/SQL TABLE. EXTEND coloca um elemento NULL no final da PL/SQL TABLE EXTEND(n) coloca n elementos NULL na PL/SQL TABLE EXTEND(n,i) coloca n copias do elemento i no final da PL/SQL TABLE TRIM Remove um elemento do final da PL/SQL TABLE DELETE DELETE deleta todas as linhas da PL/SQL DELETE (n) TABLE deleta o n elemento da PL/SQL TABLE DELETE (m,n) remove os elementos no intervalo entre m e n. 3.3.3 Exceções de usuário Estas exceções não são vinculadas a um erro ORACLE e são levantadas através do comando RAISE. Geralmente são utilizadas para o tratamento de erros de regra de negócio do sistema.

Pág.: 24/53 Ex. DECLARE e_limite_credito EXCEPTION; BEGIN... RAISE e_limite_credito;... EXCEPTION WHEN e_limite_credito;... END; 3.3.4 RAISE_APPLICATION_ERROR É uma PROCEDURE que permite gerar um erro e mensagem. Sintaxe raise_application_error (error number, message [, {TRUE FALSE}]; error_number : erro definido pelo usuário entre -20000 e -20999. message : a mensagem do erro. Ex. EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20001,'Dolar não cadastrado'); END;

Pág.: 25/53 4 STORED PROCEDURES 4.1 PROCEDURES Podemos definir uma PROCEDURE como um bloco PL/SQL nomeado que pode obter parâmetros (argumentos) e executar alguma ação. Uma PROCEDURE pode ficar armazenada dentro de forms ou no banco de dados (STORED PROCEDURE). Sendo armazenada no banco de dados, estas provêm a reutilização. Uma vez validados, eles podem ser usados em várias aplicações, Se a definição for alterada, somente o procedimento será afetado, o que simplifica bastante a manutenção. Sintaxe (criação no banco de dados) CREATE [OR REPLACE] PROCEDURE nome_procedimento [parâmetro1 [modo1] tipodedados1, parâmetro2 [modo2] tipodedados2,... ) IS AS PL/SQL BLOCK nome_procedimento parâmetro modo tipo de dados PL/SQL Block Nome da PROCEDURE Nome da variável PL/SQL IN (DEFAULT) OUT IN OUT Tipo de dados do parâmetro - Number,varchar2,date,etc.(sem tamanho) - %TYPE - %ROWTYPE - Um tipo pré-definido em uma PACKAGE Bloco PL/SQL que define as ações executadas pelo procedimento

Pág.: 26/53 Ex. CREATE OR REPLACE PROCECURE aumenta_salario (p_cd_empregado IN emp.cd_empregado%type, p_percentual IN NUMBER) IS BEGIN UPDATE emp SET salario = salario * p_percentual WHERE cd_empregado = p_cd_empregado; END; / PROCEDURE created 4.1.1 Executando uma PROCEDURE no SQL*PLUS Utilize o comando EXECUTE para executar uma PROCEDURE SQL> EXECUTE aumenta_salario (10,1.10); PL/SQL PROCEDURE successfull completed. Obs. - Para executar uma PROCEDURE com parâmetro OUT ou IN OUT é necessário declarar uma variável e referenciá-la na chamada da PROCEDURE com dois pontos para receber o retorno. Ex. SQL> VARIABLE g_name VARCHAR2(30) SQL> EXECUTE retorna_nome (10,:g_name); PL/SQL PROCEDURE successfull completed. - O SQL*PLUS não permite a declaração de variáveis BOOLEAN

Pág.: 27/53 4.1.2 Opção DEFAULT para parâmetros Você pode especificar um valor DEFAULT para um parâmetro caso este não seja informado. Para isto é necessário acrescentar a clausula DEFAULT após a definição do tipo de dados do parâmetro. CREATE OR REPLACE PROCECURE aumenta_salario (p_cd_empregado IN emp.cd_empregado%type, p_percentual IN NUMBER DEFAULT 1.10) IS BEGIN UPDATE emp SET salario = salario * p_percentual WHERE cd_empregado = p_cd_empregado; END; / 4.1.3 Métodos para especificar parâmetros Existem três formas de especificar os parâmetros na chamada de um procedimento : posicional, nomeado e combinação Posicional Nomeado Combinada Assume os valores na ordem que são passados Assume o valor associado ao nome do parâmetro através do uso do =>. Assume os primeiro parâmetros como posicional e os outros através do nomeado. Exemplos Considere a seguinte PROCEDURE prc_aumenta_precos ( cd_empresa NUMBER,cd_filial NUMBER,cd_produto NUMBER);

Pág.: 28/53 chamada posicional EXECUTE prc_aumenta_precos (1,12,1223); chamada nomeada EXECUTE prc_aumenta_preco (cd_produto=>1223,cd_empresa=>1,cd_filial=>12); chamada combinada EXECUTE prc_aumenta_preco (1,cd_produto=>1223,cd_filial=>12); 4.1.4 Chamando um procedimento a partir de um bloco PL/SQL Você pode chamar um procedimento dentro de um bloco PL/SQL (anônimo ou armazenado no banco de dados. Exemplo BEGIN prc_aumenta_precos (1,12,1223); END; 4.1.5 Removendo um procedimento do banco de dados Uma vez criado (CREATE) a PROCEDURE fica armazenada no banco de dados. Para remover, utilize o comando DROP no SQL*PLUS. Exemplo SQL> DROP PROCEDURE prc_aumenta_precos; PROCEDURE dropped;

Pág.: 29/53 4.2 FUNCTIONS Assim como a PROCEDURE, podemos definir uma função como um bloco PL/SQL nomeado que pode obter parâmetros (argumentos) e executar alguma ação. A única diferença é que a função necessita o retorno de um valor. Sintaxe (criação no banco de dados) CREATE [OR REPLACE] FUNCTION nome_procedimento [parâmetro1 [modo1] tipodedados1, parâmetro2 [modo2] tipodedados2,... ) RETURN tipo de dados IS AS PL/SQL Block nome_procedimento parâmetro modo tipo de dados Nome da PROCEDURE Nome da variável PL/SQL IN (DEFAULT) OUT IN OUT Tipo de dados do parâmetro - Number,varchar2,date, etc.(sem tamanho) - %TYPE - %ROWTYPE - Um tipo pré-definido em uma PACKAGE RETURN tipo de dados PL/SQL Block Tipo de dados do retorno da função. Segue as mesmas regras do tipo de dados dos parâmetros Bloco PL/SQL que define as ações executadas pela função

Pág.: 30/53 Ex. CREATE OR REPLACE FUNCTION retorna_nome (p_cd_empregado IN emp.cd_empregado%type) RETURN emp.nome%type IS v_nome emp.nome%type BEGIN SELECT nome INTO v_nome FROM emp WHERE cd_empregado = p_cd_empregado; END; / RETURN v_nome; PROCEDURE created 4.2.1 Executando uma FUNCTION no SQL*PLUS Utilize o comando EXECUTE para executar uma função e PRINT para visualizar o valor a variável de retorno (g_nome). Ex. SQL> VARIABLE g_nome VARCHAR2(30) SQL> EXECUTE :g_nome retorna_nome (10); PL/SQL PROCEDURE successfull completed. SQL> PRINT g_nome 4.2.2 Removendo uma função do banco de dados Uma vez criado (CREATE) a PROCEDURE fica armazenada no banco de dados. Para remover, utilize o comando DROP no SQL*PLUS. Ex. SQL> DROP FUNCTION retorna_nome; FUNCTION dropped;

Pág.: 31/53

Pág.: 32/53 4.2.3 Diferenças entre Procedures e Functions Ambas possuem funcionalidades semelhantes,porém a function por si só representa um valor, ou seja, mesmo não tendo parâmetros do tipo OUT ela retorna um valor.procedures só retornam valores se possuírem parâmetros do tipo OUT. Outra diferença importante é a possibilidade de se executar funções dentro de um comando SELECT desde que elas não possuam parâmetros OUT. Já procedures não oferecem essa funcionalidade. Ex.: SELECT FNC_VALIDA( 76345489020 ) CGC_VALIDO FROM DUAL; CGC_VALIDO --------------- TRUE

Pág.: 33/53 5 PACKAGES (PACOTES) Uma PACKAGE (pacote) tem a finalidade de agrupar itens FUNCTIONS / PROCEDURES/variáveis) relacionadas. Por exemplo, podemos agrupar todos as funções e PROCEDURES relacionadas ao sistema financeiro. Um componente de uma PACKAGE (FUNCTION/PROCEDURE/variável) pode ser público ou privado. 5.1 Escopo Público Quando um elemento de um PACKAGE pode ser referenciado ou executado por outros objetos ORACLE (PROCEDURE/FUNCTION, etc.). Para isto, o componente (FUNCTION,PROCEDURE) deve ser declarado na especificação do pacote. 5.2 Escopo Privado Só pode ser referenciado por outras construções que são parte do mesmo pacote. 5.3 Componentes de uma PACKAGE 1 - Variável pública (global) 2 - Procedimento público 3 - Procedimento privado 4 - Variável privada (local do pacote) 5 - Variável local (local do procedimento)

Pág.: 34/53 5.4 Criando uma especificação de Pacote Sintaxe CREATE OR REPLACE PACKAGE nome_pacote IS AS tipo público e declarações de item especificações do SUBPROGRAM END nome_pacote nome_pacote tipo público e declarações de item especificações do SUBPROGRAM Nome do pacote Declara variáveis, constantes, cursores, exceções e tipos declara os SUBPROGRAMS PL/SQL Obs. - Todos os itens declarados na especificação são do escopo público. Ou seja, são itens (PROCEDURES, FUNCTIONS) que podem ser chamados repetitivamente por outras construções no mesmo pacote ou de fora do pacote Ex. CREATE OR REPLACE PACKAGE pck_financeiro IS PROCEDURE prc_gera_cobranca (p_data IN date); END pck_financeiro; / 5.5 Criando o corpo do Pacote O corpo de uma PACKAGE é o local onde são definidas as ações para cada programa (público ou privada). É no corpo que encontra-se o programa (PL/SQL) de cada elemento (PROCEDURE, FUNCTIONS). Também podem ser definidas as variáveis privadas da PACKAGE.

Pág.: 35/53 CREATE [OR REPLACE] PACKAGE BODY nome_pacote IS AS tipo público e declarações de item especificações do SUBPROGRAMA. END nome_pacote nome_pacote tipo público e declarações de item especificações do SUBPROGRAMA Nome do pacote Declara variáveis, constantes, cursores, exceções e tipos declara os SUBPROGRAMS PL/SQL públicos e privados Obs. - a ordem que os SUBPROGRAMS privados (PROCEDURES, FUNCTIONS) são definidos no corpo é de grande importância. Você deve definir ou declarar SUBPROGRAMS privados antes de chamá-los a partir de outros. No caso de SUBPROGRAMS públicos tal definição não faz-se necessária. Ex. CREATE OR REPLACE PACKAGE BODY pck_financeiro IS PROCEDURE prc_gera_cobranca (p_data IN date) IS BEGIN INSERT INTO COBRANCAS (SELECT nome_cliente,cpf,valor,dt_vencimento FROM DEBITOS WHERE dt_vencimento> p_data AND dt_pagamento IS NULL); END; END pck_financeiro; /

Pág.: 36/53 5.6 Executando um procedimento de uma PACKAGE no SQL*PLUS Para executar uma PROCEDURE/FUNCTIONS no SQL*PLUS utilize o comando EXECUTE seguido do nome_do_pacote.nome_do_subprograma. SQL> EXECUTE pck_financeiro.prc_gera_cobranca(sysdate); Obs. somente podem ser executados os SUBPROGRAMS que são públicos. Ou seja, estão declarados na especificação. 5.7 Variáveis Globais Você pode declarar variáveis públicas (globais) que irão existir durante a sessão do usuário. Exemplo CREATE OR REPLACE PACKAGE pck_parametros IS cd_empresa_default NUMBER := 1; cd_filial_default NUMBER := 12; END pck_parametros; SQL> SET SERVEROUTPUT ON SQL> EXECUTE dbms_output.put_line - ('Empresa DEFAULT = ' pck_parametros.cd_empresa_default); Empresa DEFAULT=12 PL/SQL PROCEDURE sucessfull completed. 5.8 Removendo Pacotes Para remover uma especificação e o corpo utilize o comando DROP PACKAGE. Ex. DROP PACKAGE nome_do_pacote Para remover somente o corpo utilize o comando DROP PACKAGE BODY. Ex. DROP PACKAGE BODY nome_do_pacote

Pág.: 37/53 6 TRIGGERS (gatilhos) Uma TRIGGER é um bloco PL/SQL executado de forma implícita sempre que um determinado evento ocorre. Por exemplo, pode-se definir uma TRIGGER que é disparada sempre quando um funcionário é incluído. SINTAXE CREATE OR [REPLACE] TRIGGER nome_gatilho tempo evento1 [OR evento2 or evento3] ON nome_tabela [FOR EACH ROW] [WHEN condição] BEGIN corpo_gatilho; END; nome_gatilho tempo é o nome do gatilho Indica o tempo de disparo em relação ao evento ocorrido BEFORE UPDATE [OF column] DELETE tabela FOR EACH ROW WHEN corpo do gatilho Indica a tabela ou VIEW Determina que o gatilho deve ser disparado a cada linha inserida Especifica a restrição de gatilho (Esse predicado é condicional e avaliado para cada linha a fim de determinar se o corpo do gatilho é executado ou não É o corpo do gatilho que define as ações executadas (comandos PL/SQL)

Pág.: 38/53 Ex CREATE OR REPLACE TRIGGER insert_emp BEFORE INSERT ON EMP BEGIN IF TO_CHAR(SYSDATE,'D') IN (7,1) THEN RAISE_APPLICATION_ERROR (-20050, 'Você só pode incluir empregados em dias úteis'); END IF; END; 6.1 Usando Predicados Condicionais (DELETING/INSERTING/UPDATING) Em algumas situações faz-se necessário descobrir o evento que foi disparado. Utilize os predicados DELETING/INSERTING e UPDATING para isto. Ex. CREATE OR REPLACE TRIGGER insert_emp BEFORE INSERT OR UPDATE OR DELETE ON EMP BEGIN IF TO_CHAR(sysdate,'D') IN (7,1) THEN IF INSERTING RAISE_APPLICATION_ERROR (-20050, 'Você só pode incluir empregados em dias úteis'); ELSIF UPDATING('SAL') RAISE_APPLICATION_ERROR (-20051, 'Você só pode alterar salário de empregados em dias úteis'); ELSIF DELETING RAISE_APPLICATION_ERROR (-20052, 'Você só pode excluir empregados em dias úteis'); END IF; END IF; END;

Pág.: 39/53 6.2 Usando os Qualificadores :NEW e :OLD Você pode usar os valores das colunas da tabela. Para isto utilize os qualificadores NEW e OLD. Em uma TRIGGER faça referencia ao valor de uma coluna antes e depois da alteração dos dados. OPERAÇÃO Valor antigo Valor novo INSERT NULL Valor inserido UPDATE Valor antes de Valor após atualizar atualizar DELETE Valor antes da deletar NULL Ex. CREATE OR REPLACE TRIGGER insert_emp BEFORE INSERT ON EMP FOR EACH ROW BEGIN IF :NEW.SALARIO = 0 THEN RAISE_APPLICATION_ERROR(-20050, 'Salário não pode ser 0'); END IF; END; Obs. - Os qualificadores OLD e NEW estão disponíveis nos gatilhos ROW (FOR EACH ROW). - Preceda esses qualificadores como dois pontos em cada instrução SQL e PL/SQL - Não há prefixo dois pontos (:) caso os qualificadores sejam referenciados à condição de restrição WHEN.

Pág.: 40/53 6.3 Gerenciando Gatilhos Segue abaixo alguns comandos utilizados para o gerenciamento de Gatilhos : Habilitando / Desabilitando um Gatilho ALTER TRIGGER nome_gatilho DISABLE/ENABLE Habilitando/Desabilitando todos os Gatilhos de uma tabela ALTER TRIGGER nome_gatilho ALL_TRIGGERS Recompilando um TRIGGER ALTER TRIGGER nome_gatilho COMPILE Removendo um gatilho DROP TRIGGER nome_gatilho

Pág.: 41/53 7 EXCEÇÕES NO PL/SQL 7.1 O que é uma exceção? Identificador em PL/SQL que é levantado durante a execução de um bloco PL/SQL. Tal exceção pode acontecer através de um erro ORACLE ou da execução do comando RAISE. Um bloco sempre é finalizado quando uma exceção acontece. Mas você pode declarar uma exceção para manipular e executar ações caso um erro aconteça. Ex. Um erro ORACLE (ORA-01403) acontece quando nenhum registro é retornado de um SELECT. Para este erro, é gerada a exceção NO_DATA_FOUND. 7.2 Tratando uma exceção Se uma exceção acontece durante a execução de um PL/SQL e esta é tratada, a exceção não propaga para seções externas. O PL/SQL bloco é executado com sucesso. Ex. DECLARE BEGIN a exceção é levantada EXCEPTION a exceção é tratada END

Pág.: 42/53 7.3 Propagando exceções Quando uma exceção não tratada no bloco PL/SQL em que ela acontece, esta é propagada a blocos mais externos. Caso não seja encontrada a execução do PL/SQL é finalizada com falha. Ex. DECLARE BEGIN BEGIN a exceção é levantada EXCEPTION a exceção não é tratada END; EXCEPTION a exceção não é tratada END; Obs. A propagação de exceção acontece também em STORED PROCEDURE. Ou seja, caso uma PROCEDURE retorne uma exceção, esta pode ser tratada no bloco PL/SQL que a chamou. Caso aconteça, o bloco PL/SQL é finalizado com erro. 7.4 Tipos de exceções Pré-definida Não pré-definidas de Usuário

Pág.: 43/53 7.4.1 Pré-definidas Não são declaradas e são exceções geradas implicitamente pelo ORACLE. São aproximadamente 20. Segue abaixo as mais utilizadas : EXCEÇÃO Erro ORACLE Causa CURSOR_ALREDY_OPEN ORA-06511 Tentar abrir um cursor já aberto DUP_VAL_ON_INDEX ORA-00001 Tentar inserir um valor duplicado em uma tabela (PRIMARY KEY) INVALID_CURSOR ORA-01001 Operação Ilegal com um cursor. Ex. tentar executar um FETCH em um cursor que não foi aberto INVALID_NUMBER ORA-01722 Conversão de uma STRING para NUMBER. NO_DATA_FOUND ORA-01403 Um SELECT não retornou dados TOO_MANY_ROWS ORA-01422 Um SELECT retornou mais de um registro VALUE_ERROR ORA-06502 Atribuir um valor mais a uma variável ZERO_DIVIDE ORA-01476 Divisão por ZERO 7.4.2 Exceções não pré-definidas Exceções não pré-definidas são aquelas que não são geradas automaticamente na ocorrência de um erro ORACLE. No entanto, você pode fazer explicitamente a associação de um erro ORACLE a uma exceção e tratála. Utilize o PRAGMA para associar um erro ORACLE a uma exceção. Segue abaixo os passos para tratar uma exceção não pré-definida. 1) Declare uma exceção dentro da seção de declaração (DECLARE) exception exception EXCEPTION; o nome da exceção

Pág.: 44/53 2) Associe a exceção declarada a um erro ORACLE usando o comando PRAGMA EXCEPTION_INT PRAGMA EXCEPTION_INIT (exception, error_number); exception error_number a exceção previamente declarada um erro Oracle 3) Referencie a exceção declarada dentro de seção EXCEPTION. Ex. DECLARE e_produto_invalido EXCEPTION; PRAGMA EXCEPTION_INIT (e_produto_invalido, -2292); BEGIN... EXCEPTION WHEN e_produto_invalido THEN... END; Obs. O erro -2292 é um erro de violação de integridade de CONTRAINTS 7.4.3 Funções para tratamento de exceções Quando um erro acorre, você pode identificar o erro ocorrido e a mensagens através do uso de duas funções. SQLCODE SQLERRM : Retorna o código do erro ORACLE. Você pode atribuir a uma variável NUMBER. : Retorna a mensagem do erro ORACLE.

Pág.: 45/53 7.4.3.1 Exemplos de valores do SQLCODE Segue abaixo os valores possíveis do SQLCODE na ocorrência de uma exceção. SQLCODE Descrição 0 Nenhuma exceção foi encontrada 1 User-defined exception +100 NO_DATA_FOUND exception Número Negativo Outro erro ORACLE

Pág.: 46/53 8 Exercícios Controle do fluxo de execução(if/loop) 1) Criar uma função chamada FNC_EXISTE_KING do tipo boolean Fazer com que a função retorne true se existe algum funcionário com o nome de KING.Senão retorna false Dicas:(utilizar) - uma variável antes do inicio do bloco do tipo number - a função COUNT - a cláusula INTO - IF/ELSE/END IF - RETURN 2) Criar a função FNC_FAIXA_SALARIAL do tipo varchar2 Retornar otimo se a soma dos salários for maior que 20.000 Retornar bom se a soma dos salários for entre 10.000 e 19.999 Retornar razoável se a soma dos salários for entre 5.000 e 9.999 Retornar ruim caso nenhuma das condições acima seja satisfatória Dicas:(utilizar) - uma variável antes do inicio do bloco do mesmo tipo do campo sal da tabela emp(% TYPE) - SUM - IF/ELSIF/ELSE/END IF - a cláusula INTO - RETURN 3) Criar a função FNC_VALOR_DUPLO do tipo number Esta função irá duplicar um número(com valor inicial de 15) até que ele seja maior que 1000.Retornar o resultado do cálculo. Dicas:(utilizar) - uma variável to tipo number com valor inicial - LOOP(basic)/END LOOP - EXIT WHEN - RETURN

Pág.: 47/53 4) Criar a função FNC_EXECUTA_5_VEZES do tipo boolean Irá executar 5 vezes um comando de exponenciação 2 de um número com início de 2.Retornar true se o número é maior 200 e false se é menor Dicas:(utilizar) - uma variável to tipo number com valor inicial - FOR LOOP/END LOOP - POWER - IF/ELSE/END IF - RETURN 5) Criar a função FNC_MENOR_10 do tipo number Irá executar o comando de somar um valor(inicial 0) com uma constante(inicial 15) enquanto este valor seja menor que 100.Retornar o valor calculado Dicas:(utilizar) - uma variável to tipo number com valor inicial - uma constante - WHILE LOOP/END LOOP - RETURN Cursores 1) Criar uma função chamada FNC_BUSCA_NOME do tipo varchar2 Ela retornará o nome do funcionário da tabela EMP que tem o código 30. Dicas: - CURSOR - OPEN - FETCH - CLOSE - RETURN 2) Criar uma função chamada FNC_BUSCA_DEPT do tipo varchar2 Ela retornará o código e nome do departamento concatenados do funcionário JAMES. Dicas: - CURSOR - OPEN - FETCH(com duas colunas) - CONCAT ou (ex: VAR1 VAR2 = VAR1VAR2) - CLOSE - RETURN

Pág.: 48/53 3) Criar uma função chamada FNC_EXISTE_FUNC do tipo boolean Utilize o atributo %FOUND de um cursor que recebe a data como parâmetro para saber se existe algum funcionário admitido na data de 09/06/1981.Se existir retornar TRUE,senão FALSE. Dicas: - CURSOR - OPEN - FETCH - %FOUND - CLOSE - RETURN 4) Criar uma função chamada FNC_TOTAL_ANALISTA do tipo number Esta função retornará a soma de salários dos funcionários com o cargo de analista utilizando uma estrutura de repetição com cursor declarado na seção DECLARATIVE. Dicas: - CURSOR - FOR LOOP (EX: FOR emp_record in c1 LOOP) - Operador + - RETURN 5) Criar uma função chamada FNC_NEW_YORK Esta função retorna quantos funcionários de um departamento localizado em NEW YORK(FOR LOOP com subquery) tem salário maior que 2500(use OPEN recebendo como parâmetro o código do funcionário) Dicas: - FOR LOOP com subquery - CURSOR - OPEN - FETCH - %FOUND - CLOSE - operador + como contador

Pág.: 49/53 PLSQL Records,PLSQL Tables, Functions Procedures 1) Criar uma função chamada FNC_JAMES_1981 do tipo boolean que retorne TRUE se o funcionário JAMES foi admitido no ano de 1980(não usar nenhuma variável, somente Record).Caso contrário retorna FALSE. Dicas: - %ROWTYPE(da tabela EMP) - SELECT INTO - RETURN 2) Criar uma procedure chamada PRC_EMP_JOVEM do tipo varchar2 que retorne o nome e o salário(parâmetros IN/OUT) do funcionário KING ou JONES que seja mais jovem na empresa. Dicas: - usar 2 records - usar 2 SELECT INTO ou cursor que receba empno como parâmetro - operador de comparação < - RETURN 3) Criar uma função chamada FNC_CALCULA_DECIMO do tipo number Popule uma PL/SQL table com o seguinte sql : SELECT * FROM EMP Retorne o salário do décimo elemento da lista. Dicas: - TABLE - LOOP ou FOR LOOP - Referência ao elemento (ex.: pltable(4).código) - RETURN 4) Criar uma função chamada FNC_DUPLICA do tipo number que duplica uma PLSQL table populada com o sql: SELECT * from dept e soma ao deptno da PLSQL table duplicada o valor 10. Apagar a primeira PLSQL table e retornar o maior valor de DEPTNO da segunda. Dicas : - TABLE(2 vezes) - EXTEND - LOOP ou FOR LOOP - Operador + - DELETE - RETURN

Pág.: 50/53 5) Criar uma procedure chamada PRC_INSERE_DEPT a qual insere um departamento na tabela DEPT com os valores : DEPTNO = Max(deptno) + 1 DNAME = DEPT DO nome do aluno logado(user) LOC = POA Dicas: - INSERT - COMMIT(para gravar os dados no banco) 6) Criar uma procedure chamada PRC_PERCENTUAL que recebe como parâmetro de entrada um percentual e de saída um número(salário). Este percentual será usado para atualizar o salário do funcionário com maior salário fazendo com que seja % maior que o segundo maior salário. Dicas: Parâmetros: P_PERCENTUAL IN NUMBER P_SAL OUT EMP.SAL%TYPE Ex: se o percentual é 10. O JAMES possui o maior salário O KING possui o segundo maior salário Atualizar o salário do JAMES para 10 % a mais que o salário do KING Retornar ao parâmetro P_SAL o salário do funcionário com o segundo maior salário. 7) Criar uma procedure chamada PRC_VERIFICA que verifique se o valor retornado pela função FNC_CALCULA_DECIMO é igual ao salário do funcionário retornado pela execução da procedure PRC_PERCENTUAL(percentual de 10 %).Se for igual emitir mensagem Salário do décimo funcionário é o segundo maior salário, senão Erro ao procurar salário do décimo funcionário. Dicas: - Atribuir a função a uma variável - Executar a procedure passando dois parâmetros - Avaliar o resultado do segundo parâmetro - dbms_output.put_line( mensagem )

Pág.: 51/53 Packages, Triggers Criar uma Package chamada PCK_GERAL.(espec. e corpo).criar uma variável pública com o nome de lg_percentual number inicializado com 12. 2) Criar uma função chamada FNC_TESTA_CIDADE na package PCK_GERAL do tipo boolean que recebe o nome da cidade e um parâmetro(p_total_sal) do tipo número.avaliar se a diferença da soma dos salário dos departamentos da cidade com o parâmetro P_TOTAL_SAL é maior que a variável pública LG_PERCENTUAL..Se sim retornar TRUE senão retornar FALSE. 3) Criar uma procedure chamada PRC_EXECUTA_FUNCAO na package PCK_GERAL que executa a função FNC_TESTA_CIDADE passando como parâmetro a cidade do funcionário JAMES e a soma de salários do seu departamento.se a função retornar TRUE emitir a mensagem Função retornou um valor válido para a cidade do funcionário JAMES, senão Função executada com erro Dicas: - DBMS_OUTPUT.PUT_LINE - RAISE_APPLICATION_ERROR 4) Criar uma trigger na tabela DEPT com o nome BI_DEPT que será disparada antes da inserção de uma linha na tabela e que incrementa em 10 o novo número do departamento. Dicas : - BEFORE INSERT - UPDATE - :NEW 5) Criar uma trigger na tabela EMP chamada BU_EMP que será disparada antes da atualização(update) da coluna SAL.Gerar um erro caso a diferença entre o salário novo e antigo seja superior a 10 % ou o salário novo seja menor que o antigo Dicas: - BEFORE UPDATE OF nome da coluna - :NEW/:OLD - operador > 6) Criar uma trigger chamada BID_DEPT na tabela DEPT que será disparada antes da inserção/deleção.caso seja uma inserção deve gerar um erro se já existir um departamento com o mesmo nome.caso seja uma deleção deve-se gerar um erro se existe algum funcionário associado ao departamento.

Pág.: 52/53 Dicas: - BEFORE INSERT OR DELETE - INSERTING - DELETING - SELECT - RAISE_APPLICATION_ERROR(-20500, MENSAGEM ) 7) Criar uma trigger chamada AI_DEPT na tabela DEPT que será disparada depois da inserção na tabela DEPT.Ela deve inserir um empregado com os dados(fictícios) do user do departamento inserido. Dicas: - AFTER INSERT - INSERT - :NEW - USER 8) Criar uma trigger chamada BU2_EMP(before update) na tabela EMP que somente será disparada se o empregado foi admitido depois de 1980. Atualizar a comissão do funcionário para NULL se o novo salário for diferente do antigo. Dicas: - BEFORE UPDATE - WHEN - :NEW/:OLD Exceptions Crie uma função chamada FNC_ACHOU que retorne TRUE se achou um funcionário com o nome de PEDRO.Senão retorne FALSE. Dicas: - SELECT INTO - EXCEPTION - NO_DATA_FOUND - RETURN

Pág.: 53/53 2) Crie uma procedure chamada PRC_INSERE_FUNC que tem como objetivo inserir um funcionário na tabela EMP com o empno de 7876(outros dados fictícios). Caso ocorra um erro de chave duplicada emitir uma mensagem dizendo que o código já existe.para qualquer outro erro emitir a mensagem Não é possível cadastrar funcionário Dicas: - INSERT - EXCEPTION - DUP_VAL_ON_INDEX - OTHERS - DBMS_OUTPUT.PUT_LINE 3) Crie uma função chamada FNC_USER_EXCEP que retorna um número. Esta função seleciona o código do departamento dos funcionários que tem o nome iniciado com J.Se retornar mais de uma linha a função retornará 2.Se não retornar nenhuma linha a função retornará 0. Caso o código selecionado seja 30 gerar um erro definido na seção declaration chamada exceção_30 e a função retorna(30). Dicas: - SELECT INTO - TOO_MANY_ROWS - NO_DATA_FOUND - Excecao_30 EXCEPTION - RAISE excecao_30 - WHEN excecao_30 4) Criar uma trigger chamada BU_DEPT que é disparada antes da atualização da tabela DEPT. Caso o novo local não esteja na relação dos locais já cadastrados gerar um erro definido na seção declarative e gerado via RAISE_APPLICATION_ERROR. Tratar a exceção levantada atualizando o novo local para NEW YORK Dicas: - nome_da_exceção EXCEPTION - PRAGMA_EXCEPTION_INIT(nome_da_exceção,numero menor que - 20000) - SELECT COUNT - RAISE_APPLICATION_ERROR - EXCEPTION - WHEN nome_da_exceção THEN - :NEW