Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Pg.: 2/53
SUMRIO
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 VARIVEIS NO PL/SQL................................................................................................. 7 1.6 ATRIBUINDO VALORES A VARIVEIS .................................................................................................... 8 1.7 TIPOS DE VARIVEIS ............................................................................................................................ 9 1.8 O ATRIBUTO %TYPE.......................................................................................................................... 9 1.9 CONTROLANDO O FLUXO DE EXECUO (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.1.3
2.1.3.1
TRABALHANDO COM VARIVEIS 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
Pg.: 3/53
3.3.1
3.3.2
3.3.3 3.3.4 4
Referenciando uma PL/SQL TABLE de RECORD. .................................................................. 22 Mtodos PL/TABLE ..................................................................................................... 23 Excees de usurio ................................................................................................................. 23 RAISE_APPLICATION_ERROR .............................................................................................. 24
STORED PROCEDURES ..................................................................................................................... 25 4.1 PROCEDURES ................................................................................................................................ 25 4.1.1 Executando uma PROCEDURE no SQL*PLUS ...................................................................... 26 4.1.2 Opo DEFAULT para parmetros ......................................................................................... 27 4.1.3 Mtodos para especificar parmetros ...................................................................................... 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 funo do banco de dados............................................................................. 30 4.2.3 Diferenas entre Procedures e Functions................................................................................. 32
PACKAGES (PACOTES)...................................................................................................................... 33 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 ESCOPO PBLICO............................................................................................................................... 33 ESCOPO PRIVADO .............................................................................................................................. 33 COMPONENTES DE UMA PACKAGE ................................................................................................. 33 CRIANDO UMA ESPECIFICAO DE PACOTE ....................................................................................... 34 CRIANDO O CORPO DO PACOTE ......................................................................................................... 34 EXECUTANDO UM PROCEDIMENTO DE UMA PACKAGE NO SQL*PLUS .......................................... 36 VARIVEIS GLOBAIS .......................................................................................................................... 36 REMOVENDO PACOTES ...................................................................................................................... 36
TRIGGERS (GATILHOS) .................................................................................................................... 37 6.1 6.2 6.3 USANDO PREDICADOS CONDICIONAIS (DELETING/INSERTING/UPDATING)............................. 38 USANDO OS QUALIFICADORES :NEW E :OLD ................................................................................... 39 GERENCIANDO GATILHOS.................................................................................................................. 39
EXCEES NO PL/SQL ...................................................................................................................... 39 7.1 O QUE UMA EXCEO ? .................................................................................................................. 39 7.2 TRATANDO UMA EXCEO ................................................................................................................ 39 7.3 PROPAGANDO EXCEES ................................................................................................................... 39 7.4 TIPOS DE EXCEES.......................................................................................................................... 39 7.4.1 Pr-definidas ............................................................................................................................ 39 7.4.2 Excees no pr-definidas ...................................................................................................... 39 7.4.3 Funes para tratamento de excees...................................................................................... 39
7.4.3.1 Exemplos de valores do SQLCODE..................................................................................................... 39
EXERCCIOS......................................................................................................................................... 39 CONTROLE DO FLUXO DE EXECUO(IF/LOOP) ........................................................................................... 39 CURSORES ..................................................................................................................................................... 39 PLSQL RECORDS,PLSQL TABLES, FUNCTIONS PROCEDURES...................................................................... 39 PACKAGES, TRIGGERS ................................................................................................................................... 39 EXCEPTIONS .................................................................................................................................................. 39
Pg.: 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 caractersticas das linguagens de programao desenvolvidas durante os anos 1970 e 1980. Esta permite que a manipulao de dados e consultas seja includa em unidades de programas, fazendo o PL/SQL uma poderosa linguagem de processamento de transao.
1.2
Blocos de PL/SQL so 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.
Pg.: 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
Um bloco PL/SQL composto por trs sees : DECLARATIVE (opcional), EXECUTABLE (obrigatria) e EXCEPTION HANDLING (opcional). Unicamente as palavras BEGIN e END so exigidas.
Seo
DECLARATIVE
Significado
Contm todas as variveis constantes, cursores e excees dos usurios que so utilizadas nas outras sees. Contm comandos SQL e PL/SQL Especifica aes a serem executadas quando um erro ocorre dentro de seo EXECUTABLE
Pg.: 6/53
Ex. DECLARE ..................(Variveis, cursores, constantes, etc.) BEGIN ..................(Comandos SQL e PL/SQL) EXCEPTION ..................(Aes a serem executadas caso um erro acontea) END;
1.4
ANONYMOUS BLOCK: ANONYMOUS BLOCK so blocos no nomeados. Eles so declarados em um ponto de uma aplicao onde eles sero executados e passados para o PL/SQL ENGINE executar. SUBPROGRAMS : SUBPROGRAMS so 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 nvel de aplicao.
PROCEDURE PROCEDURE nome IS BEGIN comandos FUNCTIONS FUNCTION nome RETURN DATATYPE IS BEGIN - comandos [EXCEPTIONS] END;
ANONYMOUS [DECLARE]
[EXCEPTIONS] END;
Pg.: 7/53
1.5
Voc precisa declarar todas as variveis dentro da seo declarativa antes de referenciar dentro de um bloco PL/SQL. Voc tem a opo de atribuir um valor inicial.
Sintaxe :
Identifier CONSTANT
o nome da varivel contm uma varivel que no pode ser alterada (precisam ser inicializadas) um scalar, composite ou lob determina que a varivel no pode ser nula. (Precisam de um valor inicial) qualquer expresso PL/SQL. Uma literal, outra varivel ou uma expresso envolvendo operaes ou FUNCTIONS
expr
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;
Pg.: 8/53
Obs. Identifiers no podem ser maiores que 30 caracteres e o primeiro caracter deve ser uma letra. Por DEFAULT variveis so inicializadas com NULL
1.6
:= := := := :=
Literais STRINGS so atribudas com aspas simples - por exemplo ol. Se voc deseja colocar uma aspa dentro da STRING, coloque duas. - ' ol '' '.
Pg.: 9/53
1.7
Tipos de variveis
TIPO VARCHAR2(SIZE) DESCRIO Tipo base para variveis caracter de Tamanho varivel. at 32767. No h tamanho DEFAULT para a definio de variveis e constantes. Nmeros fixos e com ponto flutuante Tipo base para data e hora Tipo base para variveis de tamanho Tipo base para variveis caracter de tamanho varivel. acima de 32760 bytes. O mximo 2147483647 bytes. Tipo base para variveis binrias e bytes. No implementada no PL/SQL; TRUE,FALSE ou NULL Tipo base para nmeros inteiros entre -2147483647 e -2147483647. Tipo base para nmeros inteiros entre -2147483647 e -2147483647
LONG ROW
1.8
O Atributo %TYPE
Serve para declarar uma varivel de acordo com uma coluna de uma tabela ou com base em outra varivel j declarada.
1.9
Voc pode alterar o fluxo de execuo usando o comando condicional IF. Segue abaixo as trs formas para o IF. - IF-THEN-END IF - IF-THEN-ELSE-END IF - IF-THEN-ELSIF-END IF
Pg.: 10/53
Sintaxe IF condio THEN comandos; [ELSIF condio THEN comandos ] [ELSE comandos;] END; Exemplos 1) ..... IF ESTADO= 'RS' THEN NOME := 'RIO GRANDE DO SUL'; END IF; ..... 2) ..... IF ESTADO = 'RS' THEN NOME := 'RIO GRANDE DO SUL'; ELSE NOME := 'OUTRO QUALQUER'; END IF; ..... 3) ..... IF ESTADO = 'RS' THEN NOME := 'RIO GRANDE DO SUL'; ELSIF ESTADO = 'SP' THEN NOME := 'SO PAULO'; END IF; ..... 4) ..... IF ESTADO = 'RS' THEN NOME := 'RIO GRANDE DO SUL'; ELSIF ESTADO = 'SP' THEN NOME := 'SO PAULO'; ELSE NOME := 'OUTRO QUALQUER'; END IF; .....
Pg.: 11/53
1.10 LOOP
Existem trs tipos de LOOP : BASIC LOOP FOR LOOP WHILE LOOP
Ex.
DECLARE contador NUMBER (2) := 1; BEGIN LOOP comandos; contador := contados + 1; EXIT WHEN contador > 10; END LOOP;
Pg.: 12/53
REVERSE Ex.
Sintaxe WHILE condition LOOP comandos; END LOOP; Condition uma varivel BOOLEAN ou uma expresso
Pg.: 13/53
Voc pode encadear LOOPS. Por exemplo, colocar um FOR LOOP dentro de um WHILE LOOP. Normalmente a terminao do LOOP mais interno no termina a execuo do LOOP mais externo. No entanto, voc pode usar um LABEL para o LOOP mais externo e forar a sada atravs 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;
Pg.: 14/53
O ORACLE SERVER usa uma rea chamada SQL reas para executar um comando SQL e armazenar as informaes. Voc pode usar cursores PL/SQL para nomear um SQL e acessar as informaes armazenadas. Tipos de cursores Implicit Explicit so 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 explcitos so declarados e nomeados pelo programados e manipulados atravs de comandos especficos.
Ex. Result Set 2234 4543 3233 2221 JOO PEDRO MARIA CARLOS
Cursor==>
Linha corrente
Pg.: 15/53
2.1.2.1 Controlando um Cursor Explicito No |--------------------| | | Sim OPEN ==> FETCH ==>EMPTY ?==> CLOSE Abre o L a corrente Testa a Fecha cursor. linha para existncia de cursor Seta como variveis Linhas ativo Retorna para o FETCH se foram encontradas linhas
==>
Sintaxe CURSOR cursor_name IS comando_select; cursor_name comando_select Ex. um identificador PL/SQL um comando SELECT (sem o INTO)
Pg.: 16/53
o nome do cursor previamente declarado a varivel de sada para armazenar o retorno o nome do RECORD onde os dados sero armazenados. O RECORD pode ser declarado usando o %ROWTYPE.
O comando CLOSE fecha o cursor. Desabilita o cursor e o resultado tornando-o como indefinido. Feche o cursor aps completar o processamento do comando SELECT. Isto permite que o cursor seja reaberto se necessrio. Se voc executar o FETCH em um cursor j fechado, acontecer a exceo INVALID_CURSOR.
Descrio Retorna TRUE e o cursor est aberto Retorna TRUE se o FETCH no retornou linhas Retorna TRUE se o FETCH retornou linhas Retorna o total de linhas retornadas
Pg.: 17/53
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 parmetro 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;
Um cursor FOR LOOP processa linhas como um cursor explcito. Ele um fcil de utilizar porque o cursor quando aberto, as linhas so retornadas para cada interao do LOOP, e fechado automaticamente quando todas as linhas foram processadas. O LOOP termina automaticamente no fim da ultima interao quando a ultima linha retornada.
Pg.: 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 so implicitamente executados IF emp_record.empno = 7839 THEN .... END IF; END LOOP; -- O CLOSE executado implicitamente. END;
Exemplo BEGIN FOR emp_record IN ( SELECT empno,ename FROM emp) LOOP -- O OPEN e o FETCH so implicitamente executados IF emp_record.empno = 7839 THEN .... END IF; END LOOP; -- O CLOSE executado implicitamente. END;
Pg.: 19/53
COMPOSITE DATATYPES (tambm conhecida como COLLECTIONS) so 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, salrio, data de nascimento. Estes dados possuem diferentes tipos mas esto logicamente ligados a um empregado. Sendo assim, defini-se um RECORD para agrupar os campos do empregado. Segue abaixo algumas consideraes : - cada RECORD pode ter muitos campos - RECORD pode ter atribudo valores DEFAULT e podem ser definidos como NOT NULL - campos sem valor DEFAULT so 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.
Pg.: 20/53
field type
Exemplo DECLARE TYPE emp_record_type IS RECORD (nome VARCHAR2(30) ,cargo VARCHAR2(10) ,salario NUMBER (13,2)); emp_record emp_record_type;
3.2
PL/SQL TABLES
Objetos do tipo TABLE so chamados de PL/SQL TABLES. Eles so modelados como uma TABLE (DATABASE TABLE). PL/SQL TABLE usam uma PRIMARY KEY que permite acessar os registros.
Pg.: 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
DECLARE TYPE date_table_type IS TABLE OF DATE INDEX BY BINARY INTEGER; date_table date_table_type;
Pg.: 22/53
3.3
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;
Pg.: 23/53
Descrio Retorna TRUE se o elemento(n) existe na PL/SQL tabela Retorna o nmero de elementos da PL/SQL TABLE Retorna a primeira linha e ultima da PL/SQL TABLE. Retorna NULL se a PL/SQL TABLE est vazia Retorna o ndice que precede o ndice n em uma PL/SQL TABLE Retorna o ndice que sucede o ndice n em uma PL/SQL TABLE 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 Remove um elemento do final da PL/SQL TABLE DELETE deleta todas as linhas da PL/SQL TABLE DELETE (n) deleta o n elemento da PL/SQL TABLE DELETE (m,n) remove os elementos no intervalo entre m e n.
TRIM DELETE
Pg.: 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 message : erro definido pelo usurio entre -20000 e -20999. : a mensagem do erro.
Pg.: 25/53
4 STORED PROCEDURES
4.1
PROCEDURES
Podemos definir uma PROCEDURE como um bloco PL/SQL nomeado que pode obter parmetros (argumentos) e executar alguma ao. Uma PROCEDURE pode ficar armazenada dentro de forms ou no banco de dados (STORED PROCEDURE). Sendo armazenada no banco de dados, estas provm a reutilizao. Uma vez validados, eles podem ser usados em vrias aplicaes, Se a definio for alterada, somente o procedimento ser afetado, o que simplifica bastante a manuteno.
Sintaxe (criao no banco de dados) CREATE [OR REPLACE] PROCEDURE nome_procedimento [parmetro1 [modo1] tipodedados1, parmetro2 [modo2] tipodedados2, ...) IS|AS PL/SQL BLOCK
tipo de dados
Nome da PROCEDURE Nome da varivel PL/SQL IN (DEFAULT) OUT IN OUT Tipo de dados do parmetro - Number,varchar2,date,etc.(sem tamanho) - %TYPE - %ROWTYPE - Um tipo pr-definido em uma PACKAGE Bloco PL/SQL que define as aes executadas pelo procedimento
PL/SQL Block
Pg.: 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
Obs. Para executar uma PROCEDURE com parmetro OUT ou IN OUT necessrio declarar uma varivel 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 no permite a declarao de variveis BOOLEAN
Pg.: 27/53
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; /
Exemplos Considere a seguinte PROCEDURE prc_aumenta_precos ( cd_empresa NUMBER ,cd_filial NUMBER ,cd_produto NUMBER);
Pg.: 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);
Pg.: 29/53
4.2
FUNCTIONS
Assim como a PROCEDURE, podemos definir uma funo como um bloco PL/SQL nomeado que pode obter parmetros (argumentos) e executar alguma ao. A nica diferena que a funo necessita o retorno de um valor.
Sintaxe (criao no banco de dados) CREATE [OR REPLACE] FUNCTION nome_procedimento [parmetro1 [modo1] tipodedados1, parmetro2 [modo2] tipodedados2, ...) RETURN tipo de dados IS|AS PL/SQL Block
tipo de dados
Nome da PROCEDURE Nome da varivel PL/SQL IN (DEFAULT) OUT IN OUT Tipo de dados do parmetro Number,varchar2,date, etc.(sem tamanho) %TYPE %ROWTYPE Um tipo pr-definido em uma PACKAGE
Tipo de dados do retorno da funo. Segue as mesmas regras do tipo de dados dos parmetros Bloco PL/SQL que define as aes executadas pela funo
PL/SQL Block
Pg.: 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; RETURN v_nome; END; / PROCEDURE created
Pg.: 31/53
Pg.: 32/53
Pg.: 33/53
5 PACKAGES (PACOTES)
Uma PACKAGE (pacote) tem a finalidade de agrupar itens FUNCTIONS / PROCEDURES/variveis) relacionadas. Por exemplo, podemos agrupar todos as funes e PROCEDURES relacionadas ao sistema financeiro. Um componente de uma PACKAGE (FUNCTION/PROCEDURE/varivel) pode ser pblico ou privado.
5.1
Escopo Pblico
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 especificao do pacote.
5.2
Escopo Privado
S pode ser referenciado por outras construes que so parte do mesmo pacote.
5.3
Pg.: 34/53
5.4
Obs. Todos os itens declarados na especificao so do escopo pblico. Ou seja, so itens (PROCEDURES, FUNCTIONS) que podem ser chamados repetitivamente por outras construes 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
O corpo de uma PACKAGE o local onde so definidas as aes para cada programa (pblico ou privada). no corpo que encontra-se o programa (PL/SQL) de cada elemento (PROCEDURE, FUNCTIONS). Tambm podem ser definidas as variveis privadas da PACKAGE.
Pg.: 35/53
CREATE [OR REPLACE] PACKAGE BODY nome_pacote IS | AS tipo pblico e declaraes de item especificaes do SUBPROGRAMA. END nome_pacote
Nome do pacote Declara variveis, constantes, cursores, excees e tipos declara os SUBPROGRAMS PL/SQL pblicos e privados
Obs. a ordem que os SUBPROGRAMS privados (PROCEDURES, FUNCTIONS) so definidos no corpo de grande importncia. Voc deve definir ou declarar SUBPROGRAMS privados antes de cham-los a partir de outros. No caso de SUBPROGRAMS pblicos tal definio no faz-se necessria.
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; /
Pg.: 36/53
5.6
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 so pblicos. Ou seja, esto declarados na especificao.
5.7
Variveis Globais
Voc pode declarar variveis pblicas (globais) que iro existir durante a sesso do usurio.
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 especificao e o corpo utilize o comando DROP PACKAGE. Ex. DROP PACKAGE nome_do_pacote Para remover somente o corpo BODY. Ex. DROP PACKAGE BODY nome_do_pacote utilize o comando DROP PACKAGE
Pg.: 37/53
6 TRIGGERS (gatilhos)
Uma TRIGGER um bloco PL/SQL executado de forma implcita sempre que um determinado evento ocorre. Por exemplo, pode-se definir uma TRIGGER que disparada sempre quando um funcionrio includo.
SINTAXE CREATE OR [REPLACE] TRIGGER nome_gatilho tempo evento1 [OR evento2 or evento3] ON nome_tabela [FOR EACH ROW] [WHEN condio] BEGIN corpo_gatilho; END;
nome_gatilho tempo
o nome do gatilho Indica o tempo de disparo em relao ao evento ocorrido BEFORE UPDATE [OF column] DELETE
corpo do gatilho
Indica a tabela ou VIEW Determina que o gatilho deve ser disparado a cada linha inserida Especifica a restrio de gatilho (Esse predicado condicional e avaliado para cada linha a fim de determinar se o corpo do gatilho executado ou no o corpo do gatilho que define as aes executadas (comandos PL/SQL)
Pg.: 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
Em algumas situaes faz-se necessrio 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 salrio de empregados em dias teis'); ELSIF DELETING RAISE_APPLICATION_ERROR (-20052, 'Voc s pode excluir empregados em dias teis'); END IF; END IF; END;
Pg.: 39/53
6.2
Voc pode usar os valores das colunas da tabela. Para isto utilize os qualificadores NEW e OLD. Em uma TRIGGER faa referencia ao valor de uma coluna antes e depois da alterao dos dados.
Ex. CREATE OR REPLACE TRIGGER insert_emp BEFORE INSERT ON EMP FOR EACH ROW BEGIN IF :NEW.SALARIO = 0 THEN RAISE_APPLICATION_ERROR(-20050, 'Salrio no pode ser 0'); END IF; END;
Obs.
Os qualificadores OLD e NEW esto disponveis nos gatilhos ROW (FOR EACH ROW). Preceda esses qualificadores como dois pontos em cada instruo SQL e PL/SQL No h prefixo dois pontos (:) caso os qualificadores sejam referenciados condio de restrio WHEN.
Pg.: 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
Pg.: 41/53
7 EXCEES NO PL/SQL
7.1
Identificador em PL/SQL que levantado durante a execuo de um bloco PL/SQL. Tal exceo pode acontecer atravs de um erro ORACLE ou da execuo do comando RAISE. Um bloco sempre finalizado quando uma exceo acontece. Mas voc pode declarar uma exceo para manipular e executar aes caso um erro acontea.
Ex. Um erro ORACLE (ORA-01403) acontece quando nenhum registro retornado de um SELECT. Para este erro, gerada a exceo NO_DATA_FOUND.
7.2
Se uma exceo acontece durante a execuo de um PL/SQL e esta tratada, a exceo no propaga para sees externas. O PL/SQL bloco executado com sucesso.
Pg.: 42/53
7.3
Propagando excees
Quando uma exceo no tratada no bloco PL/SQL em que ela acontece, esta propagada a blocos mais externos. Caso no seja encontrada a execuo do PL/SQL finalizada com falha. Ex.
DECLARE BEGIN BEGIN a exceo levantada EXCEPTION a exceo no tratada END; EXCEPTION a exceo no tratada END;
Obs. A propagao de exceo acontece tambm em STORED PROCEDURE. Ou seja, caso uma PROCEDURE retorne uma exceo, esta pode ser tratada no bloco PL/SQL que a chamou. Caso acontea, o bloco PL/SQL finalizado com erro.
7.4
Tipos de excees
Pg.: 43/53
7.4.1 Pr-definidas
No so declaradas e so excees geradas implicitamente pelo ORACLE. So aproximadamente 20. Segue abaixo as mais utilizadas :
INVALID_CURSOR
ORA-01001
Causa Tentar abrir um cursor j aberto Tentar inserir um valor duplicado em uma tabela (PRIMARY KEY) Operao Ilegal com um cursor. Ex. tentar executar um FETCH em um cursor que no foi aberto Converso de uma STRING para NUMBER. Um SELECT no retornou dados Um SELECT retornou mais de um registro Atribuir um valor mais a uma varivel Diviso por ZERO
Excees no pr-definidas so aquelas que no so geradas automaticamente na ocorrncia de um erro ORACLE. No entanto, voc pode fazer explicitamente a associao de um erro ORACLE a uma exceo e tratla. Utilize o PRAGMA para associar um erro ORACLE a uma exceo. Segue abaixo os passos para tratar uma exceo no pr-definida. 1) Declare uma exceo dentro da seo de declarao (DECLARE) exception exception EXCEPTION; o nome da exceo
Pg.: 44/53
2) Associe a exceo declarada a um erro ORACLE usando o comando PRAGMA EXCEPTION_INT PRAGMA EXCEPTION_INIT (exception, error_number); exception error_number a exceo previamente declarada um erro Oracle
Ex.
DECLARE e_produto_invalido PRAGMA EXCEPTION_INIT BEGIN ........ EXCEPTION WHEN e_produto_invalido THEN ...... END; EXCEPTION; (e_produto_invalido, -2292);
Quando um erro acorre, voc pode identificar o erro ocorrido e a mensagens atravs do uso de duas funes.
SQLCODE SQLERRM
Retorna o cdigo do erro ORACLE. Voc pode atribuir a uma varivel NUMBER. : Retorna a mensagem do erro ORACLE.
Pg.: 45/53
Segue abaixo os valores possveis do SQLCODE na ocorrncia de uma exceo. SQLCODE 0 1 +100 Nmero Negativo Descrio Nenhuma exceo foi encontrada User-defined exception NO_DATA_FOUND exception Outro erro ORACLE
Pg.: 46/53
8 Exerccios
Controle do fluxo de execuo(IF/LOOP)
1) Criar uma funo chamada FNC_EXISTE_KING do tipo boolean Fazer com que a funo retorne true se existe algum funcionrio com o nome de KING.Seno retorna false Dicas:(utilizar) - uma varivel antes do inicio do bloco do tipo number - a funo COUNT - a clusula INTO - IF/ELSE/END IF - RETURN 2) Criar a funo FNC_FAIXA_SALARIAL do tipo varchar2 Retornar otimo se a soma dos salrios for maior que 20.000 Retornar bom se a soma dos salrios for entre 10.000 e 19.999 Retornar razovel se a soma dos salrios for entre 5.000 e 9.999 Retornar ruim caso nenhuma das condies acima seja satisfatria Dicas:(utilizar) - uma varivel antes do inicio do bloco do mesmo tipo do campo sal da tabela emp(% TYPE) - SUM - IF/ELSIF/ELSE/END IF - a clusula INTO - RETURN 3) Criar a funo FNC_VALOR_DUPLO do tipo number Esta funo ir duplicar um nmero(com valor inicial de 15) at que ele seja maior que 1000.Retornar o resultado do clculo. Dicas:(utilizar) - uma varivel to tipo number com valor inicial - LOOP(basic)/END LOOP - EXIT WHEN - RETURN
Pg.: 47/53
4) Criar a funo FNC_EXECUTA_5_VEZES do tipo boolean Ir executar 5 vezes um comando de exponenciao 2 de um nmero com incio de 2.Retornar true se o nmero maior 200 e false se menor Dicas:(utilizar) - uma varivel to tipo number com valor inicial - FOR LOOP/END LOOP - POWER - IF/ELSE/END IF - RETURN 5) Criar a funo 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 varivel to tipo number com valor inicial - uma constante - WHILE LOOP/END LOOP - RETURN
Cursores
1) Criar uma funo chamada FNC_BUSCA_NOME do tipo varchar2 Ela retornar o nome do funcionrio da tabela EMP que tem o cdigo 30. Dicas: CURSOR OPEN FETCH CLOSE RETURN
2) Criar uma funo chamada FNC_BUSCA_DEPT do tipo varchar2 Ela retornar o cdigo e nome do departamento concatenados do funcionrio JAMES. Dicas: CURSOR OPEN FETCH(com duas colunas) CONCAT ou ||(ex: VAR1 || VAR2 = VAR1VAR2) CLOSE RETURN
Pg.: 48/53
3) Criar uma funo chamada FNC_EXISTE_FUNC do tipo boolean Utilize o atributo %FOUND de um cursor que recebe a data como parmetro para saber se existe algum funcionrio admitido na data de 09/06/1981.Se existir retornar TRUE,seno FALSE. Dicas: CURSOR OPEN FETCH %FOUND CLOSE RETURN
4) Criar uma funo chamada FNC_TOTAL_ANALISTA do tipo number Esta funo retornar a soma de salrios dos funcionrios com o cargo de analista utilizando uma estrutura de repetio com cursor declarado na seo DECLARATIVE. Dicas: CURSOR FOR LOOP (EX: FOR emp_record in c1 LOOP) Operador + RETURN
5) Criar uma funo chamada FNC_NEW_YORK Esta funo retorna quantos funcionrios de um departamento localizado em NEW YORK(FOR LOOP com subquery) tem salrio maior que 2500(use OPEN recebendo como parmetro o cdigo do funcionrio) Dicas: FOR LOOP com subquery CURSOR OPEN FETCH %FOUND CLOSE operador + como contador
Pg.: 49/53
1) Criar uma funo chamada FNC_JAMES_1981 do tipo boolean que retorne TRUE se o funcionrio JAMES foi admitido no ano de 1980(no usar nenhuma varivel, somente Record).Caso contrrio 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 salrio(parmetros IN/OUT) do funcionrio KING ou JONES que seja mais jovem na empresa. Dicas: usar 2 records usar 2 SELECT INTO ou cursor que receba empno como parmetro operador de comparao < RETURN
3) Criar uma funo chamada FNC_CALCULA_DECIMO do tipo number Popule uma PL/SQL table com o seguinte sql : SELECT * FROM EMP Retorne o salrio do dcimo elemento da lista. Dicas: TABLE LOOP ou FOR LOOP Referncia ao elemento (ex.: pltable(4).cdigo) RETURN
4) Criar uma funo 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
Pg.: 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 parmetro de entrada um percentual e de sada um nmero(salrio). Este percentual ser usado para atualizar o salrio do funcionrio com maior salrio fazendo com que seja % maior que o segundo maior salrio. Dicas: Parmetros: P_PERCENTUAL IN NUMBER P_SAL OUT EMP.SAL%TYPE Ex: se o percentual 10. O JAMES possui o maior salrio O KING possui o segundo maior salrio Atualizar o salrio do JAMES para 10 % a mais que o salrio do KING Retornar ao parmetro P_SAL o salrio do funcionrio com o segundo maior salrio.
7) Criar uma procedure chamada PRC_VERIFICA que verifique se o valor retornado pela funo FNC_CALCULA_DECIMO igual ao salrio do funcionrio retornado pela execuo da procedure PRC_PERCENTUAL(percentual de 10 %).Se for igual emitir mensagem Salrio do dcimo funcionrio o segundo maior salrio, seno Erro ao procurar salrio do dcimo funcionrio.
Dicas: Atribuir a funo a uma varivel Executar a procedure passando dois parmetros Avaliar o resultado do segundo parmetro dbms_output.put_line(mensagem)
Pg.: 51/53
Packages, Triggers
Criar uma Package chamada PCK_GERAL.(espec. e corpo).Criar uma varivel pblica com o nome de lg_percentual number inicializado com 12.
2) Criar uma funo chamada FNC_TESTA_CIDADE na package PCK_GERAL do tipo boolean que recebe o nome da cidade e um parmetro(P_TOTAL_SAL) do tipo nmero.Avaliar se a diferena da soma dos salrio dos departamentos da cidade com o parmetro P_TOTAL_SAL maior que a varivel pblica LG_PERCENTUAL..Se sim retornar TRUE seno retornar FALSE. 3) Criar uma procedure chamada PRC_EXECUTA_FUNCAO na package PCK_GERAL que executa a funo FNC_TESTA_CIDADE passando como parmetro a cidade do funcionrio JAMES e a soma de salrios do seu departamento.Se a funo retornar TRUE emitir a mensagem Funo retornou um valor vlido para a cidade do funcionrio JAMES, seno Funo 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 insero de uma linha na tabela e que incrementa em 10 o novo nmero do departamento. Dicas : BEFORE INSERT UPDATE :NEW
5) Criar uma trigger na tabela EMP chamada BU_EMP que ser disparada antes da atualizao(UPDATE) da coluna SAL.Gerar um erro caso a diferena entre o salrio novo e antigo seja superior a 10 % ou o salrio 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 insero/deleo.Caso seja uma insero deve gerar um erro se j existir um departamento com o mesmo nome.Caso seja uma deleo deve-se gerar um erro se existe algum funcionrio associado ao departamento.
Pg.: 52/53
7) Criar uma trigger chamada AI_DEPT na tabela DEPT que ser disparada depois da insero na tabela DEPT.Ela deve inserir um empregado com os dados(fictcios) 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 comisso do funcionrio para NULL se o novo salrio for diferente do antigo. Dicas: BEFORE UPDATE WHEN :NEW/:OLD
Exceptions
Crie uma funo chamada FNC_ACHOU que retorne TRUE se achou um funcionrio com o nome de PEDRO.Seno retorne FALSE. Dicas: SELECT INTO EXCEPTION NO_DATA_FOUND RETURN
Pg.: 53/53
2) Crie uma procedure chamada PRC_INSERE_FUNC que tem como objetivo inserir um funcionrio na tabela EMP com o empno de 7876(outros dados fictcios). Caso ocorra um erro de chave duplicada emitir uma mensagem dizendo que o cdigo j existe.Para qualquer outro erro emitir a mensagem No possvel cadastrar funcionrio Dicas: INSERT EXCEPTION DUP_VAL_ON_INDEX OTHERS DBMS_OUTPUT.PUT_LINE
3) Crie uma funo chamada FNC_USER_EXCEP que retorna um nmero. Esta funo seleciona o cdigo do departamento dos funcionrios que tem o nome iniciado com J.Se retornar mais de uma linha a funo retornar 2.Se no retornar nenhuma linha a funo retornar 0. Caso o cdigo selecionado seja 30 gerar um erro definido na seo declaration chamada exceo_30 e a funo 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 atualizao da tabela DEPT. Caso o novo local no esteja na relao dos locais j cadastrados gerar um erro definido na seo declarative e gerado via RAISE_APPLICATION_ERROR. Tratar a exceo levantada atualizando o novo local para NEW YORK Dicas: nome_da_exceo EXCEPTION PRAGMA_EXCEPTION_INIT(nome_da_exceo,numero menor que 20000) SELECT COUNT RAISE_APPLICATION_ERROR EXCEPTION WHEN nome_da_exceo THEN :NEW