Sei sulla pagina 1di 53

Introduo ao PL/SQL

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

TRABALHANDO COM CURSORES ................................................................................................. 14 2.1.1 2.1.2


2.1.2.1 2.1.2.2 2.1.2.3 2.1.2.4 2.1.2.5 2.1.2.6 2.1.2.7

Implicit Cursor ......................................................................................................................... 14 Explicit Cursor ......................................................................................................................... 14


Controlando um Cursor Explicito ........................................................................................................ 15 Declarando um Cursor.......................................................................................................................... 15 Abrindo um Cursor............................................................................................................................... 15 Buscando os dados do Cursor .............................................................................................................. 16 Fechando o Cursor ............................................................................................................................... 16 Atributos para Cursores Explcitos....................................................................................................... 16 Cursor Explcito com Parmetros......................................................................................................... 17

2.1.3
2.1.3.1

Cursor FOR LOOPS................................................................................................................. 17


Cursor FOR LOOPS usando SUBQUERIES ....................................................................................... 18

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

Como executado um PL/SQL no ORACLE SERVER

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

Estrutura de um bloco PL/SQL

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

EXECUTABLE EXCEPTION HANDLING

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

Tipos de blocos PL/SQL

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]

BEGIN - comandos [EXCEPTION] END;

[EXCEPTIONS] END;

Obs. A funo similar a PROCEDURE, exceto que a funo retorna valor.

Pg.: 7/53

1.5

Declarando variveis no PL/SQL


Variveis so unidades de armazenamento de dados em um bloco PL/SQL, podendo seus valores serem alterados de acordo com a lgica do programa.O escopo de uma varivel o escopo da unidade de programa onde foi declarada.Uma varivel deve necessariamente ser declarada, definindo seu tipo e tamanho(opcional dependendo do tipo)

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] DATATYPE [NOT NULL] [:= | DEFAULT expr]

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

DATATYPE NOT NULL

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

Atribuindo valores a variveis


Para atribuir valores a variveis, use o operador :=. Sintaxe. identifier := expr; identifier expr Exemplos : o nome da varivel : pode ser varivel, literal ou uma FUNCTION;

BEGIN dolar data_nascimento cod_departamento data_atual1 data_atual2 END; Obs. -

:= := := := :=

1.4; '16-MAY-2000'; 10; SYSDATE; to_date ('16-MAY-2000');

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

NUMBER (PRECISION, SCALE) DATE CHAR[(SIZE)] LONG

LONG ROW

BOOLEAN BINARY_INTEGER PLS_INTEGER

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

Controlando o fluxo de execuo (IF)

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

1.10.1 BASIC LOOP


Sintaxe LOOP comandos EXIT [WHEN condio]; END LOOP;

Ex.

DECLARE contador NUMBER (2) := 1; BEGIN LOOP comandos; contador := contados + 1; EXIT WHEN contador > 10; END LOOP;

Pg.: 12/53

1.10.2 FOR LOOP


Sintaxe FOR counter IN [REVERSE] lower_bound..upper_bound LOOP comandos; END LOOP; counter uma varivel implicitamente declarada do tipo inteiro (INTEGER) com valores automaticamente incrementados ou decrementadas por 1 para cada execuo do LOOP. causa um decremento no counter. O DEFAULT

REVERSE Ex.

FOR I IN 1..10 LOOP comandos; END LOOP;

1.10.3 WHILE LOOP

Sintaxe WHILE condition LOOP comandos; END LOOP; Condition uma varivel BOOLEAN ou uma expresso

Ex. WHILE I <=10 LOOP I := I + 1;; END LOOP;

Pg.: 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 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

2 TRABALHANDO COM CURSORES

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.

2.1.1 Implicit Cursor


O ORACLE SERVER implicitamente abre um cursor para processar cada comandos SQL no associado com um cursor explicitamente declarado.

2.1.2 Explicit Cursor


Um cursor explcito individualmente processa cada linha retornada por um comando SELECT. O conjunto de linhas retornadas por SELECT chamado por result set.

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

DECLARE Cria um SQL area

==>

2.1.2.2 Declarando um Cursor

Sintaxe CURSOR cursor_name IS comando_select; cursor_name comando_select Ex. um identificador PL/SQL um comando SELECT (sem o INTO)

DECLARE CURSOR c1 IS SELECT empno, ename FROM emp; BEGIN ......

2.1.2.3 Abrindo um Cursor


Sintaxe OPEN cursor_name;

Pg.: 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 varivel de sada para armazenar o retorno o nome do RECORD onde os dados sero 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 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.

2.1.2.6 Atributos para Cursores Explcitos


Segue abaixo alguns atributos que podemos utilizar para auxiliar no processamento de cursores.

NOME %ISOPEN %NOTFOUND %FOUND %ROWCOUNT

RETORNO BOOLEAN BOOLEAN BOOLEAN NUMBER

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

2.1.2.7 Cursor Explcito com Parmetros


Voc pode passar parmetros para o cursor antes que este seja aberto. Isto significa que voc pode abrir e fechar um cursor vrias vezes em um bloco PL/SQL, retornando diferentes informaes.

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;

