SQL Scrips

Embed Size (px)

Citation preview

  • 5/13/2018 SQL Scrips

    1/64

    lntroduceo a programa~aoPUSQLMaio 2009

    Marcus [email protected]

    Todos os direitos de copia reservados. Nlio e permitida a distribui~lio fisica ou eletrfmica deste materialsem a permisslio expressa do autor.

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    2/64

    SumarioApresentacao IVOrganiza~iioTrabalho IVAutor IVPerfil Programador PL/SQL VArquitetura Banco de Dados Oracle V

    1 ComandosSQL 72 Implementando consultas SQL simples 8

    Construcao Basica 8Colunas 8Expressoes Aritmetlcas (Operadores aritmetlcos) 9Operador de Concatenaeao 9

    3 Restringindo e ordenando dados 103.1 Clausula WHERE 10

    Operadores de comparacao 10Operadores Loglcos 11Precedencia 11OrderBy 11

    4 Funcoes de uma linh 12Funeoes de Caracter 12Funeoes Numericas 13Funeoes de Data 13

    4.4Funeoese Conversiio_----,~::-----------------144.4.1 TO_CHAR(X[,'format_model']) 144.4.2 TO_DATE('string','formata~io') 154.5 Expressoes Condicionais Gerais 164.5.1 NVL 164.5.2 DECODE 164.5.3 CASE 16

    Parte I - Comandos SQL

    2.12.22 . 32.4

    3 . 23 . 33 . 43 . 5

    4.14.24 . 3

    5 Mostrando dados de vdrias tabelas 18Produto Cartesiano 18Alias de Tabela 19Outer-JOIN 20Self-JOIN 20

    6 Funfoesdegrupo 217 Subconsultas 23

    Operador IN 24

    5 . 15 . 25 . 35.4

    7.1

  • 5/13/2018 SQL Scrips

    3/64

    7 . 2 Operador ANY 2 47 . 3 Operador ALL 2 4

    8 Manipulando dados (DML) 258 . 1 INSERT 2 58 . 2 UPDATE 2 58 . 3 DELETE 2 6

    9 Controle de transafao 27Parte II - Programac;ao PL/SQL

    10 BlocoPVSQL 2811 Programadio PVSQL 30

    1 1 . 1 Comentarlos 3 01 1 . 2 Declaraeoes (se~iio de declaracao) 3 01 1 . 3 Tipos de Dados 3 11 1 . 4 Assinalar Valores 3 21 1 . 5 Controle de Fluxo 3 211.5.1 IF-THEN 3311.5.2 IF-THEN-ELSE 3311.5.3 IF-THEN-ELSIF 331 1 . 6 Controle de Repetleao 3 411.6.1 LOOP Simples 3411.6.2 WHILE-LOOP 3411.6.3 FOR - LOOP 351 1 . 7 Labels 3 51 1 . 8 Cursores 3 611.8.1 Controlando Cursores Explicitos 3611.8.2 Declarando um Cursor (DECLARE) 3611.8.3 Abrindo um Cursor (OPEN) 3711.8.4 Extraindo dados do Cursor (FETCH) 3711.8.5 Fechando do Cursor (CLOSE) 3711.8.6 Atributos do Cursor Explicito 3811.8.7 LOOP Simples X Cursor 3911.8.8 LOOP While X Cursor 3911.8.9 LOOP For X Cursor 3911.8.10 LOOP For Implicitos 4011.8.11 Cursores Implicitos 40

    12 Tratamento de Exceciio 411 2 . 1 Tratando X Propagando 4 11 2 . 2 Tratamento de Excecoes 4 21 2 . 3 Exceedes PL/SQL Pre-deflnidas ou intern as 4 31 2 . 4 Exceedes PL/SQL definidas pelo Usuario 4 41 2 . 5 Comando RAISE APLLICATION ERROR 4 4_1 2 . 6 Pragma EXCEPTION_INIT 4 51 2 . 7 SQLCODE, SQLERRM 4 5

  • 5/13/2018 SQL Scrips

    4/64

    Parte III - Objetos Procedurais13 Stored Subprograms 4713.1 Stored Procedure 47

    13.1.1 ParametresStored Procedures 4813.1.2 Especificandovalores de parametros 49

    13.2 Stored Function 5013.2.1 Locaispermitidos parauso de Functions 51

    14 Package 5215 Database Trigger 5515.1 Elementos 5515.2 Predicado Condicional 5615.3 Trigger de Linha 56

    15.3.1 Qualificadores (:new, :old) 5615.3.2 Cliusula WHEN 58

    Parte IV - ApendicesA - OracleNet 59A.l - Arquitetura 59A.2 - Conflguraeao 60A.3 - Principais Problemas 61

    B - Schema HR (Human Resource) 63

  • 5/13/2018 SQL Scrips

    5/64

    Apresentac;aoEste material tem a lntencao de mostrar quais S80 os rmrumosconhecimentos necessarlos para a construcao dos primeiros objetos escritos emlinguagem PUSQl como procedures, functons, packages e triggers.Os livros disponiveis no mercado voltados para proqrarnacao Oracle,

    inclusive a docurnententacao oficial, S80 abrangentes e neles contern uma grandequantidade de lnformacoes, que num primeiro momenta podem dificultar 0aprendizado da linguagem PL/SQL. Neste material, sem duvlda, temos apenas 0essencial para a lnlclacao na proqrarnacao PL/SQl, para que esta experlencla sejaraplda e direta.o leitor devera ter conhecimentos fundamentados em 16gica deproqrarnacao, e iniciais de banco de dados relacional, tendo em vista que 0material mostrara como as estruturas de proqrarnacao S80 aplicadas aproqrarnacao PL/SQl quanta a sintaxe.o material foi concebido a luz de varies anos de experiencla atuando emdesenvolvimento para Oracle e apresenta as lnformacoes em uma sequenciapensada adequada para 0 objetivo do material. Faz parte tarnbem do material umarquivo simples de texto com todos os exemplos listados na apostila para evitarredlqitacao dos mesmos.Organizac;ao TrabalhoParte IAbordaremos a construcao das primeiras lnstrucoes SQl, manipulando osdados obtidos atraves de funcoes de linhas e funcoes de grupo. Consultascomplexas com varias tabelas serao abordadas, assim como subqueries,manlpulacao de dados (insert, update, delete) e controle de transacao,Parte IIIniciaremos a proqrarnacao, e sera apresentado como as estruturas deproqrarnacao se comportam no PL/SQl, como se da a rnanlpulacao dos famososcursores PUSQl e finalizando com tratamento de erros. Todas essas atividadesse darao em blocos PL/SQl anonlrnos que S80 a unidade baslca da proqrarnacaoPL/SQL.Parte IIIContinuando a proqramacao, abordaremos a cnacao e compllacao dosprincipais objetos procedurais (procedures, function, package, triggers), conheceras suas especificidades e suas finalidades.Parte IVComo apendlce, porem n80 menos importante, serao mostrados os conceitospara uma correta conflquracao de um software Oracle Client.

    AutorMarcus William, Tecnoloqo em Processamento de Dados, com mais de 10anos na area de TI, convive ha mais de sete anos com produtos Oracle, autodidatano aprendizado da proqrarnacao PL/SQl, foi coordenador dos programadoresPL/SQl em 2000 no DETRAN-PA e atualmente chefia da Dlvlsao de Banco deDados do TJE-PA.

  • 5/13/2018 SQL Scrips

    6/64

    Perfil Programador PLlSQLo programador PUSQL e 0 profissional da area de TI especializado emcriar e manter as construcoes procedurais de um SGDB ORACLE, estes escritosem linguagem PL/SQL. 0 PL/SQL nao e um produto separado, e sim umatecnologia integrada ao SGDB Oracle e esta disponivel desda versao 6.Uma das principais finalidades da linguagem PL/SQL e a construcao deStored Procedures, que sao unidades de rnanlpulacao de dados com scopodefinido de acoes, e estarao disponiveis aos usuarlos do SGDB segundo umapolitica de acesso e privlleqlos customizada. A principal finalidade das StoredProcedures e prover procedimentos armazenados no SGDB de facll utillzacao,aliviando assim, a carga de processamento no cliente. Os principais tipos deStored Procedure se dao na forma de procedure, function e package.Para se criar ou compilar um objeto no Oracle, 0 programador deverasubmeter ao banco 0 comando de crlacao deste objeto, comando este que conteratodos os atributos e inclusive a 16gica prevista para 0 objeto. Se 0 programadortern 0 privileqio de criar os seus objetos, ele 0 tara, caso contrarlo essa tarefa eresponsabilidade do DBA (DataBase Administrator). Uma forma de facilitar este

    trabalho e registrar 0 comando de crlacao em scripts para facll recrlacao quandonecessarlo,E comum escutar "Vamos alterar a procedure". A rigor um objeto proceduralnao e alterado e sim recriado ou recompilado. Se a "alteracao" consiste em apenasna adicao de uma linha, entao todo 0 comando de cornpllacao, adicionado da novalinha, devera ser reapreciado/compilado pelo Oracle.Existem alguns excelentes aplicativos IDE (Integrated DevelopmentEnvironment) que auxiliam a gerencia dos scripts de construcao de objetosprocedurais.Produto Fabricante URLPUSQL Developer Allroundautomations www.allroundautomations.com/glsgldev.htmlSQL Developer Oracle www.oracle.com/technoloov/prod ucts/database/sal developer/index. htmlSQL Navigator Quest www.guest.com/sgl navigator

    Obs.:O programa PUSQL Developer e de prefreneia do autor, nao par aehar mais eficiente e sim parestar aeostumado.

    Arquitetura Banco de Dados OracleE necessarlo para 0 programador PL/SQL entender a estrutura dearmazenamento de objetos disponiveis no Oracle a fim de executar suasatividades.Vamos comecar a entender a dlterenca entre Banco de Dados eInstancia. Em um SGDB Oracle, a rigor, 0 termo Banco de Dados se aplica aosarquivos fisicos que integram 0 mesmo. Assim sendo, em uma conversa com 0suporte Oracle 0 atendente entendera "banco de dados" como os arquivosformadores do Oracle.lnstancla e 0 conjunto de processos de mem6ria armazenados em formavolatil, que sao responsavels pela gerencia de todas as atividades incidente econsequente no banco de dados (arquivos fisicos). Quando um usuarlo cria umaconexao no banco, na realidade ele esta se conectando a uma lnstancla, que Iheservlra de ponte de trabalho ao banco de dados.o schema e uma representacao 16gica organizacional que aglutina umaporcao de objetos do banco de dados. Quando criamos um usuarlo estamostambern criando um schema inicialmente vazio. Em geral, e convencionado que

    http://www.allroundautomations.com/glsgldev.htmlhttp://www.oracle.com/technoloov/prodhttp://www.guest.com/sglhttp://www.guest.com/sglhttp://www.oracle.com/technoloov/prodhttp://www.allroundautomations.com/glsgldev.html
  • 5/13/2018 SQL Scrips

    7/64

    urn ou mais schemas contemplem os objetos de producao de um determinadosistema e que os demais usuarlos criados sejam utilizados apenas para fins deconexao e usa dos objetos dos schemas de producao. Para que isso aconteca,urna politica de privlleqlos devera ser implementada.

    user1SGDB Oracle

    Banco de Dados

    user2 I schema1 ,lnstancia I schema2 ,

    '- 1 S-C-he-m-a-3--- ' ,User3

    user4

    Toda essa arquitetura e de responsabilidade do Administrador de Banco deDados - DBA. E no dia-a-dia, estas deflnlcoes se confundem. N80 e dificilencontrar alquern usando 0 termo banco de dados para uma lnstancla ou umschema. 1550n80 e um pecado. 0 que se deve ter em mente e a real dlferencaentre estes conceitos.Um programador PL/SQL devera receber as seguintes lntormacoes do DBApara dar inicio as suas atividades: host ou endereco IP servidor de banco de dados; usuario de banco de dados; senha de acesso; ldentlticacao do service ou nome do banco de dados.Com estas lnformacoes, 0 programador devera saber configurar 0 softwareOracle Client instalado na sua estacao de trabalho a fim de acessar 0 banco dedados informado pelo DBA. 0 usuarlo de banco de dados informado devera terprlvlleqios de cornpllacao e recornpllacao de objetos procedurais seguindo apolitica de privlleqlos imposta ao banco de dados. E boa pratlca, 0 DBA informarurn banco de desenvolvimento ao lnvez de um banco de producao,

    Obs:. No epenace A sao apresentados os aspectos mais profundos quanto a configurar;ao declientes Oracle.

  • 5/13/2018 SQL Scrips

    8/64

    Comandos SQl

    Parte I - Comandos SQL

    1 Comandos SQLStructured Query language (SQl) e um conjunto de lnstrucoes com asquais os programas e usuarios acessam as lnformacoes dos bancos de dadosrelacionais, como 0 Oracle. As apllcacoes permitem aos usuarlos rnanlpulacao nosdados sem 0 efetivo uso de lnstrucoes SQl, no entanto essas apllcacoesseguramente usam SQl para executar as requlslcoes dos usuaries.o Dr. E.F. Codd em Junho de 1970 publicou 0 estudo "A Relational Modelof Data for large Shared Data Banks". Este modele de banco proposto e agoraace ito como definitivo pelos grandes softwares gerenciadores de banco de dados(SGDB). A linguagem SEQUEL (Structured English Query language) foidesenvolvida pela IBM aproveitando 0 modele de Codd, em seguida setransformou SQL. Em 1979 a empresa Rational Software (atualmente OracleCorporation) lancou a primeira lmplernentacao de banco de dados relacional vlavelcomercialmente.Existem comites que trabalham no sentido de padronizar como a industriade software ira considerar 0 SQl em termos de sintaxe. Os principais comites saoANSI (American National Standards Institute) e 0 ISOIIEC (InternationalOrganization for Standardization! International Electrotechnical Commission). AOracle se estorca para estar de acordo com os padroes sugeridos e participaativamente deste comites de padrao SQL. As versoes Oracle10g(Enterprise,Standard, Express, Standard One) foram projetadas para estarem emconformidade ao padao ANSI-2003. Verifique a tabela de confirmidade em :

    http://download-east.oracle.com/docs/cd/B1930601/server.102/b14200/apstandardsgl.htm#g21788Obs: Serao apresentados apenas os comandos SQL de consulta e manipu/ar;ao de dados, oscomandos de msnutencso das estruturas (CREA TE , ALTER) nao pertencem ao escopo destecurso.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    9/64

    Implementando consultas SQl simples

    2 Implementando consultas SQL simplesPara extrairmos e consultarmos dados das tabelas de um banco relacional,usamos a lnstrucao SELECT, que faz uma pesquisa nas estruturas relacionais dobanco de dados e retorna valores na forma de linhas e colunas. Uma consulta SQlpode tarnbem ser nominada simplesmente como query.

    2.1 Construc;ao BasicaS EL EC T { *l co lu na 1 [ ap el id o] , c ol un a2 [ ap el id o] }F RO M t ab el a

    Figura 2.1 - Sintaxe SelectDiretrizes: Sal nao fazem distincao entre rnaiuscuas e minuscules: Sal podem estar em uma ou mais linhas; As palavras reservadas nao podem ser abreviadas; Normalmente as clausulas sao colocadas em linhas diferentes (boa prattca): Guias e identacoes sao usadas para aumentar a legibilidade.

    2.2 ColunasQuanto as colunas temos duas alternativas a primeira e selecionar todas ascolunas em uma (mica consulta SQl, a outra mais elegante e selecionar apenasas colunas interessantes, cada coluna pode ter um alias associado. Alis sao muitoutels para calculos matematicos.

    10 A d m in i s tr a t io n2 0 M ar ke ti ng 20 020 1 17001800

    sQL >s ele ct *2 from departments3 /DEPARTMENT_ID DEPARTMENT_NAME MANAGER_ID LOCATION_ID

    s QL >s el ec t f ir st _n am e, s al ar y s al ar io _m en sa l2 from employees3 /FIRST_NAME SALARIO_MENSALStevenSteven 2640024000

    Exemplo 2.1 -Select Colunas

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    10/64

    Implementando consultas sal simples

    2.3 Expressoes Aritmeticas (Operadores arltmetlcos)E possivel criar expressoes com colunas do tipo NUMBER e DATE usandooperadores arltrnetlcos, na seguinte procedencla ( *, I,+, - ).

    sQL>s elect first_name, salary, (salary * 20) /100 porcentagem2 from employees3 /

    F I R S T _ N A M E S AL A RY P OR C EN TA G EM2640017000 52803400StevenNeena

    Exemplo 2.2 - ExpressoesPara adicionarmos 1(um) dia ao valor de um coluna do tipo DATE devemosutilizar 0 operador + da seguinte forma valor_data+1, e para adicionar uma hora aseguinte sintaxe valor_data+(1124)

    s QL >s el ec t f ir st _n am e, h ir e_ da te , h ir e_ da te +3 65 d at a_ ex am e2 from employees3 /F I R S T _ N A M E HIRE_ D A T E D A T A _ EXAM EStevenSteven 1 7- JU N- 19 87 1 6- JU N- 19 881 7- JU N- 19 87 1 6- JU N- 19 88

    Exemplo 2.3 - Expressoes DataObs.: Um valor nulo nao e 0 mesmo que zero ou um especo em branco. **QUALQUER VALOROPERACIONADO COM NULO RESUL TA NULO**. Este problema e remediado pela funr;ao NVLver(4.5.1)

    2.4 Operador de Concatenac;aoNo Oracle 0 operador II executa contatenacao de dois strings de caracteres,e podera ser usado nas clausulas SELECT, WHER e ORDER BY. Utilizada naclausula SELECT de uma consulta Sal, resultara em um campo do tipo caracter.

    s QL >s e le ct f ir st _n am el I' 'I Il a st _ na m e n o me _ co m pl e to2 from employees3 /N O M E _ C O M P L E T OSteve n Ki ngN ee na K oc hh ar

    Exemplo 2.4 - Concatenacao

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    11/64

    Restringindo e ordenando dados

    3 Restringindo e ordenando dados3.1 Clciusula WHERE

    E possivel restringir as linhas retornadas da consulta Sal utilizando aclausula WHERE. As linhas da tabela 56 estarao no retorno da consulta Sal se acondlcao da clausula WHERE aplicada a linha for atendida com sucesso. Aclausula WHERE e seguida de uma expressao condicional. 0 Oracle aplicacondlcao as linhas da(s) tabela(s) de clausula FROM. Cada apllcacao de linhagera um valor boolean. As linhas que geram valores TRUE formarao 0 dataset deretorno

    Exemplo 3.1 - Olausula WHERE

    s QL >s el ec t f ir st _n am e, jo b_ id , d ep ar tm en t_ id2 from em ploy ees3 where job_id = 'ST_CLER K'4 /

    FI RST_ NAME JOB_ID D EPART MENT _IDTrennaC ur ti s ST_CLERKST_CLERK 5050

    3.2 Operadores de comparacaoOperadores de cornparacao comparam dois valores ou expressoes eretornando um resultado de valor Boolean. A tabela 3.1 ilustra os operadores decornparacao mais recorrentes. Geralmente os operadores 580 usados na clausulaWHERE.

    Tabela 3.1. Operadores de Cornparacao,Operador Significado Exemplo_ Igual a SELECT *F RO M E MP LO YE ESWHE RE L AS T N AM E='S CO OT '> Maior que S EL EC T L AS T_ NA MEF RO M E MP LO YE ESWHERE S ALARY> 2000>= Maior ou igual a S E LE CT F I RS T_ N AM E ,S AL A RYF RO M E MP LO YE ESWHERE S ALARY >= 2000< Menor que S EL EC T L AS T_ NA MEF RO M E MP LO YE ESWHERE S ALARY < 2000

  • 5/13/2018 SQL Scrips

    12/64

    Restringindo e ordenando dados

    3.3 Operadores LogicosOperadores logicos sao usados para combinar ou alterar 0 resultado deuma ou mais cornparacoes (ver 3.2). 0 produto desta operacao sera um valorbooleano e no escopo deste curso sera utilizado para determinar quais linhasestarao no resultado da consulta.

    Tabela 3.2. Operadores LogicosOperador Significado ExemploNOT Retorna TRUE se a condlcao seguinte for FALSE SELECT *F RO M E MP LO YE ESWHERE NOT (SA LARY < 10000)AND Retorna TRUE se a condlcao de componentes forem SELECT *F RO M E MP LO YE ESTRUE WHERE SALA RY> 10000AND LAST N AME LIK E 'H%'OR Retorna TRUE se cada condlcao de componentes S EL E CT F IR ST _ NA M E, SA L AR YF RO M E MP LO YE ESforem TRUE W HE RE L AS T_ NA ME = 'THOMAS'OR LAST N AME = 'JACOB'

    3.4 PrecedenciaMultiplos operadores podem formar uma expressao vallda. Os operadorescom maior precedencla serao avaliados antes dos operadores de menorprecedencla, seguindo a tabela 3.3.

    Tabela 3 3 Precedencia de Operadores.Operador Prop6sito*, / Multiplica~o, divisao+, -, I I Adicao, subtracao, concatenacao_, l=, , =. =, IS NULL, LIKE, BETWEEN, IN CornperacaoNOT Negal;:aoAND Conjunl;:aoOR Disjunl;:ao. - .. . -bs.: Parenteses poderao ser util lzados para alterar a precedencla de avallar;ao .3.5 Order By

    A ordem das linhas retornadas em um resultado de consulta e indefinida. Aclausula ORDER BY pode ser utilizada para classificar as linhas. A clausulaORDER BY deve ser colocada apos a clausula WHERE. Por deflnicao 0 resultadosera exibido de forma crescente e at raves da palavra-chave DESC a ordem einvertida. 0 resultado pode tarnbem ser ordenado por varlas colunas

    J e nn i f erM i c h a el AD_ASSTMK_MAN 1020

    s QL >s el ec t f ir st _n am e, jo b_ id , d ep ar tm en t_ id2 fro m e mploy ees3 or der by de part ment_ id, salar y DES C4 /FI RST_ NAME JOB_ID D EPART MENT _ID

    Exemplo 3.2 - Olausula Order BYObs.: Sem 0usa da cl8ucula ORDER BYo resultado da consulta incerto.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    13/64

    Funcoes de uma linha

    4 Func;oes de uma linhaEm lnstrucoes SQl as funcoes de uma linha sao usadas principalmentepara manipular os valores que serao apresentados. Estas aceitam um ou maisargumentos e retornam um ou unlco valor para cada linha do dataset gerado pelaconsulta. Um argumento pode ser um dos seguintes itens, constantes, valorvarlavel, nome de coluna, expressao,Quanto aos recursos de tuncoes de uma linha Atua em cada linha retornada da consulta.

    Retorna um resultado por linha. Podem receber zero, um ou mais argumentos. Podem ser usados em clausulas SELECT, WHERE, ORDER BY.Obs.: Funr;oes de Linha podem ser usadas em nstrucoes DML's vereB).4.1 Func;oesde CaracterTabela 3.4. FUnl;:OesCaracterFunc;ao ObjetivoLower(strlng) Converte valores de caracteres elfabeticos para letras rnaiusculasupperlstrlng) Converte valores de caracteres elfabeticos para letras rnaiusculasrm tcap rs tr-t ng ) Converte os val ores de caracteres alfabetico para usar rnaiuscula naprimeira letra de cada palavra e todas as outras letras em rninusculasc on ca t( st rl ng 1, s tr ln g2 ) Contatena 0 primeiro valor com 0segundo valor. Equivalente ao operador

    I Isubs tr-Cst r+nq.m, ln.D Retorna caracteres especificos a partir do valor de caractere comecandona posicao m, ate n caracteres depois (Se m for nagativo, a conta iniciano final do valor de caracterres. Se n for omit ido, sao retornados todoscaracteres ate, 0 final da string)Lengtnlcnar) Retorna 0nurnero de caracteresIns tr( strln g , s ubst rlng ) Retorna a poslcao nurnaria do substringIpadlstrlng,n, str-i n q ' ) Preenche 0valor de caracteres justificando it direita a uma largura totalde n posicoes de caracter

    Tabela 3.4. Funes Caracter - ResultadosFunc;ao ResutadoLOWER S QL Co urse sq courseU PPER S QL Co urse S QL CO URSEI NITC AP S QL Cou rse Sq CourseCONCA Tl Hello , World) HelloWorl dS UBSTR( HelloWorl d ,1,5) HelloLE NGTH( HelloWorl d) 10INSTR l HelloWorl d , W ) bLP AD(s alarY,lO, * ) *****24000RPAD( salarY,lO, * ) 24000*****

    1 00 S te ve nK in g1 01 N ee na Ko ch h ar102 Lex De HaanAD_PRESAD_VPAD_VP

    477o65

    S QL>S ELEC T em ploee_id , CO NCAT (fir st_na me, l ast_ name ) N AME,2 jOb_ld , L ENGTH (last_ name ),3 IN STR( last _nam e, 'a') "Con tain s 'a'?"4 FROM em ploy ees5 /EM PLOYEE_I D NA ME JOB_ID LE NGTH(LAST _NAM E) Cont ains 'a'?

    Exemplo 4.1 - Funcoes de linha

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    14/64

    Funcoes de uma linha

    4.2 Func;oesNumericasTabela 3 4 FUnl;:oes NurnericasFunc;ao Objetivo Argumento(s) ResultadoROUND Arredonda valor para determinado decimal (45.926,2) 45.93TRUNC Trunca valor para determinado decimal (45.926,2) 45.92MOD Retorna 0 restante da divis130 (1600,300) 100

    S Q L > S E LE C T R O U N D ( 45 . 92 3 , 2 ) , R O U N D (4 5 .9 2 3 ,0 ) ,2 ROU ND(45.92 3,-1)3 FROM DUA L;R O U N D ( 45 . 92 3 , 2 ) R O U N D ( 45 . 92 3 , 0 ) R O U N D ( 45 . 92 3 , - 1)

    45,92 46 501 l in ha s el ec io na da .S Q L> SE LE C T T RU NC (4 5. 92 3, 2) , T RU N C( 45 .9 23 ) ,2 T RUNC(45.923,-2)3 FROM DUA L;T R U N C ( 45 . 92 3 , 2 ) T R U N C ( 45 . 92 3 ) T R U N C ( 45 . 92 3 , - 2 )

    45,92 45 o1 l in ha s el ec io na da .S Q L> SE LE C T l as t _n am e, s al a ry , M OD (s al a ry , 5 00 0)2 FROM emp loyees3 WHERE job _id = 'SA-REP';LA ST_NAME S ALARY M OD (SALARY, 5000)AbelTaylorGrant

    1100086007000100036002000

    3 l in h as s e le ci on a da s.Exemplo 4.2 - Funcoes NumericasTabela DUAL

    Em todos os bancos de dados Oracle existe uma tabela chamada DUAL, aparentementeirrelevante. No entento, ela e utll quando se deseja retornar urn valor pontual, sendo principalmenteusada para a execucao de instrucoes Sal que n130necessitam de tabela base.4.3 Func;oesde DataTabela 3.4. FUnl;:oes DataFunc;ao Objetivo Argumento(s) ResultadoMonths between Nurnero de meses entre duas datas ('01-SET-95','11-JAN-94') 19.674194add_months Adiciona meses de celendario para a ('11-JAN-94',6) '11-JUl-94'datalast day Ultimo dia do mas (01-SET-95') '30-SET-95'Round Data de arredondamento (25-JUl-95','mm') '01-AGO-95'(25-JUl-95','yy') '01-JAN-95'Trunc Data para truncada (25-JUl-95','mm') '01-JUl-95'(25-JUl-95','yy') '01-JAN-95'

    Devemos saber informar ao ambiente de trabalho como todas essaslnformacoes serao apresentadas, segundo as nossas necessidades. Uma dasformas e atraves dos seguintes comandos.A L T ER S E SS I O N S E T N L S_ D A TE _ LA N G UA G E= 'P O R TU G UE S E ';A L T ER S E SS I O N S E T N L S_ D A TE _ FO R M AT =' DD - M ON - YY YY ';

    Figura 4.1 - Configurando 0 ambiente

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    15/64

    Funcoes de uma linha

    Para manipular valores do tipo DATE em um formato diferente do padraoestabelecido pelo ambiente de trabalho, se faz necessarlo 0 usa da funcaoTO CHAR com os elementos de Format Model corretos.Para 0 curso sera utilizado 0 Format Model 'DD-MON-VYYY'. Verifique emhttp://download-east.oracle.com/docs/cd/B1930601/server.102/b14200/sglelements004.htm#i34924todos os Format Model disponiveis valores do tipo DATE.4.4 Func;oes de Conversao4.4.1 TO_CHAR(X[,'format_model'])Onde X e um valor do tipo DATE ou NUMBER e 'format_model' e umastring que descreve 0 formato de como 0 argumento X sera apresentado. Existemtormatacoes especificas para 0 tipo DATE e outras para 0 tipo NUMBER.

    Tabela 3.5. Principais Format Model para tipo DATEElemento Descric;aoyyyy Ano com 4 digitosmm Mas (01-12)dd Dia do mas (1-31)hh24 Hora do dia (0-23)mi Minuto(0-59)ss Segundo(0-59)day dia semana por extensomon Abreviacao do masmonth Nome extenso do mas

    D A T A l D A T A 2 D A T A3 DA T A4

    SQ L > S E L E C T2 S YSDAT E d a t a l ,3 TO _ C HAR ( SYSDAT E , 'DD / M M / YYYY h h 24 :mi :5 5') da t a 2 ,4 TO _ C HAR ( SYSDAT E , 'DD / M o n / YYYY') d at a3,5 TO _ C HAR ( SYSDAT E , 'fm "Belem , "DD" de "mo n t h " d e "yyyy') d a t a46 FR O M D U A L7 /

    2 7- 0U T - 2006 27 / 10/ 20 06 19:58:09 27 / 0ut / 2 006 Be lem , 27 de o u t u b r o d e 20061 l in ha 5 el ec io na da .

    Exemplo 4.3 - Funcoes TO_CHARDiretrizes para datas: Format Model deve estar entre aspas simples e fazer distincao entre rneiusculas erninusculas. Format Model e 0valor do argumento devem estar separados por virgula. Para remover os espacos em branco ou suprimir os zeros it esquerda, use 0modode preenchimento tm.

    Qualquer string pode ser adicionada ao Format Model delimitado por aspas duplas.Quando aos valores do tipo NUMBER, se necessarlo, deveremos informar

    ao ambiente 0 separador de milhar e decimal do padrao brasileiro, atraves docomando:A L TE R S E S S IO N S ET S E T N L S _ N U ME R I C _ CHARAC T ER S=', . ';

    Figura 4.2 - Configurando 0ambiente

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    16/64

    Funcoes de uma linha

    Tabela 3.5. Principais Format Model para tipo NUMBERElemento Descric;ao9 Represnta urn nurnero0 Forca que urn Zero seja mostradoG Separador de MilharD Separador de decimalRN Nurnero Romano

    s Q L > se l e c t t o _ c ha r ( 12 3 4. 5 ),2 to_char(1234.5, ' 99999.00'),3 to_char(1234.5, ' 99~999dOO'),4 to_char(1234. 5, 'RN )5 from dual6 /T O _C HA T O _C HA R (l T O _C HA R (1 2 T O _C HA R (1 2 34 .5 ,1234,5 1234.50 1.234,50 MCCXXXV1 l in ha s el ec io na da .

    Exemplo 4.4 - Funcoes TO_CHAR4.4.2 TO_DATE('string' ,'formata~ao')Onde 'string' e a lnforrnacao que se deseja transformar para valor do tipoDATE e 'formatacao' e 0 FORMAT MODEL que indica com como 0 Oracle deverareconhecer a string apresentada no primeiro pararnetro.

    s Q L > se l e c t F I R S T_ N A M E, HI R E _ DA T E2 from employees3 where HIRE_DATE = to_date('07/06/1 994', 'dd/mm/yyyy')4 /FIRST_NAME HIRE_DATEshelleywilliam 07-JUN-199407-JUN-19942 l in ha s s el ec io na da s.S QL >i ns er t i nt o j ob _h is to ry2 (EMPLOYEE_ID3 ,START_DATE

    4 ,END_DATE5 ,JOB_ID6 ,DEPARTMENT_ID)7 values8 (1749 , to _d at e( '0 5/ no ve mb ro /1 97 4' , ' d d/ mo nt h/ yy yy ')1 0 , to _d at e( '1 0a br 19 78', 'd dm on yy yy ')11 'AD VP'12 :80)-13 /1 l inh a cr ia da .

    Exemplo 4.5 - Funcoes TO_DATEObs.:Para conversso de dados, existe tambem 0 TO_NUMBER, no entando e mais pratico se valerda conversso implici ta executada pelo Oracle. Tente usar 0comando SELECT '1' + 1FROM DUAL

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    17/64

    Funcoes de uma linha

    4.5 Expressoes Condicionais Gerais4.5.1 NVLConverte valores nulos para um valor real, a funcao esta apta a trabalharcom os tipos de dados DATE, CHARACTER e NUMBER. Os parametresinformados devem ser do mesmo tipo de dado.

    s Q L> se l ec t s a la r y, c om m is s io n _p c t, s a l a ry + co mm i s si o n_ pc t , s a la r y+ n vl ( co m mi s si o n_ p ct , O)2 from employees3 where EMPLOYEE_ID in (144,149)4 /S A LA R Y C O MM I SS IO N _P C T S A LA R Y+ C OM M IS S IO N _P C T S A LA R Y+ N VL ( CO M MI S SI O N_ P CT , O)105002500 ,2 10500,2 10500,22500

    2 l in ha s s el ec io na da s.Exemplo 4.6 - Funcoes NVL4.5.2 DECODE

    ~ ~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ,DECODE(expr ,search1,result1[ , s ea r c h2 , r es u l t2 , ...,,searchN,resulNJ[,defaul tJ)Figura 4.3 - DECODE

    A expressao DECODE trabalha de um modo similar a 16gica IF-THEN-ELSE. A expressao DECODE compara expr a todos search um por vez. Se expr eigual to search entao 0 Oracle retorna 0 result correspondente. Se nao encontrarnenhuma correspendencla entao 0 Oracle retorna default. Neste caso, se defultestiver omitida 0Oracle retornara nullsQL>select2 job_id,3 salary,4 DECODE(job_id,5 'IT_PROG' ,salary*l.l,6 'ST_MAN' ,salary*1.2,7 'MK_REP' ,salary*1.3,8 s al ar y) r ea lu st e9 from employees10 /

    Exemplo 4.7 - DECODE

    4.5.3 CASE~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ,CASE expr WHEN compare1 THEN resul1[WHEN c omp are 2 THE N r esu 12WHEN c omp ar2 N THE N r esu lNE LS E r es ul El seEN DFigura 4.4 - CASE

    Em uma expressao CASE, 0 Oracle pesquisa a partir da primeira clausulaWHEN no qual expr e igual a compare e retorna result. Se nenhuma das clausulasWHEN for selecionada e uma clausula ELSE existir, entao 0 Oracle retornararesultElse.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    18/64

    Funcoes de uma linha

    sQL>select2 job_id,3 salary,4 CASE job_id5 WHE N 'I T_ PR OG ' T HE N s al ar y* l. l6 WHE N 'S T_ MAN ' T HE N s al ar y* 1.27 WHE N 'M K_ REP ' T HE N s al ar y* 1.38 E LS E s al ar y9 END10 from employees11 /

    Exemplo 4.8 - CASEObs: De preferencia ao comando CASE ao inves do DECODE. 0coman do CASE e mais poderosoObs: No link http://download-east.oracle.com/docs/cdlBJ93060J/server.J02/b14200/[unctions.htm#iJ482J96encontra-se a relar;ao de todas as funr;oes de uma linha disponiveis nas versoes Oracle10gObs: No capituto 15sera apresentado como criar e programar as suas pr6pias funr;oes

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    19/64

    Mostrando dados de varias tabelas

    5 Mostrando dados de varlas tabelasExistem momentos em que faz necessario 0 usa de dados a partir de maisde uma tabela, neste caso usaremos condlcoes especiais chamadas de JOIN's. Aslinhas de uma tabela podem ser relacionadas as linhas de outra tabela de acordocom os valores comuns existentes nas colunas correspondentes, que em geral saocolunas de chave prlmarla e estrangeira.

    S EL EC T t ab le 1. co lu mn , t ab le 2. co lu mnFROM table1, table2W HE RE t ab le 1.c ol um n1 = table2.column2;Figura 5.1 - Join

    Diretrizes para Joins: Ao se escrever uma instrucao SELECT que combine mais de uma tabela, a interessantedeixar claro a que tabela 0 campo pertence, posicionando 0 nome da tabela antes donome do campo. Nao a obriqatorio 0 posicionamento 0 nome da tabela antes do nome do campo, porem,se uma mesma coluna pertence a mais de uma tabela, deve-se prefixar a coluna com 0

    nome da tabela. Para combinar n tabelas se fez necessario no minima n-1 condlcoes de JOIN

    S Q L> SE L EC T e m pl o ye e s. em p lo y ee _ id , e m pl o ye e s. 1ast_name,2 employees. department_i d, departments.department_id,3 departments.location_id4 FROM employees, departments5 W HE RE e mp lo ye es .d ep ar tm en t_ id = d e p ar t m en t s. de p ar t m en t _ i d;EMPLOYEE_ID LAST_NAME DEPARTMENT_ID DEPARTMENT_ID LOCATION_ID

    100 0 K ing100 King 9090 9090 17001700Exemplo 5.1 - Join

    E possivel tarnbem adicionar condlcoes de filtros as condlcoes de JOINpara restringe mais ainda as linhas obtidas. No exemplo abaixo, seraoapresentados 0 nome e 0departamento do funclonarlo "Matos".S QL >S EL EC T l as t_ na me , e mp lo ye es . d ep ar tm en t_ i d ,2 department_name3 FROM employees, departments4 WHERE employees.de~artment_id = departments.department_id5 AND last_name = Matos';LAST_NAME DEPARTMENT_ID DEPARTMENT_NAMEMatos1 l in ha s el ec io na da .

    5 0 s hi pp in g

    Exemplo 5.2 - Join I AND

    5.1 Produto CartesianoQuando um JOIN for completamente lnvalldo ou omitido, 0 resultado daconsulta SQl sera um produto cartesiano no qual serao exibidas todascomblnacoes de linhas de todas as tabelas envolvidas na consulta. 0 Produtocartesiano tende a gerar um grande nurnero de linhas e seu resultado raramente eutll, Apresentamos 0 produto cartesiano aqui por finalidades dldatlcas,

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    20/64

    Mostrando dados de varias tabelas

    S QL >S EL EC T l as t_ na me , d ep ar tm en t_ na me d ep t_ na me2 FROM employees, departments;LAST_NAME DE PT_NAMEKingKingKochharHigginsGietz

    AdministrationAdministrationAdministrationContractingContracting

    1 68 l i nh a s s e le c io n ad as .Exemplo 5.3 - Produto Cartesiano

    5.2 Alias de TabelaPara qualificar as colunas e possivel utilizar alias de tabela ao invez donome da tabela. Assim como os alias de coluna dao outro nome a coluna, os aliasde tabela tem a mesma funcao. Os alias de tabela sao definidos na clausulaFROM. 0 nome da tabela e especificado totalmente seguido do seu alias.

    S QL >S EL EC T e .e mp lo ye e_ id , e .l as t_ na me , e .d ep ar tm en t_ id ,2 d .d ep a rt m en t _i d , d .l o ca t io n _i d3 FROM employees e , departments d4 W HE R E e .d ep a rt m en t _i d = d.department_id;EMPLOYEE_ID LAST_NAME DEPARTMENT_ID DEPARTMENT_ID LOCATION_ID

    100 King 90 90 1700101 Kochhar 90 90 1700Exemplo 5.4 - Alias tabela

    Na lnstrucao Sal do exemplo 5.4 foram definidos os alias "e" para a tabelaemployees e alias "d" para a tabela departments.Obs: Perceba quanta 0 usa de alias de tabela ires legibilidade a construcso de consultas SQLcomparando 0exemplo 5.4 e 0exemplo 5. 1

    SQL>SELECT2 e.last_name,3 d.department_name,4 1. city5 FROM6 employees e,7 d epa rtm ents d ,8 locations 19 WHERE10 e.department_id = d.department_id1 1 A N D d .l o ca t io n_ i d = l.location_id;LAST_NAME DEPARTMENT_NAME CITYKingKochharDe HaanHunold

    ExecutiveExecutiveExecutiveITSeattleSeattleSeattleSouthlake

    Exemplo 5.5 - Join em mais de uma tabela.Diretrizes para Joins: Os alias de tabela nao ultrapassam 30 posicoes: urn alias de tabela podera substituir 0 nome da tabela em todas as elausulas do SOL. os alias devem ser sugestivos. Nao utilizem algo com T1, T2, T3, . .. palavras reservadas nao podem ser utilizadas como alias nenhum. Algo como DESCalusivo a descricao,

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    21/64

    Mostrando dados de varias tabelas

    5.3 Outer-JOINSe a linha n80 satisfaz a condicao da clausula WHERE, n80 aparecera noresultado do Select. Nestas condlcoes, estas linhas poderao aparecer se operadorde outer join for utilizado no JOIN. a operador (+) devera ser posicionado no "Iado"join onde a lnformacao e deficiente.

    S EL EC T e .l as t_ na me , e .d ep ar tm en t_ id , d .d ep ar tm en t_ na meFROM employees e, departments dWHE RE e .d ep ar tm en t_ id = d.department_id(+)Exemplo 5.6 - OUTER JOIN5.4 Self-JOIN

    As vezes, e necessano a eXeCU!;80 do um JOin de uma tabela com elamesma. Desta forma a tabela aparecera duas vezes na clausula FROM e naclausula WHERE exlstlra a restricao referente ao self-join. Neste caso 0 usa dealias de tabela e imperative.SQL>SELECT worker.last_name I I ' works for' I I manager.last_name2 FROM employees worker, employees manager3 WHERE worker.manager_id = ma na ge r.e mp lo ye e_ id ;W ORKER.LAST_NAMEI I'WORKSFOR' IIMANAGER.LAST_NAMEKochhar works for KingDe Haan works for KingHunold works for De Haan

    Exemplo 5.7 - Self JOIN

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    22/64

    Funcoes de grupo

    6 Func;oes de grupoDe modo diferente das tuncoes de uma (mica linha, as funcoes de grupooperam em conjunto de linhas para fornecer um resultado por grupo. Essesconjuntos podem ser uma tabela inteira ou a mesma dividida em grupos menores.

    Tabela 3 5 Funcoes de GrupoFunc;ao Descric;aoAVG Valor rneoioCOUNT Nurnero de linhasMAX Valor MaximoMIN Valor MinimoSUM Soma de Val ores

    SQL>S Q L> S EL E CT A VG ( sa l ar y ), M A X( s al a ry ) , M I N( s al a ry ) , s U M( s al a ry )2 FROM employees3 WHERE job_id LIKE '%REP%';A VG ( SA L AR Y) M A X ( SA L AR Y) M I N( S AL A RY) S U M ( S AL A RY )

    8150 11000 6000 32600SQL>S Q L> S EL E CT M I N( hi r e_ d at e ), M A X( h ir e_ d at e )2 FROM employees;M I N (H IR E _ DA M A X( HI R E _D A1 7 -J U N -1 9 87 2 9 -J A N -2 0 00SQL>S Q L> S EL E CT C O UN T( * )2 FROM employees3 WHERE department_id = 50;

    COUNT(*)SQL>S Q L >S E L EC T C O U NT ( c om m i ss i o n_ p c t)2 FROM employees;COUNT(COMMISSION_PCT)

    4Exemplo 6.1 - Group by Tabela Inteira

    E atravez da clausula GROUP BY que dividimos as linhas de uma tabelaem grupo menores. Em seguida, podera ser aplicado a esses grupos formados astuncoes de grupo, gerando assim lnformacoes surnarlas para cada grupo.Primeiramente deve ser determinada a ldentiflcacao do grupo. A ldentlflcacaodo grupo pode ser uma coluna, varlas colunas, uma expressao usando colunas ouvarlas expressoes usando colunas. 0 Oracle conslderara no grupo todas as linhasque atendenrem a clausula WHERE caso esta exista, e entao sera aplicada afuncao de grupo ao grupo caso exista.S EL EC T d ep ar tm en t_ id , A VG (s al ar y)FROM employeesGR OUP BY d ep ar tme nt _i d ;S EL EC T d ep ar tm en t_ id d ep t_ id , jo b_ id , s UM (s al ar y)FROM employeesGR OUP BY d ep ar tme nt _i d, jo b_ id ;

    Exemplo 6.2 - Group by criando gruposNa figura 6.2 tempos 3(tres) exemplos de consulta utilizando funcoes degrupo. Na primeira 0 resultado sera agrupado pelo valor do campo department_id,e a cada grupo sera aferida a media aritmetlca do campo salary. A quantidade de

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    23/64

    Funcoes de grupo

    linhas retornada no primeiro exemplo sera em fUn!;80 da quantidade de valoresexistentes na coluna department_id. No segundo exemplo apresentamos um grupomais sofisticado com dois campos (department_id ,job_id) e a estes grupos seraaplicado a somat6ria do campo salary.Diretrizes para Joins: Usando a elausula WHERE, linhas serao eliminadas antes de serem organizadas me

    grupo. N130e permitido 0 usc de alias na clausula GROUP BY . Quando se deseja urn campo esteja no retorno do SQl este devera estar na elausulaGROUP BY. E possivel criar agrupamentos de mais de urn campo. Fum;:oes de grupo n130 devem ser utilizadas na elausula WHERE e sim na elausulaHAVING.Para se excluir um grupo inteiro criado pela clausula GROUP BY,deveremos usar a clausula HAVING, que executa um trabalho parecido com aclausula WHERE que elimina as linhas, este, no entanto, elimina grupos.

    S Q L> S EL E CT d e pa r tm e nt _ id , M A X( s al a ry )2 FR OM e mp lo ye es3 G RO UP BY d ep ar tm en t_i d4 HA VIN G M AX( s a la ry 1 00 00D E P A R T M E N T _ I D M A X ( S A L A R Y )

    9 0 26 40 02 0 13 00 08 0 11 00 0S Q L >S Q L >S QL >S EL EC T j ob _i d, s UM ( sa la ry ) P AY RO LL2 FR OM e mp lo ye es3 WHE R E job _i d N OT LI K E '% RE P% '4 G RO U P BY job _i d5 HA VI NG s U M ( sa la ry ) > 1 30 006 O RD ER BY s U M ( s al ar y );J OB_I D PA YR O LLI T _P RO G 19 20 0AD _ PR ES 5 04 00

    Exemplo 6.3 - HAVING

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    24/64

    7 SubconsultasSubconsultas

    Uma subconsulta e uma lnstrucao SELECT incorporada a outra lnstrucaoSELECT. 0 usa de subconsultas torna possivel a construcao de sofisticadaslnstrucoes e S80 utels quando precisamos selecionar linhas de uma tabela comuma condlcao que dependa dos dados na pr6pria tabela. Tarnbern podem serchamadas de subqueries ou consulta interna.Tabela 7 1 Tipos de Subconsulltas.Tipo Descric;ao OperadoresSubquerie de uma (mica o resultado da consulta interna -, >, =, < =, linha retorna apenas uma linhaSubquerie de varias linhas o resultado da consulta interna IN - Igual a qualquer membro daretorna varias linhas listaANY - Compare 0 valor de cadavalor retornado pela subconsulta.ALL - Compare 0 valor a todovalor retornado pela subconsulta.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    S Q L> S EL E CT l a st _ na m e2 FROM employees3 WHERE salary>4 (SELECT salary5 FROM employees6 WHERE last_name = 'Abel')7 /LAST_NAMEKingKochharDe HaanS QL >S EL EC T l as t_ na me , j ob _i d, s al ar y2 FROM employees3 WHERE job_id =4 (SELECT job_id5 FROM employees6 WHERE employee_id = 141)7 AND salary>8 (SELECT salary9 FROM employees10 WHERE employee_id = 143);LAST_NAME JOB_ID SALARYRajsDavies ST_CLERKST_CLERK 35003100

    Exemplo 7.1 - Subquerie

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    25/64

    Subconsultas

    7.1 Operador INS QL >S EL EC T l as t_ na me , s al ar y, d ep ar tm en t_ id2 FROM employees3 WHERE salary IN45

    ( SE LE CT M IN (s al ar y)FROM employeesG RO UP B Y d ep ar tm en t_ id );LAST_NAME SALARY D EPARTMENT_IDGrantDe HaanKochhar

    700017000 9017000 90S QL >S EL EC T l as t_ na me , s al ar y, d ep ar tm en t_ id2 FROM employees3 WHE RE s al ar y I N ( 7000, 17000,6000,8300, 2500, 8600, 4200, 4400)4 /LAST_NAME SALARY D EPARTMENT_IDKochhar 17000 90De Haan 17000 90

    Exemplo 7.2 - Operador IN

    7.2 Operador ANYS EL EC T e mp lo ye e_ id , l as t_ na me , j ob _i d, s al ar yFROM employeesWHERE salary < ANY ( S EL E CT s a la r yFROM employeesWHERE job_id = 'IT_PROG')AND job_id 'IT_PROG';

    Obs.: < ANY( ...) significa menor que 0maior da lista e > ANY(. ..) signi fica mais do que 0minima7.3 Operador ALL

    S EL EC T e mp lo ye e_ id , l as t_ na me , j ob _i d, s al ar yFROM employeesWHERE salary < ALL ( S EL E CT s a la r yFROM employeesWHERE job_id = 'IT_PROG')AND job_id 'IT_PROG';

    Obs.: > ALL(. ..) significa mais do que 0maior valor listado e < ALL( ...) significa manos do que 0menor valor listado ca mais do que 0minimaObs.: Em uma instrur;ao com subconsulta, a consulta interna e a prime ira a ser resolvida.Obs: Em http://download-east.oracle.comidocs/cd/B1930601Iserver.102Ib14200Itoc.htmencontramos todas as possibildiades com 0coman do SQL disponiveis nas versoes Oracle10g

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    http://download-east.oracle.comidocs/cd/B1930601Iserver.102Ib14200Itoc.htmmailto:[email protected]:[email protected]://download-east.oracle.comidocs/cd/B1930601Iserver.102Ib14200Itoc.htm
  • 5/13/2018 SQL Scrips

    26/64

    Manipulando dados (DML)

    8 Manipulando dados (DML)8.1 INSERT

    INSERT INTO tabela [ (campo1, campo2, , campo n) ]values (valor_campo1, valor_campo2, , valor_campo n)Figura 8.1 Insert

    A lnstrucao INSERT serve para adicionar linhas em uma determinadatabela. Como voce pode observar a lista de campos da tabela n80 e obrigat6ria, noentanto, se voce optar por supri-Ia devera ter em mente a sua estrutura da tabela,pois devera fornece-los na mesma ordem.S QL >i ns er t i nt o r eg io ns2 ( re gi on _i d, re gi on _n am e)3 values4 (5, 'Africa')5 I1 linha criada.SQL>S QL >i ns er t i nt o c ou nt ri es2 values3 ('BR', 'Brasil',50)4 Ii ns er t i nt o c ou nt ri es*ERRO na linha 1:ORA-02291: restri~ao de integridade (HR.COUNTR_REG_FK) viol ada - chave mae naolocalizada

    Exemplo 8.1 -InsertObs.: encontramos todas as opr;oes do comando INSERT disponiveis nas versoes Oracle10g emhttp://download-east.oracle.comldocs/cd/B1930601/server.l02/b14200/statements9014.htm#i21636988.2 UPDATE

    U PD AT E T ab el aS ET c am po 1 = v al or _c am po 1, c am po 2 = valor_campo2,[ WHERE ]

    Figura 8.2 UpdateA lnstrucao UPDATE altera valores de campos de uma tabela, de acordocom uma condlcao fornecida, se esta condlcao for suprida, toda a tabela seraatualizada. As regras que governam a restricao de linhas nas consultas 580tambern apllcavels nas lnstrucoes UPDATE (Ver 3.1, 3.2, 3.3, 3.4).

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    27/64

    Manipulando dados (DML)

    s QL >u p da te l oc at io ns2 set city = 'Belem'3 where LOCATION_ID = 25004 /x linha criada.SQL>s QL >u p da te l oc at io ns2 set country_id = 'AG'3 where LOCATION_ID = 14004 /u pd at e l oc at io ns*ERRO na linha 1:ORA-02291: restri~ao de integridade (HR.LOC_C_ID_FK) viol ada - chave mae nao localiz ada

    Exemplo 8.2 - UpdateObs.: encontramos todas as opr;oes do comando UPDATE disponiveis nas versoes Oracle10g emhttp://download-east.oracle.comldocs/cdlBI9306 0l/server.l 021b14200/statements 10007.htm#i2067715

    8.3 DELETEDELETE {tabela} [ WHERE ]

    Figura 8.3 DeleteA lnstrucao DELETE exclui um ou mais registros de acordo com a condlcaofornecida, similarmente ao UPDATE se esta condlcao for suprida todos os dadosde sua tabela serao apagados!!!. As regras que governam a restricao de linhasnas consultas 580 tambem aplic8veis nas lnstrucoes DELETE (Ver 3.1, 3.2, 3.3,3.4).

    s QL >d el et e r eg io ns2 where region_id = 53 /1 linha deletada.s QL >d e le te l oc at io ns2 where LOCATION_ID=25003 /d el et e l oc at io ns*ERRO na linha 1:ORA-02292: restri~ao de integridade (HR.DEPT_LOC_FK) viol ada - registro filho localiz ado

    Exemplo 8.3 - DeleteObs.: encontramos todas as opr;oes do comando DELETE disponiveis nas versoes Orac/e10g emhttp://download-east.oracle.comldocs/cdlBI930601/server.l02lbI4200/statements8005.htm#i2117787

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    http://download-east.oracle.comldocs/cdlBI9306mailto:[email protected]:[email protected]://download-east.oracle.comldocs/cdlBI9306
  • 5/13/2018 SQL Scrips

    28/64

    Controle de transacao

    9 Controle de transacaoTransacao e uma unidade logica de trabalho que compreende uma ou maislnstrucoes DMl executadas em funcao das atividades de um usuarlo do sistema.o conjunto de DMl's que devem estar contidas em uma transacao e determinadopelas regras de noqoclo,o conjunto de lnsercoes, alteracoes e exclusoes efetivadas pelas lnstrucoesSQl pertencentes a uma transacao pode ser confirmadas (COMMIT) oudesconsideradas (ROllBACK). Uma transacao se inicia com 0 primeiro comandoDMl executado. A transacao termina quando e confirmada ou desconsiderada.Para ilustrar 0 conceito de transacao, podemos considerar 0 "velho"exemplo de atividades de banco de dados para lnstltulcoes finaceiras. Quando umcliente do banco transfere valores da conta poupanca para a conta corrente, atransacao deve consistir no minima de 3(tres) operacoes,

    Decrementar da conta poupanca Incrementar na conta corrente Registrar a transacaoo Oracle deve prover duas sltuacoes. Se as tres operacoes conseguiramser bem executadas afim de fornecer 0 adequado balanceamento nas contas,estas deverao ser aplicadas (COMMIT) ao banco de dados. Entretanto se algumproblema como saldo insuficiente, numero de conta lnvallda or falha de hardwareimpedir no minima uma atividade da transacao, entao a transacao inteira deveraser desconsiderada (ROllBACK) afim de assegurar 0 adequado balanceamentonas contas.Um savepoint permite dividir uma transacao em varlas partes e marcar umdeterminado ponto da transacao que perrnltlra ao programador um rollback totalonde toda a transacao sera desnconsiderada ou rollback parcial onde tudo 0 quefoi executado apos 0 savepoint sera desconsiderado. Todo 0 savepoint tem umnome associ ado a ele.

    Figura 9.2 SavePoint

    1 BEGIN2 INSERT1;3 INSERT2;4 S AV EP OI NT e xe mp lo _t ra ns a~ ao ;5 U PDATE1;6 U PDATE2;7 IF teste THEN8 ROLLBACK; ( rollback total)9 ELSE10 ROLLBACK TO exemplo_transa~ao; ( rollback parcial)11 END IF;12 END;

    Os comandos COMMIT e ROllBACK respectivamente confiram oudesconsirem as transacoes segundo a logica de proqrarnacao imposta.Obs.:No link a seguir encontramos a completa referencia do comando COMMIThttp://download-east.oracle.comldocs/cdIBI9306 Ol/server.l 021b14200/statements 4010.htm#i2060233Obs.:No link a seguir encontramos a completa referencia do comando ROLLBACKhttp://download-east.oracle.comldocs/cdlBI930601/server.l02lbI4200/statements9021.htm#i21 04635Obs.:No link a seguir encontramos a completa referencia sobre transac;oes Oraclehttp://download-east.oracle.com/docs/cd/B1930601/server.102/b14220Itransact.htm#i6564

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    http://download-east.oracle.comldocs/cdIBI9306mailto:[email protected]:[email protected]://download-east.oracle.comldocs/cdIBI9306
  • 5/13/2018 SQL Scrips

    29/64

    Bloco PLlSQl

    Parte II - Proqramacao PL/SQL

    10 Bloco PL/SQLPLlSQl(Procedural language/SQl) e a linguagem procedural desenvolvidapela Oracle que e utilizada para montar os blocos PUSQL.Um bloco PLlSQl consiste de um conjunto de lnstrucoes SQl (SELECT,INSERT, UPDATE, DELETE) ou comandos PLlSQl, e desempenha uma funcao16gica (mica, afim de resolver um problema especifico ou executar um conjunto detarefas afins. 0 Bloco PLlSQl tarnbem pode ser referenciado com Unidade dePrograma PLlSQlOs blocos PLlSQl sao qualificados em bloco anonlmo e Stored Procedure.o bloco anonlrno Nao tem nome Nao esta armazenado no SGDB Geralmente esta armazenada na apllcacao,Stored SubProgramas

    Utiliza a estrutura do bloco anonlrno com base. Estao armazenados no SGDB, A eles e atribuido um nome que podera ser utilizado nas apllcacoesou por outros objetos do banco de dados

    A estrutura de um bloco PLlSQl e constituida de tres secoes:a) SECAO DE DECLACAO (DECLARE) - Nesta secao sao definidos os objetosPLlSQl como variavels, constantes, cursores e excecoes definidas pelousuarlo que poderao ser utilizadas dentro do bloco.b) SECAO DE EXECUCOES (BEGIN ..END;) - Nesta secao conternplara asequencia de comandos PLlSQl e lnstrucoes SQl do bloco.c) SECAO DE TRATAMENTO DE ERRO (EXCEPTION) - Nesta secao seraotratados os erros definidos e levantados pelo pr6prio bloco e os erros geradospela execucao do bloco (0 capitulo 12 abordara 0 tratamento de execoes noPLlSQl)

    Figura 10.1 - Sel; :oes de urn bloco PUSQL

    [DECLARE- - d e cl a r a l; o es ]BEGIN- - i n st r u l; o e s e c o m na d o s[EXCEPTION- - t r a t a m e n t o s d e e r r o ]END;

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    30/64

    Bloeo PL/SQL

    Diretrizes: Apenas a secao de execucao e obriqatoria, As palavras chaves, DECLARE, BEGIN, EXCEOPTION nao sao seguidas por ponto-e-virgula, mas END e todas as outras instrucoes PUSQL requerem ponto-e-virgula. Nao existe bloco sem algum comando valldo, Pode existir aninhamento de bloco, no entanto, esta funcionalidade e restrita it secao deExecucao e it Se~o de Tratamento de Erro. As Inhas da secao de execucao devem ser finalizadas com ; (ponto-e-vigula)Maiores detalhes sobre a proqrarnacao PUSQL poderao ser eneontradasem http://download-east.oracle.com/docs/cd/B1930601/appdev.102/b14261/toc.htm

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    http://download-east.oracle.com/docs/cd/B1930601/appdev.102/b14261/toc.htmmailto:[email protected]:[email protected]://download-east.oracle.com/docs/cd/B1930601/appdev.102/b14261/toc.htm
  • 5/13/2018 SQL Scrips

    31/64

    Proqrarnacao PL/SQL

    11 Proqramacao PL/SQL11.1 ComentariosOs cornentarlos em PL/SQL sao de dois tiposa) Uma Linha: utiliza-se 0 delimitador --. A partir de dois hifens tudo 0 que foreserito ate 0 final da linha e eonsiderado comentarlo,b) Multiplas linhas: utiliza-se 0 delimitador /* para abrir e */ para feehar. Tudo etodas as linhas que estiverem entre os dois delimitadores serao ignorados naexecucaor,

    1 BEGIN2 -- comentando apenas uma linha3 COMAND01;4 /* comentando5 varias6 linhas */7 COMAND02;8 COMAND03; -- 0 r es to s er a i gn or ad o9 END10 / 'Exemplo 11.1 - Uso de cornentario

    11.2 Declarac;oes (sec;ao de declaracao)Para utilizar variavels e eonstantes no seu programa, voce deve declare-losanteriormente. E na secao DECLARE que sao deelaradas as varlavels eeonstantes.1 DECLARE2 nVIVenda3 cNmvendedor4 dDtVenda5 mMultiplic6 BEGIN7 NULL;9 END;10 /

    Exemplo 11.2 - Dedaracao de Objetos

    NUMBER(16,2);VARCHAR2(40);DATE:=SYSDATE;C ON ST AN T N UM BE R: =1 00 ; - -c on st an te

    As declaracoes no exemplo 2.2 foram: nVIVenda do tipo numerico tamanho 16 e 2 casas deeimais, eNmVendedor do tipo numerlco de tamanho variavel ate 40earaeteres, dDTVenda do tipo data e a eonstante mMultiplie do tipo nurnerica com valor 100.

    o eseopo de uma variavel e a parte do programa onde a variavel pode seraeessada. Para uma varlavel PL/SQL, isso oeorre a partir da declaracao devarlavels ate 0 final do bloeo. Variavels deelaradas em um bloeo externo saoaeessiveis apenas neste bloeo e em qualquer sub-bloeo eontido neste, poremvarlavels deelaradas no sub-bloeo nao sao aeessiveis pelo bloeo externo.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    32/64

    Proqrarnacao PL/SQL

    1.Permitir a saida no SQL*Plus com 0 comando set serveroutputSET SERVEROUTPUT {ON I OFF}

    Pacote DBMS OUTPUTNa proqrarnacao PUSQL nao existe nenhuma funcionalidade de entrada ou saida. Pararemediar isso, usaremos no aplicativo SQL*Plus 0 Supplied Package DBMS_OUTPUT quefornecera apenas a capacidade de dar said as para mensagens na tela. 1550e feito por meio de dois

    passos

    2.Dentro do program a PUSQL, utilize 0 procedure DBMS_OUTPUT.PUT_LlNE. Essaprocedure aoicionara 0argumento informado ao buffer de saida.Com esses passos completados, a salda impressa na tela do SQL*Plus depois que 0 blocofor completamente executado. Durante a execucao, 0 buffer e preenchido pelas chamadas deDBMS_OUTPUT.PUT_LlNE. 0 SQL*Plus nao recupera 0 conteudo do buffer e nao 0 imprime ateque 0 controle retorne para 0 SQL*Plus, depois que 0 bloco terminou a execucao,

    SQL> SET SERVEROUTPUT ONSQL> BEGIN2 DBMS_OUTPUT.PUT_LINE('Hello from PL/SQL');3 END;4 /Hello from PL/SQL

    PL/SQL procedure successfully completed.SQL>

    11.3 Tipos de DadosTipo Descri~aoVARCHAR2 Tipo basi co para dados cararter de tamanho variavel com ate 32.767[(tamanho _maximo)] bytes. Nao ha tamanho default para as constantes e variaveisVARCHAR2NUMBER Admite nurnero de ponto flxo e flutuante.[(preci sao.escsl a)]DATE Tipo basi co para datas e horas. Val ores DATE incluem a hora do diaem segundos desde a meia-noite. A faixa e entre 01/01/4712 A.C e

    31/12/9999 D.C.CHAR Tipo basico para dados cararter de tamanho flxo, Se voce nao[(tamanho maximo)] especificar 0 tamanho maximo, 0tamanho default Sera definido com 1.BOOLEAN Tipo basi co para dados que armazena urn dos tres possiveis val oresusados para calculos logicos: TRUE, FALSE, NULL.BINARY _INTEGER Inteiros com sinal entre -2.147.483.647 a 2.147.483.647PL_INTERGER Inteiros com sinal entre -2.147.483.647 a 2.147.483.647. Val ores comPL_INTERGER requerem menos espaco e sao mais rapldos que osval ore NUMBER e BINARY INTERGER

    o comando %TYPE nos da a possibilidade de associarmos ao tipo de umavarlavel 0 tipo de uma coluna de uma tabela, desta forma, automaticamente avarlavel assurnlra 0 tipo de dado da coluna.o comando %ROWTYPE crlara uma estrutura de registro identica a estruturade uma tabela.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    33/64

    Proqrarnacao PL/SQL

    DECLAREN om e_ va ri av el n om e_ ta be la .n om e_ co lu na %T YP E; - - v ar ia ve lNome_registro nome_tabela%ROWTYPE; -- registroBEGIN- - i nst ru~o es e c om na do sEND;Figura 11.1 - Uso de %TYPE e %ROWTYPE

    Nesta abordagem 0 c6digo fica mais ligado a estrutura e n80 sera necessariaa reescrita do c6digo quando 0 tipo de coluna for alterado.11.4 Assinalar Valores

    Voce pode assinalar valores a uma variavel de duas formas. A primeira formautiliza 0 operador := (sinal de dois pontes seguido do sinal de igual). Assim avarlavel posicionada a esquerda do operador recebera 0 valor da expressaoposicionada a direita.1 DECLARE2 nsalario3 nSalarioAtual4 aRe!jion Name5 dHO]e6 nAnoBi7 BEGIN8 nsalario9 nsalarioAtual10 aRe!jionName11 dHO]e12 END13 I '

    Exemplo 11.3 - Assinalar valores por operador

    NUMBER;NUMBER;regions.region_name%TYPE;DATE;BOOLEAN:=TRUE;:= 4 00 ;: = F _ SA L AR Y( 1 03 ) * 0.10;:= ' AS IA ';: = S YS D AT E ;

    A Segunda forma de assinalar valor a uma varlavel e atraves de um resultadode SELECT que sera transferido assinalado a varlavel,Um SELECT que assinala valor a uma variavel obrigatoriamente deveraretornar uma e somente uma linha, caso contrario, um erro de eXeCU!;80 seradisparado, NO_DATA_FOUND se n80 for retornada nenhuma linha eTOO_MANY _ROWS se mais de uma linha for retornada (ver 12.3)

    1 DECLARE2 bonus10 NUMBER;3 bonus20 NUMBER;4 e mp _i d N UM BE R:= 20 6;5 BEGIN6 SELECT salary * 0.107 I NT O b on us 108 F RO M e mp lo ye es9 WHE RE e mp lo ye e_i d = e mp _id ;10111213141 516171 81 9

    S EL EC T s al ar y * 0 .1 0, s al ar y * 0.20I NT O b on us 10 , b on us 20F RO M e mp lo ye esWHE RE e mp lo ye e_i d = e mp _id ;DBM S_O UTP UT .P UT_ LI NE ('S AL AR IO C OM 1 0% D E BO NU S :' I I bonus10);DBM S_O UTP UT .P UT_ LI NE ('S AL AR IO C OM 2 0% D E BO NU S :' I I bonus20);ENDI '

    Exemplo 11.4 - Assinalar valores por SELECT11.5 Controle de Fluxo

    Este conjunto de comandos permite testar uma condlcao e, dependendo se acondlcao e falsa ou verdadeira, sera tomada uma determinada dire!;80 de fluxo. acontrole de fluco se da em tres formas: IF-THEN, IF-THEN-ELSE,IF-THEN-ELSIF._Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    34/64

    Proqrarnacao PL/SQL

    11.5.1 IF-THENE a forma mais simples. Testa a condlcao especificada ap6s 0 IF e, caso sejaverdadeira, executa 0 comando alern do THEN. Caso n80 seja, executa as acoesap6s 0 END IF (note que devem ser escritos separados).1 DECLARE2 v _f ir st _n am e e mp lo ye es .f ir st _n am e% TYP E;3 v_salary employees. s al ary%TYPE;4 BEGIN5 SELECT first_name,salary6 I N T O v _ f i rs t _ n am e , v _s a l a ry7 FROM employees8 W HE R E e m pl o ye e _i d = 142;910 IF v_salary > 3 00 0 T HE N11 DBMS_OUTPUT.put_line('salario acima de uS$ 3,000');12 DBMS_OUTPUT.put_line('Teste IF-THEN');13 END IF;14 END15 I '

    Exemplo 11.5 -IF-THENObs.:Note que cada linha de a(f80 dentro do IF deve ser terminada com ponto-e-virgula(;) e apenasap6s 0END IF e que se co/oca 0ponto-e-virgula f inal do comando IF.11.5.2IF-THEN-ELSEAqui, acrescenta-se a palavra-chave ELSE para determinar 0 que deve serfeito caso a condlcao seja falsa. Dessa forma, 0 fluxo sequlra para os comandosap6s 0 THEN caso a condlcao seja verdadeira, e ap6s 0 ELSE caso seja falsa.

    1 DECLARE2 v_first_name employees.first_name%TYPE;3 v _c om mi ss io n_ pc t e mp lo ye es . c om mi s si on _p ct %T YP E;4 BEGIN5 S E L E CT f i r s t_ n a me , c o mm i s s io n _ pc t6 I N T O v _ f i rs t _ n am e , v _c o m m is s i on _ p c t7 FROM employees8 W HE R E e m pl o ye e _i d = 174;9101112131415161718

    IF v_commission_pct IS NULL THEND BM S _O U TP U T. p ut _ li n e( 's e m c o mi s sa o ') ;D BM S _O U TP U T. p ut _ li n e( 'o u tr a a ~a o ') ;ELSED BM S _O U TP U T. p ut _ li n e( 'c o mi s sa o d e 'I Iv_commi ssion_pct*100 I I '%');D BM S_ OU TP UT .p ut _l in e( ' o ut ra a ~a o ' );END IF;ENDI 'Exemplo 11.6 -IF-THEN-ELSEObs.:Note que h8 um ponto-e-virgula somente ap6s cada linha de a(f80 e ap6s 0END IF.11.5.3 IF-THEN-ELSIFQuando se deseja testar diversas condlcoes utilizando um mesmo IF, utiliza-se ELSIF. Assim, pode-se ap6s cada ELSIF, testar nova condlcao que, caso sejaverdadeira, executara as respectivas acoes,

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    35/64

    Proqrarnacao PL/SQL

    1 D ECL AR E2 Ve nc im en to s NUM BE R;3 BEGI N4 ve nc im en to s:= F _S AL ARY(1 01 ); -- de du~oe s5 IF ve nc im ent os 10000 AN D v en cim en to s 15000 AN D v en cim en to s

  • 5/13/2018 SQL Scrips

    36/64

    Proqrarnacao PL/SQL

    verdadeira, continua a sequencia de acoes dentro do LOOP ou sai, caso sejafalsa, executando 0que estiver ap6s 0 END LOOP.1 DECLARE2 x NUMBER;3 BEGIN4 x= 15 WHilE X < 5 lOOP6 x := X + 1;7 END lOOP;8 END9 I '

    Exemplo 11.10 - WHILE - LOOP11.6.3 FOR - LOOPUtilize este comando sempre que voce souber preveamente 0 nurnero devezes que um LOOP deve ser executado. A cada comando FOR-LOOP existe umavarlavel controladora que em cada lnteracao assurnlra todos os valores interiros(variando de 1 em 1) contidos entre 0 limite inicial eo limite final.

    FOR conteaor IN [REVERSE] inicio .. fi m lOOPcomando1;comando2;END lOOP;

    conteaor[REVERSE] variavel que tera seu valor incrementado.Indica que se deve diminuir ao inves de aumentar 0contador. 0 valor de inicio deve ser maior que 0fim, pois 0 valor sera decrescido a cada repeti~aointervale inicial de repeti~aointervalor final da repeti~aoiniciofi mFigura 11.2 - FOR-LOOP

    1 DECLARE2 Y NUMBER := 1;3 BEGIN4 FOR X IN 1..5 lOOP56789

    Y .= Y + x .DBMS_OUTPUT:PUT_lINE(X);END lOOP;ENDI '

    Exemplo 11.11 - FOR-LOOP.Nao necessidade de declarar a variavel control adora, isso e feitoimplicitamente pelo comando FOR-LOOP. Podemos utilizar a variavel controladoracomo uma variavel normal, no entanto, nao podemos assinalar valores a variavelcontroladora. 0 escopo de visibilidade na variavel controladora e apenas dentro dolaco, Caso 0 numero de vezes que deva ser repetida a sequencia de acoes sejafruto de um calculo, voce podera substituir tanto 0 intervalo superior quanta 0superior por variavels, mas nao se esqueca que esses valores devem ser semprenurneros inteiros.

    Obs.: Voce podera utilizar 0EXIT WHEN 'condic;ao' para terminar prematuramente 0FOR-LOOP.

    11.7 LabelsOs labels sao utilizados para melhorar a leitura do programa PUSQL. Labelssao aplicados a blocos ou LOOP's. Um label deve preceder imediatamente umbloco ou LOOP e deve ser delimitado por e . A clausula END ou END LOOP

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    37/64

    Proqrarnacao PL/SQl

    pode fazer referencia do label. 0 uso de labels e vantajoso quando existem variesblocos aninhados.123456789101112131 41 51 61 71 81 920, I l v _ de p t ) ;21 END bloc07selecao;22 END LOOP sels_tentativas;23 END;2 4 /

    DECLAREv_dept NUMBER(2);v _e mp _c ou nt N UM BE R( 2) ;BEGINseis_tentativasFOR cont IN 1 ..6 LOOPbloco_selecaoBEGINS EL EC T D EP AR TM EN T_ IDI NT O v _d eptF RO M D EP AR TM EN TSW HE RE D EP AR TM EN T_ ID = cont * 10;bloco_contadorBEGINS EL EC T c ou nt (* )I NT O v _e mp _c ou ntF RO M E MP LO YE ESW HE RE D EP AR TM EN T_ ID = v_dept;E N D b l oc o _c o nt a do r ;D BM S_ OU TP UT.P UT _L IN E( 'E xis te (m ) 'I Iv _e mp _c ou nt I I ' em pr eg ad os n o d ep ar ta me nt o

    Exemplo 11.12 - Labels

    11.8 CursoresEm alguns casos necessitamos de espacos de armazenamento maiscomplexos que as variavels, como uma matriz de lnformacao resultada de umaconsulta SQl, neste case se faz necessario 0 usa de cursores.Os cursores em PUSQl podem ser explicitos e implicitos. 0 PUSQl declaraurn cursor implicitamente para toda lnstrucao DMl (UPDATE, INSERT, DELETE,SElECT ...INTO), incluindo consultas que retornam apenas uma linha. Asconsultas que retornam mais de uma linha deverao ser declaradas explicitamente.Cursores explicitos sao indicados quando e necessarlo um controle no

    processamento do mesmo.11.8.1 Controlando Cursores ExplicitosDe acordo com a figura 11.3, quatro sao os comandos que controlam 0processamento de um cursor.

    DECLARE CLOSEPEN

    Figura 11.3 - Controle de Processamento de Cursores11.8.2 Declarando urn Cursor (DECLARE)Quando declaramos um cursor e associ ado a ele um nome e a consulta SQlque sera processada por este cursor. Assim como as variavels, os cursores devemser declarados na secao DECLARE.o escopo de validade dos cursores e 0 mesmo de uma variavel (ver 11.2).Cursores declarados em um bloco externo sao acessiveis apenas neste bloco eem qualquer sub-bloco contido neste, porern cursores declarados no sub-bloconao sao acessiveis pelo bloco externo.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    38/64

    Proqrarnacao PL/SQL

    C UR SO R n om e_ cu rs or[ (p ar am et ro l t ip o, pa ra me tr o2 t ip o: p~ ~~ me tr oN t ip o) ]I S I n s tr u~ao _S Q L;

    Figura 11.4 - Declarando urn cursor

    Os cursores podem ser definidos com parametres e para cada pararnetrodevem ser escolhidos um nome e um tipo de dado(ver 11.3).11.8.3 Abrindo urn Cursor (OPEN)o comando OPEN abre 0 cursor, executa a consulta associada a ele e gera 0conjunto ativo, que consiste de todas as linhas que atendem os crlterlos depesquisa da consulta associada ao cursor. Para gerenciar 0 conjunto ativo existeurn ponteiro que registra qual linha esta passive I do comando FETCH. Ap6s 0OPEN 0 FETCH atuara sobre a primeira linha do conjunto ativo.

    O PE N n om e_ cu rs or [( va rl ,v ar 2, . .. )] ;Figura 11.5 - Abrindo urn cursor

    11.8.4 Extraindo dad os do Cursor (FETCH)Extrair os dados do cursor e 0 evento onde os dados da linha atual doconjunto ativo sao copiados para variavels ou registros e a cada FETCH realizado,o ponteiro passara a apontar para a linha seguinte do conjunto ativo.F ET CH n om e_ cu rs or I NT O [ va rl ,v ar 2, ... I r ec or d_ na me ] ;

    Figura 11.6 - Fetch CursorDiretrizes Inclua 0 mesmo nurnero de variaveis na elausula INTO da instrucao FETCH do que ascolunas na lnstrucao SELECT e certif ique-se que os tipos de dados sao compativeis Faca a correspondencia de cada variavel para coincidir com as posicoes das colunas Registros podem ser utilizados. 0 tipo %ROWTYPE pode ser associ ado ao cursor oudiretamente a uma tabela. Os campos do cursor devem ser identicos aos campos doregistro usado em quantidade e tipo

    11.8.5 Fechando do Cursor (CLOSE)o comando CLOSE desativa 0 cursor e libera 0 conjunto ativo. Esta etapapermite que 0 cursor seja reaberto, se necessarlo, para gerar um outro conjuntoativo.C LO SE n om e_ cu rs or ;

    Figura 11.6 - Fechando urn cursor

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    39/64

    Proqrarnacao PL/SQL

    1 DECLARE2 v_empno NUMBER;3 V_ename VARCHAR2( 100);4 CU RSOR cEmplyee IS5 SELECT employee_id,first_name6 FROM EMPLOYEES;7 r Em pl oy ee cE mp ly ee %R OWTYPE;8 CU RSOR cEmplyeeJob9 (p_job varch ar)10 IS11 SELECT first_name12 FROM EMPLOYEES13 WHERE JOb_id = p_job;14 BEGIN15 OPEN cEmplyee;16 FETCH cEmplyee INTO v_empno, V_ename;1 7 D BM S_ OU TP UT .P UT _L IN E( v_ en am e) ;18 FETCH cEmplyee INTO v_empno, V_ename;1 9 D BM S_ OU TP UT .P UT _L IN E( v_ en am e) ;20 FETCH cEmplyee INTO v_empno, V_ename;2 1 D BM S_ OU TP UT .P UT _L IN E( V_ en am e) ;22 FETCH cEmplyee INTO rEmployee ;2 3 D BM S _O U TP U T. PU T _L I NE ( rE m pl o ye e .f i rs t _n a me ) ;24 CLOSE cEmplyee;25262728293031323334353637383940

    O P E N c E m pl y e eJ o b ('S A L ES M A N' );F ET CH c Em pl ye eJ ob I NT O V _e na me ;DBMS_OUTPUT.PUT_LINE(V_ename);F ET CH c Em pl ye eJ ob I NT O V _e na me ;DBMS_OUTPUT.PUT_LINE(V_ename);C L OS E c E mp l ye e Jo b;O P E N c E m pl y e eJ o b ('M A N AG E R ');F ET CH c Em pl ye eJ ob I NT O V _e na me ;DBMS_OUTPUT.PUT_LINE(V_ename);F ET CH c Em pl ye eJ ob I NT O V _e na me ;DBMS_OUTPUT.PUT_LINE(V_ename);C L OS E c E mp l ye e Jo b;ENDI '

    Exemplo 11.13 - CursoresObs: No exemplo acima, as linhas 8 ate 13 mostram a declarar;ao de um cursor com parametro enas linhas 15, 26 e 33 mostra 0 "open" do cursor. A linha 7 mostra um registro recebendo aestrutura de linha de um cursor (isso poderia ser feito a uma tabela) e as linhas 22 e 23 mostram 0fetch para 0registro e 0usa do valor do registro11.8.6 Atributos do Cursor Explicito

    Quando anexados ao nome do cursor, esses atributos retornamlnformacoes utels sobre a eXeCUy80de uma lnstrucao de rnanlpulacao de dados.Atributo Tipo Descric;ao%ISOPEN Booleano Sera avaliado para TRUE se 0cursor estiver aberto%NOTFOUND Booleano Sera avaliado para TRUE se a extracao mais recente naoretornar linha.%FOUND Booleano Sera avaliado para TRUE se a extracao mais recente retornarlinha.%ROWCOUNT Numerico Sera avaliado para 0 nurnero total de linhas retornadas ate 0momento.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    40/64

    Proqrarnacao PL/SQL

    11.8.7 LOOP Simples X CursorNeste primeiro estilo de loop de busca, a sintaxe de loop simples e utilizadapara processamento do cursor. Atributos explicitos de cursor sao utilizados paracontrolar 0 numero de vezes que 0 loop e executado.1 DECLARE2 CU RSOR cEmpregados IS3 SELECT first_name FROM employees;4 a Na me e mp loy ee s.fi rs t_ na me %T YP E;5 BEGIN6 OPEN cEmpregados;7 LOOP8 FETCH cEmpregados INTO aName;9 EXIT WHEN cEmpregados%NOTFOUND;10 DBMS_OUTPU T.PU T_LINE( aName) ;11 END LOOP;12 CLOSE cEmpregados;13 END14 / '

    Exemplo 11.14 - Cursores Loop Simples11.8.8 LOOP While X Cursoro mesmo Exemplo 11.14 poderia ser escrito utilizando a sintaxeWHILE..LOOP, da seguinte maneira.

    1 DECLARE2 CU RSOR cCidades IS3 SELECT * F R OM l o ca t io n s;4 rCity locations%ROWTYPE;5 BEGIN6 OPEN cCidades;7 FETCH cCidades INTO rCity;8 WHILE cCidades%FOU ND LOOP9 D BM S_ OU TP UT .P UT _L IN E( rC it y. ci ty lI ' - ' II rC it y.s ta te _p ro vi nc e) ;10 FETCH cCidades INTO rCity;11 END LOOP;12 CLOSE cCidades;13 END14 / 'Exemplo 11.15 - Cursores Loop While

    11.8.9 LOOP For X CursorOs dois exemplos de LOOP's descritos anteriormente requerem umprocessamento explicito de cursor por meio de lnstrucoes OPEN, FETCH, CLOSEver (11.8.1). A proqrarnacao PL/SQL fornece um tipo de LOOP mais eficiente, quetrata implicitamente 0 processamento de cursor.1 DECLARE2 CU RSOR ccargos IS3 SELECT jOb_title, job_id4 FROM Jobs;5 BEGIN6 FOR rcargo IN ccargos LOOP7 D BM S_ OU TP UT .P UT _L IN E( rC ar go .j ob _i dlI ' - ' II rc ar go .j ob _t it le );8 END LOOP;9 END10 / '

    Exemplo 11.16 - Cursor FORObserva~oes 0 registro rCargo nao e declarado, sua declaracao e executada implicitamente,recebe0 tipo cCargos%ROWTYPEeo seu escopo e apenas 0 LOOP. 0 cursor cCargos e processado implicitamente, sendo desnecessarlo oscomandosOPEN, FETCH, CLOSE.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    41/64

    Proqrarnacao PL/SOl

    11.8.10 LOOP For ImplicitosAlern do registro, 0 pr6prio cursor pode ser implicitamente declarado. Aconsulta SOL geradora do conjunto ativo e apresentada em de parenteses dentroda pr6pria lnstrucao FOR, e neste caso, tanto 0 registro com 0 cursor saoimplicitamente declarados.1 BEGI N2 F O R r D e p a r t a m e n t o I N ( S E L E C T d.de p a r t m e n t _ i d , d.dep a r t m e n t _ n a m e3 FR O M d e p a r t m e n t s d ) L O O P4 D BM S_ OU TP UT .P UT _L IN E( rD ep ar ta me nt o. de pa rt me nt _n am e) ;5 END L O O P;6 END7 I '

    Exemplo 11.17 - Cursor FOR Implicito11.8.11 Cursores ImplicitosExistem os cursor implicitos que sao criados para processar as lnstrucoesINSERT, UPDATE, DELETE, SElECT ... INTO e sao manipulados a revelia doprogramador. Neste caso apenas 0 atributo %ROWCOUTN e interessante para alnstrucao UPDATE. 0 cursor implicito e representado pela palavra reservada SOL.

    Exemplo 11.18 - Cursor Implicito

    1 BEGI N2 U P D A T E jo bs3 SE T M AX_SAL A RY = M AX_SAL A RY+l004 WHERE M AX_SAL A RY < 9000;5678D BM S_ OU TP UT .P UT _L IN E( SQ L% RO WC OU NT I I ' l in ha s s al ar io s f or am a tu al iz ad as ') ;ENDI '

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    42/64

    Tratamento de Excecao

    12 Tratamento de Excec;aoQualquer boa linguagem de proqrarnacao deve ter a capacidade de tratarerros de run-time e, se possivel, recuperar-se deles. A proqrarnacao PUSQLimplementa essa funcionalidade por meio de excecoes PUSQL e tratamento deexcecoes.Para se entender como 0 PL/SQL trabalha com os tratamentos de execoes,sera necessarlo 0 entendimento dos seguintes conceitos:./' Erro de run-time ou exe~ao- sltuacao adversa que ocasiona lnterrupcaona eXeCUy80 do programa podendo ser motivada por falha na concepcaodo sistema, codlflcacao equivocada, falha de hardware, ou outro motivo ../' Exce~ao PLlSQL - E 0 objeto de proqrarnacao PL/SQL que nos permiteevitar a lnterrupcao abrupta do programa caso este seja acomedido de umerro de run-time ../' Tratamento da exe~ao - Indica qual acao ou quais acoes deverao sertomadas quando 0 programa for acomedido de um erro de run-time.Quando 0 Oracle apresenta um erro de run-time ou execao, este sempre seraacompanhado de um c6gido e uma mensagem. Todos os possiveis erros de run-time ou excecoes podem ser consultados na lista de erros Oracle em http://download-

    east.oracle.com/docslcd/B19306 01/server.1 02/b14219ltoc.htm. A cada c6gido esta associadoalern de uma mensagem, uma causa e acoes a serem tomadas. Essaslnformacoes 580 extremamente importantes no dia-a-dia de um programadorPL/SQL.Quando criamos um programa, a rigor n80 sabemos, antes de coloca-lo emproducao quais erros de run-time ou eXCey80 podem ocorrer no momenta daeXeCUy80. No entanto, em alguns casas podemos vislumbrar ou imaginar umconjunto pequeno de erros de run-time ou eXCey80 que poderao ocorrer naeXeCUy80. A qualidade do programa se dara em funcao da habilidade que 0programa tera para tratar os eventuais erros. Para cada erro vislumbrado ouimagnado devera existir um tratamento especlflco, e isso e perfeitamenteproqrarnavel no PUSQL.12.1 Tratando X Propaganda

    Quando um erro de run-time ou execao ocorre, 0 controle do bloco PUSQLdeixa a Sey80 de execuy80(BEGIN) e passa compuisivamente para a Sey80 deexcey80(EXCEPTION). Se existe algum tratamento especifico para 0 erro de run-time (atravez de um objeto EXCEPTION), este sera capturado e tratado (seexistir 0 devido tratamento) pelo bloco e a eXeCUy80 do bloco terrnlnara semapresentar 0 erro de run-time (isso n80 quer dizer que 0 bloco executou comsucesso todas as suas atividades). Se por outro lado, este tratamento n80 existe,ou no bloco n80 existe a Sey80 EXCEPTION, entao 0 bloco propagara outransferira 0 erro de run-time para bloco que 0 contern ou para 0 ambiente que 0executou.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    43/64

    Tratamento de Excecao

    bloco_de_foraBEGINcomandol;comando2;bloco_de_dentroBEGINcomando3;comando4;EXCEPTIONtratamentol;tratamento2;END bloco_de_dentro;comando5;comando6;EXCEPTIONtratamento3;tratamento4;EN D bloco_de_fora;

    Tabela 12 1 Tabela de ComportamentoFigura 12.1 _ Capturando X Propagando.. Premissa pI tratamento Quando Tratado Quando Propagado

    bloco _de_centro> tratamento1 e tratamentoz 0 comandof e o bloco_de_foraserem capazes de capturar executado, dando recebe 0 run-time e ficatodo e qualquer erro de continuidade a encaregado de propagarruntime gerado por execucao, ou capturar e oscomandoa ou comando 4 cornandofi e cornandofnao sao executados.bloco _de_fora tratementoa e tratament04 Procedimento 0 ambiente queserem capazes de capturar concluido com executou 0 bloco mostratodo e qualquer erro de sucesso o c6digo de erro.runtime gerado porcornando l, comandoz oubloco de centro>12.2 Tratamento de Excec;oes

    E atravez do objeto exe~ao PLlSQL que temos a possibilidade de qualificaras execoes e apllca-las 0 devido tratamento. E na Sey80 de eXCey80 que ocorremos tratamentos de erros de run-time como ilustrado pelo exemplo 12.1.Para cada execao provavel devera exisitr um tratamento atravez de umaclausula WHEN que estara associ ada a uma execao PL/SQL, seguida por umasequencia de lnstrucoes a serem executadas quando 0 run-time ocorrer, querepresentam efetivamento 0 tratamento do erro de run-time.A clausula WHEN OTHERS, se usada, deve ser posicionada com ultimotratamento, e e utilizada para tratar alguma execao que n80 encontrara 0 devidotratamento nas clausulas WHEN. Devemos pensar a Sey80 de eXCey80 como umcomando IF, ELSIF, ELSE. Cada WHEN corresponde a um IF ou ELSIF, e WHENOTHERS corresponde ao ELSE.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    44/64

    Tratamento de Excecao

    1 DECL ARE2 v _e mp lo ye e_ id e mp lo ye es .e mp lo ye e_ id %T YP E;3 v _f ir st _n am e e mp lo ye es .f ir st _n am e% TYP E:='S te ve n';4 BEGI N5 SELECT empl oyee_id6 INTO v_ employee _id7 F ROM empl oyees8 WHER E firs t_name = v_fi rst_name ;9 EXCEPT ION1 0 WHE N NO_ DATA_FOU ND T HEN1 1 DBMS_OU TPUT.PUT _LINE('p rimeiro nome nao encont rado');1 2 WHE N TOO_MANY_ROWS T HEN1 3 DBMS_OU TPUT.PUT _LINE('R etornou mais de uma linha');1 4 WHE N OT HERS THEN1 5 DBMS_OU TPUT.PUT _LINE('p roblemas a o e xecutar 0 procedimento!!! ');1 5 END16 / 'Exemplo 12.1 - Tratamento de Erros

    No exemplo 12.1 apresenta um programa com uma lnstrucao SELECT(linha5) e tres tramatentos de execao (Iinhas 10, 12 e 14). Sendo dois tratamentosespecificos para determinadas execoes e 0 terceiro para tratar toda e qualquereXCey80 inesperada. Desta forma 0 programa sempre termlnara a eXeCUy80 semapresentar erro algum.Existem 2(dois) tipos de objetos execao PL/SQL Pre-deflnldos ou internes Definido pelo usuarioDiretrizes A palavra EXCEPTION inicia a secao de tratamento de excecoes, Sao permitidos varies tratamentos de excecao Somente urn tratamento e processado antes de se sair do bloco WHEN OTHERS se existir sempre deve ser 0 ultimo tratamento.

    12.3 Excec;oes PLlSQL Pre-definidas au internasAs execoes pre-definidas 580 disparados automaticamente pelo programa

    quando este gera um erro de run-time. Do grupo de erros Oracle catalogados,existe um grupo menor para as quais foram criadas excecoes pre-deflnldas ouinternas que podem ser tratadas diretamente na Sey80 EXCEPTION, sem anecessidade de declaracao na Sey80 DECLARE.Os erros de run-time que tem eXCey80 associada podem ter um tratamentoespecifico e previlegiado atraves da clausula WHEN, os demais, que formam 0maior grupo, 56 poderao ser tratados na clausula OTHERS. Veremos a frente comremediar isso (ver 12.6)Na tabela 12.2 mostra os mais recorrentes e em http://download-east.oracle.com/docs/cd/B14117 01/appdev.101 /b 10807 /07 errs.htm#i7014 encontra m-se todas as excecoes pre-deflnldasTabela 122 Excecoes Pre-definidas.Exeption OracleError Raise whenDUP_VAL_ON_INDEX ORA-OOOO1 o seu program a tentou armazenar valores duplicados emuma coluna com restrlcao de UNIQUEINVALID_CURSOR ORA-01001 o seu program a tentou urn operacao ilegal de cursorescomo fechar urn cursos ja fechado.NO DATA FOUND ORA-01403 Uma lnstrucao SELECT INTO retornou nenhuma linha.TOO MANY ROWS ORA-01422 Uma lnstrucao SELECT INTO retornou mais de uma linha.ZERO DIVIDE ORA-01476 o seu program a tentou efetuar uma divisao por O(zero)

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    45/64

    Tratamento de Excecao

    12.4 Excec;oes PLlSQL definidas pelo usuartoPara que uma excecao seja definida pelo programador, esta deve serdeclarada explicitamente na secao DECLARE e sao acionadas atraves docomando RAISE.o escopo de validade deste tipo de excecao e 0 mesmo de uma variavel (ver

    11.2). Excecoes declaradas em um bloco externo sao acessiveis apenas nestebloco e em qualquer sub-bloco contido neste, porem excecoes declaradas no sub-bloco nao sao acessiveis pelo bloco externo.1 DECLARE2 e_Emp_Invali do3 v_sal4 v_employe e_id5 BEGIN6 UPDATE employee s7 S ET salary = v_sal8 WHERE employee _id = v_empl oyee_id;9 IF S QL%NOTFOUND THEN10 RAISE e_Emp_I nvalido;11 E ND IF;12 EXCEPTION13 WHEN e_Emp_ Invalido THEN14 DBMS_OUTPUT.PU T_LINE('Este funciona rio naum ex iste');

    15 END16 / '

    EXCEPTION;em p l o ye e s. sa l a r y % TYPE:=2000;em p l o ye e s. em p l o ye e _ i d % TYPE:=5;

    Exemplo 12.2 - Excecao declaradaNo exemplo 12.2.0 programa declara a execao PL/SQL e_emp_inva/ido nalinha 2, aciona a execao na linha 10 e a trata na linha 13. Percebam que 0tratamento dado as execoes PL/SQL definidas pelo usuarlo e identica aotratamento dado as execoes PL/SQL pre-deflnldas,Exeyoes PL/SQL definidas sao uteis para tratar sutlacoes relativa ao neg6ciocomo sa/do insuficiente, c/iente ja cadastrado ou c6digo ja uti/izado.

    Obs.: Se uma excec;ao definida pro usuario for disparada e 0devido tratamento nao existir na sec;aoEXCEPTION 0 bloco retornara 0 seguinte etro "ORA-06510: PUSQL: excec;ao nao-manipuladadefinida pelo ususrio"12.5 Comando RAISE_APLLlCATION_ERROR

    Em alguns casos se faz necessarlo forcar um erro de run-time. Para issousamos 0 comando RAISE_APPLICATION_ERROR, que nos permite interrompera execucao de um programa, gerando erro de run-time e asslnala-lo um c6digo euma mensagem. Para usarmos RAISE_APPLICATION_ERROR devemos utilizar aseguinte sintaxe:r a is e _ ap p li c at i on _ e rr o r( e rr o r_ n um b e r, m e ss a g e) ;

    Figura 12.1 - Tratamento de Errosonde error_numbere um numero negativo e inteiro na faixa de -20999 a -20000e message e a mensagem customizada pelo programador.

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    46/64

    Tratamento de EXCey80

    1 DECLARE2 nQdt NUMBER;3 BEGIN4 SELECT COUN T(*)5 INTO nQdt6 FR OM employee s;7 IF n Qdt < 1 00 T HE N8 RAISE-APPLICAT ION_ERROR(-2000 0, 'Ainda nao Exis tem 100 fu ncionarios');9 END IF;10 END11 / 'Exemplo 12.3 - RAISE_APPLICATION_ERRORObs.: Excec;oes geradas por RAISE_APPLlCATlON_ERROR nao estarao na lista etros Oracle eserao capturadas e tratadas na clausula WHEN OTHERS.12.6 Pragma EXCEPTION_INIT

    Para tratar os erros de run-time que n80 tem eXCey80 PUSQL pre-deflnlda(ver 12.3), deveriamos usar a clausula OTHERS ou PRAGMA EXCEPTION_INIT.Nesta segunda abordagem, 0 compilador associa uma eXCey80 declarada pelousuarlo (ver 12.4) com um c6digo de erro de run-time mapeado na lista de errosOracle.

    12345678910existe');11 E ND IF;12 EXCEPTION13 WHEN e_emp_ remain THEN14 SELECT COUNT( *)15 INTO n Qdt16 FROM employees17 WHERE departmen t_id = v_departm ent_id;1 8 D BM S_ OU TP UT .P UT _L IN E( 'N ao e p os si ve l a r em o~a o d o d ep ar ta me nt oI I' . N e le e xi st e( m ) ' 1I nQ d tl l' f un ci on a ri o( s) ') ;19 END;20 /

    'II v _ d e p ar t m e n t _i d

    DECLAREe _ em p _r e ma i n E XC E P TI O N;PR A G M A EXCEP T I O N _I N I T ( e _e m p _ r em a i n , - 2292 ) ;v _ de p a rt m en t _i d d e pa r t me n ts . d e pa r tm e n t_ i d % TY PE := 6 0;nQdt NUMBER;BEGIND EL ET E d ep ar tm e nt sW HE RE d ep ar tm e nt _i d = v _d ep ar t me nt _i d;I F S QL %N OT FO UN D T HE NRAISE-APPLICATION_ERROR(-20001, '0 d ep at a me nt o ' I I V_ de pa rt me n t_ id l I ' n ao

    Exemplo 12.4 - Pragma EXCEPTION_INITNo exemplo 12.4 0 comando PRAGMA EXCEPTION_INIT (Iinha 3) associaORA-2292 a execao PUSQL e_emp_remain declarada na linha 2. Apartir destaassoclacao os erros de run-time ORA-2292 poderao ser tratados pela execaoPUSQL e_emp_remain (Iinha 13).Esta modalidade de tratamento e interessante para os erros de chaveestrangeira "ORA-02292: restricao de integridade violada - registro filhoLocalizado" e "ORA-02291: restricao de integridade violada - chave mae n80

    localizada".12.7 SQLCODE, SQLERRM

    Quando ocorre um erro de run-time ocorre, voce pode identificar 0 c6digo e amensagem do erro associado atraves das tuncoes SQLCODE e SQLERRM. Aobtencao do c6digo erro e consulta na lista de erros Oracle ajuda na reSOlUy80deerros de proqrarnacao,

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    47/64

    Tratamento de EXCey80

    Tabela 12.3. SQLCODE, SQLERRMFunc;ao Descric;aoSQLCODE Retorna 0 numero de c6digo de erroSQLERRM Retorna os dados de caracteres que contem a mensagem associ ada ao nurnerode erro

    1 DE C L A R E2 v _c ou nt ry _i d c ou nt ri es .c ou nt ry _i d% TYP E:='C A' ;3 BEG IN4 DE L E T E c o u n t r i e s5 WHE RE c o u n t r y _ i d = v_ c o u n t r y _ i d;6 EXCEP T I O N7 WHEN O THERS THEN8 DBMS_ O U T P U T.P U T _ L I N E ( 'c6 di g o -> ' I I S Q L C O D E ) ;9 DBMS_ O U T P U T.P U T _ L I N E ( 'Me n s a g e m -> ' I I S Q L E R R M ) ;1 0 END11 / '

    Exemplo 12.5 - SQLCODE, SQLERRM

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:[email protected]:[email protected]
  • 5/13/2018 SQL Scrips

    48/64

    Stored Subprograms

    Parte III - Objetos Procedurais

    13Stored SubprogramsSubprogramas S80 compilados e armazenados no banco de dados Oracle,estao disponiveis para leitura e eXeCUy80. Uma vez compilados se tornam objetosde schema na forma de stored procedure ou stores funciton, que podem seracessados pelos usuaries e apllcacoes conectados do banco de dados.o comando CREATE [OR REPLACE] PROCEDURE nos permite criar umaprocedure no banco de dados e 0 comando CREATE [OR REPLACE] FUNCTIONnos permite criar uma funcao de banco de dados.A utlllzacao de subprogramas armezenados nos traz a vantagem decompartilhamento de mem6ria, tendo se em vista que apenas uma versao dosubprograma sera carregada em mem6ria e sera compartilhada por variesusuaries. Podemos citar tarnbern a padronlzacao na forma de tratar os dados.

    13.1 Stored ProcedureUma PROCEDURE e um bloco PUSQL nomeado que pode obter parametres(algumas vezes chamados de argumentos), e que pode ser referenciada pornome.Para transformar um bloco PUSQL em uma PROCEDURE basta eliminarpalavra DECLARE (se existir) e adicionar CREATE [OR REPLACE] PROCEDUREnome_procedimento (par1,par2, ...,parN) IS ao inicio. Entre 0 nome do

    procedimento e a palavra IS, podem ser especificados os parametros separadospor virgula.C RE AT E [ OR R EP LA CE ] P RO CE DU RE n om e_ pr oc ed im en to( pa ra me tr ol [ MO DO ] t ip od ad o, pa ra me tr o2 [ MO DO ] t ip od ad o,

    : p~ ~a me tr oN [ MO DO ] t ip od ad o)IS - - d ec la ra l; oe sBEGIN- - i ns tr ul ;o es e c om an do sEXCEPTON-- tratamentos de erroEND;Figura 13.1 Sintaxe Create procedure

    1 CREATE OR REPLACE PROCEDURE ProcNula2 IS3 BEGIN4 D BM S_ OU TP UT .P UT _L IN E( 'p ri me ir a p ro ce du re ') ;5 END ProcNul a;6 /1 BEGIN2 ProcNul a ;3 END;/

    Exemplo 13.1 - Primeira procedure

    _Introdu{:ao a Programaciio PL/SQL [email protected]

    mailto:marc