2.1.3 Cursor FOR LOOPS

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;

2.1.3.1 Cursor FOR LOOPS usando SUBQUERIES

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

3 TRABALHANDO COM VARIVEIS COMPOSTAS


COMPOSITE DATATYPES

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

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 varivel do tipo RECORD so 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 varivel 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 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

3.2.1 Criando uma PL/SQL TABLE


H dois passos para criao de uma PL/SQL TABLE. 1. Declare um tipo TABLE 2. Declare uma varivel 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;

Pg.: 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';

Pg.: 23/53

3.3.2 Mtodos PL/TABLE

Mtodo EXISTS (n) COUNT FIRST/LAST PRIOR(n) NEXT(n) EXTEND(n,i)

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

3.3.3 Excees de usurio


Estas excees no so vinculadas a um erro ORACLE e so levantadas atravs do comando RAISE. Geralmente so utilizadas para o tratamento de erros de regra de negcio do sistema.

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.

Ex. EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20001,'Dolar no cadastrado'); END;

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

nome_procedimento parmetro modo

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

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 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

4.1.2 Opo DEFAULT para parmetros


Voc pode especificar um valor DEFAULT para um parmetro caso este no seja informado. Para isto necessrio acrescentar a clausula DEFAULT aps a definio do tipo de dados do parmetro.

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 Mtodos para especificar parmetros


Existem trs formas de especificar os parmetros na chamada de um procedimento : posicional, nomeado e combinao Posicional Nomeado Combinada Assume os valores na ordem que so passados Assume o valor associado ao nome do parmetro atravs do uso do =>. Assume os primeiro parmetros como posicional e os outros atravs do nomeado.

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);

4.1.4 Chamando um procedimento a partir de um bloco PL/SQL


Voc pode chamar um procedimento dentro de um bloco PL/SQL (annimo 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;

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

nome_procedimento parmetro modo

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

RETURN tipo de dados

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

4.2.1 Executando uma FUNCTION no SQL*PLUS


Utilize o comando EXECUTE para executar uma funo e PRINT para visualizar o valor a varivel 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 funo 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;

Pg.: 31/53

Pg.: 32/53

4.2.3 Diferenas entre Procedures e Functions


Ambas possuem funcionalidades semelhantes,porm a function por si s representa um valor, ou seja, mesmo no tendo parmetros do tipo OUT ela retorna um valor.Procedures s retornam valores se possurem parmetros do tipo OUT. Outra diferena importante a possibilidade de se executar funes dentro de um comando SELECT desde que elas no possuam parmetros OUT. J procedures no oferecem essa funcionalidade. Ex.: SELECT FNC_VALIDA(76345489020) CGC_VALIDO FROM DUAL; CGC_VALIDO --------------TRUE

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

Componentes de uma PACKAGE


1 2 3 4 5 Varivel pblica (global) Procedimento pblico Procedimento privado Varivel privada (local do pacote) Varivel local (local do procedimento)

Pg.: 34/53

5.4

Criando uma especificao de Pacote


Sintaxe CREATE OR REPLACE PACKAGE nome_pacote IS | AS tipo pblico e declaraes de item especificaes do SUBPROGRAM END nome_pacote nome_pacote tipo pblico e declaraes de item especificaes do SUBPROGRAM Nome do pacote Declara variveis, constantes, cursores, excees e tipos declara os SUBPROGRAMS PL/SQL

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

Criando o corpo do Pacote

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_pacote tipo pblico e declaraes de item especificaes do SUBPROGRAMA

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

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 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

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 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

Usando Predicados Condicionais (DELETING/INSERTING/UPDATING)

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

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 faa referencia ao valor de uma coluna antes e depois da alterao dos dados.

OPERAO INSERT UPDATE DELETE

Valor antigo NULL Valor antes de atualizar Valor antes da deletar

Valor novo Valor inserido Valor aps atualizar 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, '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

O que uma exceo ?

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

Tratando uma exceo

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.

Ex. DECLARE BEGIN a exceo levantada EXCEPTION a exceo tratada END

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

Pr-definida No pr-definidas de Usurio

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 :

EXCEO CURSOR_ALREDY_OPEN DUP_VAL_ON_INDEX

Erro ORACLE ORA-06511 ORA-00001

INVALID_CURSOR

ORA-01001

INVALID_NUMBER NO_DATA_FOUND TOO_MANY_ROWS VALUE_ERROR ZERO_DIVIDE

ORA-01722 ORA-01403 ORA-01422 ORA-06502 ORA-01476

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

7.4.2 Excees no pr-definidas

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

3) Referencie a exceo declarada dentro de seo EXCEPTION.

Ex.

DECLARE e_produto_invalido PRAGMA EXCEPTION_INIT BEGIN ........ EXCEPTION WHEN e_produto_invalido THEN ...... END; EXCEPTION; (e_produto_invalido, -2292);

Obs. O erro -2292 um erro de violao de integridade de CONTRAINTS

7.4.3 Funes para tratamento de excees

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

7.4.3.1 Exemplos de valores do SQLCODE

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

PLSQL Records,PLSQL Tables, Functions Procedures

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

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 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

Potrebbero piacerti anche