Você está na página 1de 351

Relacional Consultoria e Sistemas Rua da Candelria, 60 10 andar Tel.: (0xx21) 2213-9191 e-mail: claudiad@relacional.com.br Copyright 1998-2003 Lcia M. A.

A. Fernandes Diretora de Tecnologia e Treinamento e-mail: luciaaf@relacional.com.br

INTRODUO AO ORACLE9I

INTRODUO AO ORACLE9I - SQL

CAPTULO 1: INTRODUO.................................................................................................1
BANCO DE DADOS RELACIONAL......................................................................................................1 MODELO DE DADOS...........................................................................................................................2 BANCO DE DADOS OBJETO RELACIONAL.......................................................................................3 A LINGUAGEM SQL.............................................................................................................................4
LINGUAGEM DE MANIPULAO DOS DADOS (DATA MANIPULATION LANGUAGE DML)........................4 LINGUAGEM DE DEFINIO DOS DADOS (DATA DEFINITION LANGUAGE DDL).....................................4 LINGUAGEM DE CONTROLE DOS DADOS (DATA CONTROL LANGUAGE DCL)........................................4

O SOFTWARE SQL*PLUS...................................................................................................................6
ESQUEMA DE FUNCIONAMENTO DO SQL*PLUS.............................................................................................7 SQL BUFFER (AFIEDT.BUF).................................................................................................................................7 COMANDOS DO SQL*PLUS.................................................................................................................................7 LINHA DE COMANDO...........................................................................................................................................8 CONTINUAO DE COMANDOS ENTRE LINHAS.............................................................................................8 FIM DE COMANDO................................................................................................................................................8 O ARQUIVO LOGIN.SQL.......................................................................................................................................8

COMANDOS BSICOS DE SQL*PLUS...............................................................................................9


COMANDOS DE EDIO .....................................................................................................................................9 COMANDOS DE EXECUO.............................................................................................................................13 COMANDOS DE MANIPULAO DE ARQUIVO...............................................................................................14 DIVERSOS...........................................................................................................................................................17

O COMANDO SELECT.......................................................................................................................19
FORMA BSICA...................................................................................................................................................19 A CLUSULA WHERE.........................................................................................................................................20 APRESENTANDO O RESULTADO.....................................................................................................................21 O SMBOLO *.......................................................................................................................................................21 AS CLUSULAS ALL E DISTINCT (OU UNIQUE)..............................................................................................22 AS PALAVRAS CHAVE AND E OR.....................................................................................................................24 OPERADORES DE COMPARAO...................................................................................................................25 OPERADORES ARITMTICOS E DE CONCATENAO.................................................................................27 PREDICADOS......................................................................................................................................................28

CONSULTANDO DADOS DE UMA TABELA PARTICIONADA.........................................................31 CONSTRUES BSICAS COM O COMANDO SELECT................................................................32
CONDIES COMBINADAS...............................................................................................................................32 LIKE......................................................................................................................................................................32 CONCATENAO E INTERVALO DE VALORES..............................................................................................33 CONSTANTES.....................................................................................................................................................34

LABORATRIO 1...............................................................................................................................35

CAPTULO 2: ATUALIZANDO E ORDENANDO.................................................................36


INCLUSO..........................................................................................................................................36
NDICE - I

INTRODUO AO ORACLE9I - SQL


INCLUSO DE UMA NICA ROW......................................................................................................................37 INCLUSO EM TABELAS PARTICIONADAS.....................................................................................................38 INCLUSO DE DIVERSAS LINHAS....................................................................................................................40

REGRAS DE INTEGRIDADE..............................................................................................................41 UPDATE..............................................................................................................................................42


ATUALIZAO DE DIVERSAS LINHAS.............................................................................................................43 ATUALIZAO A PARTIR DE DADOS DE OBTIDOS DO BANCO DE DADOS...............................................44 ATUALIZAO EM TABELAS PARTICIONADAS..............................................................................................45

DELETE..............................................................................................................................................46
EXCLUSO DE LINHAS......................................................................................................................................46 INTEGRIDADE REFERENCIAL...........................................................................................................................47 EXCLUSO EM TABELAS PARTICIONADAS....................................................................................................47

RETORNANDO INFORMAES APS ATUALIZAO..................................................................48


INSERT E RETURNING.......................................................................................................................................48 UPDATE E RETURNING.....................................................................................................................................49 DELETE E RETURNING......................................................................................................................................49

ORDENANDO OS RESULTADO........................................................................................................50
CONSULTA SIMPLES COM ORDENAO .......................................................................................................50 ORDENANDO POR UMA COLUNA COM NULL.................................................................................................51

LABORATRIO 2:..............................................................................................................................52

CAPTULO 3: FUNES ESCALARES..............................................................................53


NUMRICAS NUMRICAS SIMPLES.............................................................................................54
ABS.......................................................................................................................................................................54 BITAND.................................................................................................................................................................54 CEIL......................................................................................................................................................................55 EXP.......................................................................................................................................................................55 FLOOR..................................................................................................................................................................55 LN..........................................................................................................................................................................55 LOG.......................................................................................................................................................................56 MOD......................................................................................................................................................................56 POWER................................................................................................................................................................56 ROUND.................................................................................................................................................................56 SIGN.....................................................................................................................................................................57 SQRT....................................................................................................................................................................57 TRUNC.................................................................................................................................................................57 WIDTH_BUCKET..................................................................................................................................................58

NUMRICAS - TRIGONOMTRICAS................................................................................................59
ACOS....................................................................................................................................................................59 ASIN......................................................................................................................................................................59 ATAN....................................................................................................................................................................59 ATAN2..................................................................................................................................................................59 COS......................................................................................................................................................................60 COSH....................................................................................................................................................................60 NDICE - II

INTRODUO AO ORACLE9I - SQL


SIN........................................................................................................................................................................60 SINH......................................................................................................................................................................60 TAN.......................................................................................................................................................................61 TANH....................................................................................................................................................................61

ALFANUMRICAS..............................................................................................................................62
CHR......................................................................................................................................................................62 CONCAT...............................................................................................................................................................62 INITCAP................................................................................................................................................................62 LOWER.................................................................................................................................................................63 LPAD.....................................................................................................................................................................63 LTRIM...................................................................................................................................................................63 NLS_INITCAP.......................................................................................................................................................64 NLS_LOWER........................................................................................................................................................64 NLS_UPPER.........................................................................................................................................................64 NLSSORT.............................................................................................................................................................65 REPLACE.............................................................................................................................................................65 RPAD....................................................................................................................................................................65 RTRIM...................................................................................................................................................................66 SOUNDEX............................................................................................................................................................66 SUBSTR...............................................................................................................................................................66 SUBSTRB.............................................................................................................................................................67 SUBSTRC, SUBSTR2, SUBSTR4.......................................................................................................................67 TRANSLATE.........................................................................................................................................................68 TREAT..................................................................................................................................................................68 TRIM.....................................................................................................................................................................68 UPPER..................................................................................................................................................................69

ALFANUMRICAS RETORNANDO VALORES NUMRICOS..........................................................70


ASCII.....................................................................................................................................................................70 INSTR...................................................................................................................................................................70 INSTRB.................................................................................................................................................................70 INSTRC, INSTR2, INSTR4...................................................................................................................................70 LENGTH...............................................................................................................................................................71 LENGTHB, LENGTHC, LENGTH2, LENGTH4....................................................................................................71

DATAS................................................................................................................................................72
SYSDATE.............................................................................................................................................................72 ADD_MONTHS.....................................................................................................................................................72 CURRENT_DATE.................................................................................................................................................73 SESSIONTIMEZONE...........................................................................................................................................73 CURRENT_TIMESTAMP.....................................................................................................................................74 DBTIMEZONE......................................................................................................................................................74 EXTRACT.............................................................................................................................................................75 FROM_TZ.............................................................................................................................................................76 LOCALTIMESTAMP.............................................................................................................................................76 LAST_DAY............................................................................................................................................................77 NDICE - III

INTRODUO AO ORACLE9I - SQL


MONTHS_BETWEEN..........................................................................................................................................77 NEW_TIME...........................................................................................................................................................78 NEXT_DAY...........................................................................................................................................................79 ROUND.................................................................................................................................................................79 SYS_EXTRACT_UTC..........................................................................................................................................79 SYSTIMESTAMP..................................................................................................................................................80 TRUNC.................................................................................................................................................................80 TZ_OFFSET.........................................................................................................................................................81

CONVERSO.....................................................................................................................................82
ASCIISTR.............................................................................................................................................................82 BIN_TO_NUM.......................................................................................................................................................82 CAST....................................................................................................................................................................82 CHARTOROWID..................................................................................................................................................83 COMPOSE............................................................................................................................................................83 CONVERT............................................................................................................................................................83 DECOMPOSE.......................................................................................................................................................84 HEXTORAW.........................................................................................................................................................84 NUMTODSINTERVAL..........................................................................................................................................84 NUMTOYMINTERVAL..........................................................................................................................................85 RAWTOHEX, RAWTONHEX................................................................................................................................85 ROWIDTOCHAR, ROWIDTONCHAR..................................................................................................................85 TO_CHAR CHARSET.......................................................................................................................................86 TO_CHAR - NUMRICO......................................................................................................................................86 TO_NUMBER.......................................................................................................................................................88 TO_CHAR - DATA................................................................................................................................................88 TO_DATE.............................................................................................................................................................88 TO_CLOB.............................................................................................................................................................91 TO_DSINTERVAL................................................................................................................................................91 TO_LOB................................................................................................................................................................91 TO_MULTI_BYTE.................................................................................................................................................92 TO_NCHAR..........................................................................................................................................................92 TO_NCHAR..........................................................................................................................................................92 TO_NCHAR..........................................................................................................................................................92 TO_NCLOB...........................................................................................................................................................92 TO_SINGLE_BYTE..............................................................................................................................................93 TO_TIMESTAMP..................................................................................................................................................93 TO_TIMESTAMP_TZ...........................................................................................................................................93 TO_YMINTERVAL................................................................................................................................................93 TRANSLATE USING............................................................................................................................................94 UNISTR.................................................................................................................................................................94

OUTRAS.............................................................................................................................................95
BFILENAME..........................................................................................................................................................95 COALESCE..........................................................................................................................................................95 DECODE...............................................................................................................................................................95 DUMP...................................................................................................................................................................96 NDICE - IV

INTRODUO AO ORACLE9I - SQL


EMPTY_BLOB( )...................................................................................................................................................96 EMPTY_CLOB( )..................................................................................................................................................97 EXISTSNODE.......................................................................................................................................................97 EXTRACT.............................................................................................................................................................98 GREATEST...........................................................................................................................................................98 LEAST...................................................................................................................................................................98 NLS_CHARSET_DECL_LEN...............................................................................................................................98 NLS_CHARSET_ID..............................................................................................................................................99 NLS_CHARSET_NAME.......................................................................................................................................99 NULLIF..................................................................................................................................................................99 NVL.....................................................................................................................................................................100 NVL2...................................................................................................................................................................100 SYS_CONNECT_BY_PATH..............................................................................................................................101 SYS_CONTEXT..................................................................................................................................................101 SYS_DBURIGEN................................................................................................................................................102 SYS_GUID..........................................................................................................................................................103 SYS_TYPEID......................................................................................................................................................103 SYS_XMLGEN....................................................................................................................................................103 SYS_XMLAGG...................................................................................................................................................104 UID......................................................................................................................................................................104 USER..................................................................................................................................................................104 USERENV...........................................................................................................................................................105 VSIZE..................................................................................................................................................................105

CONSTRUES BSICAS COM FUNES ESCALARES...........................................................106


OPERADORES BOOLEANOS...........................................................................................................................106 EXPRESSES...................................................................................................................................................107

LABORATRIO 3.............................................................................................................................108

CAPTULO 4 : USANDO MAIS DE UMA TABELA............................................................110


SUBSELECTS...................................................................................................................................110
CARACTERSTICAS..........................................................................................................................................110 EXEMPLOS........................................................................................................................................................113

USANDO OPERAES RELACIONAIS..........................................................................................115


SELEO OU RESTRIO..............................................................................................................................116 PROJEO........................................................................................................................................................116 UNIO.................................................................................................................................................................117 SUBTRAO......................................................................................................................................................119

INTERSEO...................................................................................................................................120 PRODUTO........................................................................................................................................121
JOIN OU JUNO.............................................................................................................................................123 DIVISO.............................................................................................................................................................129

LABORATRIO 4:............................................................................................................................130

CAPTULO 5: GRUPAMENTOS E FUNES...................................................................132


NDICE - V

INTRODUO AO ORACLE9I - SQL FUNES DE GRUPO OU DE AGREGAO................................................................................132


CONCEITOS GERAIS........................................................................................................................................132 AVG....................................................................................................................................................................134 CORR.................................................................................................................................................................134 COUNT...............................................................................................................................................................134 COVAR_POP......................................................................................................................................................134 COVAR_SAMP...................................................................................................................................................136 CUME_DIST.......................................................................................................................................................136 DENSE_RANK....................................................................................................................................................137 FIRST..................................................................................................................................................................137 GROUP_ID.........................................................................................................................................................139 GROUPING........................................................................................................................................................139 GROUPING_ID...................................................................................................................................................139 LAST...................................................................................................................................................................139 MAX....................................................................................................................................................................140 MIN......................................................................................................................................................................140 PERCENT_RANK...............................................................................................................................................140 PERCENTILE_CONT.........................................................................................................................................141 PERCENTILE_DISC...........................................................................................................................................142 RANK..................................................................................................................................................................143 REGR_AVGX......................................................................................................................................................145 REGR_AVGY......................................................................................................................................................145 REGR_COUNT...................................................................................................................................................145 REGR_INTERCEPT...........................................................................................................................................145 REGR_R2...........................................................................................................................................................146 REGR_SLOPE....................................................................................................................................................146 REGR_SXX........................................................................................................................................................146 REGR_SXY........................................................................................................................................................146 REGR_SYY........................................................................................................................................................146 STDDEV.............................................................................................................................................................147 STDDEV_POP....................................................................................................................................................148 STDDEV_SAMP.................................................................................................................................................148 SUM....................................................................................................................................................................148 VAR_POP...........................................................................................................................................................148 VAR_SAMP........................................................................................................................................................149 VARIANCE..........................................................................................................................................................149

GRUPANDO AS LINHAS SELECIONADAS.....................................................................................151


A CLUSULA HAVING.......................................................................................................................................153 AS EXPRESSES ROLLUP E CUBE...............................................................................................................155 IDENTIFICANDO AS LINHAS COM AS FUNES GROUP...........................................................................158

FUNES ANALTICAS...................................................................................................................160
FUNES SOMENTE ANALTICAS.................................................................................................................161 FIRST_VALUE....................................................................................................................................................164 LAG.....................................................................................................................................................................165 NDICE - VI

INTRODUO AO ORACLE9I - SQL


LAST_VALUE.....................................................................................................................................................166 LEAD...................................................................................................................................................................167 NTILE..................................................................................................................................................................168 RATIO_TO_REPORT.........................................................................................................................................169 ROW_NUMBER..................................................................................................................................................170 FUNES DE AGREGAO COM USO ANALTICO.....................................................................................171

LABORATRIO 5:............................................................................................................................176

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS..........................................................178


COMANDOS DE AMBIENTE............................................................................................................178
SET.....................................................................................................................................................................178

COMANDOS DE FORMATAO.....................................................................................................188
COLUMN............................................................................................................................................................188 BREAK................................................................................................................................................................190 COMPUTE..........................................................................................................................................................191 TTITLE................................................................................................................................................................192 BTITLE................................................................................................................................................................193 REPHEADER......................................................................................................................................................194 REPFOOTER......................................................................................................................................................196 SHOW.................................................................................................................................................................197 CLEAR................................................................................................................................................................198

COMANDOS INTERATIVOS............................................................................................................199
DEFINE...............................................................................................................................................................199 UNDEFINE..........................................................................................................................................................199 ACCEPT.............................................................................................................................................................200 VARIABLE..........................................................................................................................................................201 PRINT.................................................................................................................................................................201

COMANDOS DE ACESSO AO DATABASE.....................................................................................202


CONNECT..........................................................................................................................................................202 DISCONNECT....................................................................................................................................................202

GERAIS.............................................................................................................................................203
REMARK.............................................................................................................................................................203 ATTRIBUTE........................................................................................................................................................204 COPY..................................................................................................................................................................205 HOST..................................................................................................................................................................207 PASSWORD.......................................................................................................................................................207 PAUSE................................................................................................................................................................207 PROMPT.............................................................................................................................................................208 STORE................................................................................................................................................................209 TIMING...............................................................................................................................................................210 WHENEVER OSERROR....................................................................................................................................211 WHENEVER SQLERROR..................................................................................................................................212

ACIONANDO O SQL*PLUS EM BATCH..........................................................................................213 LABORATRIO 6:............................................................................................................................216


NDICE - VII

INTRODUO AO ORACLE9I - SQL

CAPTULO 7: CLUSULAS AVANADAS DO SQL........................................................218


OUTER JOIN.....................................................................................................................................219 SUBSELECTS CORRELACIONADOS.............................................................................................222 EXISTS..............................................................................................................................................224 VIEWS RELACIONAIS......................................................................................................................229 USO DE SUBQUERY NA CLUSULA FROM..................................................................................232
EM SELECTS.....................................................................................................................................................232 EM UPDATES.....................................................................................................................................................234 EM INSERTS......................................................................................................................................................234 EM DELETES.....................................................................................................................................................235

MERGE.............................................................................................................................................236 INSERT COM ALL E WHEN.............................................................................................................238 NOVOS USOS DE SUBQUERIES....................................................................................................241 CASE.................................................................................................................................................242 LABORATRIO 7:............................................................................................................................243

CAPTULO 8: DICIONRIO DE DADOS E DCL................................................................245


O DICIONRIO DE DADOS DO ORACLE.......................................................................................245
CONSULTANDO O DICIONRIO DE DADOS..................................................................................................247

DATA CONTROL LANGUAGE.........................................................................................................249


COMANDOS PARA CONTROLE DA TRANSAO.........................................................................................250 COMANDOS PARA CONTROLE DA SESSO.................................................................................................261 SET ROLE..........................................................................................................................................................265 GLOBALIZATION SUPPORT.............................................................................................................................266 VARIVEIS DE AMBIENTE...............................................................................................................................276 OS PARMETROS NLS EM USO NAS FUNES SQL.................................................................................277

LABORATRIO 8:............................................................................................................................278

CAPTULO 9: DATA DEFINITION LANGUAGE................................................................280


SCHEMA...........................................................................................................................................280 DATA DEFINITION LANGUAGE......................................................................................................281
ARMAZENAMENTO...........................................................................................................................................282 TABLESPACE....................................................................................................................................................283 BLOCO ORACLE...............................................................................................................................................283 SEGMENTOS.....................................................................................................................................................284 EXTENSO........................................................................................................................................................284 CREATE TABLE.................................................................................................................................................285 TIPOS DE DADOS.............................................................................................................................................286 CONSTRAINTS..................................................................................................................................................288 CREATE TYPE...................................................................................................................................................289 CREATE INDEX.................................................................................................................................................289 CREATE DATABASE LINK................................................................................................................................290 NDICE - VIII

INTRODUO AO ORACLE9I - SQL


CREATE SYNONYM..........................................................................................................................................290 CREATE SEQUENCE........................................................................................................................................291 CREATE ROLE...................................................................................................................................................293 CREATE DIRECTORY.......................................................................................................................................294 CREATE VIEW...................................................................................................................................................294 CREATE USER..................................................................................................................................................294 ALTER <OBJETO>.............................................................................................................................................295 DROP <OBJETO>..............................................................................................................................................295 TRUNCATE TABLE............................................................................................................................................296 RENAME.............................................................................................................................................................296 GRANT...............................................................................................................................................................297 REVOKE.............................................................................................................................................................297

LABORATRIO 9:............................................................................................................................298

CAPTULO 10: TABELAS DO CURSO..............................................................................299


TABELA DE DEPARTAMENTOS.....................................................................................................299 TABELA DE FUNCIONRIOS..........................................................................................................300 TABELA DE ATIVIDADES................................................................................................................301 TABELA DE PROJETOS..................................................................................................................302 TABELA DE PROJETOS X ATIVIDADES........................................................................................303

RESPOSTAS DOS LABORATRIOS................................................................................305


LABORATRIO 1.............................................................................................................................305 LABORATRIO 2:............................................................................................................................308 LABORATRIO 3.............................................................................................................................311 LABORATRIO 4:............................................................................................................................316 LABORATRIO 5:............................................................................................................................321 LABORATRIO 6:............................................................................................................................326 LABORATRIO 7:............................................................................................................................329 LABORATRIO 8:............................................................................................................................333 LABORATRIO 9:............................................................................................................................339

NDICE - IX

INTRODUO AO ORACLE9I - SQL

CAPTULO 1: INTRODUO
BANCO DE DADOS RELACIONAL
Um banco de dados relacional tem como objetivo implementar o modelo de dados relacional, com todas as suas caractersticas bsicas, ou seja, entidades, atributos e relacionamentos. Conceitualmente, um software de banco de dados relacional (RDBMS) usa tabelas para implementar entidades e colunas para atributos. Os relacionamentos so mantidos por valor com o uso de primary key e de foreign key. As operaes relacionais tambm so contempladas, permitindo a realizao de unies, intersees, junes, subtraes, etc. Por exemplo, suponhamos que desejssemos armazenar as informaes administrativas de uma empresa. Em um banco de dados relacional, poderamos criar diversas tabelas para armazenar diferentes partes de informao sobre a empresa, tais como, uma tabela com dados dos funcionrios, uma tabela com dados dos departamentos, uma tabela com dados dos projetos em andamento, etc. Cada uma destas tabelas possuem colunas (atributos) para armazenamento das informaes pertinentes tabela. As tabelas possuem uma coluna ou um conjunto de colunas que identifica, inequivocamente, a linha da tabela, chamada de Primary Key. Desta forma o relacionamento entre as tabelas estabelecido pela presena da PK de uma tabela em outra, ou seja, uma chave estrangeira, ou Foreign Key. Ao longo do curso veremos como obter dados relacionados, como atualizar as tabelas relacionais e como criar novas tabelas. Comentaremos sobre alguns dos objetos de um banco de dados relacional Oracle: tables, views, indexes, synonyms, roles, object tables, object types, object views, index-only tables, partition tables (Introduo ao ORACLE), triggers, packages, procedures e functions (PL/SQL).

CAPTULO 1: INTRODUO - 1

INTRODUO AO ORACLE9I - SQL

MODELO DE DADOS
Na figura abaixo, apresentamos um esquema do modelo de entidades e relacionamentos, descrito logo a seguir. FK(cd_gerente) FUNCIONRIO (func) PK(cd_mat) FK(cd_depto) DEPARTAMENTO (depto) PK(cd_depto) FK(cd_depto_ctb)

FK(cd_depto) FK(cd_resp) PROJETO (proj) PK(cd_proj)

ATIVIDADES (ativ) PK(cd_ativ)

FK(cd_ativ)

PROJETOS x ATIVIDADES (prjatv) PK(cd_proj, cd_ativ)

FK(cd_proj)

A tabela Funcionrio (Func) tem como primary key (PK) a coluna cd_mat e como foreign key (FK) a coluna cd_depto, que estabelece relacionamento com a tabela Depto. A tabela Departamento (Depto) tem como primary key (PK) a coluna cd_depto e como foreign key (FK) a coluna cd_gerente, que estabelece relacionamento com a tabela Func, e a coluna cd_depto_ctb, que estabelece um auto relacionamento. A tabela Projeto (Proj) tem como primary key (PK) a coluna cd_proj e como foreign key (FK) a coluna cd_resp, que estabelece relacionamento com a tabela Func, e a coluna cd_depto, que estabelece relacionamento com a tabela Depto. A tabela Atividades (Ativ) tem como primary key (PK) a coluna cd_ativ e no possui relacionamentos com outras tabelas. Finalmente, a tabela Projetos-Atividades (PrjAtv) tem como primary key (PK) as colunas cd_proj e cd_ativ, que simultaneamente agem como foreign key (FK) e estabelecem relacionamento com as tabelas Proj e Ativ, respectivamente.

CAPTULO 1: INTRODUO - 2

INTRODUO AO ORACLE9I - SQL

BANCO DE DADOS OBJETO RELACIONAL


A partir da verso 8.0 o Oracle estende as caractersticas de seu banco de dados e incorpora os conceitos de objeto. Poderemos declarar objetos, arrays, tabelas embedded, mtodos armazenados dentro de tabelas relacionais ou de tabelas objeto. Um novo conjunto de termos passa a ser necessrio: Encapsulamento - Mecanismo atravs do qual dados e mtodos so grupados e armazenados juntos e vistos como um conjunto. Mtodo Um mtodo um cdigo associado (ou encapsulado) ao objeto. Sua principal caracterstica que tem acesso ilimitado aos dados do objeto ao qual est ligado. Objeto um objeto algo que, de alguma forma junta dados (atributos) e cdigos (mtodos) em um elemento nico. Podemos, formalmente, dizer que um objeto encapsula dados e cdigo (atributos e mtodos). Object Table Tabela para armazenamento das instncias de um determinado objeto. Varray Uma coleo. Uma lista ordenada e finita de dados.

Nested Table Uma coleo. Uma lista desordenada e ilimitada de dados. Pode ser indexada e pesquisada. OID Cada instncia de um objeto em uma Object Table tem um identificador nico chamado Object Identifier (Oid). Estes identificadores so gerados pelo Oracle, so imutveis e so nicos e relao a todo o banco de dados. Seu objetivo identificar inequivocamente uma instncia de um objeto. Herana o mecanismo de reutilizao de atributos e operaes definidos em classes (ou tipos de objetos) gerais por classes (ou tipos de objetos) mais especficas. Views Objeto So views construdas sobre uma base relacional que apresentam dos dados com a caracterstica de objeto. Polimorfismo Habilidade que permite que um mtodo seja especificado uma vez e fornea diferentes implementaes de acordo com o tipo do argumento recebido. No Oracle isto obtido atravs do mecanismo de Overloading (ser visto em PL/SQL). Desta forma basicamente temos dois novos elementos: objetos e colees (varray ou nested table). A definio de um destes novos elementos passa pela definio de um tipo (user-defined type) no banco de dados. Este tipo poder definir uma coleo simples, uma coleo de objetos, um objeto ou um objeto como atributo de outro objeto.

CAPTULO 1: INTRODUO - 3

INTRODUO AO ORACLE9I - SQL

A LINGUAGEM SQL
Se o banco de dados s entende SQL, ento devemos supor que a linguagem possui no apenas comandos de manipulao, mas tambm comandos para criao dos diversos objetos, controle de acesso, autorizao, etc. Como isto verdade e em funo da grande quantidade de comandos, a linguagem SQL foi dividida em trs partes principais.

LINGUAGEM DE MANIPULAO LANGUAGE DML)

DOS

DADOS

(DATA

MANIPULATION

Esta parte da SQL possui comandos para que os usurios faam acesso e armazenamento dos seus dados. Esta a parte da SQL que estaremos mais interessados em estudar, pois trata dos comandos a serem utilizados nos aplicativos de acesso ao banco de dados.

LINGUAGEM DE DEFINIO DOS DADOS (DATA DEFINITION LANGUAGE DDL)


Esta parte da SQL descreve como as tabelas e outros objetos Oracle podem ser definidos, alterados e removidos. Esta parte da linguagem, de um modo geral, utilizada pelo administrador do banco de dados (DBA). Veremos que os comandos de DDL no podem ser usados em todos os aplicativos (a PL/SQL, por exemplo, no permite a utilizao direta dos comandos de DDL).

LINGUAGEM DE CONTROLE DOS DADOS (DATA CONTROL LANGUAGE DCL)


A ltima parte da SQL nos d uma viso dos mecanismos de controle, subdividida em trs grupos de comandos: Comandos para Controle da Transao so os comandos necessrios para que possamos controlar a efetivao ou no das modificaes realizadas no banco de dados. Comandos para Controle da Sesso so os comandos necessrios para que possamos modificar as caractersticas de nossa sesso. Comandos para Controle do Sistema so os comandos necessrios para a modificao de caractersticas da instncia Oracle. No sero vistas neste livro.

CAPTULO 1: INTRODUO - 4

INTRODUO AO ORACLE9I - SQL Alm destas partes, a SQL contm comandos a serem usados nas linguagens HOST, tais como COBOL, C, ADA, etc. Estes comandos so chamados de EMBEDDED, pois so codificados como parte integrante das linguagens HOST. Na verdade, so os mesmos comandos da DML e DCL incorporados ao cdigo do programa. Uma vez que existe a necessidade de troca de informao entre as variveis dos dois ambientes (HOST e SQL), existem pequenas diferenas na codificao dos comandos de SQL quando utilizamos estas linguagens HOST. Estas sintaxes especiais so tratadas em uma parte da linguagem chamada Embedded SQL Commands (no ser vista neste curso). Para darmos incio aos testes dos comandos, precisamos de uma ferramenta que nos possibilite esta conversa (interao) com o banco de dados. A ferramenta que usaremos em todo este curso se chama SQL*Plus.

CAPTULO 1: INTRODUO - 5

INTRODUO AO ORACLE9I - SQL

O SOFTWARE SQL*PLUS
O SQL*PLUS uma ferramenta que nos possibilita a interao com o banco de dados Oracle atravs da SQL. Serve de interface entre o operador e o banco de dados. Ao acionarmos a execuo da ferramenta, ser apresentado um dilogo de login a fim de que possamos fornecer o nome do usurio e senha para estabelecer conexo com o banco de dados. Nosso usurio padro para testes ser ALUNO senha ALUNO. A terceira informao deste dilogo corresponde string de conexo (String do Host), ou seja, o nome de um parmetro que indica a que mquina e a qual banco de dados desejamos estabelecer conexo. Se voc estiver estabelecendo conexo com um banco de dados instalado na mesma mquina (local), este valor no precisa ser preenchido; caso isto no acontea, consulte seu DBA para obter o nome adequado para preenchimento. Em todo este captulo estaremos usando o Personal Oracle9i para realizao dos testes.

Quando a conexo estabelecida, obtemos permisso do banco de dados para enviar comandos e receber respostas. O intervalo de tempo entre o momento que uma conexo estabelecida at o momento em que ela encerrada chamado de Sesso.

CAPTULO 1: INTRODUO - 6

INTRODUO AO ORACLE9I - SQL

ESQUEMA DE FUNCIONAMENTO DO SQL*PLUS


Utilizando o SQL*PLUS poderemos: Digitar, editar, armazenar e executar comandos SQL e blocos PL/SQL Formatar, executar clculos, armazenar e imprimir resultados de Queries. Listar a definio de qualquer tabela. Fazer acesso e copiar dados entre bancos de dados. Enviar mensagens para e aceitar respostas de um usurio. DATABASE

Comando SQL

SQL BUFFER

RESULTADO

SQL*PLUS

SQL BUFFER (AFIEDT.BUF)


Quando digitamos um comando SQL na linha de prompt, este armazenado em uma parte da memria (buffer). L permanecendo at que seja informado outro comando.

COMANDOS DO SQL*PLUS
O SQL*PLUS possui um conjunto de comandos prprios, com a finalidade de : Editar o comando SQL armazenado no Buffer Controlar o modo (formato) como os resultados so apresentados Armazenar os comandos SQL para disco e recuper-los para execuo Marcar opes que influenciem o modo de trabalhar do SQL*PLUS

CAPTULO 1: INTRODUO - 7

INTRODUO AO ORACLE9I - SQL

LINHA DE COMANDO
O SQL*PLUS apresenta um prompt (SQL>), indicando que os comandos podem ser digitados. Os quais podem ser informados em letras maisculas ou minsculas. Estes comandos podem ser de trs tipos: Comandos SQL (para interao com o banco de dados) Comandos SQL*PLUS (para formatao dos resultados, edio e armazenamento de comandos SQL) Blocos PL/SQL (para interao com o banco de dados)

CONTINUAO DE COMANDOS ENTRE LINHAS


Os comandos podem ocupar mais de uma linha, bastando que teclemos <ENTER>. Uma nova linha ser apresentada.

FIM DE COMANDO
Para encerrar um comando SQL, podemos: Digitar um ponto e vrgula (;) Usar a barra (/) em uma linha sozinha Deixar uma linha em branco aps o comando

O efeito de cada uma destas opes para o SQL*PLUS diverso. O ponto e vrgula e a barra indicam fim de comando e execuo. J a linha em branco indica apenas fim de comando. Devemos observar, ainda, que estes caracteres no fazem parte da SQL, no sendo, portanto, armazenados no SQL Buffer.

O ARQUIVO LOGIN.SQL
Neste arquivo podemos colocar todos os comandos SQL*PLUS que desejemos para caracterizar a sesso corrente, pois o mesmo ser lido no incio desta.

CAPTULO 1: INTRODUO - 8

INTRODUO AO ORACLE9I - SQL

COMANDOS BSICOS DE SQL*PLUS


COMANDOS DE EDIO
Os comandos de edio tm o objetivo de modificar a informao armazenada no SQL Buffer. A edio feita linha a linha, isto , somente uma linha pode ser modificada de cada vez. OBS: A linha considerada apta para edio aquela marcada com um asterisco (*), ou seja, a linha corrente. LIST Lista uma ou mais linhas do buffer. O * indica a linha corrente. L[IST] [ n | n m | n * | n LAST | * | * n | * LAST | LAST] SQL> L 1 SELECT cd_mat, nm_func 2 FROM func 3* WHERE nr_cargo > 50

APPEND Adiciona texto ao fim da linha corrente. A[PPEND] text SQL> L 1 1* SELECT cd_mat, nm_func SQL> A , nr_cargo, vl_sal SQL> L 1 SELECT cd_mat, nm_func, nr_cargo, vl_sal 2 FROM func 3* WHERE nr_cargo > 50 OBS: Se desejarmos adicionar um ponto e vrgula ao fim do comando, devemos digitar 2 pontos e vrgula ao trmino do comando. Se desejarmos adicionar um espao antes da primeira letra do texto, devemos digitar 2 espaos.

CAPTULO 1: INTRODUO - 9

INTRODUO AO ORACLE9I - SQL CHANGE Substitui o texto old pelo texto new, na linha corrente. C[HANGE] sepchar old [sepchar [new [sepchar]]], onde sepchar pode ser algum caracter especial que no esteja no texto old nem no texto new, como por exemplo / ou !. SQL> L 1 1* SELECT cd_mat, nm_func, nr_cargo, vl_sal SQL> C/cd_mat/in_sexo SQL> L 1 1* SELECT in_sexo, nm_func, nr_cargo, vl_sal

DEL Exclui a linha corrente, uma linha especfica, a ltima linha ou um intervalo de linhas. O * indica a linha corrente. DEL [ n | n m | n * | n LAST | * | * n | * LAST | LAST ] SQL> L 3 3* WHERE nr_cargo > 50 SQL> DEL SQL> L 1 SELECT in_sexo, nm_func, nr_cargo, vl_sal 2* FROM func

CAPTULO 1: INTRODUO - 10

INTRODUO AO ORACLE9I - SQL INPUT Adicionar uma ou mais linhas aps a linha corrente, no buffer. I[NPUT] [texto] SQL> L 1 SELECT in_sexo, nm_func, nr_cargo, vl_sal 2* FROM func SQL> i 3 WHERE nr_git > 18 SQL> L 1 SELECT in_sexo, nm_func, nr_cargo, vl_sal 2 FROM func 3* WHERE nr_git > 18

CAPTULO 1: INTRODUO - 11

INTRODUO AO ORACLE9I - SQL EDIT Executa um editor do sistema operacional, passando como parmetro o nome de um arquivo ou o contedo do buffer. EDIT [ filename [.ext] ], onde : filename representa o nome do arquivo a ser editado. ext indica a extenso do nome do arquivo. Se omitido, ser assumido SQL.

SQL> EDIT ex2.txt

OBS: Se desejarmos a edio do Sql*Buffer basta a execuo do comando EDIT sem a indicao do nome do arquivo. A varivel _EDITOR possui o nome do editor do sistema a ser chamado pelo comando EDIT. A modificao de seu valor poder ser feito com o uso do comando DEFINE.

SQL> DEFINE _EDITOR = "Notepad"

CAPTULO 1: INTRODUO - 12

INTRODUO AO ORACLE9I - SQL

COMANDOS DE EXECUO
/ Executa o comando Sql ou Pl/Sql armazenado no buffer. SQL> L 1 SELECT in_sexo, nm_func, nr_cargo, vl_sal 2 FROM func 3* WHERE nr_git > 18 SQL> / I F M NM_FUNC NR_CARGO VL_SAL ------------ ---------- ---------SANDRA 60 3825 VICENTE 58 4650

RUN Lista e executa o comando Sql ou Pl/Sql armazenado no buffer. SQL> RUN 1 SELECT in_sexo, nm_func, nr_cargo, vl_sal 2 FROM func 3* WHERE nr_git > 18 I F M NM_FUNC NR_CARGO VL_SAL ------------ ---------- ---------SANDRA 60 3825 VICENTE 58 4650

EXECUTE Executa um comando de PL/SQL. SQL> EXECUTE DECLARE a DATE; BEGIN a := SYSDATE; END;

PL/SQL procedure successfully completed.

CAPTULO 1: INTRODUO - 13

INTRODUO AO ORACLE9I - SQL

COMANDOS DE MANIPULAO DE ARQUIVO


SAVE Salva o contedo do buffer SQL em um arquivo do sistema operacional. SAV[E] filename [.ext] [ CRE[ATE] | REP[LACE] | APP[END ] ] A extenso (.ext) default .SQL. SQL> L 1 SELECT COUNT(*) 2 FROM FUNC 3* WHERE CD_DEPTO = 'D11' SQL> SAVE TESTE Created file TESTE Por default o Oracle tenta criar o arquivo. Caso o arquivo j exista ocorrer um erro. Neste caso devemos acrescentar as palavras Replace ou Append ao comando. SQL> SAVE TESTE File "TESTE.SQL" already exists. Use another name or "SAVE filename REPLACE". SQL> SAVE TESTE REP Wrote file TESTE

GET Carrega todo o contedo de um arquivo do sistema operacional para o buffer SQL. GET filename [.ext] [ LIS[T] | NOL[IST] ] A extenso s precisa ser mencionada se diferente do sufixo default. SQL> GET TESTE 1 SELECT COUNT(*) 2 FROM FUNC 3* WHERE CD_DEPTO = 'D11' OBS.: Se o nome do arquivo contiver as palavras LIST ou FILE, o nome deve ser mencionado entre aspas.

CAPTULO 1: INTRODUO - 14

INTRODUO AO ORACLE9I - SQL START OU @ Executa o contedo de um arquivo de comandos existente no sistema operacional. START filename [.ext] [ parm1 cujos nomes so nmeros. parm2 parm3 ] onde parm representam variveis de substituio

Variveis de substituio so nomes de variveis precedidas por um ou dois ampersands(&). Quando atribumos nmeros s variveis de substituio (nomes numricos) elas podem ser passadas na linha do comando Start, imediatamente aps o nome do arquivo (parm1, par2, etc). A associao posicional: &1 indica o primeiro parmetro passado na linha de comandos, &2 o segundo e assim por diante. Quando o SQL*PLUS encontra uma varivel de substituio em um comando, ele substitui o nome da varivel pelo seu contedo antes de enviar o comando ao Oracle Server. A utilizao de dois ampersands (&&) indica ao SQL*Plus que a varivel tambm deve ser declarada (Define) alm de ser substituda no texto. A prxima execuo de um script utilizando a mesma varivel faz com que o SQL*Plus obtenha seu valor de memria em vez de solicit-lo ao operador. SQL> L 1 SELECT nm_func, vl_sal, cd_mat, nr_git 2 FROM func 3* WHERE nr_git > &1 AND cd_depto = '&2' SQL> SAVE TESTE REP Gravou arquivo TESTE.sql SQL> @TESTE Entre o valor para 1: 16 Entre o valor para 2: D11 antigo 3: WHERE nr_git > &1 AND cd_depto = '&2' novo 3: WHERE nr_git > 16 AND cd_depto = 'D11' NM_FUNC VL_SAL CD_MAT NR_GIT ------------ ---------- ---------- ---------ELIZABET 2225 160 17 MARIA 2134 180 17 WILIAM 1827 210 17 JOANA 2984 220 18

@@ Similar ao START, mas pesquisa os arquivos de comandos existentes dentro do arquivo de comandos no diretrio onde se acha o arquivo de comandos e no no diretrio local, como o default para o Start e o @.

CAPTULO 1: INTRODUO - 15

INTRODUO AO ORACLE9I - SQL SPOOL Armazena o resultado de uma consulta em um arquivo do sistema operacional e, opcionalmente, envia o arquivo para a impressora default do sistema. SPO[OL] [filename [.ext] | OFF | OUT] A extenso default para o arquivo pode ser LST (Windows95) ou LIS (Unix), de acordo com o sistema operacional. A opo OFF interrompe o processo de gerao do arquivo e a opo OUT alm de interromper a gerao envia-o para a impressora default do sistema.

SQL> SPOOL saida SQL> SELECT cd_mat FROM func where cd_mat = 10; CD_MAT ---------10 SQL> SPOOL OFF SQL> EDIT saida.lst SQL> SELECT cd_mat FROM func where cd_mat = 10; CD_MAT ---------10 SQL> SPOOL OFF

CAPTULO 1: INTRODUO - 16

INTRODUO AO ORACLE9I - SQL

DIVERSOS
EXIT / QUIT Encerra uma sesso do SQL*PLUS. Efetiva, por default, todas as alteraes pendentes no banco de dados e retorna o controle para o sistema operacional. {EXIT | QUIT} [SUCCESS | FAILURE | WARNING | n | variable | :BindVariable ] [ COMMIT | ROLLBACK ] Por default, o trmino do SQL*Plus normal (Success). Caso seja informada outra opo, o trmino variar de acordo com o valor fornecido. Os valores numricos informados aps a palavra EXIT (ou QUIT) indicam o return code. SQL> exit

HELP Fornece informaes sobre os comandos SQL*PLUS. Os arquivos de ajuda referentes ao SQL*Plus tambm esto includas na documentao fornecida pela Oracle em formato HTML e devem ser lidas com a ajuda de um Browser. SQL> HELP ACCEPT ACCEPT -----Reads a line of input and stores it in a given user variable. ACC[EPT] variable [NUM[BER] | CHAR | DATE] [FOR[MAT] format] [DEF[AULT] default] [PROMPT text | NOPR[OMPT]] [HIDE]

CAPTULO 1: INTRODUO - 17

INTRODUO AO ORACLE9I - SQL DESCRIBE Lista a definio de uma determinada tabela, view, sinnimo, funo, procedure ou package. DESC[RIBE] { [ schema.] object [ @database_link_name ] } SQL> DESC DEPTO Nome Nulo? ----------------------------------------- -------CD_DEPTO NOT NULL NM_DEPTO CD_GERENTE CD_DEPTO_CTB

Tipo ------------CHAR(3) VARCHAR2(40) NUMBER(5) CHAR(3)

Onde : schema indica o schema onde o objeto reside. object indica o nome da tabela, view, type, procedure, function, package ou synonym do qual desejamos obter informaes. database_link_name indica o banco de dados onde os objetos residem.

SQL> DESC TESTE PROCEDURE TESTE Nome do Argumento Tipo In/Out Default? -------------------- ----------------------- ------ -------P1 NUMBER IN

CAPTULO 1: INTRODUO - 18

INTRODUO AO ORACLE9I - SQL

O COMANDO SELECT
A SQL (como j comentamos anteriormente) a linguagem que d ao usurio acesso aos dados armazenados no banco de dados. A parte da linguagem que trata da manipulao dos dados, chamada DML (Linguagem de Manipulao dos Dados), permite que os usurios faam consultas ou modifiquem informaes existentes, criem novos dados ou excluam dados de tabelas (uma tabela Oracle composta de linhas e colunas). As consultas so feitas com o uso do comando SELECT e modificaes com os comandos INSERT, UPDATE e DELETE.

FORMA BSICA
O propsito de uma QUERY (consulta) obter informaes das tabelas Oracle. Esta recuperao feita com o comando SELECT. O resultado desta operao ser sempre uma tabela consistindo das linhas e colunas selecionadas. Num comando SELECT deve ser, obrigatoriamente, especificado: que dados devem ser trazidos, isto , que informaes devem ser obtidas como resultado da execuo do comando. de que tabela estes dados sero obtidos.

Opcionalmente, pode-se especificar: as condies que devem ser satisfeitas para a obteno destes dados

A forma bsica do comando SELECT : SELECT <informaes que se deseja obter> FROM <tabelas/views/sinnimos onde se encontram as informaes> WHERE <condies que devem ser satisfeitas, se houverem>

CAPTULO 1: INTRODUO - 19

INTRODUO AO ORACLE9I - SQL As informaes que se deseja obter podem ser compostas de nomes de colunas, funes ou expresses aritmticas. SQL> SELECT cd_mat, nm_func 2 FROM func; CD_MAT ---------10 20 30 ... NM_FUNC -----------CRISTINA MIGUEL SANDRA

Este comando selecionar todos os empregados cadastrados na tabela FUNC.

A CLUSULA WHERE
A utilizao da clusula WHERE permite que efetuemos uma restrio sobre as linhas da tabela. SQL> SELECT cd_mat, nm_func 2 FROM func 3 WHERE cd_depto = 'D11'; CD_MAT ---------60 150 160 170 180 190 200 210 220 NM_FUNC -----------IRACY BRUNO ELIZABET GABRIEL MARIA JAIRO DAVI WILIAM JOANA

9 linhas selecionadas. Somente os empregados do departamento D11 sero selecionados. Observe que as colunas so apresentadas na mesma ordem em que foram especificadas na clusula SELECT.

CAPTULO 1: INTRODUO - 20

INTRODUO AO ORACLE9I - SQL

APRESENTANDO O RESULTADO
Para a montagem do resultado, o SQL*Plus tem a necessidade de determinar o tamanho de cada coluna para que possa definir o layout de apresentao; desta forma, existem alguns padres de layout de acordo com o tipo de coluna. Data o tamanho determinado pela mscara de edio default em uso na sesso (obtida pela NLS do banco de dados ou da estao) ou pela mscara de edio especfica modificada pelo uso da funo To_Char. Em ambos os casos, o alinhamento pela esquerda. Alfanumricas o tamanho da coluna determinado por sua definio na tabela do banco de dados (Char, Nchar, Varchar2, Varchar ou Nvarchar2) e o alinhamento pela esquerda. Long, Clob ou Nclob a largura determinada pelas variveis de sistema Longchunksize ou Long, o que for menor. Numricas o tamanho determinado pelo cabealho da coluna, sendo que seu tamanho mnimo dado pela varivel de sistema NumWidth (do SQL*Plus). O alinhamento pela direita. OBS: Todos estes padres podem ser modificados com o uso do comando Column do SQL*Plus.

O SMBOLO *
Para que obtenhamos todas as colunas de uma tabela ou VIEW, devemos substituir os nomes das colunas no comando SELECT pelo caracter *. SQL> SELECT * 2 FROM func 3 WHERE cd_depto = 'E01';
CD_MAT NM_FUNC NM_SOBRENOME CD_ NR_RAMAL DT_ADM NR_CARGO NR_GIT I DT_NASC VL_SAL NM_FOTO ------ ------- ------------ --- -------- -------- -------- ------ - -------- ------ -------------------50 JOAO GOMES E01 6789 17/08/89 58 16 M 15/09/55 4017,5 c:\winnt\esteira.bmp

No exemplo so obtidas todas as colunas da tabela funcionrio, das linhas que satisfazem condio da clusula WHERE.

CAPTULO 1: INTRODUO - 21

INTRODUO AO ORACLE9I - SQL

AS CLUSULAS ALL E DISTINCT (OU UNIQUE)


possvel que vrias das linhas selecionadas sejam idnticas (isto todas as colunas correspondentes nas linhas selecionadas tenham valores idnticos). Para suprimir a apresentao de linhas idnticas, podemos usar a palavra-chave DISTINCT ou UNIQUE (sinnimo de UNIQUE). OBS: DISTINCT uma palavra-chave posicional que deve seguir a palavra SELECT. A alternativa para DISTINCT ALL, que o valor default. SQL> SELECT ALL cd_depto 2 FROM func 3 WHERE in_sexo = 'F'; CD_ --A00 C01 D11 D21 E11 C01 C01 D11 D11 D11 D21 D21 E11 E11 14 linhas selecionadas.

CAPTULO 1: INTRODUO - 22

INTRODUO AO ORACLE9I - SQL No exemplo a seguir sero eliminadas as linhas duplicadas que possuam nome e sobrenome idnticos entre si. Isto significa que sero obtidas vrias linhas, onde sexo seja feminino, mas que tenham valores diferentes para a coluna cd_depto. SQL> SELECT DISTINCT cd_depto 2 FROM func 3 WHERE in_sexo = 'F'; CD_ --A00 C01 D11 D21 E11

OBS.: No exemplo anterior, as constantes usadas na clusula WHERE so strings. Quando uma string especificada no comando SQL, ela deve estar entre plics ( ' ). Quando uma constante numrica for usada, ela deve ser especificada sem plics.

CAPTULO 1: INTRODUO - 23

INTRODUO AO ORACLE9I - SQL

AS PALAVRAS CHAVE AND E OR


Se desejamos colocar mais de uma condio num comando SELECT, estas condies podem ser combinadas pelo uso das palavras-chave AND ou OR. No exemplo a seguir, foram selecionados os empregados com cargo igual a 56 e pertencentes ao departamento D11, simultaneamente. SQL> SELECT cd_mat, nm_func, nm_sobrenome 2 FROM func 3 WHERE cd_depto = 'D11' AND nr_cargo no h linhas selecionadas

= 56;

A palavra-chave AND, far com que sejam selecionados os empregados que atendam a ambas as condies simultaneamente. A palavra-chave OR selecionar aqueles funcionrios onde pelo menos uma das condies seja satisfeita. SQL> SELECT cd_mat, nm_func, nm_sobrenome 2 FROM func 3 WHERE cd_depto = 'D11' OR nr_cargo = 56; CD_MAT ---------60 70 140 150 160 170 180 190 200 210 220 NM_FUNC -----------IRACY EVA HELENA BRUNO ELIZABET GABRIEL MARIA JAIRO DAVI WILIAM JOANA NM_SOBRENOME -----------SOUZA PEREIRA NOVAES AZEVEDO PINTO YVES SANTOS WILARES BARBOSA JONES LUZ

11 linhas selecionadas. No exemplo anterior, todos os empregados do departamento D11 ou todos os empregados com cargo igual a 56 foram selecionados.

CAPTULO 1: INTRODUO - 24

INTRODUO AO ORACLE9I - SQL

OPERADORES DE COMPARAO
A linguagem SQL permite os seguintes operadores de comparao: =, ^=, >, >=, <, <=, <>, != A utilizao de parnteses tambm vlida para alterar a precedncia de execuo das operaes. No exemplo abaixo, so selecionados empregados do departamento D11 ou D21 e que tenham cargo maior que 54 ou um grau de instruo acima de 15. SQL> SELECT cd_mat, nm_func, nm_sobrenome, cd_depto, nr_git 2 FROM func 3 WHERE ( cd_depto = 'D11' OR cd_depto = 'D21' ) 4 AND ( nr_cargo > 54 OR nr_git > 15 ) 5 / CD_MAT ---------60 70 150 160 170 180 190 200 210 220 240 260 270 NM_FUNC -----------IRACY EVA BRUNO ELIZABET GABRIEL MARIA JAIRO DAVI WILIAM JOANA SALVADOR SILVIA MARTA NM_SOBRENOME -----------SOUZA PEREIRA AZEVEDO PINTO YVES SANTOS WILARES BARBOSA JONES LUZ MEDEIROS JUVENTO PARENTE nr_cargo,

CD_ NR_CARGO NR_GIT --- ---------- ---------D11 55 16 D21 56 16 D11 55 16 D11 54 17 D11 54 16 D11 53 17 D11 53 16 D11 55 16 D11 52 17 D11 55 18 D21 55 17 D21 52 16 D21 55 15

13 linhas selecionadas. O operador NOT (^) pode ser usado para negar uma comparao (^=). SQL> 2 3 4 5 SELECT cd_mat, nm_func, nm_sobrenome, nr_cargo, cd_depto FROM func WHERE nr_cargo = 54 AND cd_depto ^= 'D11' / NM_FUNC -----------TEODORO ELINE DILSON NM_SOBRENOME NR_CARGO CD_ ------------ ---------- --SIQUEIRA 54 E21 SEVERO 54 E11 GONCALVES 54 E21

CD_MAT ---------100 280 340

CAPTULO 1: INTRODUO - 25

INTRODUO AO ORACLE9I - SQL A palavra-chave NOT pode ser usada na clusula WHERE como um operador booleano normal. A seguir sero vistas as mesmas restries anteriores, porm utilizando-se a palavra-chave NOT. SQL> 2 3 4 SELECT cd_mat, nm_func, nm_sobrenome, nr_cargo, cd_depto FROM func WHERE nr_cargo = 54 AND NOT cd_depto = 'D11'; NM_FUNC -----------TEODORO ELINE DILSON NM_SOBRENOME NR_CARGO CD_ ------------ ---------- --SIQUEIRA 54 E21 SEVERO 54 E11 GONCALVES 54 E21

CD_MAT ---------100 280 340

CAPTULO 1: INTRODUO - 26

INTRODUO AO ORACLE9I - SQL

OPERADORES ARITMTICOS E DE CONCATENAO


A linguagem SQL possui os seguintes operadores aritmticos: +, -, *, /, -(unrio) e +(unrio) e o operador de concatenao ||. Os operadores aritmticos e de concatenao podem ser usados em expresses dentro de um comando SELECT, tanto para modificar a informao selecionada quanto na clusula WHERE para estabelecer condies mais complexas. SQL> SELECT nm_func || nm_sobrenome, vl_sal * 1.1, 13800 / (2*2) 2 FROM func 3 WHERE vl_sal > 13800 / (2*2); NM_FUNC||NM_SOBRENOME VL_SAL*1.1 13800/(2*2) ------------------------ ---------- ----------CRISTINAHENDERSON 5802,5 3450 MIGUELTEIXEIRA 4537,5 3450 SANDRAKWAN 4207,5 3450 JOAOGOMES 4419,25 3450 EVAPEREIRA 3978,7 3450 VICENTELOURENCO 5115 3450 6 linhas selecionadas.

CAPTULO 1: INTRODUO - 27

INTRODUO AO ORACLE9I - SQL

PREDICADOS
Podem ser combinadas vrias condies na clusula WHERE. Cada uma destas condies chamada predicado. BETWEEN O predicado BETWEEN tem por objetivo a comparao de uma expresso num intervalo de valores. Ele pode ser usado em uma clusula WHERE junto com outras expresses. Pode ou no ser precedido por NOT. No exemplo a seguir sero selecionados todos os empregados que tenham nmero de matrcula entre 100 e 140 (inclusive). SQL> SELECT cd_mat, nm_func, nm_sobrenome, cd_depto 2 FROM func 3 WHERE cd_mat BETWEEN 100 AND 140 4 / CD_MAT ---------100 110 120 130 140 NM_FUNC -----------TEODORO VICENTE SILVIO DOLORES HELENA NM_SOBRENOME -----------SIQUEIRA LOURENCO OLIVA QUEIROZ NOVAES CD_ --E21 A00 A00 C01 C01

OBS.: Os empregados com nmero de matrcula 100 e 140 sero includos no resultado. IN O predicado IN torna possvel a comparao do contedo de um campo com uma lista de valores. O predicado satisfeito se o campo for igual a qualquer dos valores presentes na lista. Se NOT IN for especificado, o predicado ser satisfeito se o valor do campo for diferente de todos os valores na lista. SQL> SELECT cd_mat, nm_func, nm_sobrenome, nr_git 2 FROM func 3 WHERE nr_git IN (12, 15, 19, 20); CD_MAT ---------30 110 250 270 290 310 NM_FUNC -----------SANDRA VICENTE DANIEL MARTA JOAO MARINA NM_SOBRENOME NR_GIT ------------ ---------KWAN 20 LOURENCO 19 SANTANA 15 PARENTE 15 PONTES 12 SALGADO 12

6 linhas selecionadas.
CAPTULO 1: INTRODUO - 28

INTRODUO AO ORACLE9I - SQL LIKE O predicado LIKE permite que o usurio compare partes de uma string. No predicado LIKE (e exclusivamente nele), os caracteres % e _ (sublinhado) adquirem significado especial: o caracter % indica um nmero qualquer de caracteres; o caracter _ representa exatamente 1 (um) caracter.

NOT LIKE tambm pode ser usado. A seguir sero selecionados todos os empregados que tenham o sobrenome comeando com P e que trabalhem num departamento cujo primeiro caracter seja D e o terceiro seja 1. SQL> 2 3 4 SELECT cd_mat, nm_func, nm_sobrenome, cd_depto FROM func WHERE nm_sobrenome LIKE 'P%' AND cd_depto LIKE 'D_1'; NM_FUNC -----------EVA ELIZABET MARTA NM_SOBRENOME -----------PEREIRA PINTO PARENTE CD_ --D21 D11 D21

CD_MAT ---------70 160 270

Se no texto a ser pesquisado os caracteres especiais estiverem presentes e desejarmos encontr-los, devemos indicar que no contexto o caracter ter outro significado.

SQL> UPDATE FUNC 2 SET NM_FUNC = 'WI_SON' 3 WHERE NM_FUNC = 'WILSON'; 1 linha atualizada. SQL> SELECT nm_func FROM func 2 WHERE nm_func LIKE '%/_%' ESCAPE '/'; NM_FUNC -----------WI_SON

OBS: O caracter de escape definido pela clusula Escape e pode ser qualquer caracter exceto % e _ (underscore).

CAPTULO 1: INTRODUO - 29

INTRODUO AO ORACLE9I - SQL IS NULL A expresso NULL tem um significado especial para o ORACLE: indica ausncia de valor. Desta forma no pode ser usado em uma comparao. Toda comparao com NULL produz resultado FALSE uma vez que NULL no menor, no igual e no diferente de outros valores (incluindo outro valor NULL). O predicado IS NULL prov uma forma do usurio explicitamente procurar valores nulos numa tabela bsica, ou, se IS NOT NULL for usado, excluir valores nulos do resultado de uma consulta. No primeiro exemplo tentamos identificar as linhas em que o cdigo do gerente no estava preenchido utilizando um operador de comparao (como o resultado da comparao FALSE sempre, nenhuma linha foi selecionada). No segundo exemplo, todas as linhas em que a coluna cd_gerente no possui valor so selecionadas uma vez que utilizamos o predicado ISNULL. SQL> SELECT CD_DEPTO, NM_DEPTO, CD_GERENTE 2 FROM DEPTO 3 WHERE CD_GERENTE = NULL; no h linhas selecionadas SQL> SELECT CD_DEPTO, NM_DEPTO, CD_GERENTE 2 FROM DEPTO 3 WHERE CD_GERENTE IS NULL; CD_ NM_DEPTO CD_GERENTE --- ---------------------------------------- ---------D01 DIRETORIA DE SISTEMAS Os predicados discutidos anteriormente podem ser combinados em qualquer ordem na mesma clusula WHERE. A consulta abaixo ilustra a combinao dos predicados explicados. SQL> 2 3 4 5 6 7 8 SELECT nm_sobrenome, nr_cargo, nr_git, vl_sal, cd_depto FROM func WHERE (cd_depto = 'D11' OR cd_depto = 'E21') AND nr_git IN (12, 14, 16, 18) AND vl_sal BETWEEN 1500 AND 2370 AND (nm_sobrenome NOT LIKE 'P%' OR nm_sobrenome LIKE '%SON%') AND nr_cargo IS NOT NULL /

NM_SOBRENOME NR_CARGO NR_GIT VL_SAL CD_ ------------ ---------- ---------- ---------- --WILARES 53 16 2045 D11 MARQUES 52 16 1995 E21

CAPTULO 1: INTRODUO - 30

INTRODUO AO ORACLE9I - SQL

CONSULTANDO DADOS DE UMA TABELA PARTICIONADA


A tabela Hst_Promo uma tabela particionada. Isto quer dizer que a tabela est fisicamente subdividida em parties de acordo com o valor de uma ou mais colunas. No nosso caso, a tabela est particionada em relao coluna dt_promocao e foram estabelecidas quatro parties de nomes Anos80, Anos90_94, Anos95_99 e Anos2000. A consulta em uma tabela com estas caractersticas pode ser feita normalmente. De acordo com a sintaxe apresentada, o Oracle direcionar a consulta para uma ou mais parties. No exemplo abaixo a clusula Where faz referncia data da promoo, que justamente a coluna sobre a qual ocorre o particionamento, possvel que o banco de dados, atravs da descrio da tabela, perceba que s h necessidade de pesquisar a partio Anos90_94. SQL> SELECT CD_MAT, VL_SAL, CD_DEPTO, DT_PROMOCAO 2 FROM HST_PROMO 3 WHERE DT_PROMOCAO BETWEEN '01/01/91' AND '01/01/93'; CD_MAT VL_SAL CD_ DT_PROMO ---------- ---------- --- -------280 2625 E11 24/03/91 130 2380 C01 28/07/91 310 1590 E11 12/09/91 140 2842 C01 15/12/91 150 2528 D11 12/02/92 300 1775 E11 19/06/92 Se a pesquisa, por outro lado, no fornecer possibilidade de o Oracle restringir a busca a determinadas parties, todas sero pesquisadas. Utilizando uma sintaxe prpria do comando SELECT, podemos contornar esta situao (se desejarmos) limitando a busca a uma determinada partio, bastando que mencionemos a clusula Partition aps a clusula From. SQL> SELECT CD_MAT, VL_SAL, CD_DEPTO, DT_PROMOCAO 2 FROM HST_PROMO PARTITION (ANOS90_94) 3 WHERE CD_DEPTO = 'C01'; CD_MAT VL_SAL CD_ DT_PROMO ---------- ---------- --- -------130 2380 C01 28/07/91 140 2842 C01 15/12/91 O uso de tabelas particionadas pode ser muito til, justamente para dados histricos, que no precisam ser consultados todo o tempo e que, estando armazenados em reas (tablespaces) separadas das linhas mais freqentemente utilizadas da tabela, podem trazer significativo ganho na performance das aplicaes dirias.
CAPTULO 1: INTRODUO - 31

INTRODUO AO ORACLE9I - SQL

CONSTRUES BSICAS COM O COMANDO SELECT


Neste tpico apresentaremos alguns problemas similares queles que encontraremos no laboratrio deste captulo.

CONDIES COMBINADAS
Deseja-se uma lista de todas as funcionrias que tenham cargo superior a 55. A lista deve conter o nmero da matrcula, o primeiro e ltimo nome e o cargo. SQL> SELECT cd_mat, nm_sobrenome, nm_func, nr_cargo 2 FROM func 3 WHERE in_sexo = 'F' 4 AND nr_cargo > 55; CD_MAT ---------10 30 70 140 NM_SOBRENOME -----------HENDERSON KWAN PEREIRA NOVAES NM_FUNC NR_CARGO ------------ ---------CRISTINA 66 SANDRA 60 EVA 56 HELENA 56

LIKE
Deve ser produzida uma lista mostrando todos os projetos que tenham o texto PRO em algum lugar do seu nome. Para limitar a lista a projetos relevantes, somente cdigos de projetos comeando com as letras AD ou nmeros de projetos contendo 0 como ltimo caracter devem ser selecionados. Liste o cdigo do projeto e o nome do projeto. SQL> 2 3 4 SELECT cd_proj, nm_proj FROM proj WHERE nm_proj LIKE '%PRO%' AND (cd_proj LIKE 'AD%' OR cd_proj LIKE '%0'); NM_PROJ -----------------------------PROGRAMACAO PROGRAMACAO DE PAGAMENTO PROGRAMACAO DE PESSOAL SUPORTE PRODUCAO

CD_PRO -----MA2110 AD3111 AD3112 OP1000

CAPTULO 1: INTRODUO - 32

INTRODUO AO ORACLE9I - SQL

CONCATENAO E INTERVALO DE VALORES


Deseja-se uma lista de todas as funcionrias que trabalhem nos departamentos E01, E11 ou E21 e que tenham salrio entre 1000 e 3000. A lista deve conter o nmero da matrcula, o primeiro e ltimo nome concatenados, o departamento e o salrio. SQL> SELECT cd_mat, nm_func || nm_sobrenome nome, cd_depto, vl_sal 2 FROM func 3 WHERE cd_depto IN ('E01', 'E11', 'E21') 4 AND vl_sal between 1000 and 3000 5 AND in_sexo = 'F'; CD_MAT ---------90 280 310 NOME -----------------------ELIANEHONOFRE ELINESEVERO MARINASALGADO CD_ VL_SAL --- ---------E11 2975 E11 2625 E11 1590

OBS: nome corresponde ao alias (apelido) da expresso. O Sql*Plus recebe os dados desta coluna com a indicao de que seu nome NOME.

CAPTULO 1: INTRODUO - 33

INTRODUO AO ORACLE9I - SQL

CONSTANTES
Uma constante um conjunto de caracteres fixos (numricos ou string) que podem ser includos numa lista de um SELECT assim como um nome de coluna. Quando uma constante especificada a tabela resultado conter uma coluna com valor constante. Deseja-se uma simulao para aumento dos funcionrios considerando aumentos de 10% e 15% para todos os funcionrios senior e gerentes da empresa. A lista deve conter a matrcula, o salrio atual, as simulaes e o departamento relativo ao funcionrio. SQL> SELECT cd_depto, cd_mat, vl_sal Atual, 2 vl_sal * 1.1 "10%", vl_sal * 1.15 "15%", 3 1 "numrica", 4 'teste' "alfa" 5 FROM func 6 WHERE nr_cargo > 56; CD_ CD_MAT ATUAL 10% 15% numrica alfa --- ---------- ---------- ---------- ---------- ---------- ----A00 10 5275 5802,5 6066,25 1 teste B01 20 4125 4537,5 4743,75 1 teste C01 30 3825 4207,5 4398,75 1 teste E01 50 4017,5 4419,25 4620,125 1 teste A00 110 4650 5115 5347,5 1 teste A00 120 2925 3217,5 3363,75 1 teste 6 linhas selecionadas.

Neste exemplo utilizamos duas constantes: uma numrica (1) e outra alfanumrica (teste). As constantes podem ser usadas para completar informaes (muito utilizada em unies), clculos, indicaes, etc. Os apelidos utilizados (10% por exemplo) esto entre aspas porque possuem caracteres especiais.

CAPTULO 1: INTRODUO - 34

INTRODUO AO ORACLE9I - SQL

LABORATRIO 1
1. Mostre a descrio da tabela DEPTO. 2. Mostre o nome e o ramal de cada funcionrio. 3. Mostre os departamentos em que existem funcionrios. No repita o cdigo do departamento no resultado. 4. Qual o nome do funcionrio cuja matrcula 230 ? 5. Mostre o sobrenome, nome e departamento de todos os funcionrios que no trabalhem no departamento D11. 6. Mostre o ltimo nome e salrio de todos os empregados que recebam entre R$2500,00 e R$5000,00 (inclusive). 7. Apresente o nome e telefone de todos os funcionrios que trabalhem nos departamentos A00, D11, D21 e E11. 8. Mostre o nome e sobrenome de todos os funcionrios que tenham o sobrenome com 5 letras e que a terceira seja M e que sejam do sexo feminino. A listagem deve apresentar nome, data de nascimento e sexo. 9. Deseja-se uma lista contendo cdigo do departamento e nome do departamento de todos os departamentos em que o cdigo do departamento contbil no est preenchido. OPCIONAIS 10. Crie uma query para mostrar o nome, matrcula e salrio de todos os funcionrios que trabalhem no departamento D11. Salve a query com o nome de Lab.sql. 11. Execute a query Lab.sql. 12. Recupere a query no SQL buffer. Nomeie as colunas CD_MAT de "Matricula", NM_FUNC de "Nome" e VL_SAL de "Salario". Re-execute a query. 13. Produza uma listagem de todos os funcionrios do departamento X. O cdigo do departamento ser informado como parmetro a tempo de execuo. Deseja-se o nome do funcionrio e o cdigo do departamento que ele trabalha. 14. Deseja-se saber quais os funcionrios (matrcula, cargo e departamento) que foram cadastrados na partio Anos95_99 da tabela de histrico de promoes.

CAPTULO 1: INTRODUO - 35

INTRODUO AO ORACLE9I - SQL

CAPTULO 2: ATUALIZANDO E ORDENANDO


Neste captulo estudaremos, utilizando exemplos, a primeira forma sinttica dos comandos de atualizao do banco de dados.

INCLUSO
O primeiro comando que estudaremos ser o comando Insert.

A incluso pode ser feita linha a linha ou os valores podem ser obtidos de outra(s) tabela(s) do banco de dados de tal forma, que a incluso de diversas linhas pode ser feita com um nico comando Insert. Podemos tambm determinar que os valores sejam cadastrados em uma partio especfica de uma tabela particionada.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 36

INTRODUO AO ORACLE9I - SQL

INCLUSO DE UMA NICA ROW


O departamento D21 admitiu dois novos empregados. Esses novos empregados no comearam a trabalhar ainda, ento, os nmeros de telefone e cargos ainda no so conhecidos. Faremos a incluso apenas dos dados disponveis para estes novos empregados, deixando os dados no conhecidos como NULL. Depois da operao de INSERT, listaremos todos os funcionrios do departamento D21 que estejam sem cargo. SQL> 2 3 4 INSERT INTO func (cd_mat, nm_sobrenome, nm_func, vl_sal, cd_depto) VALUES (272, 'Pereira', 'Laura', 1838, 'D21');

1 linha criada. SQL> INSERT INTO func 2 VALUES 3 (274, 'Elizabet', 'Jorio', 'D21', NULL, SYSDATE, 4 NULL, NULL, 'F', '14/01/73', 1874, NULL); 1 linha criada. SQL> 2 3 4 SELECT cd_mat, nm_sobrenome, nm_func, nr_ramal, nr_cargo, vl_sal, cd_depto FROM func WHERE nr_cargo IS NULL; NM_SOBRENOME -----------Pereira Jorio NM_FUNC NR_RAMAL NR_CARGO VL_SAL CD_ ------------ ---------- ---------- ---------- --Laura 1838 D21 Elizabet 1874 D21

CD_MAT ---------272 274

CAPTULO 2: ATUALIZANDO E ORDENANDO - 37

INTRODUO AO ORACLE9I - SQL

INCLUSO EM TABELAS PARTICIONADAS


Suponhamos, agora, que nossa funcionria Laura tenha sido promovida. Neste caso, devemos incluir uma nova linha na tabela HST_PROMO indicando a razo da mudana e o novo salrio da funcionria. Esta operao poder ser feita com o uso de sintaxes diferentes. Vejamos cada uma delas: SEM USAR PARTITION Neste primeiro exemplo, faremos a incluso de dados sem mencionar em que partio a incluso deve ser realizada. Uma vez que a coluna dt_promocao de preenchimento obrigatrio, ser em funo dela que o Oracle descobrir em que partio deve realizar a incluso. SQL> 2 3 4 INSERT INTO HST_PROMO (DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO) VALUES ('01/01/02', 272, 2500, 'D11', 55, 'Promoo');

1 linha criada. SQL> SELECT * 2 FROM HST_PROMO PARTITION (ANOS2000) 3 WHERE CD_MAT = 272; DT_PROMO CD_MAT VL_SAL CD_ NR_CARGO TX_MOTIVO -------- ---------- ---------- --- ---------- -------------------01/01/02 272 2500 D11 55 Promoo

O comando Select acima j menciona o nome da partio. Sendo assim, a consulta se restringe partio mencionada. OBS: No momento da criao da tabela foi especificado que a coluna dt_promoo seria a coluna atravs da qual o particionamento da tabela seria realizado. Desta forma, o Oracle pode determinar qual a partio mais adequada para a incluso da nova linha.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 38

INTRODUO AO ORACLE9I - SQL USANDO PARTITION Neste exemplo, tentamos incluir linhas na partio Anos95_99, quando, na verdade, a data da promoo era de 2002. Observamos que o Oracle, apesar de informarmos o nome da partio, faz a verificao e impede que faamos a incluso na partio incorreta, garantindo a integridade lgica da informao armazenada. SQL> INSERT INTO HST_PROMO PARTITION (ANOS95_99) 2 (DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO) 3 VALUES 4 ('01/01/02', 274, 1950, 'D11', 55, 'Promoo'); INSERT INTO HST_PROMO PARTITION (ANOS95_99) * ERRO na linha 1: ORA-14401: chave inserida da partio est fora da partio especificada SQL> 2 3 4 INSERT INTO HST_PROMO PARTITION (ANOS2000) (DT_PROMOCAO, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, TX_MOTIVO) VALUES ('01/01/02', 274, 1950, 'D11', 55, 'Promoo');

1 linha criada. Ao consultarmos as informaes armazenadas obteremos as duas linhas includas. SQL> SELECT * 2 FROM HST_PROMO PARTITION (ANOS2000) 3 WHERE CD_MAT in (272, 274); DT_PROMO CD_MAT VL_SAL CD_ NR_CARGO TX_MOTIVO -------- ---------- ---------- --- ---------- ----------01/01/02 272 2500 D11 55 Promoo 01/01/02 274 1950 D11 55 Promoo

CAPTULO 2: ATUALIZANDO E ORDENANDO - 39

INTRODUO AO ORACLE9I - SQL

INCLUSO DE DIVERSAS LINHAS


At este momento observamos a incluso de linhas processadas uma a uma, com valores diferenciados em cada uma delas. Neste exemplo utilizaremos uma sintaxe do comando SELECT que permitir que a incluso em uma tabela se processe a partir de dados existentes em uma ou vrias das demais tabelas do ambiente.

SQL> INSERT INTO FUNC 2 (CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO) 3 SELECT CD_MAT + CD_MAT / 20, NM_SOBRENOME, NM_FUNC, 4 'D01', IN_SEXO 5 FROM FUNC 6 WHERE CD_DEPTO = 'E21'; 4 linhas criadas.

No exemplo acima, o comando Insert foi utilizado para efetuar a incluso de diversas linhas simultaneamente. As linhas foram obtidas da prpria tabela Func para efeito de teste. O novo cdigo da matrcula foi derivado do valor antigo, porm foi obrigatria sua modificao, pois cd_mat primary key da tabela Func. Isto significa que o Oracle no admitir duas linhas com o mesmo valor de matrcula.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 40

INTRODUO AO ORACLE9I - SQL

REGRAS DE INTEGRIDADE
Quando iniciamos nosso estudo dissemos que um banco de dados relacional deveria ser capaz de garantir as regras estabelecidas por um modelo relacional de dados, reconhecendo conceitos como primary key (PK), foreign key (FK), etc. Nos exemplos a seguir verificaremos esta capacidade no Oracle. SQL> INSERT INTO FUNC 2 (CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO) 3 VALUES 4 (100, 'Teste', 'Duplicidade', 'A00', 'M'); INSERT INTO FUNC * ERRO na linha 1: ORA-00001: restrio exclusiva (ALUNO.SYS_C002719) violada

Neste primeiro comando, tentamos incluir uma matrcula previamente j cadastrada, o que causou a mensagem de erro ORA-00001: restrio exclusiva (ALUNO.SYS_C002719) violada, onde nos mostrada qual a regra de integridade que foi violada. SYS_C002719 o nome da restrio de primary key da tabela Func. SQL> INSERT INTO FUNC 2 (CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO) 3 VALUES 4 (101, 'Teste', 'Estrangeira', 'XXX', 'M'); INSERT INTO FUNC * ERRO na linha 1: ORA-02291: restrio de integridade (ALUNO.SYS_C002720) violada chave-pai no localizada Neste segundo comando, fizemos a tentativa de incluir uma linha com matrcula vlida, porm contendo um cdigo de departamento que no existe na tabela Depto. Neste caso, a mensagem de erro ORA-02291: restrio de integridade (ALUNO.SYS_C002720) violada - chave-pai no localizada, nos informa novamente qual a regra de integridade, neste caso referencial, foi violada (SYS_C002720). Todas estas regras podem ser definidas pelo DBA no momento da criao da tabela. Quando estabelecidas no banco de dados garantem que, independente do modo como o usurio faa a incluso ou alterao dos dados (SQL*Plus, Forms Builder, Reports Builder, PL/SQL, etc.), sua validao ser feita pelo banco de dados e nenhuma tentativa de violao ser aceita.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 41

INTRODUO AO ORACLE9I - SQL

UPDATE
O comando Update tem a finalidade de alterar informaes j gravadas na base de dados. Diferentemente do comando Insert, o comando Update possui uma clusula Where, a qual determinar que linhas sero modificadas. Para encontrar estas linhas, o Oracle faz um Select implcito no banco de dados, uma pesquisa para determinar que linhas atendem clusula Where presente no comando. OBS: Caso no seja informada nenhuma clusula Where, todas as linhas sero modificadas.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 42

INTRODUO AO ORACLE9I - SQL

ATUALIZAO DE DIVERSAS LINHAS


Os funcionrios contratados j comearam a trabalhar e, portanto, j possuem informao relativa a ramal e cargo. Neste exemplo faremos a atualizao de seus dados na tabela de funcionrios. SQL> UPDATE FUNC 2 SET NR_RAMAL = 4176, NR_CARGO = DEFAULT 3 WHERE CD_MAT IN (272, 274); 2 linhas atualizadas. OBS: A palavra DEFAULT atribuda coluna NR_GIT indica que o valor da coluna ser obtido da definio (DEFAULT) dada pelo DBA quando criou a tabela. Se esta coluna no possuir um valor default definido, lhe ser atribudo NULL.

SEM WHERE Suponhamos que desejssemos alterar o salrio de todos os funcionrios em 10%. O comando Update poderia ser utilizado de forma que o novo salrio fosse igual ao anterior mais 10%. Para que todos os funcionrios fossem atualizados, bastaria que omitssemos a clusula Where. SQL> UPDATE FUNC 2 SET VL_SAL = VL_SAL * 1.10; 38 linhas atualizadas.

OBS: Observe que o Oracle no produz erro quando omitimos a clusula WHERE em um comando UPDATE (ela opcional), portanto, a ausncia desta clusula faz com que todas as linhas sejam atualizadas.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 43

INTRODUO AO ORACLE9I - SQL

ATUALIZAO A PARTIR DE DADOS DE OBTIDOS DO BANCO DE DADOS


Suponhamos, agora, que desejemos atualizar o salrio e cargo dos funcionrios com cargo 58 para que ganhem 90% do salrio da gerente Cristina Henderson (matrcula 10) e o mesmo cargo. Para realizarmos esta atualizao, precisaremos consultar os dados para obter o salrio e cargo do gerente, calcular 90% do salrio e, ento, fazer a atribuio aos funcionrios com cargo 58. SQL> UPDATE FUNC 2 SET (VL_SAL, NR_CARGO) = (SELECT VL_SAL * .9, NR_CARGO 3 FROM FUNC 4 WHERE CD_MAT = 10) 5 WHERE NR_CARGO = 58; 3 linhas atualizadas.

Todas as operaes foram feitas em um nico comando Update. Sua sintaxe permite que na clusula de atribuio faamos uma busca para obteno do valor a ser atribudo. Observe que o Select interno possui uma clusula Where que determina os valores a serem obtidos e o comando Update tambm possui uma clusula Where para determinar quais linhas sero atualizadas. SQL> UPDATE FUNC 2 SET (VL_SAL, NR_CARGO) = (SELECT VL_SAL * .9, NR_CARGO 3 FROM FUNC 4 WHERE CD_MAT >= 10) 5 WHERE NR_CARGO = 58; SET (VL_SAL, NR_CARGO) = (SELECT VL_SAL * .9, NR_CARGO * ERRO na linha 2: ORA-01427: a subconsulta de uma nica linha retorna mais de uma linha Este exemplo similar ao anterior, porm, como a clusula WHERE do Select interno retorna mais de uma linha, o Oracle produz um erro indicando que a subquery s pode retornar uma linha para ser usada como atribuio nas colunas a serem atualizadas.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 44

INTRODUO AO ORACLE9I - SQL

ATUALIZAO EM TABELAS PARTICIONADAS


Da mesma forma que na incluso, a atualizao em tabelas particionadas leva o Oracle a determinar em que partio (ou parties) a atualizao ser realizada. Se no mencionarmos a partio, todas as parties sero consultadas para verificao da condio de seleo. SQL> UPDATE HST_PROMO 2 SET TX_MOTIVO = 'Informao inicial do funcionrio' 3 WHERE TX_MOTIVO = 'ADMISSO'; 32 linhas atualizadas.

Quando mencionamos a partio, a restrio presente na clusula Where somente ser verificada para esta partio. SQL> UPDATE HST_PROMO PARTITION(ANOS2000) 2 SET TX_MOTIVO = 'Alterao de salrio devido a prmoo' 3 WHERE TX_MOTIVO = 'Promoo'; 2 linhas atualizadas.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 45

INTRODUO AO ORACLE9I - SQL

DELETE
Nossa prxima etapa o estudo do comando DELETE. Ele ser o responsvel por excluir linhas cadastradas no banco de dados.

Da mesma forma que o comando Update, a clusula Where ser a responsvel por determinar que linhas podero ser removidas. Caso esta clusula no seja informada, o comando tentar remover todas as linhas da tabela informada.

EXCLUSO DE LINHAS
A funcionria, recentemente contratada, Elizabeth Jorio decidiu aceitar um emprego em outra empresa. Teremos, portanto, que excluir seus dados da tabela de funcionrios. SQL> DELETE FROM func 2 WHERE nm_sobrenome = 'Jorio' 3 AND nm_func = 'Elizabet'; 1 linha deletada. Na clusula Where utilizamos a pesquisa pelo nome Elizabet, que foi escrito exatamente igual forma como estava armazenado. A sintaxe dos comandos de SQL pode ser escrita em letras maisculas ou minsculas, conforme nosso desejo, uma vez que os comandos no so sensveis utilizao de maisculas ou minsculas. J o contedo de uma coluna depende da forma como a informao foi armazenada. Em uma pesquisa posterior, devemos igualar a coluna a um valor constante escrito exatamente da mesma forma que foi armazenado. Caso contrrio, no encontraremos a linha na base de dados.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 46

INTRODUO AO ORACLE9I - SQL

INTEGRIDADE REFERENCIAL
No comando a seguir, no conseguimos remover o gerente do departamento D11 porque existe um relacionamento (veja o modelo de dados) entre a tabela de Departamentos e a tabela de Funcionrios, onde o cdigo do gerente (que corresponde matrcula do funcionrio) se encontra presente na tabela de Departamentos. Neste caso, o Oracle somente permitir a remoo do funcionrio se, primeiro, tirarmos sua referncia da tabela de Departamentos. SQL> DELETE FROM FUNC WHERE CD_MAT = 60; DELETE FROM FUNC WHERE CD_MAT = 60 * ERRO na linha 1: ORA-02292: restrio de integridade (ALUNO.SYS_C002727) violada registro filho localizado

EXCLUSO EM TABELAS PARTICIONADAS


A sintaxe para utilizao do comando DELETE em uma tabela particionada no traz novidades. Faremos um primeiro teste sem mencionar a partio e, posteriormente, mencionando o nome da partio desejada. SQL> DELETE FROM HST_PROMO 2 WHERE TX_MOTIVO LIKE '%gerencial%'; 8 linhas deletadas. SQL> DELETE FROM HST_PROMO PARTITION (ANOS2000) 2 WHERE TX_MOTIVO LIKE '%promoo%'; 2 linhas deletadas. Quando indicamos o nome da partio, estamos restringindo a pesquisa a esta partio, tornando a execuo do comando mais eficiente. Quando isto no ocorre, todas as parties so pesquisadas.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 47

INTRODUO AO ORACLE9I - SQL

RETORNANDO INFORMAES APS ATUALIZAO


Os comandos de atualizao INSERT, UPDATE e DELETE possuem (em sua sintaxe) uma clusula que permitir que retornemos informaes do banco de dados aps sua execuo.

INSERT E RETURNING
No caso do INSERT esta clusula permite que obtenhamos alguma informao da linha que est sendo includa. SQL> SQL> SQL> 2 3 4 5 VARIABLE MAT NUMBER VARIABLE NOME VARCHAR2(20) INSERT INTO FUNC (CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, IN_SEXO) VALUES (101, 'Teste', 'Returning', 'A00', 'M') RETURNING CD_MAT, NM_FUNC INTO :MAT, :NOME;

1 linha criada. SQL> PRINT MAT NOME MAT ---------101 NOME -------------------------------Teste

OBS: Os comandos VARIABLE e PRINT so comandos de SQL*PLUS e sero vistos mais adiante neste material.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 48

INTRODUO AO ORACLE9I - SQL

UPDATE E RETURNING
Aps a execuo de um comando Update, a clusula RETURNING permitir que venhamos a obter informaes relativas linha atualizada. SQL> VARIABLE SALARIO NUMBER SQL> UPDATE FUNC 2 SET VL_SAL = (SELECT VL_SAL FROM FUNC 3 WHERE CD_MAT = 110) 4 WHERE CD_MAT = 230 5 RETURNING VL_SAL INTO :SALARIO; 1 linha atualizada. SQL> PRINT SALARIO SALARIO ---------5115

DELETE E RETURNING
Da mesma forma que para os demais comandos, aps uma operao de DELETE podemos obter informaes da linha excluda. SQL> VARIABLE MAT NUMBER SQL> DELETE FROM FUNC 2 WHERE NM_FUNC = 'Laura' 3 RETURNING CD_MAT INTO :MAT; 1 linha deletada. SQL> PRINT MAT MAT ---------272

CAPTULO 2: ATUALIZANDO E ORDENANDO - 49

INTRODUO AO ORACLE9I - SQL

ORDENANDO OS RESULTADO
O objetivo da clusula ORDER BY garantir que o resultado de uma consulta seja apresentado em uma ordem definida. Com ela, podemos especificar se desejamos ordenao ascendente ou descendente e em relao a que colunas (ou expresses). A sintaxe permite que seja informado um nome de coluna, alias, uma expresso, o nmero posicional da coluna ou at mesmo uma coluna que no tenha sido selecionada.

CONSULTA SIMPLES COM ORDENAO


Deseja-se produzir uma lista dos sobrenomes, salrios e departamentos. A lista deve conter somente empregados que recebam mais de 5.300,00 e deve ser ordenada por nmero de departamento em ordem ascendente (primria) e dentro de cada departamento, por salrio em ordem descendente (secundria). SQL> 2 3 4 CD_ --A00 A00 B01 D21 E01 SELECT cd_depto, nm_sobrenome, vl_sal FROM func WHERE vl_sal > 5300 ORDER BY cd_depto asc, 3 desc; NM_SOBRENOME VL_SAL ------------ ---------HENDERSON 6802,5 LOURENCO 6115 TEIXEIRA 5537,5 JANUARIO 6115 GOMES 5419,25

Atravs do uso da clusula ORDER BY, o usurio pode especificar como o resultado deve ser ordenado. A ordenao default ascendente (ASC), mas a ordenao descendente pode ser especificada (DESC). O usurio pode requisitar a ordenao de um ou mais itens (colunas ou expresses) numa clusula SELECT, especificando o nome da coluna, um nmero inteiro, referente um elemento na lista resultante ou o alias da coluna.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 50

INTRODUO AO ORACLE9I - SQL

ORDENANDO POR UMA COLUNA COM NULL


O que acontece quando ordenamos por uma coluna cujo contedo de alguma (ou algumas linhas) est ausente ? Observe o teste a seguir. SQL> SELECT CD_DEPTO, CD_GERENTE FROM DEPTO 2 ORDER BY 2 ASC; CD_ CD_GERENTE --- ---------A00 10 B01 20 C01 30 E01 50 D11 60 D21 70 E11 90 E21 100 D01 9 linhas selecionadas. Podemos observar que a linha em que o gerente no est definido aparece em ltimo lugar, ou seja, para ordenao ascendente NULL considerado maior valor. SQL> SELECT CD_DEPTO, CD_GERENTE FROM DEPTO 2 ORDER BY 2 NULLS FIRST; CD_ CD_GERENTE --- ---------D01 A00 10 B01 20 C01 30 E01 50 D11 60 D21 70 E11 90 E21 100 9 linhas selecionadas.

Neste exemplo usamos a clusula NULLS FIRST para que o posicionamento das linhas, com valores ausentes, seja anterior aos demais valores em ordenao. Podemos optar por NULLS LAST se desejarmos que estas linhas sejam apresentadas aps os demais valores.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 51

INTRODUO AO ORACLE9I - SQL

LABORATRIO 2:
1. Inclua-se como funcionrio. . Preencha todas as colunas da tabela. O nmero da matrcula deve corresponder ao nmero ao dia do seu aniversrio. 2. Complete, agora, as informaes. Sabendo-se que se novo ramal 1512 e a data de admisso 15/01/2003, necessrio que os dados na tabela Func sejam atualizados e que sejam includas as linhas correspondentes ao valor inicial dos funcionrios na tabela de histrico de promoes. 3. Aumente seu salrio e, simultaneamente, tente trocar o cdigo do departamento associado a voc para um cdigo de departamento invlido. O que acontece ? 4. Inclua todos os funcionrios do departamento D11 no departamento D01, acrescentando ao nmero da matrcula o valor 400. 5. Altere o ramal de todos os funcionrios do departamento D11 para 1437. 6. Exclua todos os funcionrios que ganhem mais que voc. 7. Exclua todas as linhas da partio Anos80. 8. Aumente o salrio de todos os funcionrios em 10%. Retorne o valor dos novos salrios. O que acontece ? OPCIONAIS 9. Produza um script para inserir uma linha na tabela funcionrio interativamente (preencha apenas matrcula, nome e departamento). 10. Execute o script do item anterior gerando 2 linhas na tabela. 11. Mostre em ordem alfabtica todos os funcionrios que contenham em seu primeiro nome a letra A. 12. Apresente em ordem decrescente de salrio os funcionrios de um departamento indicado como parmetro de substituio. Os funcionrios sem salrio devem ser apresentados no fim da relao.

CAPTULO 2: ATUALIZANDO E ORDENANDO - 52

INTRODUO AO ORACLE9I - SQL

CAPTULO 3: FUNES ESCALARES


Funes so programas que realizam determinadas aes, podem receber parmetros e retornam pelo menos um resultado. Dentre as funes pr-definidas pelo SQL do Oracle9i, o maior conjunto se refere s funes escalares. Estas funes se aplicam (s) coluna(s) de uma nica linha, desta forma produzindo um resultado por linha. Podemos subdividir este grupo de funes de acordo com o tipo de parmetro e resultado gerado, da seguinte forma: Numricas So aquelas que recebem parmetros numricos e geram resultados numricos. Podem ser subdivididas em Trigonomtricas e Numricas Simples. Alfanumricas Geram resultados alfanumricos. Recebem parmetros alfanumricos e (algumas) numricos. Alfanumricas retornando valores numricos Recebem parmetros alfanumricos e geram resultados numricos. Datas Geram resultados com o tipo DATE e realizam a manipulao de datas. Converso Realizam converso de tipo. Outras Miscelnea.

OBS: Para efeito de simplicidade usaremos, na exemplificao, sempre que possvel valores constantes e a tabela Dual (do dicionrio de dados do Oracle), pois possui apenas uma linha.

CAPTULO 3: FUNES ESCALARES - 53

INTRODUO AO ORACLE9I - SQL

NUMRICAS NUMRICAS SIMPLES


Recebem parmetros numricos e geram resultados numricos.

ABS
Retorna o valor absoluto do argumento <n>. SINTAXE: ABS(<n>) SQL> SELECT ABS(-10) 2 FROM DUAL; ABS(-10) ---------10

BITAND
Calcula uma operao de AND entre os bits dos dois argumentos. Os valores do argumento devem ser no negativos e inteiros. Esta funo no determina o tipo de seu resultado, portanto, pode ser necessrio que a utilizemos dentro de outra funo (TO_NUMBER, por exemplo) para garantir que o retorno ser numrico. SQL> SELECT BITAND(1,2), BITAND(5,2), BITAND(6,2) 2 FROM DUAL; BITAND(1,2) BITAND(5,2) BITAND(6,2) ----------- ----------- ----------0 0 2

Para entendermos o resultado da funo Bitand devemos nos lembrar da formao binria dos nmeros envolvidos: 1 = 0 * 2**2 + 0 * 2**1 + 1 * 2**0 5 = 1 * 2**2 + 0 * 2**1 + 1 * 2**0 2 = 0 * 2**2 + 1 * 2**1 + 0 * 2**0 6 = 1 * 2**2 + 1 * 2**1 + 0 * 2**0

Uma operao AND somente produzir resultado diferente de zero se ambos os bits correspondentes forem 1. Neste caso BITAND(1, 2) far um AND entre (001) e (010). Como no ocorre empate (de 1 e 1 na mesma posio correspondente), o resultado zero. Observe o resultado entre 6 (110) e 2(010). Esta funo pode ser interessante quando utilizada junto com DECODE.

CAPTULO 3: FUNES ESCALARES - 54

INTRODUO AO ORACLE9I - SQL

CEIL
Retorna o menor inteiro maior que ou igual a <n>. SINTAXE: CEIL(<n>) SQL> SELECT CEIL(7.3), CEIL (-7.3) 2 FROM DUAL; CEIL(7.3) CEIL(-7.3) ---------- ---------8 -7

EXP
Retorna e elevado n-sima potncia, onde e = 2.71828183.... SINTAXE: EXP(<n>)

FLOOR
Retorna o maior inteiro menor que ou igual a <n>. SINTAXE: FLOOR(<n>) SQL> SELECT FLOOR(-4.3), FLOOR(4.3) FROM DUAL; FLOOR(-4.3) FLOOR(4.3) ----------- ----------5 4

LN
Retorna o logaritmo natural do argumento, que deve ser maior que zero. SINTAXE: LN(<n>)

CAPTULO 3: FUNES ESCALARES - 55

INTRODUO AO ORACLE9I - SQL

LOG
Retorna o logaritmo de <n> na base <m>, sendo que a base <m> deve ser maior que 1 e <n> deve ser maior que zero. SINTAXE: LOG(<m>,<n>)

MOD
Retorna o resto da diviso de <m> por <n>. O valor resultante ser <m> se <n> for zero. SINTAXE: MOD(<m>,<n>)

POWER
Retorna <m> elevado a <n> potncia. Os argumentos <m> e <n> podem assumir qualquer valor, porm se <m> for negativo, <n> deve ser um inteiro. SINTAXE: POWER(<m>,<n>)

ROUND
Retorna <n> arredondado para <m> posies direita do ponto decimal. Se <m> for omitido, ser assumido 0(zero). <m> pode ser negativo para arredondar os dgitos a esquerda do ponto decimal. <m> deve ser um inteiro. SINTAXE: ROUND(<n>[,<m>]) SQL> SELECT ROUND(17.654, 2), ROUND(17.654), 2 ROUND(17.654, -1), ROUND(17.654, -2) 3 FROM DUAL; ROUND(17.654,2) ROUND(17.654) ROUND(17.654,-1) ROUND(17.654,-2) --------------- ------------- ---------------- ---------------17,65 18 20 0

CAPTULO 3: FUNES ESCALARES - 56

INTRODUO AO ORACLE9I - SQL

SIGN
Se <n> menor que 0, a funo retorna -1. Se <n> igual a 0, a funo retorna 0. Se <n> > 0, a funo retorna 1. SINTAXE: SIGN(<n>)

SQRT
Retorna a raiz quadrada de <n>. A funo retorna um resultado real. O argumento <n> deve ser positivo. SINTAXE: SQRT(<n>) SQL> SELECT SQRT(-3) FROM DUAL; SELECT SQRT(-3) FROM DUAL * ERRO na linha 1: ORA-01428: o argumento '-3' est fora da faixa vlida

TRUNC
Retorna <n> truncado para <m> posies decimais. Se <m> for omitido, ser assumido 0. <m> pode ser negativo para truncar <m> dgitos esquerda do ponto decimal. SINTAXE: TRUNC(<n>[,<m>]) SQL> SELECT TRUNC(175.894, 0), TRUNC(175.894, -2) 2 FROM DUAL; TRUNC(175.894,0) TRUNC(175.894,-2) ---------------- ----------------175 100

CAPTULO 3: FUNES ESCALARES - 57

INTRODUO AO ORACLE9I - SQL

WIDTH_BUCKET
Esta funo permite a construo de um histograma de intervalos de mesmo tamanho. Os parmetros <menor_valor> e <maior_valor> determinam o menor valor do histograma e o maior valor do histograma, que ser subdividido em tantos intervalos quanto determinarmos em <num_buckets> (deve ser uma constante inteira e positiva). Os intervalos so do tipo fechado-aberto, o que significa que o valor inferior de cada intervalo estar includo naquele grupo e o valor superior no. A <expresso> deve ser do tipo numrica ou datetime. SINTAXE: WIDTH_BUCKET (<n>, <menor_valor>, <maior_valor>, <num_buckets>) Se forem encontrados valores abaixo do <menor_valor>, o Oracle criar um Bucket 0 onde acomodar todos estes valores. Caso ocorra o oposto, ou seja, valores acima do <maior_valor> ser criado um Bucket <num_buckets> + 1 que acomodar todos os valores superiores. OBS: <n> corresponde a uma expresso. SQL> SELECT VL_SAL, WIDTH_BUCKET(VL_SAL, 1, 3300, 10) FAIXAS 2 FROM FUNC 3 WHERE VL_SAL <= 3300 4 ORDER BY 1; VL_SAL FAIXAS ---------- ---------2687,4 9 2749 9 2897,5 9 2952,5 9 3009,7 10 3109,8 10 3194,5 10 3249,5 10 8 linhas selecionadas.

CAPTULO 3: FUNES ESCALARES - 58

INTRODUO AO ORACLE9I - SQL

NUMRICAS - TRIGONOMTRICAS
ACOS
Retorna como resultado o arco do cosseno (<n>) informado. O parmetro <n> deve estar no intervalo de 1 a 1. O resultado ser fornecido em radianos e varia de 0 a (pi). SINTAXE: ACOS(<n>)

ASIN
Retorna como resultado o arco do seno (<n>) informado. O parmetro <n> deve estar no intervalo de 1 a 1. O resultado ser fornecido em radianos e varia de - /2 a /2 (pi / 2). SINTAXE: ASIN(<n>)

ATAN
Retorna como resultado o arco da tangente (<n>) informada. O resultado ser fornecido em radianos e varia de - /2 a /2 (pi / 2). SINTAXE: ATAN(<n>)

ATAN2
Retorna como resultado o arco da tangente (<n>/<m>) informada. O resultado ser fornecido em radianos e varia de - a (pi). SINTAXE: ATAN2(<n>, <m>) Observe que ATAN2(<n>, <m>) produz o mesmo resultado que ATAN(<n> / <m>) ATAN2

CAPTULO 3: FUNES ESCALARES - 59

INTRODUO AO ORACLE9I - SQL

COS
Retorna o cosseno do ngulo <n>, o qual deve ser expresso em radianos. SINTAXE: COS(<n>) Para transformarmos um ngulo (em graus) para radianos, devemos dividi-lo por 57.29578. SQL> SELECT COS(180/57.29578) FROM DUAL; COS(180/57.29578) -----------------1

COSH
Retorna o cosseno hiperblico do ngulo <n>, o qual deve ser expresso em radianos. SINTAXE: COSH(<n>) Para transformarmos um ngulo (em graus) para radianos, devemos dividi-lo por 57.29578.

SIN
Retorna o seno do ngulo <n>, o qual deve ser expresso em radianos. SINTAXE: SIN(<n>) Para transformarmos um ngulo (em graus) para radianos, devemos dividi-lo por 57.29578.

SINH
Retorna o seno hiperblico do ngulo <n>, o qual deve ser expresso em radianos. SINTAXE: SINH(<n>) Para transformarmos um ngulo, expresso em graus, para radianos, devemos dividi-lo por 57.29578.

CAPTULO 3: FUNES ESCALARES - 60

INTRODUO AO ORACLE9I - SQL

TAN
Retorna a tangente do ngulo <n>, o qual deve ser expresso em radianos. SINTAXE: TAN(<n>) Para transformarmos um ngulo, expresso em graus, para radianos, devemos dividi-lo por 57.29578.

TANH
Retorna a tangente hiperblica do ngulo <n>, o qual deve ser expresso em radianos. SINTAXE: TANH(<n>) Para transformarmos um ngulo, expresso em graus, para radianos, devemos dividi-lo por 57.29578.

CAPTULO 3: FUNES ESCALARES - 61

INTRODUO AO ORACLE9I - SQL

ALFANUMRICAS
Geram resultados alfanumricos. Recebem parmetros alfanumricos e (algumas) numricos.

CHR
Retorna o caracter correspondente ao valor de <n>. Esta transformao pode ser feita de acordo com o charset do banco de dados ou de acordo com o national charset. SINTAXE: CHR(<n> [USING NCHAR_CS]) Se a opo Using Nchar_Cs no for utilizada, a transformao de <valor> no caracter equivalente ser feita de acordo com o charset do banco de dados. Se a opo Using Nchar_Cs for utilizada, a transformao de <valor> no caracter equivalente ser feita de acordo com o national charset . OBS: O charset e o national charset so especificados no momento da criao do banco de dados e no podem ser modificados posteriormente. O charset determina o conjunto de valores vlidos para armazenamento. O national charset determina o conjunto de valores vlidos para colunas do tipo Nchar, Nvarchar, etc. SQL> SELECT CHR(65) FROM DUAL; C A Esta opo da funo pode ser muito til em situaes em que o ambiente cliente seja diferente do ambiente do banco de dados (ASCII x EBCDIC, SINGLE-BYTE x MULTI-BYTE, etc).

CONCAT
Retorna uma string resultante da concatenao de <str1> com <str2>. Este resultado equivalente ao uso do operador II (concatenao). SINTAXE: CONCAT(<str1>, <str2>)

INITCAP
Retorna <str> com a primeira letra de cada palavra em maiscula e as demais em minscula. SINTAXE: INITCAP(<str>)

CAPTULO 3: FUNES ESCALARES - 62

INTRODUO AO ORACLE9I - SQL

LOWER
Retorna<str>, com todas as letras minsculas. SINTAXE: LOWER(<str>)

LPAD
Retorna <str1> completado esquerda para o comprimento <n> com a seqncia de caracteres em <str2> (default branco). Se <str1> for maior que o comprimento de <n>, o resultado da operao ser uma string com comprimento <n>. SINTAXE: LPAD(<str1>,<n>[,<str2>]) SQL> SELECT LPAD('ABDE', 10, '*') 2 FROM DUAL; LPAD('ABDE ---------******ABDE

LTRIM
Retorna <str1> sem os caracteres <str2> encontrados esquerda. A busca interrompida quando for encontrado o primeiro caracter diferente de <str2> (default branco) . SINTAXE: LTRIM(<str1>[,<str2>]) SQL> SELECT LTRIM('***A*B*C*D*', '*') 2 FROM DUAL; LTRIM('* -------A*B*C*D* SQL> SELECT LTRIM ('AB*AB*AXYZ', '*BA') 2 FROM DUAL; LTR --XYZ

CAPTULO 3: FUNES ESCALARES - 63

INTRODUO AO ORACLE9I - SQL

NLS_INITCAP
Retorna <str1> com a primeira letra de cada palavra em letra maiscula e as demais em minsculas. O comando considera que as palavras esto separadas por brancos ou caracteres no alfanumricos. O segundo parmetro (<nlsparams>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um idioma ou BINARY. A seqncia de ordenao para determinadas lnguas tambm possui requerimentos especficos para colocao de maisculas. SINTAXE: NLS_INITCAP(<str1>[,<nlsparams>]) SQL> SELECT NLS_INITCAP('ijsland', 'NLS_SORT = XDutch') "Initcap" 2 FROM DUAL; Initcap ------IJsland

NLS_LOWER
Retorna <str1> com todas as letras em minsculas. O segundo parmetro (<nlsparams>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um idioma ou BINARY. A seqncia de ordenao para determinadas lnguas tambm possui requerimentos especficos para colocao de maisculas/minsculas. SINTAXE: NLS_LOWER(<str1>[,<nlsparams>])

NLS_UPPER
Retorna <str1> com todas as letras em maisculas. O segundo parmetro (<nlsparams>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um idioma ou BINARY. A seqncia de ordenao para determinadas lnguas tambm possui requerimentos especficos para colocao de maisculas. SINTAXE: NLS_UPPER(<str1>[,<nlsparams>])

CAPTULO 3: FUNES ESCALARES - 64

INTRODUO AO ORACLE9I - SQL

NLSSORT
Retorna a string de bytes usada para ordenar <texto>. SINTAXE: NLSSORT(<str1>[,<nlsparams>]) O segundo parmetro (<nlsparams>) s pode conter a sintaxe NLS_SORT = <sort>, onde <sort> pode ser um nome de idioma ou BINARY. Se omitirmos o segundo parmetro, esta funo usa a ordenao default em uso na sesso. Se especificarmos BINARY, ela retorna <str1>. SQL> SELECT NLSSORT('CHA') "DEFAULT", 2 NLSSORT('CHA', 'NLS_SORT = BINARY') 3 FROM DUAL;

"BINARY"

DEFAULT BINARY -------------------------------------------------- --------------1E37140001010100 43484100

REPLACE
Retorna <str1> com cada ocorrncia de <s1> substituda por <s2>. Se <s1> e <s2> no forem informados, a funo retornar NULL. SINTAXE: REPLACE(<str1>,<s1>[,<s2>]) SQL> SELECT REPLACE('**A**B**C**D**E', '**', 'M') 2 FROM DUAL; REPLACE('* ---------MAMBMCMDME

RPAD
Retorna <str1> completado direita para o comprimento <n> com a seqncia de caracteres em <str2> (default branco) SINTAXE: RPAD(<str1>,<n>[,<str2>])

CAPTULO 3: FUNES ESCALARES - 65

INTRODUO AO ORACLE9I - SQL

RTRIM
Retorna <str1> sem os caracteres <str2> finais direita. A busca interrompida quando for encontrado o primeiro caracter diferente de <str2> (default branco) SINTAXE: RTRIM(<str1>[,<str2>])

SOUNDEX
Retorna uma string que represente o som de <str>. A rotina retorna fonemas iguais para palavras que tenham o mesmo som em ingls. SINTAXE: SOUNDEX(<str>) SQL> SELECT SOUNDEX('SMYTHE'), SOUNDEX('SMITH'), SOUNDEX('Smith') 2 FROM DUAL; SOUN SOUN SOUN ---- ---- ---S530 S530 S530

SUBSTR
Retorna uma parte de <str1>, comeando no <pos> caracter com comprimento <tam>. Se <pos> tiver o comprimento zero, ser considerado 1. Se <pos> for positivo (> 0), o Oracle contar a partir do primeiro caracter (mais esquerda). Se <pos> for negativo (< 0), o Oracle contar a partir do final de <str1>. Se <tam> for omitido ser retornado da posio determinada at o final da string. Se <tam> for menor que 1, ser retornado NULL. SINTAXE: SUBSTR(<str1>,<pos>[,<tam>]) Se para os parmetros numricos forem fornecidos valores em ponto flutuante haver transformao com truncamento. SQL> SELECT SUBSTR('HELENA',2,3), SUBSTR('HELENA',-3) 2 FROM DUAL; SUB SUB --- --ELE ENA

CAPTULO 3: FUNES ESCALARES - 66

INTRODUO AO ORACLE9I - SQL

SUBSTRB
Esta funo executa a mesma operao da funo SUBSTR. A diferena que os parmetros <pos> e <tam> so fornecidos em bytes em vez de caracteres. Desta forma, em ambientes single-byte no existe diferena entre as duas funes. Em ambientes multi-byte o resultado diferente. SINTAXE: SUBSTRB(<str1>,<pos>[,<tam>])

SUBSTRC, SUBSTR2, SUBSTR4


Estas funes executam a mesma operao da funo SUBSTR. SINTAXE: SUBSTR<x>(<str1>,<pos>[,<tam>]) A diferena ocorre em funo do charset e da forma de tratamento do tamanho. SubstrC em Unicode complete characters. Substr2 em UCS2 codepoints. Substr4 em UCS4 codepoints.

Desta forma, a utilizao destas variaes da funo Substr est ligada forma de armazenamento das informaes no banco de dados (charset ou national charset ) ou ao ambiente do usurio.

CAPTULO 3: FUNES ESCALARES - 67

INTRODUO AO ORACLE9I - SQL

TRANSLATE
Retorna <str1>,substituindo todas as ocorrncias de <x> por <y>. O relacionamento entre os caracteres de <x> e <y> posicional. Caso <y> tenha cumprimento inferior a <x> os caracteres de <x> sem correspondncia sero omitidos do resultado. SINTAXE: TRANSLATE(<c>,<x>,<y>) SQL> SELECT TRANSLATE ('JOAO DA SILVA', 'ABCDEFGHI', '123456789') "Translate" 2 FROM DUAL; Translate ------------JO1O 41 S9LV1

TREAT
Esta funo altera o tipo declarado para a expresso. Uma vez que ela est ligada a definio de tipo no ser estudada neste curso.

TRIM
A funo TRIM retira caracteres iniciais (leading), finais(trailing) ou ambos de uma string de caracteres. SINTAXE: TRIM ( [ LEADING | TRAILING | BOTH ] [<char> FROM] <Trim_Source>) Se o conjunto de caracteres a serem pesquisados (<char>) ou o conjunto de caracteres onde a pesquisa ser feita (Trim_Source) forem literais, devero ser apresentados entre aspas simples. SQL> SELECT TRIM(0 FROM 00098765000) TRIM_NUM, 2 '*'||TRIM(' ABCDEFGHI JKLMNO 3 FROM DUAL; TRIM_ TRIM_ALFA ----- ------------------98765 *ABCDEFGHI JKLMNO*

')||'*' TRIM_ALFA

Nos exemplos acima usamos um conjunto de caracteres numricos do qual retiramos os zeros iniciais e finais e um conjunto de caracteres alfanumricos (literais) do qual retiramos os brancos iniciais e finais.

CAPTULO 3: FUNES ESCALARES - 68

INTRODUO AO ORACLE9I - SQL Se no especificarmos o <char>, o default branco. Se especificarmos LEADING, o Oracle remove qualquer caracter inicial (lado esquerdo) igual ao <char>. Se, por outro lado, especificarmos TRAILING, o Oracle remove qualquer caracter final (lado direito) igual ao <char>. Se especificarmos BOTH ou omitirmos as trs indicaes, o Oracle remove tanto os caracteres do lado esquerdo quanto os caracteres do lado direito que sejam iguais ao <char>. SQL> SELECT TRIM(TRAILING '@' FROM '@@@TESTE@@@') FROM DUAL; TRIM(TRA -------@@@TESTE SQL> SELECT TRIM(LEADING '@' FROM '@@@TESTE@@@') FROM DUAL; TRIM(LEA -------TESTE@@@ A funo retorna um VARCHAR2 com comprimento mximo igual ao de Trim_Source. Se Trim_Source ou <char> forem Null, o retorno da funo ser Null.

UPPER
Retorna <c> com todas as letras maisculas. SINTAXE: UPPER(<c>) SQL> SELECT UPPER ('Teste') "Upper" 2 FROM DUAL; Upper ----TESTE

CAPTULO 3: FUNES ESCALARES - 69

INTRODUO AO ORACLE9I - SQL

ALFANUMRICAS RETORNANDO VALORES NUMRICOS


Recebem parmetros alfanumricos e geram resultados numricos.

ASCII
Retorna a representao decimal no charset do banco de dados para o primeiro byte de <str1>. Se o charset do banco de dados for ASCII, esta funo retornar um valor ASCII. Se o banco de dados possuir um charset EBCDIC, esta funo retornar o valor EBCDIC correspondente. SINTAXE: ASCII (<str1>)

INSTR
Retorna a posio da <m>-sima ocorrncia de <str2> dentro de <str1>, comeando na posio <n>. Se <n> for negativo a pesquisa se dar no sentido inverso. SINTAXE: INSTR (<str1>,<str2>[,<n>[,<m>]]) SQL> SELECT INSTR('JOAO DA SILVA', 'A', 4, 1), 2 INSTR('JOAO DA SILVA', 'A', -4, 2) 3 FROM DUAL; INSTR('JOAODASILVA','A',4,1) INSTR('JOAODASILVA','A',-4,2) ---------------------------- ----------------------------7 3

INSTRB
Similar a INSTR, sendo que os valores de <n> e o resultado se referem a bytes, no lugar de caracteres. SINTAXE: INSTRB(<str1>,<str2>[,<n>[,<m>]])

INSTRC, INSTR2, INSTR4


Similar a Instr. A diferena ocorre em funo do charset e da forma de tratamento do tamanho. InstrC em Unicode complete characters. Instr2 em UCS2 codepoints. Instr4 em UCS4 codepoints.

Desta forma, a utilizao destas variaes da funo Instr est ligada forma de armazenamento das informaes no banco de dados (charset ou national charset) ou ao ambiente do usurio.

CAPTULO 3: FUNES ESCALARES - 70

INTRODUO AO ORACLE9I - SQL

LENGTH
Retorna o comprimento de <str> em caracteres. SINTAXE: LENGTH(<str>)

LENGTHB, LENGTHC, LENGTH2, LENGTH4


Similar funo Length. A diferena ocorre em funo do charset e da forma de tratamento do tamanho. LengthB a informao fornecida em bytes (em vez de caracteres). LengthC em Unicode complete characteres. Length2 em UCS2 codepoints. Length4 em UCS4 codepoints.

Desta forma, a utilizao destas variaes da funo Length est ligada forma de armazenamento das informaes no banco de dados (charset ou national charset) ou ao ambiente do usurio. SINTAXE: LENGTH<x>(<str>)

CAPTULO 3: FUNES ESCALARES - 71

INTRODUO AO ORACLE9I - SQL

DATAS
Realizam manipulao de datas.

SYSDATE
Retorna a data e hora correntes do banco de dados. O formato de apresentao depende do idioma e do territrio em uso na estao do usurio. No afetado pelas modificaes de zona de tempo da sesso do usurio. SINTAXE: SYSDATE SQL> ALTER SESSION SET NLS_TERRITORY = AMERICA; Sesso alterada. SQL> SELECT SYSDATE FROM DUAL; SYSDATE --------08-NOV-02 SQL> ALTER SESSION SET NLS_TERRITORY = BRAZIL; Sesso alterada. SQL> SELECT SYSDATE FROM DUAL; SYSDATE -------08/11/02

ADD_MONTHS
Retorna a data <d> adicionada de <n> meses. <n> deve ser um inteiro e pode ser negativo. Se o ms resultante da soma tiver menos dias que o dia calculado ou se o dia fornecido no parmetro <d> corresponder ao ltimo dia do ms, o dia resultante ser o ltimo dia do ms calculado. Caso contrrio ser exatamente o dia da data <d>. SINTAXE: ADD_MONTHS(<d>,<n>) SQL> SELECT ADD_MONTHS('21/04/97', -3), ADD_MONTHS('31/01/98', 1) 2 FROM DUAL; ADD_MONT ADD_MONT -------- -------21/01/97 28/02/98
CAPTULO 3: FUNES ESCALARES - 72

INTRODUO AO ORACLE9I - SQL

CURRENT_DATE
Retorna a data corrente na zona de tempo (meridiano) da sesso do usurio. Caso no venhamos a modificar caractersticas de meridiano, esta funo e a Sysdate sero similares. SINTAXE: CURRENT_DATE

SESSIONTIMEZONE
Apresenta o posicionamento em relao ao fuso horrio da sesso do usurio. Os fusos horrios so calculados em relao ao meridiano de Greenwich. SINTAXE: SESSIONTIMEZONE Se caminharmos para o lado esquerdo do Planisfrio estaremos subtraindo horas em relao hora oficial de Greenwich. Se caminharmos para a direita estaremos somando. SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS'; Sesso alterada. SQL> SELECT SESSIONTIMEZONE, CURRENT_DATE, SYSDATE FROM DUAL; SESSIONTIMEZONE CURRENT_DATE SYSDATE ---------------- ------------------- -------------------02:00 08/11/2002 08:52:04 08/11/2002 08:52:04 SQL> ALTER SESSION SET TIME_ZONE = '-6:00'; Sesso alterada. SQL> SELECT SESSIONTIMEZONE, CURRENT_DATE, SYSDATE FROM DUAL; SESSIONTIMEZONE CURRENT_DATE SYSDATE ---------------- ------------------- -------------------06:00 08/11/2002 04:52:20 08/11/2002 08:52:20 OBS: Sysdate no foi afetada pela modificao na zona de tempo da sesso do usurio.

CAPTULO 3: FUNES ESCALARES - 73

INTRODUO AO ORACLE9I - SQL

CURRENT_TIMESTAMP
Retorna a data corrente e hora na zona de tempo da sesso do usurio. Apresenta adicionalmente, a time zone da sesso do usurio. A preciso determina frao de segundos (o default 6, o limite 9). SINTAXE: CURRENT_TIMESTAMP [ ( <precision> ) ] A diferena entre esta funo e LocalTimestamp que apresentado o valor da zona de tempo enquanto que Localtimestamp no apresenta. SQL> SELECT CURRENT_TIMESTAMP, CURRENT_DATE FROM DUAL; CURRENT_TIMESTAMP CURRENT_DATE ----------------------------------------- ------------------08/11/02 04:54:12,000000 -06:00 08/11/2002 04:54:12

A diferena entre CURRENT_DATE e CURRENT_TIMESTAMP que o formato de apresentao de data para CURRENT_DATE depende da sesso, enquanto que CURRENT_TIMESTAMP no afetado pela modificao nesta formatao.

DBTIMEZONE
Retorna o valor da zona de tempo do banco de dados. O formato do retorno pode ser um offset ([ + | ] TZH:TZM) ou um nome de regio, de acordo com a especificao dada na criao do banco de dados. A tabela V$Timezone_Names contm uma lista das zonas de tempo por nome. SINTAXE: DBTIMEZONE SQL> SELECT DBTIMEZONE FROM DUAL; DBTIME ------05:00

CAPTULO 3: FUNES ESCALARES - 74

INTRODUO AO ORACLE9I - SQL

EXTRACT
Extrai uma determinada informao de tempo (por exemplo ano, mes, dia, segundo, etc) de um campo do tipo datetime ou interval. A tabela V$Timezone_Names contm uma lista das zonas de tempo por nome. SINTAXE:

SQL> SELECT EXTRACT(YEAR FROM SYSDATE) ANO, 2 EXTRACT(TIMEZONE_HOUR FROM CURRENT_TIMESTAMP) HORA 3 FROM DUAL; ANO HORA ---------- ---------2002 -6 SQL> SELECT EXTRACT(TIMEZONE_HOUR FROM CURRENT_DATE) HORA 2 FROM DUAL SELECT EXTRACT(TIMEZONE_HOUR FROM CURRENT_DATE) HORA * ERRO na linha 1: ORA-30076: campo de extrao invlido para origem de extrao OBS: a funo Extract pode ser usada em variveis (no caso usamos as funes SYSDATE e CURRENT_TIMESTAMP) no formato DATE ou TIMESTAMP. Para que possamos extrair valores como TIMEZONE_HOUR, o parmetro deve possuir especificao de zona de tempo caso contrrio receberemos erro.

CAPTULO 3: FUNES ESCALARES - 75

INTRODUO AO ORACLE9I - SQL

FROM_TZ
Converte um valor de timestamp sem zona de tempo para a um valor de timestamp com zona de tempo solicitada. O formato do parmetro <time_zone_value> deve ser um offset ([ + | - ] TZH:TZM). SINTAXE: FROM_TZ ( <timestamp>, <time_zone> ) OBS: No feita converso de hora, apenas anexada a especificao de zona de tempo ao timestamp fornecido como parmetro. O formato da data no parmetro obrigatrio. SQL> SELECT FROM_TZ(TIMESTAMP '2002-12-05 19:30:25', '+4:00') FROM_TZ 2 FROM DUAL; FROM_TZ --------------------------------------------------------------------05/12/02 19:30:25,000000000 +04:00 OBS: o resultado da funo FROM_TZ no fez nenhuma modificao na informao passada como parmetro, o que muda realmente o tipo de dado retornado, que passa a ser TIMESTAMP WITH TIME ZONE. O primeiro parmetro passado para a funo tem de ser, necessariamente, um timestamp. No exemplo usamos o formato TIMESTAMP <string>. A string deve estar no formato: yyyy-mm-dd hh24:mi:ss. Poderamos ter usado, alternativamente, um valor que j fosse um timestamp, por exemplo Localtimestamp. Receberemos erro se tentarmos outro tipo de valor, por exemplo uma data ou timestamp with time zone.

LOCALTIMESTAMP
Retorna a data e hora corrente na zona de tempo da sesso. SINTAXE: LOCALTIMESTAMP [ ( <precision> ) ] SQL> SELECT LOCALTIMESTAMP (8), CURRENT_TIMESTAMP 2 FROM DUAL; LOCALTIMESTAMP(8) CURRENT_TIMESTAMP --------------------------------- -------------------------------08/11/02 05:59:22,00000078 08/11/02 05:59:22,000001 -06:00 OBS: A diferena entre a funo Current_Timestamp e a funo Localtimestamp pode ser vista no exemplo. A funo Current_Timestamp do tipo timestamp with time zone, enquanto que Localtimestamp do tipo timestamp.
CAPTULO 3: FUNES ESCALARES - 76

INTRODUO AO ORACLE9I - SQL

LAST_DAY
Retorna a data do ltimo dia do ms de <d>. SINTAXE: LAST_DAY(<d>) SQL> SELECT LAST_DAY('21/04/1997') LAST_DAY 2 FROM DUAL; LAST_DAY ------------------30/04/1997 00:00:00

MONTHS_BETWEEN
Retorna o nmero de meses entre <d> e <e>. Se <d> e <e> diferem referncia aos mesmos dias de ms ou ao ltimo dia do ms, o resultado sempre inteiro. Caso contrrio o Oracle calcula a frao do resultado baseado em meses de 31 dias e considera a diferena de horas entre as datas. SINTAXE: MONTHS_BETWEEN(<d>, <e>) SQL> SELECT MONTHS_BETWEEN (LAST_DAY('21/04/1997'), 2 LAST_DAY('15/05/1998')) "Ultimo", 3 MONTHS_BETWEEN ('05/01/1999', 4 TO_DATE('05/12/2002', 'DD/MM/YYYY')) "Dia 5", 5 MONTHS_BETWEEN ('05/01/1999', 6 '06/02/1999') "Outro dia" 7 FROM DUAL; Ultimo Dia 5 Outro dia ---------- ---------- ----------13 -47 -1,0322581

CAPTULO 3: FUNES ESCALARES - 77

INTRODUO AO ORACLE9I - SQL

NEW_TIME
Retorna a data e hora no meridiano <b>, para a data e hora <d> no meridiano <a>. SINTAXE: NEW_TIME(<d>,<a>,<b>) ABREVIATURAS PARA MERIDIANOS

AST, ADT BST, BDT CST, CDT EST, EDT GMT HST, HDT MST, MDT NST PST, PDT YST, YDT

Atlantic standard ou Daylight Time Bering Standard ou Daylight Time Central Standard ou Daylight Time Eastern Standard ou Daylight Time Greenwich Alaska-Hawaii Standard Time ou Daylight Time Mountain Standard ou Daylight Time Newfoundland Standard Time Pacific Standard ou Daylight Time Youkon Standard ou Daylight Time.

SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS'; Sesso alterada. SQL> SELECT NEW_TIME(SYSDATE, 'AST', 'GMT') NEW_TIME, SYSDATE 2 FROM DUAL; NEW_TIME SYSDATE ------------------- ------------------08/11/2002 14:17:12 08/11/2002 10:17:12

CAPTULO 3: FUNES ESCALARES - 78

INTRODUO AO ORACLE9I - SQL

NEXT_DAY
Retorna a data do primeiro dia da semana nomeado por <dia semana> que seja posterior a <d>. A lngua em que o parmetro <dia semana> deve ser fornecido depende da linguagem em uso na sesso. SINTAXE: NEXT_DAY(<d>,<dia semana>) SQL> ALTER SESSION SET NLS_LANGUAGE = 'BRAZILIAN PORTUGUESE'; Sesso alterada. SQL> SELECT NEXT_DAY(SYSDATE, 'QUARTA-FEIRA') "Prximo dia" 2 FROM DUAL; Prximo dia ------------------13/11/2002 10:19:12

ROUND
Retorna <d> arredondado para o formato especificado. Caso <fmt> no seja informado, haver o arredondamento para o dia mais prximo (formato DD). SINTAXE: ROUND(<d> [,<fmt>]) SQL> SELECT ROUND(SYSDATE + 4, 'DY'), SYSDATE 2 FROM DUAL; ROUND(SYSDATE+4,'DY SYSDATE ------------------- ------------------10/11/2002 00:00:00 08/11/2002 10:20:44

SYS_EXTRACT_UTC
Extrai o UTC (Coordinated Universal Time, ou seja, Greenwich Mean Time) de um parmetro do tipo datetime with time zone, isto , determina a data e hora no meridiano de Greenwich. SINTAXE: SYS_EXTRACT_UTC (<datetime_with_timezone>)

CAPTULO 3: FUNES ESCALARES - 79

INTRODUO AO ORACLE9I - SQL

SYSTIMESTAMP
Retorna a data do sistema, incluindo fraes de segundo e a timezone do banco de dados. SINTAXE: SYSTIMESTAMP [ (<precision>) ]

TRUNC
Retorna uma data no formato especificado por <fmt>, representando <d> truncada na unidade correspondente. Caso <fmt> no seja informado, haver o truncamento para o dia mais prximo (formato DD). SINTAXE: TRUNC (<d> [ , <fmt> ] ) FORMATOS PARA ROUND E TRUNC Formato CC, SCC SYYYY, YYYY, YEAR, SYEAR, YYY, YY, Y IYYY, IYY, IY, I Q MONTH, MON, MM, RM WW IW W DDD, DD, J DAY, DY, D Descrio Duas primeiras posies do ano (yyyy) mais um. Ano (meio=01/07) Ano (ISO) Quarto de ano (arredondado a partir do dcimo sexto dia do segundo ms do trimestre). Ms (arredondado a partir do dcimo sexto dia). Mesmo dia da semana que o dia de incio do ano. Mesmo dia da semana que o dia de incio do ano ISO. Mesmo dia da semana que o dia de incio do ms. Dia (DEFAULT) Dia de incio da semana (Domingo para o territrio Brazil)

SQL> SELECT SYSDATE, TRUNC(SYSDATE, 'WW') "inicio ano", 2 TRUNC(SYSDATE, 'W') "inicio ms" 3 FROM DUAL; SYSDATE inicio ano inicio ms ------------------- ------------------- ------------------08/11/2002 10:33:20 05/11/2002 00:00:00 08/11/2002 00:00:00

CAPTULO 3: FUNES ESCALARES - 80

INTRODUO AO ORACLE9I - SQL

TZ_OFFSET
Retorna a time zone offset correspondente ao valor passado no parmetro, baseado na data que o comando executado. SINTAXE:

SQL> SELECT SYS_EXTRACT_UTC (CURRENT_TIMESTAMP) UTC_TTAMP, 2 SYSTIMESTAMP, 3 TZ_OFFSET ('-3:00') TZ_OFF, TZ_OFFSET(DBTIMEZONE) 4 FROM DUAL;
UTC_TTAMP SYSTIMESTAMP TZ_OFF TZ_OFFS ------------------------- --------------------------------- ------- ------08/11/02 12:40:29,000000 08/11/02 10:40:29,000000 -02:00 -03:00 -05:00

OBS: a funo Sys_Extract_Utc, recalcula o parmetro recebido, fornecendo o resultado no timestamp de Greenwich. O parmetro deve ser um timestamp com zona de tempo.

CAPTULO 3: FUNES ESCALARES - 81

INTRODUO AO ORACLE9I - SQL

CONVERSO
Convertem as informaes de um tipo para outro.

ASCIISTR
Recebe um argumento string em qualquer charset e retorna uma string ASCII no charset do banco de dados. SINTAXE: ASCIISTR (<c>) O valor retornado contm somente caracteres que vlidos em SQL e a contra-barra ( \ ).

BIN_TO_NUM
Converte um vetor de bits no seu nmero equivalente. SINTAXE: ASCIISTR (<e> [ , <e> [ , <e>.....] ] ) Cada argumento desta funo deve representar um bit (somente valores 0 1 e so permitidos) no vetor. SQL> SELECT ASCIISTR('AO') AO, ASCIISTR('MISSO') MISSO, 2 BIN_TO_NUM(1,1,0,0,1) BIN 3 FROM DUAL; AO MISSO BIN ------------ ---------- ---------A\00C7\00C3O MISS\00C3O 25

OBS: No exemplo acima o cedilha maisculo corresponde ao valor C7 (ou 199) e A com til corresponde ao valor C3 (195). A contra barra indica a presena de um valor em hexadecimal na seqncia. A string de bits informada na funo BIN_TO_NUM resultou no valor 25 (2**4 + 2**3 + 0**2 + 0**1 + 2**0).

CAST
Uma converso de tipo coleo para outro tipo coleo. Podemos converter uma coleo annima (o resultado de uma subquery) ou uma coleo identificada (um Varray ou uma Nested Table) em uma outra coleo que seja compatvel. Como esta funo trata de colees ela no ser estudada neste material.
CAPTULO 3: FUNES ESCALARES - 82

INTRODUO AO ORACLE9I - SQL

CHARTOROWID
Converte o valor de <c> para rowid. SINTAXE: CHARTOROWID(<c>) SQL> SELECT cd_mat, nm_func 2 FROM func 3 WHERE ROWID = CHARTOROWID('AAAH2LAAIAAAAAyAAc'); CD_MAT NM_FUNC ---------- -----------310 MARINA

COMPOSE
Recebe um argumento string em qualquer tipo de dados e retorna uma string Unicode em sua forma normalizada no mesmo charset da entrada. SINTAXE: COMPOSE (<c>) O parmetro de entrada poder estar no formato CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB ou NCLOB.

CONVERT
Converte uma string de caracteres de um charset para outro. O valor default para <source_charset> o prprio database charset. SINTAXE: CONVERT(<c>, <dest_charset> [,<source_charset>] ) SQL> SELECT CONVERT('Joo Aurlio', 'US7ASCII'), 2 COMPOSE('A'||UNISTR('\00C7\00C3') ||'O') COMPOSE 3 FROM dual; CONVERT('JO COMP ------------ ---Jo?o Aurelio AO

OBS: a funo UNISTR, que converte uma string em qualquer charset e a retorna em Unicode foi usada para converter os valores hexadecimais (indicado pela \ ) em e , respecticamente.

CAPTULO 3: FUNES ESCALARES - 83

INTRODUO AO ORACLE9I - SQL

DECOMPOSE
Recebe um argumento string em qualquer tipo de dados e retorna uma string Unicode aps decomposio cannica no mesmo charset da entrada. SINTAXE: DECOMPOSE (<c>) O parmetro de entrada poder estar no formato CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB ou NCLOB.

HEXTORAW
Converte uma string contendo texto hexadecimal para um valor raw. SINTAXE: HEXTORAW( <c> )

NUMTODSINTERVAL
Converte um numrico para o formato de armazenamento INTERVAL DAY TO SECOND. SINTAXE:

O primeiro parmetro deve ser numrico. O segundo parmetro pode ser uma string do tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 e deve corresponder a um dos seguintes valores: DAY, HOUR, MINUTE, SECOND (case sensitive). SQL> SELECT DECOMPOSE ('AO') DECOMPOSE, 2 CONVERT(',, , , ', 'us7ascii') CONVERT, 3 HEXTORAW('7D9A8B') HEXTORAW, 4 NUMTODSINTERVAL(17123, 'SECOND') NUMTODS 5 FROM DUAL; DECO CONVERT HEXTOR NUMTODS ---- ------------ ------ -------------------------------AO a,e, ?, ?, A 7D9A8B +000000000 04:45:23.000000000

CAPTULO 3: FUNES ESCALARES - 84

INTRODUO AO ORACLE9I - SQL

NUMTOYMINTERVAL
Converte um numrico para o formato de armazenamento INTERVAL YEAR TO MONTH. SINTAXE:

O primeiro parmetro deve ser numrico. O segundo parmetro pode ser uma string do tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 e deve corresponder a um dos seguintes valores: YEAR, MONTH (case sensitive).

RAWTOHEX, RAWTONHEX
Rawtohex converte <raw> para seu texto correspondente em hexadecimal e Rawtonhex converte para hexadecimal em NVARCHAR2. SINTAXE: HEXTORAW( <c> )

ROWIDTOCHAR, ROWIDTONCHAR
A funo RowidToChar converte valores de Rowid para caracteres. O tamanho da string resultante sempre de 18 caracteres. A funo RowidToNchar converte um valor de Rowid para NVARCHAR2 com comprimento de 18 caracteres. SINTAXE: ROWIDTOCHAR(<rowid>) SQL> SELECT ROWIDTOCHAR(rowid) 2 FROM dual; ROWIDTOCHAR(ROWID) -----------------AAAADdAABAAAANnAAA

ROWID corresponde ao endereo da linha. Esta pseudo coluna existe em cada tabela (exceto Index Tables) do ORACLE. O resultado possui sempre 18 caracteres de comprimento. Neste endereo existem informaes do data object number, bloco, linha e arquivo fsico. O pacote Dbms_Rowid pode ser usado para recuperarmos partes especficas da coluna.

CAPTULO 3: FUNES ESCALARES - 85

INTRODUO AO ORACLE9I - SQL

TO_CHAR CHARSET
Esta primeira forma sinttica da funo TO_CHAR s possui um parmetro. Seu objetivo converter valores NCHAR, NVARCHAR2, CLOB ou NCLOB para o charset do banco de dados. SINTAXE: TO_CHAR( <c> )

TO_CHAR - NUMRICO
A funo To_Char possui duas sintaxes, uma para efetuar a converso de datas para o formato caracter e outra para converter o formato numrico para caracter. Nesta primeira sintaxe veremos a converso de um valor numrico para o formato especificado. SINTAXE: TO_CHAR( <n> [,<fmt> [, <nlsparam>] ] ) onde <nlsparam> tem o formato : 'nls_numeric_characters = ''dg'' nls_currency = ''text'' nls_iso_currency = <territrio>' OBS: As especificaes de formato variam de acordo com a converso desejada. Se o formato no for especificado, ser usado o formato padro da sesso do usurio. Esse formato determinado pelos parmetros da National Language Support em uso. FORMATOS NUMRICOS PARA TO_CHAR E TO_NUMBER Formato $ , . 0 9 B C D E FM Descrio Prefixa o valor com o smbolo $. Mostra uma , na posio correspondente. Mostra um . decimal na posio. Completa o comprimento do formato com zeros ( esquerda ou direita, de acordo com a mscara fornecida). A quantidade de 9s determina o comprimento. Se o nmero for positivo acrescentado um branco esquerda e se negativo, o sinal de menos. Retorna brancos esquerda da parte inteira de um nmero zero, mesmo que no formato haja zeros. Mostra o smbolo financeiro ISO. Mostra o smbolo de separao decimal default. Notao cientfica Retorna um valor sem zeros esquerda ou direita.

CAPTULO 3: FUNES ESCALARES - 86

INTRODUO AO ORACLE9I - SQL FORMATOS NUMRICOS PARA TO_CHAR E TO_NUMBER (CONT) Formato G L MI PR RN rn S TM Descrio Mostra o smbolo de separao de milhar default. Mostra o smbolo financeiro local. Mostra - direita de um valor negativo e branco de um valor positivo. Mostra um valor negativo entre <> e os positivos entre brancos. Mostra o nmero em algarismos romanos (maiscula). Mostra o nmero em algarismos romanos (minsculas). Pode ser inserido direita ou esquerda, determinando o local do aparecimento do sinal de menos para valores negativos e branco para positivos. Text minimum. Retorna (em formato decimal) o menor nmero de caracteres possvel. O default TM9 que retorna o nmero em formato fixo (a menos que exceda 84 caracteres, neste caso retornado em notao cientfica). Mostra o smbolo Euro (ou outro dual), associado ao parmetro NLS_DUAL_CURRENCY. Multiplica o valor por 10n, onde n corresponde ao nmero de 9s aps v. Retorna o valor hexadecimal do nmero.

U V X

OBS: Os formatos numricos podem ser usados na To_Char com parmetro numrico, ou na To_Number. SQL> SELECT TO_CHAR(-1234567.98, 'L099G999G990D00PR') "NMERO" 2 FROM DUAL; NMERO -------------------------<Cr$001.234.567,98>

CAPTULO 3: FUNES ESCALARES - 87

INTRODUO AO ORACLE9I - SQL

TO_NUMBER
Converte <c> para o valor numrico correspondente. SINTAXE: TO_NUMBER( <c> [, <fmt> [, <nlsparam> ] ] ) Onde <nlsparam> tem o formato : 'nls_numeric_characters = ''dg'' nls_currency = ''text'' nls_iso_currency = <territrio>'

SQL> SELECT TO_NUMBER('-R$3.456.780,10', 'SL999G999G990D00', 2 'NLS_CURRENCY=R$') 3 FROM DUAL; TO_NUMBER('-R$3.456.780,10','SL999G999G990D00','NLS_CURRENCY=R$') -----------------------------------------------------------------3456780,1

TO_CHAR - DATA
Converte um valor de data para o formato especificado. SINTAXE: TO_CHAR( <d> [ , <fmt> [, <nlsparam>] ] ) Onde <nlsparam> tem o formato : 'nls_date_language = <linguagem>'

TO_DATE
Converte <c> para o formato interno de data. SINTAXE: TO_DATE(<c>[ , <fmt> [, <nlsparam>] ] ) Onde <nlsparam> tem o formato : 'nls_date_language = <linguagem>' SQL> SELECT TO_CHAR(TO_DATE('18 FEBRUARY, 49, 11:00 P.M.', 2 'DD MONTH, RR, HH:MI A.M.', 3 'NLS_DATE_LANGUAGE = AMERICAN'), 4 'DD MONTH, YYYY, HH24:MI', 5 'NLS_DATE_LANGUAGE = ''BRAZILIAN PORTUGUESE''') DATA, 6 TO_CHAR(LOCALTIMESTAMP, 'HH24:MI:SSXFF') TIMESTAMP 7 FROM DUAL; DATA TIMESTAMP ------------------------- -----------------18 FEVEREIRO, 2049, 23:00 08:20:18,000001

CAPTULO 3: FUNES ESCALARES - 88

INTRODUO AO ORACLE9I - SQL FORMATOS PARA TO_CHAR E TO_DATE Formato -/,.;:text AM ou A.M. ou PM ou P.M. BC ou B.C. AD ou A.D. CC, SCC D DAY DD DDD DY E EE FF HH, HH12 HH24 IW IYYY ou IYY ou IY ou I J MI MM MON MONTH Q RM RR Descrio Incluso de pontuao no resultado. Indicador de meio-dia com ou sem pontuao. Indicadores BC ou AD com ou sem pontuao Adiciona 1 aos dois primeiros dgitos do ano (yyyy) e prefixa datas BC com um sinal negativo. Dia da semana (1-7) Nome do dia, completado com brancos at o comprimento de 9 caracteres. Dia do ms (1-31) Dia do ano (1-366) Nome do dia abreviado (3 caracteres) Nome da era abreviado Nome da era por extenso Frao de segundo Hora (0-12) Hora (0-23) Semana do ano (ISO) Ano ISO Dia em data juliana. Data inicial para formato de data juliana 01/01/4712 BC. Minuto Ms (numrico) Nome do ms abreviado (3 caracteres) Nome do ms completado com brancos direita at o comprimento de 9 caracteres. Quarto de ano (numrico). Trimestre. Numeral romano do ms Ano. Soma 1 aos dois primeiros dgitos de CC se ano for < 50 e os ltimos 2 dgitos do ano corrente forem >=50. Subtrai 1 de CC se ano >= 50 e os ltimos dois dgitos do ano corrente forem < 50.
CAPTULO 3: FUNES ESCALARES - 89

INTRODUO AO ORACLE9I - SQL FORMATOS PARA TO_CHAR E TO_DATE (CONT) RRRR SS SSSSS SYYYY TZD TZH TZM TZR W WW X Y,YYY YEAR, SYEAR YYYY ou YYY ou YY ou Y Ano. Aceita 2 ou 4 dgitos. Se ano informado com 2 dgitos, segue as mesmas regras de RR. Segundo Segundos aps a meia-noite Ano. Prefixa anos BC com um sinal negativo. Abreviatura da zona de tempo (fuso horrio). Hora da zona de tempo (fuso horrio). Minuto da zona de tempo (fuso horrio). Nome da zona de tempo (fuso horrio. Semana do ms (numrico). Contabilizado da mesma forma que WW em relao ao ms. A semana comea no primeiro dia no ano e incrementada de 1 a cada 7 dias. Caracter radix local para ser usado como separador da parte fracionria dos segundos. Ex.: HH:MI:SSXFF. Ano com vrgula na posio marcada Ano por extenso Ano

OBS: Os formatos RR e RRRR levam em considerao o ano atual (por exemplo, 1999) e o valor informado de ano (por exemplo, to_date(ddmmrr, 010149)) para determinao do sculo. Se os dois ltimos dgitos do ano atual (no nosso caso, 1999) so inferiores a 50 e o ano informado (no nosso caso, 49) < 50, o sculo retornado o corrente, e se o ano informado for >= 50, o sculo retornado o atual menos 1. Se os dois ltimos dgitos do ano atual (no nosso caso, 1999) so superiores a 49 e o ano informado (no nosso caso, 49) < 50, o sculo retornado o corrente mais um, e se o ano informado for >= 50, o sculo retornado o sculo corrente. Como resultado, o comando to_date(ddmmrr, 010149) executado no ano de 1999 geraria a data 01/01/2049. Este comando executado no ano 2000 produziria o mesmo resultado, porm observe que a lgica seguida seria diferente. So admitidos dois modificadores: FM (retira brancos direita e esquerda e os zeros no significativos do resultado) e FX (exige validao exata dos caracteres no formato com os informados). So admitidos trs sufixos: TH (acrescenta ao nmero as letras TH), SP (apresenta o nmero por extenso) e SPTH ou THSP (apresenta o ordinal do nmero por extenso). Todos os trs sufixos retornam o valor em ingls.
CAPTULO 3: FUNES ESCALARES - 90

INTRODUO AO ORACLE9I - SQL

TO_CLOB
Converte o valor passado como parmetro (que pode ser uma coluna NCLOB ou outro tipo de caracter) para CLOB. SINTAXE: TO_CLOB ( <c> ) O parmetro pode ser do tipo CHAR, NCHAR, VARCHAR2, NVARCHAR2, CLOB ou NCLOB.

TO_DSINTERVAL
Converte uma string (no formato CHAR, VARCHAR2, NCHAR ou NVARCHAR2) para INTERVAL DAY TO SECOND. SINTAXE: TO_ DSINTERVAL ( <c> [ , <nlsparam>] ) O nico parmetro NLS que pode ser utilizado NLS_NUMERIC_CHARACTERS.

TO_LOB
Essa funo converte valores Long ou Long Raw armazenados em colunas do tipo Long para valores Lob. OBS: Podemos aplicar essa funo somente a uma coluna Long ou Long Raw e somente na lista de seleo de uma subquery de um comando INSERT. SQL> CREATE TABLE LONGA (TX_LONGA LONG); Tabela criada. SQL> INSERT INTO LONGA 2 SELECT CD_MAT||NM_FUNC ||'-'||NR_CARGO||'-'||NM_SOBRENOME||'-'||CD_MAT 3 FROM FUNC; 36 linhas criadas. SQL> CREATE TABLE LOB8 (TX_LOB CLOB); Tabela criada. SQL> INSERT INTO LOB8 2 SELECT TX_LONGA FROM LONGA; SELECT TX_LONGA FROM LONGA * ERRO na linha 2: ORA-00997: uso invlido do tipo de dados LONG SQL> INSERT INTO LOB8 2 SELECT TO_LOB(TX_LONGA) FROM LONGA; 36 linhas criadas.
CAPTULO 3: FUNES ESCALARES - 91

INTRODUO AO ORACLE9I - SQL

TO_MULTI_BYTE
Retorna a string com todos os seus caracteres single-byte convertidos para seus correspondentes multi-byte. No havendo correspondncia o caracter apresentado como single-byte. Esta funo s vlida para database charsets que contenham single e multi-byte. SINTAXE: TO_MULTI_BYTE( <c> )

TO_NCHAR
Converte uma string do tipo CLOB ou NCLOB a partir do charset do banco de dados para o national charset . SINTAXE: TO_NCHAR ( <c> ) Esta funo equivalente a TRANSLATEUSING NCHAR_CS.

TO_NCHAR
Converte uma string no formato DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL MONTH TO YEAR ou INTERVAL DAY TO SECOND a partir do charset do banco de dados para o national charset . SINTAXE: TO_NCHAR (<datetime>[ , <fmt> [, <nlsparam>] ] )

TO_NCHAR
Converte um nmero para uma string NVARCHAR2. O formato e correspondente nlsparam pode ser relativo a DATE, TIMESTAMP, TIMESTAMP WITH TIME ZONE, TIMESTAMP WITH LOCAL TIME ZONE, INTERVAL MONTH TO YEAR ou INTERVAL DAY TO SECOND. SINTAXE: TO_NCHAR (<nmero>[ , <fmt> [, <nlsparam>] ] )

TO_NCLOB
Converte valores CLOB em uma coluna LOB ou outro tipo de string para valores NCLOB. O Oracle converte a coluna LOB a partir do charset do banco de dados para o national charset . SINTAXE: TO_NCLOB ( <c> )

CAPTULO 3: FUNES ESCALARES - 92

INTRODUO AO ORACLE9I - SQL

TO_SINGLE_BYTE
Retorna a string com todos os seus caracteres multi-byte convertidos para seus correspondentes single-byte. No havendo correspondncia o caracter aparece no resultado como multi-byte. Esta funo s vlida para database charsets que contenham single e multi-byte. SINTAXE: TO_SINGLE_BYTE( <c> )

TO_TIMESTAMP
Converte um texto de tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 no formato timestamp para um valor interno de timestamp. O parmetro nls especifica o formato do texto. SINTAXE: TO_ TIMESTAMP (<c>[ , <fmt> [, <nlsparam>] ] )

TO_TIMESTAMP_TZ
Converte um texto de tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 para um valor interno de TIMESTAMP WITH TIME ZONE. O parmetro nls especifica o formato do texto. SINTAXE: TO_ TIMESTAMP_TZ (<c>[ , <fmt> [, <nlsparam>] ] )

TO_YMINTERVAL
Converte um texto de tipo CHAR, VARCHAR2, NCHAR ou NVARCHAR2 para um valor interno de INTERVAL YEAR TO MONTH. SINTAXE: TO_ YMINTERVAL ( <c> ) SQL> SELECT TO_TIMESTAMP('12/05/1932 10:32:45.067', 2 'DD/MM/YYYY HH24:MI:SS.FF') TMST, 3 TO_TIMESTAMP_TZ('12/05/1932 10:32 -3:00', 4 'DD/MM/YYYY HH24:MI TZH:TZM') TMSTZ, 5 TO_YMINTERVAL('22-10') YM 6 FROM DUAL; TMST TMSTZ YM --------------------------- ----------------------------------- -------------12/05/32 10:32:45,067000000 12/05/32 10:32:00,000000000 -03:00 +000000022-10

CAPTULO 3: FUNES ESCALARES - 93

INTRODUO AO ORACLE9I - SQL

TRANSLATE USING
Converte o texto para o charset especificado. Para que sua utilizao seja efetiva o database charset e o national charset devem ser diferentes. Quando especificamos Using CHAR_CS, o argumento convertido para o database charset e o resultado um VARCHAR2. Quando especificamos Using NCHAR_CS, o argumento convertido para o national charset e o resultado NVARCHAR2. Esta funo similar funo CONVERT mas sua utilizao recomendvel se o tipo do dado da entrada ou sada for NCHAR ou NVARCHAR2. SINTAXE: TRANSLATE(<texto> USING { CHAR_CS | NCHAR_CS } )

UNISTR
Converte uma string em qualquer charset e a retorna em Unicode. SINTAXE: UNISTR ( <texto> ) OBS: Para incluirmos UCS2 codepoints devemos preceder o caracter por uma contra barra ( \ ). Para incluirmos a prpria contra barra ( \ ) devemos preced-la com outra contrabarra.

SQL> SELECT ASCIISTR(', , , , '), 2 UNISTR('\00C3, \00C2, \00C1, \00C7, \00DC') 3 FROM DUAL; ASCIISTR(',,,,') UNISTR('\00C3 --------------------------------- ------------\00C3, \00C2, \00C1, \00C7, \00DC , , , ,

CAPTULO 3: FUNES ESCALARES - 94

INTRODUO AO ORACLE9I - SQL

OUTRAS
BFILENAME
Retorna um Bfile locator que est associado com um arquivo fsico binrio (Lob) no ambiente servidor. O parmetro <diretrio> um objeto do banco de dados que identifica a localizao do arquivo identificado por <arquivo>. A associao a um arquivo deve ser feita antes de executarmos qualquer operao SQL ou PL/SQL com o pacote DBMS_LOB. SINTAXE: BFILENAME( <diretrio>, <arquivo> )

COALESCE
Esta funo retorna a primeira expresso no nula da lista. Se todas as expresses forem Null, o resultado ser Null. SINTAXE: Coalesce ( <e> [ , <e> [ , <e> ......] ] )

DECODE
Compara <e> a cada valor <search> e retorna <result> se <e> for igual a <search>. Se no for encontrado, a funo retorna o valor <default>, que se no for informado ser assumido NULL. SINTAXE: DECODE(<e>, <search1>, <result1>, [<search2>, <result2>,] ...[<default>]) SQL> SELECT COALESCE(LENGTH(''), NULL, 235*21) COALESCE, 2 DECODE('&P1', 'F', 'FEMININO', 3 'M', 'MASCULINO', 4 'NO IDENTIFICADO') DECODE 5 FROM DUAL; Entre o valor para p1: M antigo 2: DECODE('&P1', 'F', 'FEMININO', novo 2: DECODE('M', 'F', 'FEMININO', COALESCE DECODE ---------- --------4935 MASCULINO

CAPTULO 3: FUNES ESCALARES - 95

INTRODUO AO ORACLE9I - SQL

DUMP
Retorna um valor VARCHAR2 contendo o tipo de dado, comprimento (em bytes) e a representao interna da expresso. SINTAXE: DUMP( <e> [ , <formato> [ , <inicio> [ , <comprimento> ] ] ] ) FORMATOS PARA DUMP 8 Retorna o resultado em notao octal. 10 Retorna o resultado em notao decimal. 16 Retorna o resultado em notao hexadecimal. 17 Retorna o resultado como caracteres simples. OBS: Os argumentos <inicio> e <comprimento> podem ser combinados para determinar que parte da representao interna deve ser apresentada. O default retornar a representao interna inteira na notao decimal. Se <e> for NULL, a funo retorna NULL. SQL> SELECT DUMP ('abc', 16) FROM DUAL; DUMP('ABC',16) ---------------------Typ=96 Len=3: 61,62,63

EMPTY_BLOB( )
Retorna um Lob locator vazio que pode ser usado para inicializar variveis do tipo Blob ou colunas Blob em um comando Insert ou Update. Empty significa que o Lob est inicializado mas no est preenchido. A manipulao de colunas (ou variveis) Lob feita atravs do pacote DBMS_LOB, que no pode ser usado para valores NULL. A funo no recebe parmetros, mas os parnteses devem ser usados na sintaxe. SINTAXE: EMPTY_BLOB( )

CAPTULO 3: FUNES ESCALARES - 96

INTRODUO AO ORACLE9I - SQL

EMPTY_CLOB( )
Retorna um Lob locator vazio que pode ser usado para inicializar variveis do tipo Clob ou colunas Clob em um comando Insert ou Update. Empty significa que o Lob est inicializado mas no est preenchido. OBS: A manipulao de colunas (ou variveis) Lob feita atravs do pacote DBMS_LOB, que no pode ser usado para valores NULL. A funo no recebe parmetros, mas os parnteses devem ser usados na sintaxe. SINTAXE: EMPTY_CLOB( )

EXISTSNODE
Esta funo determina se existe uma estrutura hierrquica (passada como parmetro) no documento especificado. O retorno da funo ser zero se a estrutura no existir e > 0 se for encontrada. SINTAXE: EXISTSNODE ( <xmltype_instance>, <xpath_string> ) SQL> CREATE TABLE TESTE_XML 2 (C_XML SYS.XMLTYPE, 3 C_URI SYS.URITYPE); Tabela criada. SQL> INSERT INTO TESTE_XML (C_XML) 2 VALUES 3 (SYS.XMLTYPE.CREATEXML('<Endereco> 4 <Rua>Candelria</Rua> 5 <Numero>60</Numero><Andar>7</Andar> 6 <Bairro>Centro</Bairro> 7 <Cidade>Rio de Janeiro</Cidade><Estado>RJ</Estado> 8 </Endereco>')); 1 linha criada. SQL> SELECT ROWNUM, EXISTSNODE(C_XML, '/Endereco/Numero') N 2 FROM TESTE_XML; ROWNUM N ---------- ---------1 1 OBS: A tabela TESTE_XML possui colunas com tipo de dado objeto. Para realizarmos a incluso de dados precisamos do mtodo CREATEXML. A funo Existsnode verifica a existncia de uma estrutura (trecho). No nosso caso poderamos ter procurado por qualquer elemento subordinado a endereo. O nico cuidado que a informao case sensitive, desta forma o parmetro /endereco/numero no encontrada.
CAPTULO 3: FUNES ESCALARES - 97

INTRODUO AO ORACLE9I - SQL

EXTRACT
A funo Extract retorna um objeto do tipo XML que contenha a hierarquia pesquisada. Podemos, ento aplicar um mtodo deste tipo de objeto e visualizar o contedo, como no exemplo abaixo. SINTAXE: EXTRACT ( <xmltype_instance>, <xpath_string> ) SQL> SELECT EXTRACT(C_XML, '/Endereco/Numero').GETSTRINGVAL() TEXTO 2 FROM TESTE_XML; TEXTO --------------------------------------------------------------<Numero>60</Numero> OBS: Getstringval um mtodo do objeto Sys.XmlType. O estudo sobre objetos no sera visto neste curso.

GREATEST
Retorna a maior <e> da lista de valores. Todas as expresses aps a primeira so convertidas para o tipo de dado da primeira antes da comparao ser feita. SINTAXE: GREATEST(<e>,[,<e>] ...)

LEAST
Retorna a menor <e> da lista de valores. Todas as expresses aps a primeira so convertidas para o tipo de dado da primeira antes da comparao ser feita. SINTAXE: LEAST(<e>,[,<e>] ...)

NLS_CHARSET_DECL_LEN
Retorna o comprimento declarado (em nmero de caracteres) de uma coluna NCHAR. SINTAXE: NLS_CHARSET_DECL_LEN( <tamanho em bytes> , <charsetid>) Onde: O argumento charsetid indica o identificador do charset da coluna.

CAPTULO 3: FUNES ESCALARES - 98

INTRODUO AO ORACLE9I - SQL

NLS_CHARSET_ID
Retorna o ID do charset passado como parmetro. Se passarmos como valor CHAR_CS obteremos o database charset. Se passarmos como valor NCHAR_CS retornaremos o identificador do national charset. Se informarmos um nome de charset invlido ser retornado NULL. SINTAXE: NLS_CHARSET_ID( <charset>) SQL> SELECT NLS_CHARSET_ID ('CHAR_CS'), NLS_CHARSET_ID ('NCHAR_CS') 2 FROM DUAL; NLS_CHARSET_ID('CHAR_CS') NLS_CHARSET_ID('NCHAR_CS') ------------------------- -------------------------178 2000

NLS_CHARSET_NAME
Retorna o nome do charset correspondente ao nmero passado como parmetro. Se informarmos um nmero de charset invlido ser retornado NULL. SINTAXE: NLS_CHARSET_NAME( <id>) SQL> SELECT NLS_CHARSET_NAME(NLS_CHARSET_ID ('CHAR_CS')), 2 NLS_CHARSET_NAME(NLS_CHARSET_ID ('NCHAR_CS')) 3 FROM DUAL; NLS_CHARSET_ NLS_CHARS ------------ --------WE8MSWIN1252 AL16UTF16

NULLIF
Esta funo compara <expresso1> e <expresso2>. Se forem iguais ser retornado Null, caso contrrio ser retornada <expresso1>. SINTAXE: NULLIF (<e1>, <e2>) OBS: As expresses devem ser diferente de NULL. SQL> SELECT NULLIF(1,2) FROM DUAL; NULLIF(1,2) ----------1
CAPTULO 3: FUNES ESCALARES - 99

INTRODUO AO ORACLE9I - SQL

NVL
Se <e1> for NULL, retorna <e2>. Se <e1> no for NULL, retorna <e1> SINTAXE: NVL(<e1>, <e2>)

SQL> SELECT NVL(NULL, 'RESP = UM'), NVL(1,2) FROM DUAL; NVL(NULL, NVL(1,2) --------- ---------RESP = UM 1

NVL2
Se <expresso1> no for null retornar <expresso2>. Se <expresso1> for null, retornar <expresso3>. SINTAXE: NVL2(<e1>, <e2>, <e3>) OBS: O argumento <expresso1> pode ser de qualquer tipo. Os argumentos <expresso2> e <expresso3> podem ser de qualquer tipo exceto Long.

SQL> SELECT NULLIF(120, 154) NULLIF, 2 NVL(NULL, 'RETORNO') NVL, 3 NVL2('EXPRESSO1', 'EXPRESSO2', 'EXPRESSO3') NVL2 4 FROM DUAL; NULLIF NVL NVL2 ---------- ------- ---------120 RETORNO EXPRESSO2

CAPTULO 3: FUNES ESCALARES - 100

INTRODUO AO ORACLE9I - SQL

SYS_CONNECT_BY_PATH
Vlido apenas para queries hierrquicas. Retorna o caminho do valor da coluna a partir do n raiz. Tanto o parmetro <coluna> quanto o parmetro <texto> podem ser dos tipos CHAR, VARCHAR2, NCHAR e NVARCHAR2. SINTAXE: SYS_CONNECT_BY_PATH (<coluna>, <texto>) SQL> SELECT CD_DEPTO, CD_DEPTO_CTB, SYS_CONNECT_BY_PATH (CD_DEPTO, '/') PATH 2 FROM DEPTO 3 CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB 4 START WITH CD_DEPTO = 'A00'; CD_ --A00 B01 C01 D01 D11 D21 E01 E11 E21 CD_ PATH --- --------------/A00 A00 /A00/B01 A00 /A00/C01 A00 /A00/D01 D01 /A00/D01/D11 D01 /A00/D01/D21 A00 /A00/E01 E01 /A00/E01/E11 E01 /A00/E01/E21

9 linhas selecionadas.

SYS_CONTEXT
Retorna o valor do atributo informado como parmetro e associado com o context namespace. SINTAXE: SYS_CONTEXT (<namespace>, <formato> [ , <comprimento> ]) A tabela, a seguir, apresenta os formatos vlidos para a funo, considerando-se o namespace default USERENV. Podemos criar nossos prprios namespaces usando o package DBMS_SESSION. O objetivo de um namespace criar numa rea associada sesso do usurio para armazenamento de informaes, que podem vir a ser usadas em aplicaes. Formato Nls_territory Nls_currency Nls_calendar Descrio Retorna o Territrio Retorna o smbolo financeiro local. Retorna o calendrio utilizado para determinao de datas.

CAPTULO 3: FUNES ESCALARES - 101

INTRODUO AO ORACLE9I - SQL

Formato Nls_date_format Nls_date_language Nls_sort Session_user Current_user

Descrio Retorna o formato corrente para datas. Retorna a linguagem usada para dias da semana, meses e, assim por diante (em datas). Indica se a ordenao baseada em ordem lingstica ou binria. Retorna o nome do usurio que est logado. Retorna o nome do usurio da sesso corrente, que pode ser diferente do SESSION_USER de dentro de uma Stored Procedure (como um Invoker Rights). Retorna o nome do schema corrente, que pode ser alterado com o comando ALTER SESSION SET SCHEMA <comando>. Retorna o ID do schema corrente. Retorna o ID do usurio conectado. Obtm o endereo de IP de um cliente se este estiver conectado ao Oracle usando o protocolo TCP-IP. Retorna o ID do usurio da sesso corrente.

Current_schema Current schemaid Session_userid Ip_address Current_userid

SQL> SELECT SYS_CONTEXT('USERENV', 'NLS_TERRITORY') 2 FROM DUAL; SYS_CONTEXT('USERENV','NLS_TERRITORY') --------------------------------------------------BRAZIL

SYS_DBURIGEN
Esta funo recebe como parmetro uma ou mais colunas (ou atributos) e, opcionalmente, um ROWID e gera uma URL do tipo DBUriType para uma coluna ou row. Podemos usar o URL para recuperar um documento XML no banco de dados. SINTAXE:

OBS: Todas as colunas (ou atributos) devem residir na mesma tabela. Devem fazer referncia a valores que identifiquem uma linha (PK ou UK). Por default a URL aponta para um documento XML formatado. Se desejarmos que a URL aponte somente o texto do documento, devemos especificar o parmetro text( ).
CAPTULO 3: FUNES ESCALARES - 102

INTRODUO AO ORACLE9I - SQL

SYS_GUID
Gera e retorna um identificador nico global (RAW) composto de 16 bytes. SINTAXE: SYS_GUID ( ) SQL> SELECT SYS_DBURIGEN(CD_DEPTO) URI, 2 SYS_GUID() GUID 3 FROM DEPTO 4 WHERE CD_DEPTO IN ('A00', 'D11');
URI(URL, SPARE) --------------------------------------------------------------DBURITYPE('/PUBLIC/DEPTO/ROW[CD_DEPTO=''D11'']/CD_DEPTO', NULL) DBURITYPE('/PUBLIC/DEPTO/ROW[CD_DEPTO=''A00'']/CD_DEPTO', NULL) GUID -------------------------------8AC53CFC55BA456D9FDDE08CB143F3E3 6EA6E6F1BC764DF4B99EEFA9BF412D08

SYS_TYPEID
Esta funo retorna o typeid do mais especfico tipo do parmetro. Uma vez que esta funo est totalmente ligada concepo de objetos, no ser estudada neste curso.

SYS_XMLGEN
Esta funo retorna uma instncia do tipo SYS.XMLType contendo um documento XML. A <expresso> pode ser um valor escalar, um tipo definido pelo usurio ou uma instncia de um XMLType. SINTAXE: SYS_ XMLGEN (<e> [ , <formato> ]) Se <expresso> for escalar o resultado ser um elemento XML contendo o valor escalar. Se a expresso for um tipo do usurio, a funo mapear os atributos do tipo do usurio para elementos XML. Se <expresso> for uma instncia XMLType, a funo incluir o documento em um elemento XML cuja tag default ROW. SQL> SELECT SYS_XMLGEN ('TESTE') 2 FROM DUAL; SYS_XMLGEN('TESTE')() -------------------------------XMLTYPE() OBS: o resultado desta funo um objeto do tipo XMLType e no podemos visualizar diretamente seu contedo. Para isto devemos usar um mtodo que liste seu contedo.

CAPTULO 3: FUNES ESCALARES - 103

INTRODUO AO ORACLE9I - SQL

SYS_XMLAGG
Agrega todos os documentos XML (ou fragmentos) representados por <expresso> e produz um nico documento XML. Ele adiciona um novo elemento com o nome default de ROWSET. SQL> SELECT SYS_XMLAGG(SYS_XMLGEN('teste')).getClobVal() 2 FROM dual; SYS_XMLAGG(SYS_XMLGEN('TESTE')).GETCLOBVAL() --------------------------------------------------------<?xml version="1.0"?> <ROWSET> <ROW>teste</ROW> </ROWSET>

UID
Retorna o valor do inteiro associado a cada username pelo Oracle. SINTAXE: UID

USER
Retorna o username corrente. SINTAXE: USER

CAPTULO 3: FUNES ESCALARES - 104

INTRODUO AO ORACLE9I - SQL

USERENV
Retorna informaes sobre o user e a sesso. SINTAXE: USERENV( <option> )

VALORES DE <OPTION> Isdba Language Terminal Sessionid Retorna True se a sesso corrente tem foi habilitada como DBA. Caso contrrio, retorna False. Retorna a linguagem, territrio e charset atualmente em uso na sesso. Retorna um identificador do sistema operacional para o terminal em uso na sesso corrente. Retorna o identificador de auditoria da sesso. Para que este valor seja significativo, o parmetro de inicializao do banco de dados Audit_Trail deve estar com o valor True. Retorna a abreviao ISO para o nome da linguagem. Retorna o nmero identificador da instncia corrente. Retorna o identificador da entrada na trilha de auditoria. Para que este valor seja significativo, o parmetro de inicializao do banco de dados Audit_Trail deve estar com o valor True. Retorna at 64 bytes de informao obtidos da sesso do usurio e gravados pelo pacotes DBMS_APPLICATION_INFO.

Lang Instance Entryid

Client_Info

SQL> SELECT USERENV('LANGUAGE') 2 FROM DUAL; USERENV('LANGUAGE') ------------------------------------------BRAZILIAN PORTUGUESE_BRAZIL.WE8MSWIN1252

VSIZE
Retorna o nmero de bytes usado para armazenar a representao interna de <e>. Se <e> for NULL, o resultado da funo NULL. SINTAXE: VSIZE(<e>)

CAPTULO 3: FUNES ESCALARES - 105

INTRODUO AO ORACLE9I - SQL

CONSTRUES BSICAS COM FUNES ESCALARES


Neste tpico veremos alguns exemplos simples do que ser pedido no laboratrio deste captulo.

OPERADORES BOOLEANOS
Crie uma consulta que selecione empregados da tabela de funcionrios contendo as seguintes condies : empregados que tenham data de admisso posterior a 1 de agosto de 1993, mas anterior ao final de 1996. cargos no podem ser 54 ou 56 salrio deve ser maior que 3.000,00 grau de instruo deve ser igual ou maior que 12 Para empregados que atendam a estas condies, deve-se listar o sobrenome, salrio, grau de instruo, cargo e data de admisso. SQL> SELECT nm_sobrenome,vl_sal,nr_git,nr_cargo, dt_adm 2 FROM func 3 WHERE (dt_adm > TO_DATE('1993-08-01', 'yyyy-mm-dd') 4 AND dt_adm <= TO_DATE('12/31/1996', 'mm/dd/yyyy')) 5 AND (nr_cargo ^= 54 AND nr_cargo ^= 56) 6 AND vl_sal > 3000 7 AND nr_git >= 12; NM_SOBRENOME VL_SAL NR_GIT NR_CARGO DT_ADM ------------ ---------- ---------- ---------- ------------------HENDERSON 5802,5 18 66 01/01/1995 00:00:00 TEIXEIRA 4537,5 18 61 10/10/1993 00:00:00 KWAN 4207,5 20 60 05/04/1995 00:00:00 SOUZA 3547,5 16 55 14/09/1993 00:00:00 HONOFRE 3272,5 16 55 15/08/1995 00:00:00 LOURENCO 5115 19 58 16/05/1994 00:00:00 OLIVA 3217,5 14 58 05/12/1993 00:00:00 BARBOSA 3051,4 16 55 03/03/1996 00:00:00 LUZ 3282,4 18 55 29/08/1995 00:00:00 JANUARIO 5115 14 53 21/11/1995 00:00:00 MEDEIROS 3163,6 17 55 05/12/1993 00:00:00

CAPTULO 3: FUNES ESCALARES - 106

INTRODUO AO ORACLE9I - SQL

EXPRESSES
O gerente do departamento pessoal requisitou uma lista de todos os empregados que em 31 de dezembro de 1996 tinham mais de 6 anos na empresa. A lista deve incluir alm dos nomes e sobrenomes dos empregados o nmero de anos de trabalho dos empregados e a idade com que o funcionrio ingressou na companhia. SQL> SELECT cd_mat, nm_sobrenome, 2 TRUNC(MONTHS_BETWEEN('31/12/1996', dt_adm)/ 12, 0) "anos trab", 3 TRUNC((dt_adm - dt_nasc)/365.25) "idade de adm" 4 FROM func 5 WHERE MONTHS_BETWEEN(TO_DATE('12311996', 'mmddyyyy'),dt_adm) / 12 > 6; CD_MAT ---------50 70 100 170 180 270 290 320 NM_SOBRENOME anos trab idade de adm ------------ ---------- -----------GOMES 7 33 PEREIRA 6 27 SIQUEIRA 6 23 YVES 7 18 SANTOS 6 21 PARENTE 6 17 PONTES 6 23 MARQUES 6 17

8 linhas selecionadas. OBS: As expresses "anos trab." e "idade de adm" so alias para o nome da coluna, isto , um apelido para a coluna.

CAPTULO 3: FUNES ESCALARES - 107

INTRODUO AO ORACLE9I - SQL

LABORATRIO 3
1. Atualize o salrio de todos os funcionrios de tal forma que as casas decimais sejam eliminadas. 2. Calcule a durao das atividades de cada um dos projetos. O tempo (em unidades de 10 dias) deve ser arredondado para um valor inteiro. Usar a tabela PRJATV. 3. Mostre a matrcula e data de admisso de todos os funcionrios admitidos aps 17 de junho de 1992. 4. Produza uma listagem de todos os funcionrios que foram contratados com menos de 21 anos. Deseja-se saber o nome, matricula e a idade na contratao. 5. Produza uma listagem dos funcionrios do sexo masculino, com mais de 25 anos e que ganhem mais de R$ 3.500,00. A listagem deve conter a matrcula, nome, salrio, sexo e idade do funcionrio. 6. Produza uma listagem contendo o nome e sobrenome de todos os funcionrios cujo nome completo (nome concatenado com sobrenome excluindo-se as vogais) seja composto de mais de 9 caracteres. A lista deve apresentar o nome e o sobrenome (em uma nica coluna), a data e hora de nascimento, o ms e ano de admisso (nmero do ms em algarismos romanos) e o valor de salrio (editado). 7. Produza uma listagem contendo nome e sobrenome do funcionrio (concatenados e alinhados esquerda), cdigo do departamento (alinhado direita - tam 6), matrcula (alinhado direita), data de admisso (formato dd/mm/yy, centralizado - tam 12) dos funcionrios do departamento D11. 8. Deseja-se uma listagem dos funcionrios que tenha mais de trs vogais em seu primeiro nome. A listagem deve apresentar o nome do funcionrio (completo) criptografado, de acordo com as regras abaixo: A B,C,D,F,G,H,J T,V,X,Y,Z E N,O K,L,M,P,Q,R,S I U,W 0 1 3 4 6 2 5 7

9. Produza uma listagem contendo o nome, data de nascimento e sexo de todos os funcionrios cujo ramal esteja preenchido. Deseja-se que o nome seja composto pelo primeiro e ltimo nome do funcionrio, que sejam impressas as palavras feminino e masculino no lugar do indicador de sexo e que a data de nascimento apresente tambm a hora.

CAPTULO 3: FUNES ESCALARES - 108

INTRODUO AO ORACLE9I - SQL OPCIONAIS 10. Apresente uma listagem contendo informaes sobre a sesso do usurio: cdigo do usurio, linguagem, territrio, charset, identificador da sesso, data e hora do sistema. 11. Deseja-se uma lista dos projetos (nome) com equipe maior que 3 e em cujo nome (do projeto) existam simultaneamente as letras M e A em qualquer ordem. 12. Deseja-se uma lista dos funcionrios com mais de 35 anos e que tenham cargo menor que 55. 13. Deseja-se uma lista de projetos (cdigo) e atividades (cdigo) ocorridos durante o ano de 1996. 14. Deseja-se uma lista de projetos (cdigo) e atividades (cdigo) que no tiveram atividades no ano de 1996 (Usar PRJATV). 15. Deseja-se uma relao contendo nome completo do funcionrio usando letras maisculas e minsculas, sexo por extenso, nmero de dias entre a data de admisso e o ltimo dia do ms da data corrente e o valor do salrio (se houver definido; caso contrrio, 0) formatado. Esta relao deve ser ordenada do menor salrio para o maior. 16. Deseja-se uma relao com as seguintes informaes: linguagem em uso no banco de dados, o conjunto de caracteres nacionais e o do banco de dados, o endereo da linha do funcionrio com matrcula 100, a data de hoje (com dia, ms e ano por extenso), a data da prxima quinta-feira, o seno, cosseno e tangente do ngulo de 30 graus. 17. Deseja-se realizar o enquadramento dos funcionrios da empresa em uma faixa salarial. O grupo ser dividio em 10 faixas iguais, sendo o intervalo salarial aprecivel entre 1500 e 5000. Determine a faixa de cada funcionrio. 18. Deseja-se obter o valor numrico e nome da zona de tempo da sesso e do banco de dados. 19. Receba um timestamp como parmetro e sua zona de tempo e retorne este timestamp convertido para o horrio de Greenwich.

CAPTULO 3: FUNES ESCALARES - 109

INTRODUO AO ORACLE9I - SQL

CAPTULO 4 : USANDO MAIS DE UMA TABELA


Todas as consultas discutidas at o momento foram baseadas em uma nica tabela. Nos captulos a seguir iremos combinar vrias tabelas e avaliar o potencial da SQL na manipulao de dados.

SUBSELECTS
A clusula WHERE pode fazer referncia a um valor constante ou a um conjunto de valores derivados de um subselect.

CARACTERSTICAS
Um subselect tambm pode ter um outro subselect, isto , pode ser aninhado. No existe limitao para o nmero de nveis de subselects. Um subselect ser usado mais freqentemente em uma clusula WHERE, mas tambm poder aparecer em uma clusula HAVING. A utilizao direta, atravs dos operadores de comparao, quando a subquery retorna apenas uma linha. No exemplo a seguir, sero selecionadas todas as funcionrias que ganhem menos que a mdia salarial da empresa. SQL> SELECT nm_sobrenome, nm_func, dt_nasc 2 FROM func 3 WHERE in_sexo = 'F' 4 AND vl_sal < (SELECT AVG(vl_sal) FROM func); NM_SOBRENOME -----------QUEIROZ PINTO SANTOS JUVENTO PARENTE SEVERO SALGADO NM_FUNC -----------DOLORES ELIZABET MARIA SILVIA MARTA ELINE MARINA DT_NASC ------------------15/09/1955 00:00:00 12/04/1965 00:00:00 21/02/1969 00:00:00 05/10/1966 00:00:00 26/05/1973 00:00:00 28/03/1966 00:00:00 21/04/1971 00:00:00

7 linhas selecionadas. Uma vez que o subselect ser executado primeiro, uma comparao poder ser feita entre a mdia salarial dos funcionrios (obtida) e o salrio atual encontrado em cada linha do nvel mais externo da consulta. OBS: o subselect deve ser colocado entre parnteses.
CAPTULO 4: USANDO MAIS DE UMA TABELA - 110

INTRODUO AO ORACLE9I - SQL SQL> SELECT CD_MAT, CD_DEPTO, NM_FUNC, VL_SAL 2 FROM FUNC 3 WHERE VL_SAL > (SELECT VL_SAL FROM FUNC 4 WHERE CD_MAT = (SELECT CD_GERENTE FROM DEPTO 5 WHERE CD_DEPTO = '&DEP')); Entre o valor para dep: A00 no h linhas selecionadas Nos exemplos anteriores apenas uma linha foi retornada da execuo do subselect, porm pode ocorrer de mais de uma linha ser retornada. Neste caso, a comparao no poder ser feita apenas com um dos operadores de comparao (>, <, =, >=, etc.). Faremos uso das palavras-chave ALL, ANY (ou SOME) e IN. ALL Se ALL for usada em uma comparao, a condio ser satisfeita se a expresso dada for verdadeira para todos os valores do subconjunto obtido. ANY OU SOME Se a palavra-chave ANY for usada em uma comparao, a condio ser satisfeita se a expresso for verdadeira para algum dos valores do subconjunto obtido. SQL> SELECT CD_MAT, CD_DEPTO, NM_FUNC, VL_SAL 2 FROM FUNC 3 WHERE CD_DEPTO = SOME (SELECT CD_DEPTO FROM DEPTO 4 WHERE CD_DEPTO_CTB = &DEP); Entre o valor para dep: 'E01' CD_MAT ---------90 100 280 290 300 310 320 330 340 CD_ --E11 E21 E11 E11 E11 E11 E21 E21 E21 NM_FUNC VL_SAL ------------ ---------ELIANE 3272,5 TEODORO 2876,5 ELINE 2887,5 JOAO 1687,4 FELIPE 1952,5 MARINA 1749 ROBERTO 2194,5 WI_SON 2790,7 DILSON 2622,4

9 linhas selecionadas.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 111

INTRODUO AO ORACLE9I - SQL IN O predicado IN tambm pode ser usado em conjunto com um subselect, o qual ter o mesmo significado de = ANY ou, no caso de NOT IN, o mesmo significado de <> ALL. Selecionar todos os gerentes de uma tabela de empregados. O cdigo de gerente encontrado na tabela de departamentos. SQL> SELECT CD_MAT, NM_SOBRENOME, CD_DEPTO 2 FROM FUNC 3 WHERE CD_MAT IN (SELECT CD_GERENTE FROM DEPTO); CD_MAT ---------10 20 30 50 60 70 90 100 NM_SOBRENOME -----------HENDERSON TEIXEIRA KWAN GOMES SOUZA PEREIRA HONOFRE SIQUEIRA CD_ --A00 B01 C01 E01 D11 D21 E11 E21

8 linhas selecionadas.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 112

INTRODUO AO ORACLE9I - SQL

EXEMPLOS
RETORNANDO UM NICO VALOR Deseja-se uma lista dos funcionrios gerenciados por Cristina Henderson, cuja matrcula 10. SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO 2 FROM FUNC 3 WHERE CD_DEPTO = (SELECT CD_DEPTO FROM DEPTO 4 WHERE CD_GERENTE = 10); CD_MAT ---------10 110 120 NM_FUNC -----------CRISTINA VICENTE SILVIO CD_ --A00 A00 A00

RETORNANDO UM CONJUNTO DE VALORES Deseja-se uma lista de de todos os departamentos em que no existam funcionrios. SQL> INSERT INTO DEPTO (CD_DEPTO, NM_DEPTO) 2 VALUES ('A01', 'RECURSOS HUMANOS'); 1 linha criada. SQL> SELECT CD_DEPTO, NM_DEPTO 2 FROM DEPTO 3 WHERE CD_DEPTO <> ALL (SELECT DISTINCT CD_DEPTO 4 FROM FUNC 5 WHERE CD_DEPTO IS NOT NULL); CD_ NM_DEPTO --- ---------------------------------------A01 RECURSOS HUMANOS

CAPTULO 4: USANDO MAIS DE UMA TABELA - 113

INTRODUO AO ORACLE9I - SQL USANDO NOT IN Deseja-se uma lista dos funcionrios que no so gerentes. SQL> SELECT CD_MAT, NM_FUNC FROM FUNC 2 WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO); no h linhas selecionadas SQL> SELECT CD_MAT, NM_FUNC FROM FUNC 2 WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO 3 WHERE CD_GERENTE IS NOT NULL); CD_MAT NM_FUNC ---------- -----------110 VICENTE 120 SILVIO ... 27 linhas selecionadas. Quando o comando de comparao (no exemplo CD_MAT NOT IN) puder ser substitudo por uma expresso contendo AND (no exempo CD_MAT <> xxx AND CD_MAT <> yyy ...), devemos garantir que a subquery no contenha NULL. Caso contrrio o resultado ser FALSE e nanhuma linha ser selecionada. COM O COMANDO DELETE Suponhamos que desejssemos excluir todos os funcionrios que no so gerentes, no so lderes de projeto e que possuam grau de instruo igual a 15. SQL> DELETE FROM FUNC 2 WHERE cd_mat NOT IN (SELECT cd_resp FROM PROJ 3 WHERE cd_resp IS NOT NULL) 4 AND cd_mat NOT IN (SELECT cd_gerente FROM DEPTO 5 WHERE cd_gerente IS NOT NULL) 6 AND nr_git = 15; 1 linha deletada. A indicao de liderana de projeto feita pela coluna cd_resp da tabela Proj. A indicao de gerncia de departamento feita pela coluna cd_gerente da tabela Depto. A utilizao da restrio IS NOT NULL indispensvel para que o resultado seja correto. Caso no seja includa no subselect e existam ausncias de informao na coluna comparada, o resultado da pesquisa ser False e nenhuma linha ser removida.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 114

INTRODUO AO ORACLE9I - SQL

USANDO OPERAES RELACIONAIS


A lgebra Relacional possui oito operaes (restrio, projeo, unio, interseo, diferena, produto cartesiano, juno e diviso) para operar conjuntos. Neste tpico, trataremos destas operaes e como execut-las usando o SQL do Oracle. Para exemplificao, utilizaremos duas tabelas F e G criadas a partir da tabela Func, como apresentado a seguir. SQL> CREATE TABLE F(MAT, NOME, DEPTO, CARGO, SALARIO) 2 AS SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, VL_SAL 3 FROM FUNC 4 WHERE CD_DEPTO IN ('D11', 'D21') 5 AND NR_CARGO BETWEEN 53 AND 60; Tabela criada. SQL> CREATE TABLE G(MAT, NOME, DEPTO, CARGO, SALARIO) 2 AS SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, VL_SAL 3 FROM FUNC 4 WHERE CD_DEPTO IN ('D11', 'D21') 5 AND NR_CARGO BETWEEN 50 AND 54; Tabela criada. SQL> DESC F Nome Nulo? -------------------------- -------MAT NOT NULL NOME DEPTO CARGO SALARIO SQL> DESC G Nome Nulo? -------------------------- -------MAT NOT NULL NOME DEPTO CARGO SALARIO

Tipo --------------NUMBER(5) VARCHAR2(12) CHAR(3) NUMBER(3) NUMBER(9,2) Tipo --------------NUMBER(5) VARCHAR2(12) CHAR(3) NUMBER(3) NUMBER(9,2)

CAPTULO 4: USANDO MAIS DE UMA TABELA - 115

INTRODUO AO ORACLE9I - SQL

SELEO OU RESTRIO
Esta operao se aplica a um nico conjunto e representa uma restrio sobre linhas. Poderamos dizer que o resultado R seria uma relao contendo todas as linhas de F que satisfizessem a condio de restrio. A operao representada por: R F [ salario > 4000 ]. No Oracle isto obtido por um comando Select simples em que utilizamos a clusula WHERE para estabelecer a restrio sobre as linhas. SQL> SELECT * FROM F 2 WHERE salario > 4000; MAT NOME DEP CARGO SALARIO ---------- ------------ --- ---------- ---------230 JOAQUIM D21 53 5115 Nesta operao todas as colunas so selecionadas, desta forma, usamos o * para que todos os dados sejam apresentados no resultado.

PROJEO
Nesta operao relacional desejamos obter todas as linhas , mas operaremos uma restrio em relao s colunas. Poderamos dizer que o resultado R seria uma relao contendo apenas as colunas matrcula e nome de F referente a todas as linhas. A operao representada por: R F [ mat, nome ]. As linhas em duplicidade, geradas pela ausncia de determinadas colunas, seriam eliminadas. No Oracle, esta operao pode ser resolvida utilizando-se a clusula Distinct aplicada s colunas desejadas. SQL> SELECT MAT, NOME FROM F; MAT NOME ---------- -----------60 IRACY 70 EVA 150 BRUNO ... 11 linhas selecionadas. Neste exemplo apenas as colunas MAT e NOME foram selecionadas, porm como no informamos uma clusula Where todas as linhas foram trazidas. No SQL do Oracle, podemos realizar a combinao destas duas operaes ao adicionarmos ao comando SELECT a clusula WHERE, juntamente com a definio das colunas na clusula SELECT.
CAPTULO 4: USANDO MAIS DE UMA TABELA - 116

INTRODUO AO ORACLE9I - SQL

UNIO
A operao de Unio obtm como resultado um conjunto T tal que contenham todas as tuplas de F e todas as tuplas de G sem repetio. Poderamos dizer que o resultado T seria uma relao contendo simultaneamente F e G. A operao representada por: T F G. O operador UNION tem a finalidade de produzir um nico resultado atravs da soma (unio) dos resultados dos SELECTs individuais envolvidos. A unio de resultados possui o conjunto de regras apresentadas abaixo: Todos os SELECTs envolvidos devem possuir o mesmo nmero de colunas. As colunas correspondentes em cada um dos SELECTs devem ser de mesmo tipo. A clusula ORDER BY se aplica ao resultado geral da unio.

As demais clusulas que compem um comando SELECT so tratadas individualmente nos SELECTs a que se aplicam. A clusula UNION realiza uma ordenao implcita (SORT) para garantir que no existiro linhas duplicadas no resultado. A clusula UNION ALL no efetua qualquer tipo de ordenao, as linhas duplicadas que houverem sido geradas sero apresentadas. SQL> SELECT MAT, NOME, DEPTO 2 FROM F 3 UNION 4 SELECT MAT, NOME, DEPTO 5 FROM G; MAT NOME ---------- -----------60 IRACY 70 EVA ... 14 linhas selecionadas. DEP --D11 D21

OBS: No SQL do Oracle, os dois conjuntos participantes do processo de unio so definidos dinamicamente atravs de dois (ou mais) comandos Selects unidos por Union ou Union All. O operador Union retira do resultado todas as tuplas duplicadas. J o operador Union ALL mantm as linhas duplicadas no resultado.
CAPTULO 4: USANDO MAIS DE UMA TABELA - 117

INTRODUO AO ORACLE9I - SQL UNION ALL Produza uma lista contendo: todos os funcionrios do departamento D11 com cargo > 54. todos os funcionrios do departamento D21 com cargo > 53. todos os funcionrios que recebam mais de R$4000,00.

O resultado deve conter o nome do funcionrio, matrcula, cargo e departamento. SQL> SELECT NOME, DEPTO, SALARIO, CARGO 2 FROM F 3 WHERE DEPTO = 'D11' AND CARGO > 54 4 UNION ALL 5 SELECT NOME, DEPTO, SALARIO, CARGO 6 FROM G 7 WHERE DEPTO = 'D21' AND CARGO > 53 8 UNION ALL 9 SELECT NOME, DEPTO, SALARIO, CARGO 10 FROM F 11 WHERE SALARIO > 4000 12 ORDER BY 1; NOME -----------BRUNO DAVI IRACY JOANA JOAQUIM DEP SALARIO CARGO --- ---------- ---------D11 2780,8 55 D11 3051,4 55 D11 3547,5 55 D11 3282,4 55 D21 5115 53

OBS: Entre o primeiro e o segundo Select no existe possibilidade de linhas duplicadas.

Entre o primeiro e o terceiro esta possibilidade existe. Se no desejssemos visualizar estas linhas no resultado poderamos utilizar o operador Union no lugar do Union All.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 118

INTRODUO AO ORACLE9I - SQL

SUBTRAO
A operao de Subtrao obtm como resultado um conjunto R tal que contenham todas as tuplas de F menos todas as tuplas de G sem repetio. Poderamos dizer que o resultado R seria uma relao contendo todas as tuplas de F que no existissem em G. A operao representada por: R F G. Neste caso a ordem da operao tem influncia no resultado. No Oracle o operador MINUS atua sobre o resultado das consultas, efetuando uma subtrao entre os resultados. A subtrao de resultados possui regras similares operao de unio com a seguinte regra adicional: A operao de subtrao realizada na ordem em que os comandos SELECTs individuais so apresentados, ou seja, a ordem dos operandos importa no resultado geral. SQL> SELECT MAT, NOME, DEPTO, SALARIO FROM F 2 MINUS 3 SELECT MAT, NOME, DEPTO, SALARIO FROM G; MAT ---------60 70 150 200 220 240 NOME -----------IRACY EVA BRUNO DAVI JOANA SALVADOR DEP SALARIO --- ---------D11 3547,5 D21 3978,7 D11 2780,8 D11 3051,4 D11 3282,4 D21 3163,6

6 linhas selecionadas. SQL> SELECT MAT, NOME, DEPTO, SALARIO FROM G 2 MINUS 3 SELECT MAT, NOME, DEPTO, SALARIO FROM F; MAT ---------210 250 260 NOME -----------WILIAM DANIEL SILVIA DEP SALARIO --- ---------D11 2009,7 D21 2109,8 D21 1897,5

Nos exemplos apresentamos F G e em seguida G F para que pudssemos observar a diferena nos resultados.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 119

INTRODUO AO ORACLE9I - SQL

INTERSEO
A operao de interseo resulta em um conjunto de valores presente em ambos os conjuntos. Poderamos dizer que o resultado R seria uma relao contendo todas as tuplas presentes em F e G simultaneamente. A operao representada por: R F G. No Oracle o operador INTERSECT atua sobre o resultado das consultas, efetuando uma interseo entre os resultados. A regras relativas interseo de resultados so as mesmas analisadas na unio. SQL> SELECT NOME, DEPTO, SALARIO FROM F 2 INTERSECT 3 SELECT NOME, DEPTO, SALARIO FROM G; NOME -----------ELIZABET GABRIEL JAIRO JOAQUIM MARIA DEP SALARIO --- ---------D11 2447,5 D11 2714,8 D11 2249,5 D21 5115 D11 2347,4

OBS: Para a interseo a ordem dos operandos no importa. Sero apresentadas apenas as tuplas presentes em ambas as tabelas simultaneamente. A interseo feita em relao a toda a linha e no a uma coluna em particular. Para realizar esta operao o Oracle executa uma ordenao nas linhas obtidas das tabelas.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 120

INTRODUO AO ORACLE9I - SQL

PRODUTO
Um produto de conjuntos contm todos os elementos do primeiro conjunto concatenadas com todos os elementos do segundo conjunto. Considerando-se a existncia das duas tabelas F e P, o resultado R uma relao que contm as rows em F concatenadas s rows de P. As tuplas do produto seriam representadas por R F x P. Neste caso, a ordem dos fatores no altera o produto. Inicialmente criaremos uma tabela P contendo poucas linhas. SQL> CREATE TABLE P(DEPTNO, GERENTE) 2 AS SELECT DEPTO.CD_DEPTO, FUNC.NM_FUNC 3 FROM DEPTO, FUNC 4 WHERE DEPTO.CD_GERENTE = FUNC.CD_MAT 5 AND DEPTO.CD_DEPTO IN ('A00', 'D11', 'D21'); Tabela criada. SQL> SELECT * FROM P; DEP --D21 D11 A00 GERENTE -----------EVA IRACY CRISTINA

CAPTULO 4: USANDO MAIS DE UMA TABELA - 121

INTRODUO AO ORACLE9I - SQL No SQL do Oracle, os dois conjuntos participantes do processo de produto so definidos dinamicamente atravs da clusula Select (definindo as colunas a serem apresentadas no resultado) e da clusula From, indicando as tabelas a serem operadas. SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO 2 FROM P, F 3 WHERE MAT BETWEEN 150 AND 200 4 ORDER BY DEPTNO; DEP --A00 A00 A00 A00 A00 A00 D11 D11 D11 D11 D11 D11 D21 D21 D21 D21 D21 D21 GERENTE MAT NOME SALARIO DEP ------------ ---------- ------------ ---------- --CRISTINA 150 BRUNO 2780,8 D11 CRISTINA 160 ELIZABET 2447,5 D11 CRISTINA 170 GABRIEL 2714,8 D11 CRISTINA 180 MARIA 2347,4 D11 CRISTINA 190 JAIRO 2249,5 D11 CRISTINA 200 DAVI 3051,4 D11 IRACY 150 BRUNO 2780,8 D11 IRACY 160 ELIZABET 2447,5 D11 IRACY 170 GABRIEL 2714,8 D11 IRACY 190 JAIRO 2249,5 D11 IRACY 200 DAVI 3051,4 D11 IRACY 180 MARIA 2347,4 D11 EVA 150 BRUNO 2780,8 D11 EVA 160 ELIZABET 2447,5 D11 EVA 200 DAVI 3051,4 D11 EVA 190 JAIRO 2249,5 D11 EVA 180 MARIA 2347,4 D11 EVA 170 GABRIEL 2714,8 D11

18 linhas selecionadas. Observe, no resultado, que a tabela P possui trs linhas relativas aos departamentos A00, D11 e D21. Cada uma destas linhas foi concatenada a cada uma das linhas da tabela F que atendesse restrio de matrcula entre 150 e 200. Como a tabela P possua trs linhas e a restrio sobre a tabela F resultou em seis linhas, o produto das duas tabelas gerou 18 linhas (3 x 6). Observe, porm, que a coluna Depto (da tabela F) indica a que departamento aquele funcionrio pertence. Na mesma linha, esto presentes informaes do departamento (deptno) e do funcionrio (depto). Quando estas informaes so iguais, significa que houve a concatenao da linha do funcionrio com o seu departamento. Quando estas informaes so diferentes, significa que houve a concatenao da linha com um outro departamento qualquer. Quando estabelecemos uma restrio que determine que linhas da tabela P devem ser concatenadas com que linhas da tabela F, estamos determinando uma operao de Juno (ou Join).
CAPTULO 4: USANDO MAIS DE UMA TABELA - 122

INTRODUO AO ORACLE9I - SQL

JOIN OU JUNO
Uma operao de Join contm todos os elementos do primeiro conjunto concatenados a todos os elementos do segundo conjunto que satisfaam regra de comparao indicada. Considerando-se a existncia das duas tabelas F e P, o resultado R uma relao que contm as rows de F concatenadas s rows de P que satisfazem comparao entre os domnios indicados. As tuplas da juno seriam representadas por R F [ depto=deptno ] P. A ordem dos fatores no altera o resultado da juno. No SQL do Oracle, os dois conjuntos participantes do processo de Join so definidos dinamicamente atravs da clusula Select (definindo as colunas a serem apresentadas no resultado), da clusula From, indicando as tabelas a serem operadas, e da clusula Where, contendo a relao entre as tabelas. SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO 2 FROM P, F 3 WHERE MAT BETWEEN 180 AND 270 4 AND DEPTNO = DEPTO 5 ORDER BY DEPTNO; DEP --D11 D11 D11 D11 D21 D21 GERENTE MAT NOME SALARIO DEP ------------ ---------- ------------ ---------- --IRACY 180 MARIA 2347,4 D11 IRACY 190 JAIRO 2249,5 D11 IRACY 200 DAVI 3051,4 D11 IRACY 220 JOANA 3282,4 D11 EVA 230 JOAQUIM 5115 D21 EVA 240 SALVADOR 3163,6 D21

6 linhas selecionadas. Neste primeiro exemplo, as linhas de F foram concatenadas s linhas de P, porm atendendo restrio de que depto = deptno, garantindo que cada departamento seja concatenado exatamente a seus funcionrios.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 123

INTRODUO AO ORACLE9I - SQL No exemplo a seguir, desejamos obter informaes sobre os gerentes dos departamentos. Na tabela P temos o nome do gerente, e na tabela F temos o nome do funcionrio. Nada mais natural, portanto, que realizar um Join entre as tabelas de tal forma que a restrio seja gerente = nome. SQL> SELECT MAT, NOME, SALARIO, DEPTO 2 FROM P, F 3 WHERE NOME = GERENTE; MAT ---------70 60 NOME SALARIO DEP ------------ ---------- --EVA 3978,7 D21 IRACY 3547,5 D11

OBS: no necessrio que faamos a seleo de colunas da tabela P. O que estabelece o produto a presena das duas tabelas na clusula From e o que estabelece a restrio a presena da clusula Where determinando a regra de juno. SQL> SELECT G.MAT, G.NOME, G.SALARIO, 2 F.MAT, F.NOME, F.SALARIO, F.DEPTO 3 FROM F, P, F G 4 WHERE G.NOME = GERENTE 5 AND F.DEPTO = G.DEPTO 6 AND F.SALARIO > G.SALARIO; MAT NOME SALARIO MAT NOME SALARIO DEP ------ ------ ---------- ----- --------- ---------- --70 EVA 3978,7 230 JOAQUIM 5115 D21 No exemplo acima desejvamos obter informaes relativas ao funcionrio que tivesse vencimentos superiores aos do gerente de seu departamento. Desta forma, numa mesma linha precisvamos de informaes referentes ao gerente e ao funcionrio. Como ambos esto presentes na mesma tabela, precisamos utilizar alguns artifcios para que no haja erros de sintaxe ao selecionarmos uma mesma coluna duas vezes.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 124

INTRODUO AO ORACLE9I - SQL Faamos a anlise passo a passo do comando Select desenvolvido : Iniciaremos a anlise pela clusula From. Nela so referenciadas trs tabelas: a tabela P (que contm informaes sobre o departamento), a tabela F (que contm informaes sobre o funcionrio) e novamente a tabela F, agora apelidada de G (que contm informaes sobre o funcionrio gerente). A partir do momento que apelidamos a tabela F de G, para ns e para o Oracle consideraremos a existncia de uma tabela G. Na clusula Select, definimos as informaes que desejamos visualizar de cada uma das tabelas. Como as colunas da tabela F e da tabela G so iguais, h necessidade de qualificarmos as informaes. Desta forma, desejvamos obter a matrcula, nome e salrio do gerente ( g.mat, g.nome e g.salario ) e matrcula, nome, salrio e departamento do funcionrio ( f.mat, f.nome, f.salario e f.depto). A clusula Where o que vai determinar as regras do relacionamento. Precisvamos garantir que o funcionrio e o gerente trabalhassem no mesmo departamento, pois a proposta era obter os funcionrios que tivessem salrio superior ao de seu gerente. Assim, restringimos que os departamentos de ambas as tabelas fossem o mesmo (f.depto = g.depto). Como segunda restrio desejvamos que o salrio do funcionrio fosse superior ao salrio do gerente (f.salario > g.salario). Como restrio final, precisvamos garantir que o funcionrio gerente (obtido da tabela G) fosse realmente gerente de um departamento. Esta informao s se acha presente na tabela P (por este motivo ela foi acrescentada ao Join) e, portanto, igualamos g.nome coluna Gerente.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 125

INTRODUO AO ORACLE9I - SQL NATURAL JOIN O exemplo a seguir j foi visto anteriormente, neste caso fizemos apenas uma mudana na sintaxe. Substitumos a vrgula da listagem anterior pelas palavras Natural Join, outra forma aceita e que tambm produziria os mesmos resultados seria: Natural Inner Join. SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO 2 FROM P NATURAL JOIN F 3 WHERE MAT BETWEEN 180 AND 270 4 AND DEPTNO = DEPTO 5 ORDER BY DEPTNO; DEP --D11 D11 D11 D11 D21 D21 GERENTE MAT NOME SALARIO DEP ------------ ---------- ------------ ---------- --IRACY 180 MARIA 2347,4 D11 IRACY 190 JAIRO 2249,5 D11 IRACY 200 DAVI 3051,4 D11 IRACY 220 JOANA 3282,4 D11 EVA 230 JOAQUIM 5115 D21 EVA 240 SALVADOR 3163,6 D21

6 linhas selecionadas. Em ambos os exemplos utilizamos a condio de igualdade para que tivssemos mais facilidade de entendimento. Este tipo de Join dito eqijoin, isto , usando a igualdade. A forma mais comum de juno entre as duas tabelas o uso do Inner Join com a condio de igualdade, ou seja Inner Eqijoin. Um Inner Join aquele em que somente sero selecionadas para o resultado aquelas linhas que existam em ambos os lados da operao. Para o exemplo em estudo significa que somente aparecer no resultado aquelas linhas de F em que depto esteja preenchido com um valor existente em P. Observe que o departamento A00 no apareceu no resultado (no existe nenhum elemento em F cuja coluna DEPTO esteja preenchida com A00). Da mesma forma se incluirmos linhas na tabela F cujo valor preenchido na coluna DEPTNO no exista em P ou esteja vazio (NULL), no encontraremos estas linhas no resultado do Join. Esta a regra do Inner Join.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 126

INTRODUO AO ORACLE9I - SQL USO DE INNER JOIN COM ON <CONDITION> Nesta sintaxe alternativa para o comando anterior podemos separar as clusulas relativas ligao entre as tabelas no ON <condition> e as demais clusulas de filtragem na clusula WHERE. SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO 2 FROM P INNER JOIN F ON DEPTNO = DEPTO 3 WHERE MAT BETWEEN 180 AND 270 4 ORDER BY DEPTO; DEP --D11 D11 D11 D11 D21 D21 GERENTE MAT NOME SALARIO DEP ------------ ---------- ------------ ---------- --IRACY 180 MARIA 2347,4 D11 IRACY 190 JAIRO 2249,5 D11 IRACY 200 DAVI 3051,4 D11 IRACY 220 JOANA 3282,4 D11 EVA 230 JOAQUIM 5115 D21 EVA 240 SALVADOR 3163,6 D21

6 linhas selecionadas. Isto pode ser muito til, principalmente, quando realizamos um Join envolvendo diversas tabelas e/ou quando a chave para relacionamento constituda de mais de uma coluna. Esta sintaxe torna visveis as restries relativas juno e aquelas relativas a filtragem.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 127

INTRODUO AO ORACLE9I - SQL CROSS JOIN O exemplo a seguir produz exatamente o mesmo resultado do exemplo visto no tpico PRODUTO CARTESIANO. SQL> SELECT DEPTNO, GERENTE, MAT, NOME, SALARIO, DEPTO 2 FROM P CROSS JOIN F 3 WHERE MAT BETWEEN 150 AND 200 4 ORDER BY DEPTO; DEP --D21 D11 A00 D21 D11 A00 D21 D11 A00 D21 D11 A00 D21 D11 A00 D21 D11 A00 GERENTE MAT NOME SALARIO DEP ------------ ---------- ------------ ---------- --EVA 150 BRUNO 2780,8 D11 IRACY 150 BRUNO 2780,8 D11 CRISTINA 150 BRUNO 2780,8 D11 EVA 160 ELIZABET 2447,5 D11 IRACY 160 ELIZABET 2447,5 D11 CRISTINA 160 ELIZABET 2447,5 D11 EVA 170 GABRIEL 2714,8 D11 IRACY 170 GABRIEL 2714,8 D11 CRISTINA 170 GABRIEL 2714,8 D11 EVA 180 MARIA 2347,4 D11 IRACY 180 MARIA 2347,4 D11 CRISTINA 180 MARIA 2347,4 D11 EVA 190 JAIRO 2249,5 D11 IRACY 190 JAIRO 2249,5 D11 CRISTINA 190 JAIRO 2249,5 D11 EVA 200 DAVI 3051,4 D11 IRACY 200 DAVI 3051,4 D11 CRISTINA 200 DAVI 3051,4 D11

18 linhas selecionadas. Substitumos a vrgula pelo texto CROSS JOIN. O resultado um produto cartesiano, isto , cada uma das linhas de P concatenada com cada uma das linha de F, produzindo 18 linhas no resultado aps a filltragem de matrcula (entre 150 e 200). Esta sintaxe torna mais clara a inteno do programador no sentido de obter um produto cartesiano. Isto, certamente, facilita a manuteno posterior de um programa pois indica claramente a inteno do resultado.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 128

INTRODUO AO ORACLE9I - SQL

DIVISO
As tuplas da diviso seriam representadas por R F [depto : deptno] P. A ordem dos operandos afeta o resultado da operao. No SQL do Oracle no existe um operando especfico para a realizao desta operao, portanto no a trataremos neste curso (a operao pode ser realizada atravs de clusulas como Group By, Subselect, etc.).

CAPTULO 4: USANDO MAIS DE UMA TABELA - 129

INTRODUO AO ORACLE9I - SQL

LABORATRIO 4:
1. Deseja-se uma lista contendo o nome do projeto, o nome das atividades e tempo de durao de cada atividade (fornecido em nmero de horas). Ordene o resultado por projeto e atividade. 2. Produza uma relao dos funcionrios que possuam cargo igual ao cargo de algum dos funcionrios do departamento D11. 3. Deseja-se uma lista (nome, sobrenome, matrcula, ramal e depto) de todos os funcionrios que sejam responsveis por projeto, porm no sejam gerentes. 4. Deseja-se uma lista (nome, sobrenome, matrcula, ramal e depto) de todos os funcionrios que sejam responsveis por projetos e sejam, simultaneamente, gerentes. 5. Produza uma lista (nome e salrio) dos funcionrios que ganhem menos que todos os funcionrios com idade menor que 25 anos (usar subselect). 6. Produza uma lista dos funcionrios (nome e salrio) do sexo feminino que ganhem mais que todos os funcionrios do sexo masculino. 7. Deseja-se saber quais os departamentos que no possuem funcionrios (usar Minus). 8. Deseja-se uma lista contendo o nome e departamento do gerente e nome e salrio de todos os funcionrios subordinados a ele. Apresente o resultado ordenado por departamento e salrio (descendente).

OPCIONAIS 9. Deseja-se uma lista contendo o nome do projeto, o nome do departamento responsvel e o nome do funcionrio responsvel, desde que ele trabalhe no departamento responsvel pelo projeto. 10.Produza uma lista dos funcionrios (nome, nome departamento e tempo de empresa) que sejam gerentes e seus respectivos departamentos em ordem descendente de tempo de empresa. 11. Deseja-se uma lista (nome depto, nome depto contbil e cdigos) ordenada por departamento contbil. 12. Deseja-se uma lista (nome, sobrenome, matrcula, ramal e depto) de todos os gerentes que sejam responsveis por projetos no pertencentes ao seu departamento.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 130

INTRODUO AO ORACLE9I - SQL 13. Deseja-se obter uma lista(nome, salrio, depto) dos funcionrios que so gerentes. O salrio deve ser criptografado de acordo com as regras abaixo: 00 ser convertido para 9 ser convertido para 8, 7, 6 sero convertidos para 5 ser convertido para 4,3 sero convertidos para 2,1 sero convertidos para A X Y Z K W

14. Deseja-se saber o cdigo e nome do projeto, cdigo e nome da atividade e o tempo de durao da atividade durante o ano de 1996. Ordene o resultado por nome do projeto e nome da atividade. Se uma atividade se iniciou antes de 1996 e terminou durante o ano de 1996, desejamos saber apenas quanto tempo ela durou de 01/01/96 at a data de trmino. Se uma atividade comeou durante o ano de 1996 e terminou em outro ano, desejamos saber apenas o tempo da data de incio da atividade at dia 31/12/1996. Se uma atividade comeou antes de 1996 e terminou depois de 1996, sua durao ser de 01/01 a 31/12. Se uma atividade comeou e terminou em 1996, sua durao ser desde a data de incio at a data de trmino.

CAPTULO 4: USANDO MAIS DE UMA TABELA - 131

INTRODUO AO ORACLE9I - SQL

CAPTULO 5: GRUPAMENTOS E FUNES


Iniciaremos este captulo estudando as funes de grupo, que cresceram bastante em nmero na verso 9i, em seguida veremos as clusula GROUP BY e HAVING e, finalmente, veremos um novo grupo de funes disponibilizadas a partir da 9i, as funes analticas.

FUNES DE GRUPO OU DE AGREGAO


So programas que tm a finalidade de efetuar clculos sobre um conjunto de linhas e retornam um valor.

CONCEITOS GERAIS
Elas se aplicam a um grupo de linhas e retornam um nico valor relativo a todo o grupo selecionado. Neste conjunto o Oracle disponibiliza 34 funes que conheceremos a seguir. O argumento para estas funes pode ser o nome de uma coluna ou uma expresso (combinao de nomes de colunas, constantes ou outras funes). SQL> SELECT SUM(VL_SAL), AVG(VL_SAL), MAX(VL_SAL), 2 MIN(VL_SAL), COUNT(CD_MAT) 3 FROM FUNC; SUM(VL_SAL) AVG(VL_SAL) MAX(VL_SAL) MIN(VL_SAL) COUNT(CD_MAT) ----------- ----------- ----------- ----------- ------------95772,05 3089,42097 5802,5 1687,4 35 Neste primeiro exemplo, o grupo sobre o qual os clculos foram feitos foi toda a tabela FUNC, uma vez que no limitamos as linhas selecionadas (Where). Obtivemos a soma de todos os salrios cadastrados, a mdia salarial (aritmtica), o valor do maior e do menor salrio e a quantidade de linhas encontradas na tabela. Dentro do algoritmo de clculo das funes de grupo, as linhas com NULL so excludas da etapa de avaliao. Caso esta ao no fosse efetuada, o resultado, freqentemente, seria NULL, uma vez que ao operarmos um valor desconhecido (NULL) com um valor conhecido o resultado ser invariavelmente desconhecido.

CAPTULO 5: GRUPAMENTOS E FUNES - 132

INTRODUO AO ORACLE9I - SQL Para conferncia dos resultados gerados, realizaremos os testes baseados na massa de dados abaixo. Nesta massa de teste, temos duas linhas em que a coluna VL_SAL no est preenchida. SQL> SELECT CD_MAT, NM_FUNC, VL_SAL, NR_CARGO 2 FROM FUNC 3 WHERE CD_DEPTO = 'A02'; CD_MAT ---------101 102 103 104 105 106 107 108 NM_FUNC VL_SAL NR_CARGO ------------ ---------- ---------TESTE1 100 32 TESTE2 200 45 TESTE3 200 65 TESTE4 300 21 TESTE5 100 32 TESTE6 TESTE7 100 8 TESTE8 12

8 linhas selecionadas. OBS: ALL a opo default para todas as funes de grupo; todos os valores (exceto NULL) so passados como argumento das funes.

CAPTULO 5: GRUPAMENTOS E FUNES - 133

INTRODUO AO ORACLE9I - SQL

AVG
Retorna a mdia dos valores de <expresso>. Ela pode ser usada como uma funo de agregao ou analtica. Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null. SINTAXE:

CORR
Retorna o coeficiente da correlao de um conjunto de pares de nmeros. Ela pode ser usada como uma funo de agregao ou analtica. SINTAXE:

Os parmetros <expr1> e <expr2> devem ser numricos. Os pares em que <expr1> ou <expr2> estiverem sem valor so excludos do resultado. A frmula de clculo para esta funo a seguinte: COVAR_POP(<expr1>, <expr2>) / (STDDEV_POP (<expr1>) * STDDEV_POP (<expr2>)) Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null.

COUNT
Retorna o nmero de linhas que satisfaam a query. Ela pode ser usada como uma funo de agregao ou analtica. SINTAXE:

COVAR_POP
Retorna a covarincia populacional de um conjunto de pares numricos. Ela pode ser usada como uma funo de agregao ou analtica. SINTAXE:

Os parmetros <expr1> e <expr2> devem ser numricos. Os pares em que <expr1> ou <expr2> estiverem sem valor so excludos do resultado. A frmula de clculo para esta funo a seguinte: (SUM(<expr1> * <expr2>) (SUM(<expr2>) * SUM(<expr1>)) / n) / n
CAPTULO 5: GRUPAMENTOS E FUNES - 134

INTRODUO AO ORACLE9I - SQL Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null. O divisor n indica a quantidade de linhas onde <expr1> e <expr2> esto preenchidos.
SQL> SELECT AVG(VL_SAL) AVG, 2 COUNT(VL_SAL) CT_SAL, COUNT(CD_MAT) CT_MAT, COUNT(*) COUNT, 3 SUM(VL_SAL) S_SAL, SUM(NR_CARGO) S_CARGO, SUM(VL_SAL * NR_CARGO) S_PROD, 4 CORR(VL_SAL, NR_CARGO) CORR, 5 COVAR_POP(VL_SAL, NR_CARGO) COVAR_POP 6 FROM FUNC 7 WHERE CD_DEPTO = 'A02'; AVG CT_SAL CT_MAT COUNT S_SAL S_CARGO S_PROD CORR COVAR_POP ---------- ------ ------- ------ ------ ------- ------- ---------- ---------166,666667 6 8 8 1000 215 35500 ,207533207 277,777778

A funo AVG nos traz como resultado 166,667, indicando que a soma das linhas (1000) foi dividida por 6 (linhas em que salrio tem valor) e no por 8 (total de linhas que atendem condio de busca). As linhas em que salrio no possui valor (NULL) so ignoradas para clculo do resultado. A funo Count sobre a coluna vl_sal nos traz como resultado 6, indicando que das linhas selecionadas seis possuem valor na coluna vl_sal. Quando a mesma funo Count aplicada sobre a coluna cd_mat (primary key), que possui valor para todas as linhas, o resultado 8, indicando que foram selecionadas oito linhas na consulta. Observe que a funo Count com o argumento * (asterisco) retorna o mesmo valor que para a coluna cd_mat. Esta sintaxe fornece o nmero de linhas selecionadas no comando, independente de qualquer coluna. Pode ser usada sempre que desejarmos saber a quantidade de linhas obtidas. A funo Sum soma todas as linhas no nulas do resultado. Caso as linhas com valor Null fossem includas, o valor seria, necessriamente Null (isto desconhecido). A frmula da funo Covar_Pop utiliza apenas a funo Sum sendo, neste caso mais fcil de conferirmos o resultado. Se aplicarmos a frmula ( [35500 [[215*1000 ] / 6 ]] / 6 ) diretamente aos valores obtidos separadamente no exemplo verificaremos que o resultado obtido negativo (-55.556). Devemos observar que a descrio da funo diz que as linhas em que uma das expresses Null excludo do resultado, neste caso a linha com cargo 12 no entra nos clculos. A frmula modificada ([35500 [[203*1000 ] / 6 ]] / 6 ) em funo desta regra obtm o valor esperado de 277,778.

CAPTULO 5: GRUPAMENTOS E FUNES - 135

INTRODUO AO ORACLE9I - SQL

COVAR_SAMP
Retorna a covarincia simples de um conjunto de pares numricos. Ela pode ser usada como uma funo de agregao ou analtica. SINTAXE:

Os parmetros <expr1> e <expr2> devem ser numricos. Os pares em que <expr1> ou <expr2> estiverem sem valor so excludos do resultado. A frmula de clculo para esta funo a seguinte: (SUM(<expr1> * <expr2>) (SUM(<expr2>) * SUM(<expr1>)) / n) / (n-1) Se a funo for aplicada a um grupamento vazio (sem linhas) o retorno null. O divisor n indica a quantidade de linhas onde <expr1> e <expr2> esto preenchidos.

CUME_DIST
Esta funo calcula a distribuio cumulativa de um valor em um grupo de valores. O valor retornado por esta funo estar dentro do intervalo > 0 e <= 1. SINTAXE:

Ela calcula, para uma linha hipottica R identificada pelos argumentos da funo e especificao de ordenao, a posio relativa de R no grupo de agregao. O clculo considera como se R estivesse inserida no grupo de linhas a serem agregadas. Os argumentos da funo identificam um nica linha dentro de cada grupo, desta forma devem estar associados a expresses constantes dentro de cada grupo. O nmero de expresses no argumento e na clusula Order By devem ser idnticos pois sero considerados 1 para 1 posicionalmente.

CAPTULO 5: GRUPAMENTOS E FUNES - 136

INTRODUO AO ORACLE9I - SQL

DENSE_RANK
Esta funo calcula o posicionamento (rank) de uma linha em um grupo ordenado de linhas. O posicionamento consecutivo, inteiro, comeando em 1. SINTAXE:

O maior valor do Rank corresponde ao nmero de valores distintos retornados pela query. Ela calcula o posicionamento relativo de uma linha hipottica identificada pelos argumentos da funo de acordo com a ordenao especificada. Os argumentos da funo identificam uma nica linha dentro de cada grupo, desta forma devem estar associados a expresses constantes dentro de cada grupo. O nmero de expresses no argumento e na clusula Order By devem ser idnticos pois sero considerados 1 para 1 posicionalmente.

FIRST
Pode ser usada como funo de agregao ou analtica. Opera em um conjunto de valores a partir de um conjunto de linhas que rank (so identificadas) como FIRST com relao a uma determinada ordem. SINTAXE:

Se somente uma linha for classificada (rank) como FIRST, a agregao realizada em um conjunto de apenas uma linha. A funo de agregao utilizada em conjunto pode ser MIN, MAX, SUM, COUNT, AVG, VARIANCE ou STDDEV.

CAPTULO 5: GRUPAMENTOS E FUNES - 137

INTRODUO AO ORACLE9I - SQL


SQL> SELECT CUME_DIST(300) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS FIRST) CUME_A, 2 CUME_DIST(300) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS FIRST) CUME_D, 3 DENSE_RANK(300) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS FIRST) RANK_A, 4 DENSE_RANK(300) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS FIRST) RANK_D, 5 MAX(NR_CARGO) KEEP (DENSE_RANK FIRST ORDER BY VL_SAL ASC NULLS LAST) FIRST_A, 6 MAX(NR_CARGO) KEEP (DENSE_RANK FIRST ORDER BY VL_SAL DESC NULLS LAST) FIRST_D 7 FROM FUNC 8 WHERE CD_DEPTO = 'A02'; CUME_A CUME_D RANK_A RANK_D FIRST_A FIRST_D ---------- ---------- ---------- ---------- ---------- ---------1 ,444444444 4 2 32 21

No exemplo acima observamos que as funes Cume_Dist e Dense_Rank receberam como parmetro a constante 300. Poderamos ter fornecido mais de um valor (separados por vrgulas), desde que constantes. Como primeiro resultado da Cume_Dist para o valor 300 recebemos 1, isto significa que 100% das linhas selecionadas possuiam valores de salrio menores (ou igual) que 300 considerando-se um total de 9 linhas ordenadas ascendentemente por salrio (o valor 300 includo no resultado) e nos quais os valores Null so considerados os menores. O segundo resultado (44,44%) indica que o clculo 4/9 foi realizado. Este clculo possui a seguinte lgica, o valor 300 includo na lista de valores, desta forma passamos de 8 linhas para 9. Como os valores com Null foram colocados na frente, os dois valores 300 (o da linha com matrcula 104 e o da constante) ocuparam respectivamente o terceiro e quarto lugares na seqncia de leitura. Como o clculo se refere a todos os valores maiores ou iguais a 300 (devido ordenao estabelecida), escolhe-se a posio 4 como numerador do clculo. Se toda esta explicao est confusa para voc, faa as contas com um valor que no tenha na sua lista, por exemplo 290 ou 310. Outro teste interessante retirar as linhas com Null da query (where vl_sal is not null). Estas duas modificaes devem te ajudar a entender melhor o resultado. A primeira construo funo Dense_Rank, classifica o valor da expresso (no caso 300) dentro do conjunto de valores selecionados e de acordo com a ordenao especificada na clusula Within Group. O resultado 4, o que indica que a classificao 1 atribuda s linhas com NULL (pois indicamos que NULLS FIRST), a classificao 2 para as linhas com salrio 100, a classificao 3 para as linhas com salrio 200 e a 4 para o valor 300. Observe que a classificao do valor e no da quantidade de linhas. A segunda construo, com ordenao descendente classifica o valor 300 em segundo lugar, j que o primeiro ocupado pelas linhas com salrio null (Nulls First). A primeira construo da funo FIRST, obter o maior cargo (max) das linhas classificadas como FIRST. Esta classificao dada atravs da ordenao de salrio, no caso ASC e com nulls no fim. Sendo assim o menor valor de salrio 100 (as linhas com salrio 100 so, portanto, classificadas como FIRST). Das 3 linhas com salrio 100, o maior cargo 32. No segundo exemplo a ordenao de salrio descendente, desta forma a linha com salrio 300 classificada como FIRST e, portanto, o maior (e nico) cargo 21.
CAPTULO 5: GRUPAMENTOS E FUNES - 138

INTRODUO AO ORACLE9I - SQL

GROUP_ID
Esta funo distinge linhas duplicadas resultantes de uma especificao GROUP BY. Ela somente vlida em comandos SELECT que utilizem a clusula GROUP BY. SINTAXE: GROUP_ID ( ) Se houverem n duplicatas para um determinado grupamento a funo retornar valores de 0 a n-1.

GROUPING
Esta funo distinge valores relativos a uma agregao que utilize GROUP BY juntamente com as extenses ROLLUP ou CUBE. SINTAXE: GROUPING ( <expr> ) O objetivo determinar quando o valor null de uma determinada expresso significa uma agregao e quando significa o valor real (ou ausente) da expresso. A <expresso> que viermos a usar na funo GROUPING deve ser compatvel com o valor usado na clusula GROUP BY. O retorno da funo 1 se o valor de <expresso> null significando um conjunto de todos os valores e 0 se o null significar valor ausente.

GROUPING_ID
Retorna um nmero que corresponde ao Grouping bit vector associado com uma linha. SINTAXE: GROUPING ( <expr> [ , <expr> [ , <expr> ... ] ] ) aplicvel somente a comandos SELECT que incluam a clusula GROUP BY com a extenso ROLLUP ou CUBE e uma funo GROUPING.

LAST
Pode ser usada como funo de agregao ou analtica. SINTAXE:

Opera em um conjunto de valores a partir de um conjunto de linhas que rank (so identificadas) como LAST com relao a uma determinada ordem. Se somente uma linha for classificada (rank) como LAST, a agregao realizada em um conjunto de apenas uma linha. A funo de agregao utilizada em conjunto pode ser MIN, MAX, SUM, COUNT, AVG, VARIANCE ou STDDEV.
CAPTULO 5: GRUPAMENTOS E FUNES - 139

INTRODUO AO ORACLE9I - SQL

MAX
Retorna o maior valor de <expresso>. Pode ser usada como uma funo de agregao ou analtica. SINTAXE:

MIN
Retorna o menor valor de <expresso>. Pode ser usada como uma funo de agregao ou analtica. SINTAXE:

PERCENT_RANK
Esta funo similar a CUME_DIST (distribuio cumulativa). O intervalo de valores retornados por PERCENT_RANK de 0 a 1 (inclusive). A primeira linha em qualquer conjunto tem um PERCENT_RANK de 0. SINTAXE:

SQL> SELECT MIN(NR_CARGO) KEEP (DENSE_RANK LAST ORDER BY VL_SAL ASC NULLS LAST) L_ASC, 2 MIN(NR_CARGO) KEEP (DENSE_RANK LAST ORDER BY VL_SAL DESC NULLS FIRST) L_DESC, 3 MAX(VL_SAL) MX_SAL, MAX(NR_CARGO) MX_CRG, 4 MIN(VL_SAL) MN_SAL, MIN(NR_CARGO) MN_CRG, 5 PERCENT_RANK (310) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS LAST) P310_ASC, 6 PERCENT_RANK (290) WITHIN GROUP(ORDER BY VL_SAL ASC NULLS LAST) P290_ASC, 7 PERCENT_RANK (310) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS LAST) P310_DESC, 8 PERCENT_RANK (290) WITHIN GROUP(ORDER BY VL_SAL DESC NULLS LAST) P290_DESC 9 FROM FUNC 10 WHERE CD_DEPTO = 'A02'; L_ASC L_DESC MX_SAL MX_CRG MN_SAL MN_CRG P310_ASC P290_ASC P310_DESC P290_DESC ----- ------- ------- ------- ------- ------- -------- --------- ---------- ---------12 8 300 65 100 8 ,75 ,625 0 ,125

A primeira construo da funo LAST, obter o menor cargo (min) das linhas classificadas como LAST.

CAPTULO 5: GRUPAMENTOS E FUNES - 140

INTRODUO AO ORACLE9I - SQL Esta classificao dada atravs da ordenao de salrio, no caso ASC e com nulls no fim. Sendo assim o maior valor de salrio NULL (as linhas sem salrio so, portanto, classificadas como LAST). Das 2 linhas com salrio 100, o menor cargo 12. No segundo exemplo a ordenao de salrio descendente e as linhas sem salrio (NULL) so colocadas no incio da fila, desta forma as linhas com salrio 100 so classificadas como LAST e, portanto, o menor dete grupo cargo 8. As funes max e min so facilmente compreendidas por ns. O maior salrio, desconsiderando-se as linhas sem salrio, 300 e o maior cargo 65. O menor salrio e o menor cargo so, respectivamente, 100 e 8. Nos testes da funo Percent_Rank utilizamos, desta vez, valores que no pertencem lista de valores presentes na tabela. Como esta funo similar funo Cume_Dist j sabemos que a frmula corresponde diviso da posio da linha em questo em relao posio da ltima linha do grupo. Como esta funo inicia a classificao em zero, temos como primeira frmula a diviso de 6 por 8, ou seja, a posio da linha com valor de salrio 310 6 (os trs valores 100 ocupam as posies 0, 1 e 2; os dois valores 200 ocupam as posies 3 e 4; o valor 300 ocupa a quinta posio; o valor 310 a sexta e os dois valores null as posies 7 e 8) e da ltima linha 8. O resultado 0.75 corresponde a esta diviso. No segundo exemplo temos 5 sobre 8 (os trs valores 100 ocupam as posies 0, 1 e 2; os dois valores 200 ocupam as posies 3 e 4; o valor 290 ocupa a quinta posio; o valor 300 a sexta posio e os dois valores null as posies 7 e 8). No terceiro exemplo, pela classificao, o valor 310 o primeiro da lista, recebendo o valor 0, que dividido por qualquer valor d zero. No ltimo exemplo a diviso realizada de 1 por 8.

PERCENTILE_CONT
Esta funo realiza uma distribuio inversa considerando um modelo de distribuio contnua. SINTAXE:

Ela obtm um valor percentual e uma especificao de ordenao e retorna um valor interpolado que deve cair dentro do percentual em relao especificao de ordenao. Os nulls so ignorados no clculo. O parmetro deve ser uma constante com valor entr 0 e 1, pois indica um valor percentual.

CAPTULO 5: GRUPAMENTOS E FUNES - 141

INTRODUO AO ORACLE9I - SQL A clusula ORDER BY deve ser composta de uma nica expresso numrica ou datetime. O resultado calculado por uma interpolao linear entre os valores aps a ordenao. Usando-se o valor percentual (P) e o nmero de linhas (N) no grupo de agregao, determina-se o nmero da linha de interesse. Este nmero de linha calculado de acordo com a frmula: RN = (1 + (P * ( N 1) O resultado final da funo de agregao calculado pela interpolao linear entre os valores das linhas relativas ao nmero da linha, onde CRN = CEILING(RN) e FRN = FLOOR(RN). O resultado final ser o valor da expresso da linha em RN se CRN=FRN=RN (no houver mais de um valor resultante) ou (CRN RN) * (valor da expresso da linha em FRN) + (RN FRN) * (valor da expresso da linha em CRN). Tambm pode ser usada como funo analtica.

PERCENTILE_DISC
uma distribuio inversa que assume um modelo de distribuio discreta. SINTAXE:

Ela recebe um valor percentual e uma especificao de ordenao e retorna um elemento do conjunto. Os Nulls so ignorados no clculo. O parmetro deve ser uma constante com valor numrico entre 0 e 1 pois corresponde a um percentual. A clusula ORDER BY no possui restries de tipo. Para um determinado valor percentual P e de acordo com a ordenao, a funo retornar o menor valor CUME_DIST (com relao mesma especificao de ordenao) que seja maior ou igual ao parmetro P.

CAPTULO 5: GRUPAMENTOS E FUNES - 142

INTRODUO AO ORACLE9I - SQL

RANK
CaLcula o posicionamento (rank) de um valor em um grupo de valores. As linhas com valores iguais recebem a mesma classificao. Calcula a posio de uma linha hipottica identificada pelos argumentos da funo com relao a uma oredenao. Os argumentos da funo devem ser constantes. O nmero de expresses no argumento e na clusula Order By devem ser idnticos pois sero considerados 1 para 1 posicionalmente. SQL> SELECT PERCENTILE_CONT(.5) WITHIN GROUP (ORDER BY VL_SAL ASC) CONT_ASC, 2 PERCENTILE_CONT(.5) WITHIN GROUP (ORDER BY VL_SAL DESC) CONT_DESC, 3 PERCENTILE_DISC(.5) WITHIN GROUP (ORDER BY VL_SAL ASC) DISC_ASC, 4 PERCENTILE_DISC(.5) WITHIN GROUP (ORDER BY VL_SAL DESC) DISC_DESC, 5 RANK(290) WITHIN GROUP (ORDER BY VL_SAL ASC NULLS FIRST) RK_ASC, 6 RANK(290) WITHIN GROUP (ORDER BY VL_SAL DESC NULLS FIRST) RK_DESC 7 FROM FUNC 8 WHERE CD_DEPTO = 'A02'; CONT_ASC CONT_DESC DISC_ASC DISC_DESC RK_ASC RK_DESC ---------- ---------- ---------- ---------- ---------- ---------150 150 100 200 8 4 Para as funes Percentile, passamos como parmetro um percentual e recebemos como resultado um valor relativo expresso de ordenao (no nosso caso VL_SAL), ou seja, elas funcionam de forma inversa da funo CUME_DIST. Nos quatro exemplos passamos como parmetro 50%. Uma vez que nestas funes os valores NULLS so eliminados, a quantidade de linhas teis passa a ser 6 e 50%, ou seja o centro da lista, corresponde a duas linhas, uma linha com valor 100 e uma linha com valor 200 (tanto ascendentemente quanto descendentemente). Para Percentile_Cont, uma vez que no conseguimos obter uma nica linha (veja a seguir o clculo de RN), devemos aplicar a frmula (CRN RN) * (valor da expresso da linha em FRN) + (RN FRN) * (valor da expresso da linha em CRN). Como primeiro passo devemos determinar a linha de interesse, ou seja, RN = (1 + P * (N 1)), no nosso caso, temos que RN = (1 + 0.5 * (6 1)), onde P o percentual (0.5) e N a quantidade de linhas (6). O resultado RN=3.5. O valor de CRN (o menor inteiro maior que RN) 4. O valor de FRN (o maior inteiro menor que RN) 3. Uma vez que RN representa a linha desejada e a linha 3.5 no existe, devemos aplicar a frmula mostrada acima e obter o valor de salrio. Valor = (4 3.5) * (salrio na linha FRN = 100) + (3.5 3) * (salrio na linha CRN = 200) Valor = 0.5 * 100 + 0.5 * 200 = 50 + 100 = 150
CAPTULO 5: GRUPAMENTOS E FUNES - 143

INTRODUO AO ORACLE9I - SQL Para Percentile_Disc no feita a interpolao, o valor retornado ser o primeiro em relao s linhas que atendem ao percentual, ou seja ser o valor da linha FRN. Neste caso temos valores diferentes para ordenaes diferentes. Para ordenao ascendente, o valor correspondente linha 3 (FRN) 100 e para ordenao descendente, o valor correspondente linha 3 (FRN) 200. A funo Rank d a posio relativa do valor na lista ordenada, considerando o valor inserido no grupo, desta forma o primeiro resultado 8, considera a seguinte lista: null (1), null (2), 100 (3), 100 (4), 100 (5), 200 (6), 200 (7), 290 (8) e 300 (9). No segundo exemplo, temos a posio 4 para o valor de salrio 290, o que significa: null (1), null (2), 300 (3), 290 (4), 200 (5), 200 (6), 100 (7), 100 (8) e 100 (9).

CAPTULO 5: GRUPAMENTOS E FUNES - 144

INTRODUO AO ORACLE9I - SQL As funes a seguir calculam a regresso linear de um conjunto de duplas de nmeros. Podem ser usadas como funes de agregao ou analticas. SINTAXE:

REGR_AVGX
Avalia a mdia da varivel independente, representada por <expresso2> da regresso linear. Ela calcula AVG(<expresso2>) aps a eliminao das linhas em que <expresso1> ou <expresso2> no possuem valor (NULL).

REGR_AVGY
Avalia a mdia da varivel dependente, representada por <expresso1> da regresso linear. Ela calcula AVG(<expresso1>) aps a eliminao das linhas em que <expresso1> ou <expresso2> no possuem valor (NULL).

REGR_COUNT
Retorna um inteiro que representa o nmero de pares no nulos usados para clculo da regresso linear.

REGR_INTERCEPT
Retorna o y-intercept da regresso linear. Aps a eliminao dos pares de nulos o seguinte clculo realizado: AVG(<expr1>) REGR_SLOPE(<expr1>, <expr2>) * AVG(<expr2>)

CAPTULO 5: GRUPAMENTOS E FUNES - 145

INTRODUO AO ORACLE9I - SQL

REGR_R2
Retorna o coeficiente de determinao para a regresso. Aps a eliminao dos pares nulos o seguinte clculo realizado: IF VAR_POP (<expr2>) = 0 THEN NULL; ELSIF VAR_POP (<expr1>) = 0 AND VAR_POP(<exp2>) <> 0 THEN 1; ELSIF VAR_POP(<expr1>) > 0 AND VAR_POP(<expr2>) != 0 THEN POWER(CORR(<expr1>,<expr2>),2); ELSE NULL;

REGR_SLOPE
Retorna o declive da linha. Aps a eliminao dos pares nulos, o seguinte clculo realizado: COVAR_POP(<expr1>, <expr2>) / VAR_POP(<expr2>)

REGR_SXX
As funes Regr_Sxx, Regr_Sxy e Regr_Syy so funes auxiliares usadas para calcular vrias estatsticas. Aps a eliminao dos pares nulos, o seguinte clculo realizado: REGR_COUNT(<expr1>, <expr2>) * VAR_POP(<expr2>)

REGR_SXY
As funes Regr_Sxx, Regr_Sxy e Regr_Syy so funes auxiliares usadas para calcular vrias estatsticas. Aps a eliminao dos pares nulos, o seguinte clculo realizado: REGR_COUNT(<expr1>, <expr2>) * COVAR_POP(<expr1>, <expr2>)

REGR_SYY
As funes Regr_Sxx, Regr_Sxy e Regr_Syy so funes auxiliares usadas para calcular vrias estatsticas. Aps a eliminao dos pares nulos, o seguinte clculo realizado: REGR_COUNT(<expr1>, <expr2>) * VAR_POP(<expr1>)

CAPTULO 5: GRUPAMENTOS E FUNES - 146

INTRODUO AO ORACLE9I - SQL SQL> SELECT REGR_AVGX(VL_SAL, NR_CARGO) AVG_CRG, 2 REGR_AVGY(VL_SAL, NR_CARGO) AVG_SAL, 3 REGR_COUNT(VL_SAL, NR_CARGO) COUNT, 4 REGR_SLOPE(VL_SAL, NR_CARGO) SLOPE, 5 REGR_INTERCEPT(VL_SAL, NR_CARGO) INTERC, 6 REGR_R2(VL_SAL, NR_CARGO) R2, 7 REGR_SXX(VL_SAL, NR_CARGO) SXX, 8 REGR_SXY(VL_SAL, NR_CARGO) SXY, 9 REGR_SYY(VL_SAL, NR_CARGO) SYY 10 FROM FUNC 11 WHERE CD_DEPTO = 'A02';
AVG_CRG AVG_SAL COUNT SLOPE INTERC R2 SXX SXY SYY --------- --------- ----- --------- --------- ---------- --------- --------- --------33,833333 166,66667 6 ,86140064 137,52261 ,043070032 1934,8333 1666,6667 33333,333

Neste exemplo analisaremos apenas os trs primeiros resultado, pois os demais podem ser conferidos diretamente pelas frmulas descritas. Dentro da nossa massa de dados apenas seis linhas (veja REGR_COUNT) possuem valor em ambas as colunas VL_SAL e NR_CARGO, portanto, este ser a quantidade utilizada para clculo em todas as funes deste grupo. Para a mdia de NR_CARGO (calculada por REGR_AVGX) devemos levar em considerao os valores (8 + 32 + 32 + 45 + 65 + 21) divididos por 6. Para a mdia de VL_SAL (calculada por REGR_AVGY) devemos levar em considerao os valores (100 + 100 + 100 + 200 + 200 + 300) divididos por 6.

STDDEV
Retorna o desvio padro simples da <expresso>. SINTAXE:

Pode ser usada tanto como funo de agregao como funo analtica. Retorna 0 quando houver apenas uma linha de entrada. O resultado corresponde raiz quadrada da varincia.

CAPTULO 5: GRUPAMENTOS E FUNES - 147

INTRODUO AO ORACLE9I - SQL

STDDEV_POP
Calcula o desvio padro populacional e retorna a raiz quadrada da varincia populacional. SINTAXE:

Pode ser usada como uma funo de agregao ou como funo analtica. Retorna Null se o retorno da funo VAR_POP for Null.

STDDEV_SAMP
Calcula o desvio padro simples cumulativo e retorna a raiz quadrada da varincia simples. Pode ser usada como funo de agregao ou analtica. SINTAXE:

Utiliza a funo VAR_SAMP como entrada. Se o resultado de VAR_SAMP for null, seu retorno tambm ser null.

SUM
Retorna o somatrio dos valores de <expresso>. Pode ser usada como funo de agregao ou analtica. SINTAXE:

VAR_POP
Retorna a varincia populacional de um conjunto de linhas aps descartar as linha nulas. Pode ser usada como funo de agregao ou analtica. SINTAXE:

Se o conjunto de entrada for vazio, o resultado ser null. O seguinte clculo realizado: (SUM(<expr> ** 2) - SUM(<expr>) ** 2 / COUNT(<expr>)) / COUNT(<expr>)

CAPTULO 5: GRUPAMENTOS E FUNES - 148

INTRODUO AO ORACLE9I - SQL

VAR_SAMP
Retorna a varincia simples de um conjunto de linhas aps descartar as linha nulas. Pode ser usada como funo de agregao ou analtica. SINTAXE:

Se o conjunto de entrada for vazio, o resultado ser null. O seguinte clculo realizado: (SUM(<expr> ** 2) - SUM(<expr>) ** 2 / COUNT(<expr>)) / (COUNT(<expr>) 1) Esta funo similar funo VARIANCE, exceto que para um elemento a funo VARIANCE retorna 0 e VAR_SAMP retorna null.

VARIANCE
Retorna a varincia dos valores de <expresso>. SINTAXE:

Pode ser usada como funo de agregao ou analtica. O clculo da varincia feito da seguinte forma: IF <quantidade de linhas> = 1 THEN 0 ELSE VAR_SAMP(<expr>) SQL> SELECT STDDEV(VL_SAL) SDEV, STDDEV_POP (VL_SAL) SDEV_POP, 2 STDDEV_SAMP(VL_SAL) SDEV_SAMP, 3 SUM(VL_SAL) SUM, SUM(DISTINCT VL_SAL) SUM_DIST, 4 SUM(POWER(VL_SAL,2)) SUM_2, POWER(SUM(VL_SAL),2) "SUM**2", 5 VAR_POP(VL_SAL) VAR_POP, VAR_SAMP(VL_SAL) VAR_SAMP, 6 VARIANCE(VL_SAL) VAR 7 FROM FUNC 8 WHERE CD_DEPTO = 'A02';
SDEV SDEV_POP SDEV_SAMP SUM SUM_DIST SUM_2 SUM**2 VAR_POP VAR_SAMP VAR --------- --------- --------- ---- -------- ------ ------- --------- --------- --------81,649658 74,535599 81,649658 1000 600 200000 1000000 5555,5556 6666,6667 6666,6667

Comeando pelo fim, confirmamos que o resultado da funo VARIANCE e VAR_SAMP so iguais pois a quantidade de linhas informadas para a funo foi maior que 1.
CAPTULO 5: GRUPAMENTOS E FUNES - 149

INTRODUO AO ORACLE9I - SQL A funo SUM, presente no resultado pode ser utilizada juntamente com a clusula DISTINCT indicando que somente valores diferentes de salrio sero somados (100 + 200 + 300). Para conferirmos os valores das demais funes devemos apenas realizar os clculos descritos acima, considerando o resultado de SUM_2 como sendo sum(vl_sal 2) e SUM**2 como sendo sum(vl_sal)2. A quantidade de linhas para salrio 6.

CAPTULO 5: GRUPAMENTOS E FUNES - 150

INTRODUO AO ORACLE9I - SQL

GRUPANDO AS LINHAS SELECIONADAS


A clusula Group By, adicionada a um comando SELECT, separa as linhas selecionadas em grupos de acordo com a coluna ou expresso que determinarmos como grupamento. Aps esta etapa, para cada um dos grupos formados podemos aplicar as funes de grupo. Desta forma, obteremos como resultado uma linha para cada grupo contendo o resultado das funes aplicadas s colunas e, opcionalmente, as colunas em relao s quais foi feito o grupamento. SQL> SELECT CD_DEPTO, COUNT(*), SUM(VL_SAL) 2 FROM FUNC 3 WHERE CD_DEPTO IN ('A00', 'B01', 'C01') 4 GROUP BY CD_DEPTO; CD_ COUNT(*) SUM(VL_SAL) --- ---------- ----------A00 3 14135 B01 1 4537,5 C01 3 9951,7 Neste primeiro exemplo, as linhas da tabela de funcionrios foram divididas em grupos com relao coluna Cdigo do Departamento. Desta forma, o grupo com cd_depto valendo A00 possui soma total dos salrios igual a 19.665,13 e composto de quatro linhas. J o grupo com cd_depto valendo C01 possui soma total dos salrios igual a 10.162,08 e composto de trs linhas. Das informaes apresentadas, a nica que no se apresenta como argumento de uma funo de grupo a coluna em relao qual foi feito o grupamento, uma vez que seu valor igual em todas as linhas do grupo. SQL> SELECT CD_DEPTO, COUNT(*), SUM(VL_SAL), NM_FUNC 2 FROM FUNC 3 WHERE CD_DEPTO IN ('A00', 'B01', 'C01') 4 GROUP BY CD_DEPTO; SELECT CD_DEPTO, COUNT(*), SUM(VL_SAL), NM_FUNC * ERRO na linha 1: ORA-00979: no uma expresso GROUP BY Na Listagem 2.67, foi feita uma tentativa de se obter uma informao unitria do conjunto de linhas de cada grupo. A mensagem de erro indica que isto no possvel, uma vez que aquela coluna no se encontra presente na clusula Group By.
CAPTULO 5: GRUPAMENTOS E FUNES - 151

INTRODUO AO ORACLE9I - SQL REGRA No possvel a utilizao direta de colunas no referenciadas na clusula Group By na lista de seleo. Estas colunas s podem ser usadas como argumento das funes de grupo. Na lista de seleo, podemos utilizar outras expresses que resultem no mesmo valor para todas as linhas de cada grupo, tais como: valores constantes, as funes User, Userid, Sysdate, clculos envolvendo as colunas sobre as quais est sendo feito o grupamento. SQL> SELECT NR_CARGO, MAX(VL_SAL) MXIMO, 2 MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA 3 FROM FUNC 4 WHERE IN_SEXO = 'M' 5 GROUP BY NR_CARGO; NR_CARGO MXIMO MNIMO MDIA ---------- ---------- ---------- ---------42 1687,4 1687,4 1687,4 48 1952,5 1952,5 1952,5 52 2194,5 2009,7 2104,66667 53 5115 2249,5 3682,25 54 2876,5 2622,4 2737,9 55 3163,6 2780,8 2946,625 58 5115 3217,5 4250,58333 61 4537,5 4537,5 4537,5 9 linhas selecionadas. No exemplo acima, foram selecionadas, da tabela FUNC, as linhas em que a coluna in_sexo possua o valor M. Este conjunto de linhas foi separado de acordo com o valor de cargo. Para cada um dos grupos foram aplicadas as funes Max, Min e Avg. Observe que a restrio presente na clusula Where faz referncia a uma informao da tabela Func. Imagine que desejssemos obter apenas as linhas em que a mdia salarial fosse superior a R$ 2.500. SQL> SELECT NR_CARGO,MAX(VL_SAL) MXIMO, 2 MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA 3 FROM FUNC 4 WHERE IN_SEXO = 'M' AND AVG(VL_SAL) > 2500 5 GROUP BY NR_CARGO; WHERE IN_SEXO = 'M' AND AVG(VL_SAL) > 2500 * ERRO na linha 4: ORA-00934: a funo de grupo no permitida aqui A utilizao desta restrio na clusula Where causa um erro (ORA-00934) que indica que no podemos fazer referncia ao resultado do grupamento antes do grupamento ser realizado.
CAPTULO 5: GRUPAMENTOS E FUNES - 152

INTRODUO AO ORACLE9I - SQL

A CLUSULA HAVING
A clusula Having vem resolver o problema apresentado no exemplo anterior. Ela se aplica aps o grupamento ter sido realizado. Assim, poderemos efetuar uma restrio sobre as colunas calculadas durante a execuo da clusula Group By. A clusula Having no precisa ser usada em conjunto com a clusula Group By. Se ela for usada sem a clusula Group By, toda a tabela ser tratada como um (1) grupo. SQL> SELECT NR_CARGO, MAX(VL_SAL) MXIMO, 2 MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA 3 FROM FUNC 4 WHERE IN_SEXO = 'M' 5 GROUP BY NR_CARGO 6 HAVING AVG(VL_SAL) > 2500; NR_CARGO MXIMO MNIMO MDIA ---------- ---------- ---------- ---------53 5115 2249,5 3682,25 54 2876,5 2622,4 2737,9 55 3163,6 2780,8 2946,625 58 5115 3217,5 4250,58333 61 4537,5 4537,5 4537,5 Este exemplo corrige o erro apresentado na anteriormente. Da mesma forma que na clusula Order By e na Group By, as expresses referenciadas na clusula Having no precisam, necessariamente, estar presentes na clusula Select. SQL> SELECT NR_CARGO, MIN(VL_SAL) MNIMO, AVG(VL_SAL) MDIA, 2 'Constante', (NR_CARGO/2), USER 3 FROM FUNC 4 WHERE IN_SEXO = 'M' 5 GROUP BY NR_CARGO 6 HAVING SUM(VL_SAL) > 2500; NR_CARGO MNIMO MDIA 'CONSTANT (NR_CARGO/2) USER ---------- ---------- ---------- --------- ------------ -------52 2009,7 2104,66667 Constante 26 ALUNO 53 2249,5 3682,25 Constante 26,5 ALUNO 54 2622,4 2737,9 Constante 27 ALUNO 55 2780,8 2946,625 Constante 27,5 ALUNO 58 3217,5 4250,58333 Constante 29 ALUNO 61 4537,5 4537,5 Constante 30,5 ALUNO No primeiro exemplo, a restrio foi feita sobre a soma salarial que no foi mencionada na clusula Select. Neste segundo exemplo, foram selecionados outros tipos de informao que podem aparecer na lista de seleo de um grupamento.
CAPTULO 5: GRUPAMENTOS E FUNES - 153

INTRODUO AO ORACLE9I - SQL Observe que em todos os exemplos apresentados o resultado de um grupamento sempre trouxe as linhas ordenadas pela coluna (ou colunas) sobre a qual foi feito o grupamento. Isto ocorre porque o Oracle pode executar uma operao de ordenao para separar as linhas selecionadas de acordo com os grupos. O resultado desta operao pode trazer os dados na ordem ascendente do grupo ou no. A clusula Group By tem a finalidade de grupar as linhas e no ordenar. A clusula a ser usada para garantir que o resultado ser apresentado na ordem desejada a clusula Order By.

CAPTULO 5: GRUPAMENTOS E FUNES - 154

INTRODUO AO ORACLE9I - SQL

AS EXPRESSES ROLLUP E CUBE


Visando aplicaes de Data WareHouse, as operaes de agregao com o uso de Group By e Having podem se utilizar de operaes chamadas de Rollup e Cube, que so, na verdade, subtotais e tabulaes sobre as dimenses. Essas mesmas operaes podem ser feitas com a sintaxe tradicional, porm sua execuo mais eficiente com o uso das expresses adicionadas clusula Group By. ROLLUP uma extenso da clusula Group By que, alm de executar as funes de agregao para os grupos estabelecidos na clusula, executa as mesmas funes de agregao para subgrupos compostos das n-1, n-2, ..., at 0 expresses includas na clusula Rollup e retorna uma nica linha sumariada para cada um destes subgrupos. Tem grande utilidade na construo de subtotais. SQL> SELECT CD_DEPTO, NR_CARGO, IN_SEXO, SUM(VL_SAL) 2 FROM FUNC 3 WHERE CD_DEPTO IN ('D11', 'D21', 'E11', 'E21') 4 AND NR_CARGO IN (48, 52, 54, 56) 5 GROUP BY ROLLUP(CD_DEPTO, NR_CARGO, IN_SEXO); CD_ NR_CARGO I SUM(VL_SAL) --- ---------- - ----------D11 52 M 2009,7 D11 52 2009,7 D11 54 F 2447,5 D11 54 M 2714,8 D11 54 5162,3 D11 7172 D21 52 F 1897,5 D21 52 M 2109,8 D21 52 4007,3 D21 56 F 3978,7 D21 56 3978,7 D21 7986 E11 48 M 1952,5 E11 48 1952,5 E11 54 F 2887,5 E11 54 2887,5 E11 4840 E21 52 M 2194,5 E21 52 2194,5 E21 54 M 5498,9 E21 54 5498,9 E21 7693,4 27691,4 23 linhas selecionadas.
CAPTULO 5: GRUPAMENTOS E FUNES - 155

INTRODUO AO ORACLE9I - SQL Observe no exemplo acima que o grupamento desenvolvido retorna 1 (uma) linha para cada grupo depto-cargo-sexo. Adicionalmente a estas linhas, a clusula Rollup acrescentou uma linha para cada grupo depto-cargo, outra linha para cada depto, contendo um sumrio ou subtotal referente s linhas grupadas, e, finalmente, um total geral. Poderamos considerar que esta clusula fez uma operao de grupamento para cada quebra do grupo. Esta operao de agregao para cima (para estabelecer sumrios menos detalhados) chamada de Rollup. A quantidade de grupos que a clusula Rollup gerar ser igual quantidade de expresses includas na clusula + 1. No caso do exemplo, inclumos na clusula Rollup trs expresses; portanto, obtivemos quatro tipos de totais. CUBE Tambm uma extenso da clusula Group By que, alm de executar as funes de agregao para os grupos estabelecidos na clusula Cube, executa as mesmas funes de agregao para subgrupos compostos dos valores de todas as possveis combinaes das expresses (informadas para Cube) e retorna uma nica linha sumariada para cada subgrupo. Podemos nos utilizar desta caracterstica para a montagem de produtos matriciais (cross-tab). Observe, na prxima pgina, que utilizamos o mesmo grupamento do exemplo anterior, porm obtivemos um nmero maior de linhas no resultado. SQL> SELECT CD_DEPTO, NR_CARGO, IN_SEXO, SUM(VL_SAL) 2 FROM FUNC 3 WHERE CD_DEPTO IN ('D11', 'D21', 'E11', 'E21') 4 AND NR_CARGO IN (48, 52, 54, 56) 5 GROUP BY CUBE(CD_DEPTO, NR_CARGO, IN_SEXO); Isso ocorre porque a clusula Cube, alm de calcular a funo SUM(vl_sal) para o grupo depto-cargosexo, tambm gera somas para os subgrupos depto-cargo, depto-sexo, cargo-sexo, s cargo, s depto, s sexo e um total geral. A quantidade de grupos que a clusula Cube gerar ser igual a 2 elevado quantidade de expresses includas na clusula. No caso do exemplo, inclumos na clusula Cube trs expresses; portanto, obtivemos 8 tipos de totais.

CAPTULO 5: GRUPAMENTOS E FUNES - 156

INTRODUO AO ORACLE9I - SQL CD_ NR_CARGO I SUM(VL_SAL) --- ---------- - ----------D11 52 M 2009,7 D11 52 2009,7 D11 54 F 2447,5 D11 54 M 2714,8 D11 54 5162,3 D11 F 2447,5 D11 M 4724,5 D11 7172 D21 52 F 1897,5 D21 52 M 2109,8 D21 52 4007,3 D21 56 F 3978,7 D21 56 3978,7 D21 F 5876,2 D21 M 2109,8 D21 7986 E11 48 M 1952,5 E11 48 1952,5 E11 54 F 2887,5 E11 54 2887,5 E11 F 2887,5 E11 M 1952,5 E11 4840 E21 52 M 2194,5 E21 52 2194,5 E21 54 M 5498,9 E21 54 5498,9 E21 M 7693,4 E21 7693,4 48 M 1952,5 48 1952,5 52 F 1897,5 52 M 6314 52 8211,5 54 F 5335 54 M 8213,7 54 13548,7 56 F 3978,7 56 3978,7 F 11211,2 M 16480,2 27691,4 42 linhas selecionadas.

CAPTULO 5: GRUPAMENTOS E FUNES - 157

INTRODUO AO ORACLE9I - SQL

IDENTIFICANDO AS LINHAS COM AS FUNES GROUP


Voc j deve ter percebido, pelos resultados anteriores, que a utilizao de Rollup e Cube pode tornar o resultado um pouco confuso, principalmente se as expresses envolvidas possurem valores Null. Temos 3 funes que podem nos ajudar a distinguir um valor Null que representa um subgrupo (de uma das agregaes produzidas pelo Rollup ou Cube), de um valor Null real. A expresso a ser includa na funo Grouping deve corresponder a uma das expresses da clusula Group by. Esta funo retornar 1 se o valor da expresso representar um subgrupo, caso contrrio, retornar zero. O tipo de valor retornado Number. Para efeito de teste inclua uma linha com preenchimento apenas de cd_depto (D11) e cd_mat (1). SQL> SELECT CD_DEPTO, GROUPING(CD_DEPTO) GRP_DEPTO, 2 IN_SEXO, GROUPING(IN_SEXO) GRP_SEXO, 3 GROUPING_ID(CD_DEPTO, IN_SEXO) GRP_ID, 4 SUM(VL_SAL) 5 FROM FUNC 6 WHERE CD_DEPTO IN ('D11', 'D21', 'E11', 'E21') 7 GROUP BY CUBE(CD_DEPTO, IN_SEXO); CD_ GRP_DEPTO I GRP_SEXO GRP_ID SUM(VL_SAL) --- ---------- - ---------- ---------- ----------D11 0 F 0 0 11624,8 D11 0 M 0 0 12806,2 D11 0 1 1 24431 D21 0 F 0 0 5876,2 D21 0 M 0 0 10388,4 D21 0 1 1 16264,6 E11 0 F 0 0 7909 E11 0 M 0 0 3639,9 E11 0 1 1 11548,9 E21 0 M 0 0 10484,1 E21 0 1 1 10484,1 1 F 0 2 25410 1 M 0 2 37318,6 1 1 3 62728,6 14 linhas selecionadas. No exemplo acima, simplificamos o grupamento para que o resultado fosse mais claro.

CAPTULO 5: GRUPAMENTOS E FUNES - 158

INTRODUO AO ORACLE9I - SQL Observe os valores de Grouping_id, correspondem concatenao dos diversos resultados da funo Grouping na ordem em que ocorrem. Considerando-se uma formao (Grouping s retorna zero ou 1), temos que o valor de Grouping_id seria calculado (no exemplo) como GRP_DEPTO * 21 + GRP_SEXO * 20. Desta forma as linhas em que GRP_DEPTO recebeu 0 e GRP_SEXO recebeu 1 calcularam GRP_ID com 1 (0 * 21 + 1 * 20). As linhas em que GRP_DEPTO recebeu 1 e GRP_SEXO recebeu 0 calcularam GRP_ID com 2 (1 * 21 + 0 * 20). Finalmente a linha em que tanto GRP_DEPTO quanto GRP_SEXO receberam valor 1 calcularam GRP_ID com 3 (1 * 21 + 1 * 20). SQL> SELECT CD_DEPTO, IN_SEXO, GROUP_ID(), SUM(VL_SAL) 2 FROM FUNC 3 WHERE CD_DEPTO IN ('D11', 'D21') 4 GROUP BY CD_DEPTO, ROLLUP(CD_DEPTO, IN_SEXO); CD_ --D11 D11 D21 D21 D11 D21 D11 D21 I GROUP_ID() SUM(VL_SAL) - ---------- ----------F 0 11624,8 M 0 12806,2 F 0 5876,2 M 0 10388,4 0 24431 0 16264,6 1 24431 1 16264,6

8 linhas selecionadas. Neste ltimo exemplo utilizamos a funo GROUP_ID para identificar as linhas de D11 e D21 que aparecem duas vezes (com os mesmos valores em toda a linha) em funo de um grupamento duplo entre cd_depto e a extenso Rollup de cd_depto com in_sexo.

CAPTULO 5: GRUPAMENTOS E FUNES - 159

INTRODUO AO ORACLE9I - SQL

FUNES ANALTICAS
So programas que tm a finalidade de efetuar clculos sobre um conjunto de linhas. Elas diferem das funes de agregao no sentido de retornarem mltiplas linhas para cada grupo. O grupo de linhas chamado de window e definido pela clusula analytic. A janela determina o intervalo de linhas para que os clculos sejam realizados para a current row. Esta janela pode ser definida em funo de quantidade de linhas ou em funo de um intervalo lgico (por exemplo tempo). As funes analticas correspondem penltima etapa de execuo de uma query (a ltima corresponde clusula ORDER BY). Desta forma as funes analticas somente podem ser usadas na clusula SELECT ou na ORDER BY. O argumento para estas funes pode ser o nome de uma coluna ou uma expresso (combinao de nomes de colunas, constantes ou outras funes). A tabela a seguir relaciona todas as funes analticas. Diversas funes desta lista j apareceram, no grupo de funes de agregao. O que as torna analticas o uso da palavra chave OVER seguida das clusulas que aparecem no incio da sintaxe. Avg (*) Cume_dist Last Ntile Ratio_to_report Stddev_samp (*) Corr (*) Dense_rank Last_value (*) Percent_rank Regr_ (*) Sum (*) Covar_pop (*) First Lead Percentile_cont Row_number Var_pop (*) Covar_samp (*) First_value (*) Max (*) Percentile_disc Stddev (*) Var_samp (*) Count (*) Lag Min (*) Rank Stddev_pop (*) Variance (*)

Na lista acima as funes com (*) permitem a sintaxe completa da clusula analtica.

CAPTULO 5: GRUPAMENTOS E FUNES - 160

INTRODUO AO ORACLE9I - SQL

FUNES SOMENTE ANALTICAS


Neste grupo apresentaremos aquelas funes ainda no estudadas no conjunto de funes de agregao.

CAPTULO 5: GRUPAMENTOS E FUNES - 161

INTRODUO AO ORACLE9I - SQL As seguintes clusulas so encontradas na analytic_clause: Rows o uso desta palavra significa que para cada linha selecionada ser associada uma window. Esta janela, que corresponde a um conjunto de linhas, ser usada para clculo do resultado da funo, ou seja, a funo aplicada a todas as linhas da janela. A palavra ROWS indica, ainda que a determinao da janela ser feita em unidades fsicas (linhas). No podemos especificar esta clusula a menos que usemos ORDER BY. Range o uso desta palavra significa que para cada linha selecionada ser associada uma window. Esta janela, que corresponde a um conjunto de linhas, ser usada para clculo do resultado da funo, ou seja, a funo aplicada a todas as linhas da janela. A palavra RANGE especifica a janela como um conjunto lgico. No podemos especificar esta clusula a menos que usemos ORDER BY. Unbounded Preceding esta opo indica que a window comea na primeira linha da partio. No pode ser usado como ponto de fim de especificao. Between And com esta clusula podemos indicar um ponto de incio e um ponto de trmino da janela. A primeira expresso determina o ponto inicial e a segunda expresso determina o ponto final. Current Row se esta expresso for usada como ponto inicial indica que a window comea na linha ou valor corrente (dependendo da especificao ROW ou RANGE, respectivamente). Neste caso o ponto final no pode ser <value_expr> PRECEDING. Se especificado como ponto final, indica que a janela termina na linha corrente ou valor (dependendo da especificao ROW ou RANGE, respectivamente). Neste caso o ponto inicial no pode ser <value_expr> FOLLOWING. <value_expr> Preceding se esta expresso for usada como ponto final, ento o ponto inicial tambm dever ser <value_expr> Preceding. Se especificarmos ROWS, <value_expr> um offset fsico, numrico, positivo. Se <value_expr> for usada como ponto de incio deve identificar uma linha antes do ponto final. Se especificarmos RANGE, <value_expr> corresponde a um offset lgico, numrico e positivo ou um intervalo literal. Somente poderemos especificar uma expresso na clusula ORDER BY e se <value_expr> for numrica, a <expresso> da clusula ORDER BY deve ser um NUMBER ou DATE. Se <value_expr> for um intervalo, a <expresso> da clusula ORDER BY deve ser do tipo DATE.

CAPTULO 5: GRUPAMENTOS E FUNES - 162

INTRODUO AO ORACLE9I - SQL Unbounded Following indica que a janela termina na ltima linha da partio. Esta uma especificao de ponto final e no pode ser usada como ponto de incio. <value_expr> Following se esta expresso for usada como ponto inicial, ento o ponto final tambm dever ser <value_expr> Following. Se especificarmos ROWS, <value_expr> um offset fsico, numrico, positivo. Se <value_expr> for usada como ponto de incio deve identificar uma linha antes do ponto final. Se especificarmos RANGE, <value_expr> corresponde a um offset lgico, numrico e positivo ou um intervalo literal. Somente poderemos especificar uma expresso na clusula ORDER BY e se <value_expr> for numrica, a <expresso> da clusula ORDER BY deve ser um NUMBER ou DATE. Se <value_expr> for um intervalo, a <expresso> da clusula ORDER BY deve ser do tipo DATE. Partition By com esta clusula podemos particionar o resultado da query em grupos baseados em um ou mais valores de <value_expr>. Se a clusula for omitida, haver somente um grupo. Podemos especificar mais de uma funo analtica na mesma query, cada uma delas clusula Partition By prprias. Se omitirmos o uso da clusula windowing, o default RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW.

CAPTULO 5: GRUPAMENTOS E FUNES - 163

INTRODUO AO ORACLE9I - SQL

FIRST_VALUE
uma funo analtica que retorna o primeiro valor em um conjunto ordenado de valores. SINTAXE: FIRST_VALUE ( <e> ) OVER ( <analitic> ) OBS: Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada. SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 first_value(nr_cargo) over (order by vl_sal DESC nulls last 3 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) TERCEIRA 4 FROM FUNC 5 WHERE CD_DEPTO = 'A02'; CD_ NR_CARGO VL_SAL TERCEIRA --- ---------- ---------- ---------A02 21 300 21 A02 45 200 21 A02 65 200 21 A02 32 100 21 A02 8 100 21 A02 32 100 21 A02 21 A02 12 21 8 linhas selecionadas.

Para entendermos o resultado temos dois passos a verificar: Primeiramente devemos identificar qual a janela de linhas para cada linha selecionada e como segundo passo devemos aplicar a funo First_Value a cada linha. Neste primeiro exemplo em funo da restrio especificada UNBOUNDED PRECEDING e UNBOUNDED FOLLOWING, indicamos que todas as linhas selecionadas fazem parte da janela. Como a ordenao ocorre em funo de salrio DESC, o primeiro cargo de cada grupo o cargo 21, que por este motivo aparece em todos os resultados.

CAPTULO 5: GRUPAMENTOS E FUNES - 164

INTRODUO AO ORACLE9I - SQL

LAG
uma funo analtica que fornece o acesso a mais de uma linha de uma tabela simultaneamente sem um auto-join. SINTAXE:

Supondo-se um conjunto de linhas retornadas da querie e uma posio de cursor, esta funo fornece o acesso a uma linha especfica anterior a esta posio. Caso no seja especificado offset, o default 1. O valor <default> retornado se o offset apontar para fora do escopo da window. Se este parmetro no for informado, o default Null. OBS: Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada. SQL> SELECT cd_depto, nr_cargo, vl_sal, LAG(VL_SAL) 2 over (order by NR_CARGO ASC nulls last) ANTERIOR 3 FROM FUNC 4 WHERE CD_DEPTO = 'A02'; CD_ NR_CARGO VL_SAL ANTERIOR --- ---------- ---------- ---------A02 8 100 A02 12 100 A02 21 300 A02 32 100 300 A02 32 100 100 A02 45 200 100 A02 65 200 200 A02 200 8 linhas selecionadas. A funo LAG no permite a sintaxe completa da clusula analytic desta forma, no determinamos a janela. No exemplo a funo traz o salrio anterior em relao ordenao de NR_CARGO, ou seja para o funcionrio com cargo 45 e salrio 200, a funo apresentou o salrio 100 que corresponde ao salrio do funcionrio com cargo 32 (imediatamente anterior ao funcionrio com cargo 45).

CAPTULO 5: GRUPAMENTOS E FUNES - 165

INTRODUO AO ORACLE9I - SQL

LAST_VALUE
uma funo analtica que retorna o ltimo valor em um conjunto ordenado de valores. SINTAXE: LAST _VALUE ( <e> ) OVER ( <analitic> ) OBS:Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada. SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 LAST_VALUE(NR_CARGO) 3 over (order by VL_SAL ASC nulls last 4 ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) LAST_VALUE 5 FROM FUNC 6 WHERE CD_DEPTO = 'A02'; CD_ NR_CARGO VL_SAL LAST_VALUE --- ---------- ---------- ---------A02 32 100 32 A02 32 100 8 A02 8 100 45 A02 45 200 65 A02 65 200 21 A02 21 300 A02 12 A02 12 12 8 linhas selecionadas.

A window deste exemplo ser formada (a cada linha) a partir da linha corrente mais uma linha para frente. Assim sendo para a linha com cargo 8 a window composta das linhas 8 e 45. Para 45 das linhas 45 e 65, para 65 das linhas 65 e 21, etc. Uma vez que a funo retorna o ltimo valor da seqncia, ser retornado o segundo valor de cada seqncia.

CAPTULO 5: GRUPAMENTOS E FUNES - 166

INTRODUO AO ORACLE9I - SQL

LEAD
uma funo analtica que fornece o acesso a mais de uma linha de uma tabela simultaneamente sem um auto-join. SINTAXE:

Supondo-se um conjunto de linhas retornadas da querie e uma posio de cursor, esta funo fornece o acesso a uma linha especfica posterior a esta posio. Caso no seja especificado offset, o default 1. O valor <default> retornado se o offset apontar para fora do escopo da window. Se este parmetro no for informado, o default Null. OBS: Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada.

CAPTULO 5: GRUPAMENTOS E FUNES - 167

INTRODUO AO ORACLE9I - SQL

NTILE
uma funo analtica que divide um conjunto ordenado de dados em faixas, de acordo com <expresso> e associa o nmero da faixa correspondente a cada linha. SINTAXE: NTILE (<e> ) OVER ( [ <partition> ] <order_by> ) As faixas (buckets) so numeradas de 1 at <expresso>, que deve ser uma constante positiva (para cada partio). Se <expresso> for maior que o nmero de linhas as faixas sero preenchidas de uma em uma at a quantidade de linhas, ficando as demais vazias. OBS: Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada. SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 NTILE(3) over (order by NR_CARGO ASC nulls last) NTILE 3 FROM FUNC 4 WHERE CD_DEPTO = 'A02'; CD_ NR_CARGO VL_SAL NTILE --- ---------- ---------- ---------A02 8 100 1 A02 12 1 A02 21 300 1 A02 32 100 2 A02 32 100 2 A02 45 200 2 A02 65 200 3 A02 3 8 linhas selecionadas.

No exemplo a lista de cargos foi classificada de acordo com a quantidade de faixas recebida como parmetro e da ordenao estabelecida. Indicamos a determinao de 3 faixas. Os cargos foram distribudos da seguinte forma: de 8 a 21 para faixa 1, de 32 a 45 para faixa 2 e de 65 em diante para faixa 3.

CAPTULO 5: GRUPAMENTOS E FUNES - 168

INTRODUO AO ORACLE9I - SQL

RATIO_TO_REPORT
uma funo analtica que calcula a razo entre um valor e a soma de um conjunto de valores. SINTAXE: RATIO_TO_REPORT (<e> ) OVER ( [ <partition> ] ) Se o parmetro <expresso> for null o resultado da funo tambm ser null. O conjunto de valores determinado por <query_partition_clause>. Caso seja omitido ser considerado uma nica partio composta de todas as linhas retornadas pela query. OBS: Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada. SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 RATIO_TO_REPORT(VL_SAL) 3 over (PARTITION BY CD_DEPTO) RATIO 4 FROM FUNC 5 WHERE CD_DEPTO IN ('A02', 'A00', 'B01'); CD_ NR_CARGO VL_SAL RATIO --- ---------- ---------- ---------A00 66 5802,5 ,410505837 A00 58 5115 ,361867704 A00 58 3217,5 ,227626459 A02 32 100 ,1 A02 21 300 ,3 A02 A02 12 A02 8 100 ,1 A02 32 100 ,1 A02 65 200 ,2 A02 45 200 ,2 B01 61 4537,5 1 12 linhas selecionadas. Neste exemplo inclumos 3 departamentos para que pudssemos realizar o particionamento dos dados em relao a estes departamentos. Isto significa que o valor de salrio para os funcionrios do departamento A00 foi dividido por 12850 (5272+4650+2925) para clculo da razo (Ratio). Observe que no caso dos funcionrios do departamento A02, os salrios foram divididos por 1000 (que corresponde soma dos salrios no nulos), isto significa que os Nulls foram ignorados para efeito de clculo.
CAPTULO 5: GRUPAMENTOS E FUNES - 169

INTRODUO AO ORACLE9I - SQL

ROW_NUMBER
uma funo analtica que associa um nmero nico para cada linha qual esta aplicada (cada linha da partio ou retornada pela query), na ordem especificada pela clusula Order By, comeando com 1. SINTAXE: ROW_NUMBER ( ) OVER ( [ <partition> ] <order_by> ) OBS: Esta funo no pode ser usada por qualquer das outras funes analticas como parmetro (na <expresso>), isto , no pode ser aninhada. SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 ROW_NUMBER() over (PARTITION BY CD_DEPTO 3 ORDER BY NR_CARGO) ROW_NUMBER 4 FROM FUNC 5 WHERE CD_DEPTO IN ('A02', 'A00', 'B01'); CD_ NR_CARGO VL_SAL ROW_NUMBER --- ---------- ---------- ---------A00 58 5115 1 A00 58 3217,5 2 A00 66 5802,5 3 A02 8 100 1 A02 12 2 A02 21 300 3 A02 32 100 4 A02 32 100 5 A02 45 200 6 A02 65 200 7 A02 8 B01 61 4537,5 1 12 linhas selecionadas. Neste exemplo o particionamento foi, novamente, realizado em relao a departamento, ou seja, temos trs grupos, um para cada departamento. Em cada grupo as linhas foram ordenadas por cargo e receberam um nmero crescente, comeando em 1 e incremento de 1.

CAPTULO 5: GRUPAMENTOS E FUNES - 170

INTRODUO AO ORACLE9I - SQL

FUNES DE AGREGAO COM USO ANALTICO


Uma vez que j estudamos as funes de agregao, faremos apenas alguns exemplos de uso destas funes com a clusula analytic. AVG, COUNT, MAX E MIN Neste exemplo utilizamos diversas alternativas de window. SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 count(*) over (ORDER BY NR_CARGO NULLS LAST 3 RANGE BETWEEN 5 PRECEDING AND 5 FOLLOWING) COUNT, 4 avg(nr_cargo) over (ORDER BY NR_CARGO NULLS LAST 5 RANGE UNBOUNDED PRECEDING) AVG, 6 max(nr_cargo) over (ORDER BY NR_CARGO NULLS LAST 7 ROWS 3 PRECEDING) MAX, 8 min(nr_cargo) over (ORDER BY NR_CARGO NULLS LAST 9 RANGE 10 PRECEDING) MIN 10 FROM FUNC 11 WHERE CD_DEPTO = 'A02'; CD_ NR_CARGO VL_SAL COUNT AVG MAX MIN --- ---------- ---------- ---------- ---------- ---------- ---------A02 8 100 2 8 8 8 A02 12 2 10 12 8 A02 21 300 1 13,6666667 21 12 A02 32 100 2 21 32 32 A02 32 100 2 21 32 32 A02 45 200 1 25 45 45 A02 65 200 1 30,7142857 65 65 A02 1 30,7142857 65 8 linhas selecionadas. Analisemos separadamente: Count para esta funo usamos um intervalo correspondente a cargos 5 pontos anteriores ao cargo da linha e 5 pontos posteriores ao cargo da linha. Quando usamos a palavra RANGE estamos utilizando um intervalo relativo linha. No nosso caso, os intervalos seriam para cargo 8 o intervalo entre 3 e 13 (existem neste intervalo dois cargos 8 e 12), para cargo 12 o intervalo entre 7 e 17(existem neste intervalo dois cargos 8 e 12), para cargo 21 o intervalo 16 e 26 (neste intervalo s existe o cargo 21) e assim por diante.

CAPTULO 5: GRUPAMENTOS E FUNES - 171

INTRODUO AO ORACLE9I - SQL Avg para esta funo no definimos o fim do intervalo, o que significa, por default, o cargo da linha corrente. Unbounded Preceding indica a primeira linha como incio do intervalo. Sendo assim para o cargo 8 o intervalo de linhas composto somente com a linha corrente. Para o cargo 12 o intervalo [8,12]. Para o cargo 21 o intervalo [8,21] e para o cargo 32 o intervalo [8,32]. Observe que neste ltimo valor, o resultado corresponde expresso (8+12+21+32+32)/5, com resultado 21. Isto significa que a seleo feita em relao ao valor (todas as linhas com cargo <=32) e no a posicionamento fsico. Max para esta funo utilizamos posicionamento fsico, ou seja o intervalo ser composto de 3 linhas (em relao ordenao fsica) anteriores e a linha atual. Desta window escolhido o maior valor. Min para esta funo usamos a sintaxe Range 10 Preceding, o que indica que o intervalo ser composto das linhas com cargo entre (cargo da linha atual 10) at (cargo da linha atual). Desta window escolhido o menor valor.

CAPTULO 5: GRUPAMENTOS E FUNES - 172

INTRODUO AO ORACLE9I - SQL CUME_DIST, DENSE_RANK, FIRST, LAST, PERCENT_RANK Neste exemplo tambm utilizamos diversas funes de grupo.
SQL> SELECT cd_depto, nr_cargo, vl_sal, 2 cume_dist() over (partition by vl_sal 3 ORDER BY NR_CARGO NULLS LAST) CUME_DIST, 4 dense_rank() over (partition by vl_sal 5 ORDER BY NR_CARGO DESC NULLS LAST) DENSE_RANK, 6 MAX(NR_CARGO) KEEP (DENSE_RANK FIRST 7 ORDER BY NR_CARGO ASC NULLS LAST) 8 over (PARTITION BY VL_SAL) FIRST, 9 MIN(NR_CARGO) KEEP (DENSE_RANK LAST 10 ORDER BY NR_CARGO ASC NULLS LAST) 11 over (PARTITION BY VL_SAL) LAST, 12 PERCENT_RANK () OVER (PARTITION BY VL_SAL 13 ORDER BY NR_CARGO DESC NULLS LAST) P_RANK, 14 PERCENTILE_CONT(.5) WITHIN GROUP (ORDER BY NR_CARGO ASC) 15 over (PARTITION BY VL_SAL) P_CONT, 16 PERCENTILE_DISC(.5) WITHIN GROUP (ORDER BY NR_CARGO ASC) 17 over (PARTITION BY VL_SAL) P_DISC, 18 RANK () OVER (PARTITION BY VL_SAL 19 ORDER BY NR_CARGO DESC NULLS LAST) RANK 20 FROM FUNC 21 WHERE CD_DEPTO = 'A02'; CD_ NR_CARGO VL_SAL CUME_DIST DENSE_RANK FIRST LAST P_RANK P_CONT _DISC RANK --- -------- ------ ---------- ---------- ----- ---- ------ ------ ----- ---A02 8 100 ,333333333 2 8 32 1 32 32 3 A02 32 100 1 1 8 32 0 32 32 1 A02 32 100 1 1 8 32 0 32 32 1 A02 45 200 ,5 2 45 65 1 55 45 2 A02 65 200 1 1 45 65 0 55 45 1 A02 21 300 1 1 21 21 0 21 21 1 A02 12 ,5 1 12 0 12 12 1 A02 1 2 12 1 12 12 2 8 linhas selecionadas.

O resultado de cada uma delas deve ser analisado considerando-se a clusula analtica empregada. Cume_Dist quando esta funo usada analiticamente ela no possui parmetro, o valor comparado se refere ao valor da expresso usada na clusula ORDER BY aplicada linha corrente. A clusula Partition determina o universo analisado. Desta forma para a primeira partio temos 3 linhas (com salrio 100). O valor 0.333 (1/3) indica que 1 linha (no caso a corrente) possui cargo <= 8. Para as linhas com cargo 32, 100% delas possuem cargo <= 32, considerando-se como universo as linhas com salrio 100. No exemplo existem 4 universos : o universo das linhas com salrio 100, o das linhas cm salrio 200, o das linhas com salrio 300 e o das linhas com salrio Null.

CAPTULO 5: GRUPAMENTOS E FUNES - 173

INTRODUO AO ORACLE9I - SQL Dense_Rank quando esta funo usada analiticamente ela no possui parmetro. O valor comparado ou classificado aquele informado na clusula ORDER BY aplicado linha corrente. Considerando-se o universo das linhas com salrio 100 temos que o cargo 8 o segundo na classificao e 32 o primeiro, pois utilizamos a expresso DESC. First o uso desta funo analiticamente levar em considerao um universo de valores especfico para cada linha analisada. Com relao ao grupamento das linhas com salrio 100, usamos ordenao por cargo, desta forma a linha classificada como FIRST para este primeiro grupo foi aquela com cargo 8. Sobre esta linha aplicamos a funo max(nr_cargo). Para que o resultado fique mais lgico preencha mais uma coluna da tabela FUNC, para as linhas com cd_depto = A02 e utilize esta coluna na funo max para que os resultados fiquem diferenciados. Last o uso desta funo analiticamente levar em considerao um universo de valores especfico para cada linha analisada. Com relao ao grupamento das linhas com salrio 100, usamos ordenao por cargo, desta forma as linhas classificadas como LAST para este primeiro grupo foram aquelas com cargo 32. Sobre esta linha aplicamos a funo min(nr_cargo). Para que o resultado fique mais lgico preencha mais uma coluna da tabela FUNC, para as linhas com cd_depto = A02 e utilize esta coluna na funo min para que os resultados fiquem diferenciados. Percent_Rank quando esta funo usada analiticamente ela no possui parmetro, o valor comparado se refere ao valor da expresso usada na clusula ORDER BY aplicada linha corrente. A clusula Partition determina o universo analisado. Desta forma para a primeira partio temos 3 linhas (com salrio 100). Uma vez que ordenamos por cargo descendentemente temos a classificao da seguinte forma: os dois cargos 32 ocupam as posies 0 e 1, o cargo 8 ocupa a posio 2. Como resultado encontramos o denominador de todas as fraes deste grupo como sendo 2. Para o cargo 8 a razo 2/2 que produz como resultado 1. Para as linhas com cargo 32 obtermos a primeira classificao, ou seja 0/2, que produz como resultado zero.

CAPTULO 5: GRUPAMENTOS E FUNES - 174

INTRODUO AO ORACLE9I - SQL Percentile_Cont a diferena desta funo quando analtica o particionamento, que produzir 4 (no nosso caso) grupos de interresse. Como primeiro passo devemos determinar a linha de interesse, usaremos, para efeito de anlise um grupo com quantidade par de linhas (o grupo com salrio 200). Como RN = (1 + P * (N 1)), no exemplo da listagem 2.139, temos que RN = (1 + 0.5 * (2 1)), onde P o percentual (0.5) e N a quantidade de linhas (2). O resultado RN=1.5. O valor de CRN (o menor inteiro maior que RN) 2. O valor de FRN (o maior inteiro menor que RN) 1. Uma vez que RN representa a linha desejada e a linha 1.5 no existe, devemos aplicar a frmula obter o valor de cargo. Valor = (2 1.5) * (cargo na linha FRN = 45) + (1.5 1) * (cargo na linha CRN = 65) = (0.5)*45 + (0.5)* 65 = 22.5 + 32.5 = 55 Percentile_Disc no feita a interpolao, o valor retornado ser o primeiro em relao s linhas que atendem ao percentual, ou seja ser o valor da linha FRN. Para o primeiro grupo (salrio igual a 100), a linha RN possvel de ser encontrada pois RN = (1 + 0.5 * (3 1)), cujo resultado 2. Desta forma a linha de interesse aquela com cargo 32. Para o segundo grupo j sabemos que RN = 1.5 e portanto temos duas linhas candidatas a linha de interesse. Como a funo no realiza interpolao, o resultado corresponde, sempre, primeira linha, no caso deste grupo o cargo retornado para as duas 45. Rank a funo Rank d a posio relativa do valor na lista ordenada.

A diferena em relao ao seu uso como funo de agregao que podemos determinar o universo de valores. Para o primeiro grupo, o valor 8 ficou classificado com 3 e os dois valores 32 como 1. No segundo grupo o valor 45 foi classificado como 2 e o valor 65 como 1. Esta classificao foi dada em funo da ordenao descendente.

CAPTULO 5: GRUPAMENTOS E FUNES - 175

INTRODUO AO ORACLE9I - SQL

LABORATRIO 5:
1. Deseja-se uma lista contendo matrcula, nome e salrio de todos os funcionrios que ganhem mais que a mdia salarial da empresa. 2. Produza uma lista contendo a mdia salarial, total de salrios e quantidade de linhas selecionadas por departamento, de todos os funcionrios que tenham em seu primeiro nome a letra A. 3. Produza uma lista contendo o cargo, a mdia salarial e o nmero de funcionrios grupados por cargo para os departamentos D01, D11, D21 e E11. Todos os cargos com menos de trs funcionrios devem ser excludos do resultado. A lista deve vir ordenada descendentemente por mdia salarial. 4. Determine a quantidade de atividades diferentes por projeto (tabela Prjatv). 5. Deseja-se obter, em mdia, quantos funcionrios existem por departamento. 6. Deseja-se obter uma lista (nr_cargo) de todos os cargos que possuam mais de duas funcionrias. 7. Deseja-se uma lista (cd_mat, vl_sal, nr_git) dos funcionrios mais graduados (com maior grau de instruo) da empresa. 8. Deseja-se saber qual departamento possui maior mdia salarial da empresa. 9. Deseja-se saber quais os departamentos (cdigo e nome) responsveis por mais de dois projetos e que, simultaneamente, possuam mais de trs funcionrios (usar Intersect). OPCIONAIS 10. Deseja-se o total salarial e a mdia salarial por quantidade de anos trabalhados e por cargo dos funcionrios que tenham menos de 10 anos de casa e cargo superior a 50. Devem ser informados, simultaneamente, totais por cargo e por quantidade de ano, alm de um acumulado geral. 11. Deseja-se uma tabulao contendo a quantidade de funcionrios por sexo e por quantidade de anos na empresa. Alm dos dados individuais, deseja-se totalizaes por sexo, por quantidade de anos e por sexo e quantidade de anos simultaneamente. Identifique claramente os totais apresentados. 12. Repita os dois exerccios anteriores de tal forma que os totais provenientes da quebra seja identificados diferentemente dos valores gerados em funo de valores NULL. 13. Um novo funcionrio foi contratado na empresa, o cargo definido para ele foi 55 e seu salrio deve ser 2700, 2800 ou 2900. Determine qual dos trs salrios se enquadra nos requisitos estabelecidos pela gerncia de projetos: a) b) Seu salrio deve ser superior ao quarto maior salrio dentre os funcionrios com o mesmo cargo. Pelo menos 60% do grupo de funcionrios com o mesmo cargo deve ter salrio menor que o dele.
CAPTULO 5: GRUPAMENTOS E FUNES - 176

INTRODUO AO ORACLE9I - SQL 14. Para determina o percentual de promoo dos funcionrios, o departamento Pessoal solicitou: a) b) o menor, o maior e a mdia salrial do menor cargo o menor, o maior e a mdia salrial do maior cargo

15. O novo diretor do Departamento pessoal deseja estabelecer faixas salariais para futuro enquadramento dos funcionrios. Com este objetivo deseja obter informaes sobre a distribuio salarial atual. Considerando-se intervalos de 20% (.20, .40, .60, .80 ou 1) deseja-se saber qual o salrio correspondente. 16 Deseja-se saber (somente para os cargos 55) o salrio do funcionrio com grau de instruo imediatamente inferior e superior ao seu, o resultado deve vir ordenado pelo nome do funcionrio. 17. Ainda estudando uma forma de enquadramento salarial o departamento Pessoal deseja dividir o grupo em trs faixas, considerando ordenao decrescente de cargo. Apresente o enquadramento para os funcionrios dos departamentos A00 e D11 e ordene o resultado pelo nome do funcionrio. 18. Deseja-se saber quanto o salrio de cada funcionrio representa (percentualmente) em relao ao seu prprio departamento e em relao empresa. 19. Deseja-se saber para cada funcionrio: a) b) c) o salrio imediatamente anterior e posterior ao seu. o cargo imediatamente anterior e posterior ao seu. a classificao do salrio do funcionrio em relao empresa e a seu departamento.

O resultado deve vir ordenado pelo nome do funcionrio.

CAPTULO 5: GRUPAMENTOS E FUNES - 177

INTRODUO AO ORACLE9I - SQL

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS


Neste captulo retornamos ao estudo da ferramenta SQL*Plus. Os comandos foram subdivididos em grupos: Ambiente, Formatao, Interativos, Acesso ao Banco de Dados e Gerais.

COMANDOS DE AMBIENTE
So aqueles que modificam a forma de agir da ferramenta.

SET
Estabelece valores para as variveis de sistema responsveis pelas caractersticas de ambiente da seo corrente. SINTAXE: SET <system_variable> <valor>

FEED[ BACK ] n Mostra o nmero de registros retornados por uma query se forem selecionados mais de n registros (default 6) FEED[ BACK ] ON | OFF Determina o estado da varivel FEEDBACK (default ON). PAU[ SE ] <mensagem> Mostra a mensagem aps o preenchimento da pgina de tela. PAU[ SE ] ON | OFF Indica se o mecanismo de pausa aps o preenchimento de uma pgina deve ser acionado (default OFF). HEA[ DING ] ON | OFF Determina de os cabealhos de coluna devem ser apresentados (default ON). SQL> SET FEEDBACK 1 SQL> SET HEADING OFF SQL> SET PAUSE 'PRESSIONE <enter> PARA CONTINUAR' SQL> SET PAUSE ON SQL> SELECT CD_DEPTO FROM depto WHERE cd_depto = 'D01'; PRESSIONE <enter> PARA CONTINUAR D01 1 row selected. SQL>
CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 178

INTRODUO AO ORACLE9I - SQL

PAGES[ IZE ] n Indica o nmero de linhas para cada pgina do relatrio (default 14). LIN[ ESIZE ] n Indica o nmero de caracteres por linha (default 80). SPACE n Indica o nmero de espaos entre as colunas do relatrio. O valor mximo 10 (default 1). VER[ IFY ] ON | OFF Determina se o texto do comando SQL ser apresentado antes e aps o SQL*PLUS ter efetuado a substituio do parmetro pelo valor real (default ON). AUTO[COMMIT] {OFF | ON | IMM[EDIATE]} Indica se o ORACLE efetiva as modificaes pendentes para o database. A opo ON faz com que seja executado um COMMIT aps cada comando SQL ou bloco PL/SQL. A opo IMM funciona de forma semelhante a ON. ARRAY[SIZE] {20|n} Determina o nmero de linhas que o SQL*Plus deve obter do banco de dados a cada leitura (Fetch). NUM[WIDTH] {10 | n} Indica a largura default para apresentao de nmeros. SQLC[ASE] {MIX[ED] | LO[WER] | UP[PER]} Converte os textos dos comandos SQL e PL/SQL de acordo com a opo escolhida, inclusive os textos constantes (entre plics). (default MIXED) SQLP[ROMPT] {SQL> | text } Indica o texto de prompt para o SQL*PLUS. SQLT[ERMINATOR] {; | c | OFF | ON} Indica qual caracter o SQL*PLUS reconhecer como fim de linha e execuo. OFF indica que no existe caracter associado, o fim do comando reconhecido por uma linha inteira em branco. A opo ON retorna ao valor default de; SUF[FIX] {SQL | text} Indica a extenso default para arquivos de comandos do SQL*PLUS. APPI[NFO]{ON|OFF|text} Indica que os comandos executados com @, @@ e Start devem ser registrados pelo pacote DBMS_APPLICATION_INFO a fim de terem sua execuo monitorada pelo DBA. O valor default para texto SQL*Plus.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 179

INTRODUO AO ORACLE9I - SQL SQL> SET SPACE 5 SQL> SET SQLT ] SQL> SET SQLPROMPT "CURSO> " CURSO> SELECT CD_DEPTO, CD_DEPTO_CTB, CD_GERENTE 2 FROM DEPTO 3 WHERE CD_DEPTO IN ('A00', 'BO1')] CD_ --B01 A00 CD_ --A00 CD_GERENTE ---------20 10

AUTOP[RINT] {OFF|ON} Apresenta, automaticamente, o valor das variveis BIND aps a execuo de um PL/SQL. BLO[CKTERMINATOR] {.|c} Determina um caracter no-alfanumrico a ser usado para indicar fim de blocos PL/SQL. CMDS[EP] {;|c|OFF|ON} Determina um caracter no alfanumrico usado para separar mltiplos comandos de SQL*Plus digitados na mesma linha. Se usarmos a opo ON, o caracter default ser ponto e vrgula ( ; ). COLSEP {_|text} Determina o texto a ser impresso entre colunas selecionadas (Select). Se o valor tiver brancos ou caracteres de pontuao, deve ser informado entre aspas simples. O valor default um nico espao em branco. CON[CAT] {.|c|OFF|ON} Determina o caracter para terminar uma varivel de substituio se desejarmos seguir imediatamente a varivel com um caracter que o SQL*Plus deva interpretar como valor e no como parte do nome da varivel de substituio. COM[PATIBILITY] {V7|V8|NATIVE} Especifica a verso do banco de dados com a qual estamos nos conectando. AUTOT[RACE] {OFF|ON|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]] Apresenta um relatrio sobre a execuo dos comandos de SQL DML (Select, Insert, Update ou Delete) bem sucedidos. O relatrio pode incluir a apresentao de estatsticas e o caminho de execuo (Explain). A opo TraceOnly apresenta o relatrio sem apresentar os dados da Query. Se Statistics for solicitado a execuo do comando realizada, porm sem a apresentao dos resultados. Para que a opo Explain possa ser executada deve ser criada a tabela Plan_Table para a gerao do caminho de acesso.
CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 180

INTRODUO AO ORACLE9I - SQL SQL> SET CMDSEP / SQL> SET CONCAT */SET NUMWIDTH 4/SET VERIFY ON/SET COLSEP | SQL> SELECT CD_DEPTO, CD_DEPTO_CTB, CD_GERENTE G 2 FROM DEPTO 3 WHERE CD_DEPTO > '&D*00'; Enter value for d: D old 3: WHERE CD_DEPTO > '&D*00' new 3: WHERE CD_DEPTO > 'D00' CD_|CD_| G ---|---|---D01|A00| D11|D01| 60 D21|D01| 70 E01|A00| 50 E11|E01| 90 E21|E01| 100 COPYC[OMMIT] {0|n} Controla o nmero de linhas aps as quais o comando COPY deve efetivar (Commit) as linhas para o banco de dados. Se optarmos por 0 (zero), o commit s ser executado ao final da cpia. COPYTYPECHECK {OFF|ON} Determina que a verificao de compatibilidade de tipos de dados deve ser suprimida durante uma incluso ou adicionamento de linhas para tabelas usando-se o comando COPY. Esta uma facilidade para DB2, que necessita que um CHAR seja copiado para um DB2 DATE. DEF[INE] {'&'|c|OFF|ON} Determina o caracter a ser usado para prefixar variveis de substituio. ON ou OFF controla se o SQL*Plus ir ou no pesquisar no texto a procura de variveis de substituio para substitu-las por valores. Ao usarmos ON o valor atribudo &. Esta opo tem precedncia sobre SCAN. ECHO {OFF|ON} Controle quando o comando Start lista cada comando presente no arquivo de comandos quando realiza a sua execuo. EDITF[ILE] file_name[.ext] Determina o nome default para o comando Edit ( no Windows95 o nome default Afiedt.buf). Podemos incluir caminho e/ou extenso para o arquivo. EMB[EDDED] {OFF|ON} Controla onde cada nova pgina do relatrio comea. OFF fora cada relatrio a comear no topo de uma nova pgina. ON permite que um relatrio inicie em qualquer parte da pgina.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 181

INTRODUO AO ORACLE9I - SQL

ESC[APE] {\|c|OFF|ON} Define qual o caracter a ser usado como escape. ON altera o valor <c> para o default \. Este caracter utilizado antes do caracter indicado para variveis de substituio para indicar que o texto a seguir deve ser considerado normal e no uma substituio. SQL> SET DEFINE # SQL> SET AUTOTRACE ON SQL> SET ESCAPE ! SQL> SELECT CD_DEPTO, CD_DEPTO_CTB, CD_GERENTE 2 FROM DEPTO 3 WHERE CD_DEPTO = '#DEP' AND 4 CD_DEPTO_CTB <> '!#01'; Enter value for dep: A00 old 3: WHERE CD_DEPTO = '#DEP' AND new 3: WHERE CD_DEPTO = 'A00' AND no rows selected Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DEPTO' 2 1 INDEX (UNIQUE SCAN) OF 'SYS_C00590' (UNIQUE)

Statistics ---------------------------------------------------------0 recursive calls 0 db block gets 2 consistent gets 0 physical reads 0 redo size 587 bytes sent via SQL*Net to client 637 bytes received via SQL*Net from client 3 SQL*Net roundtrips to/from client 1 sorts (memory) 0 sorts (disk) 0 rows processed SQL>

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 182

INTRODUO AO ORACLE9I - SQL FLU[SH] {OFF|ON} Controla quando o resultado de uma execuo enviada para o vdeo. A utilizao deste comando pode aumentar a performance inibindo o I/O necessrio para apresentao das informaes. Podemos usar OFF quando desejamos executa um arquivo de comandos no interativamente, pois no necessitamos visualizar os resultados ou prompts. HEADS[EP] {||c|OFF|ON} Define o caracter a ser usado para indicar quebra de linha na formatao de cabealho de coluna (heading) no comando Column. LOBOF[FSET] {n|1} Determina a posio inicial a partir das quais dados do tipo CLOB ou NCLOB sero recuperados e mostrados. NEWP[AGE] {1|n|NONE} Determina o nmero de linhas em branco a serem impressas a partir do topo da pgina at o ttulo do relatrio. Se colocarmos zero, ser impresso um Formfeed no incio de cada pgina (inclusive da primeira). Se atribuirmos NONE, no ser impressa nenhuma linha em branco ou Formfeed. NULL text Determina o texto a ser apresentado quando o resultado de um comando SELECT para uma determinada coluna for NULL. NUMF[ORMAT] format Determina o formato default para apresentao de nmeros. O formato o mesmo do comando Column. SQL> SET AUTOPRINT ON SQL> SET NULL "NULO" SQL> SET NUMFORMAT L999G999G999D99 SQL> VARIABLE V NUMBER SQL> BEGIN :V:= 5; END; 2 / PL/SQL procedure successfully completed. V ------------------------$5.00 SQL> SELECT CD_DEPTO, CD_DEPTO_CTB CONTAB 2 FROM DEPTO 3 WHERE CD_DEPTO = 'A00'; CD_ CONTAB --- -----A00 NULO
CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 183

INTRODUO AO ORACLE9I - SQL LONG {80|n} Determina a largura mxima em bytes para apresentao de valores LONG, CLOB e NCLOB e para cpia de valores LONG. O valor mximo de 2Gb. LONGC[HUNKSIZE] {80|n} Determina o tamanho (em bytes) dos incrementos nos quais o SQL*Plus recupera um valor LONG, CLOB ou NCLOB. Quando obtemos valores CLOB ou NCLOB podemos desejar obter os valores em pedaos em vez do tamanho total em funo de restries de memria. RECSEP {WR[APPED]|EA[CH]|OFF} Mostra ou imprime separadores de registros. A varivel RECSEPCHAR define o caracter a ser apresentado para separao de registros. O valor default um branco. Esta varivel indica quando o SQL*Plus deve efetuar a separao dos registros. Se escolhermos WRAPPED, o SQL*Plus imprime um separador somente aps as linhas quebradas. Se escolhermos EACH a impresso se dar a cada linha. RECSEPCHAR {_|c} Define o caracter separador de registros. O default um branco. SHOW[MODE] {OFF|ON} Indica se o SQL*Plus mostra o valor antigo e o novo de uma varivel de sistema quando esta modificada com o comando SET. SERVEROUT[PUT] {OFF|ON} [SIZE n] [ FOR[MAT] {WRA[PPED]| WOR[D_WRAPPED]|TRU[NCATED]} ] Controla a apresentao das informaes geradas atravs do pacote DBMS_OUTPUT em stored procedures ou blocos de PL/SQL. O parmetro Size determina o nmero de bytes que podem ser buferizados dentro do Oracle8 Server (o valor deve variar entre 2000 e 1.000.000). O default 2000. Quando WRAPPED habilitado a quebra de linha ocorre a cada LINESIZE caracteres. Quando WORD_WRAPPED utilizado a quebra de linhas ocorre a cada LINESIZE caracteres, porm em final de palavra. Quando TRUNCATED habilitado, cada linha truncada em LINESIZE caracteres.
SQL> SQL> SQL> new: SQL> 2 SET RECSEPCHAR ! SET RECSEP EACH SET SHOWMODE ON showmode BOTH SELECT CD_DEPTO, CD_DEPTO_CTB CTB FROM DEPTO WHERE CD_DEPTO IN ('A00', 'B01');

CD_ CTB --- --B01 A00 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! A00 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 184

INTRODUO AO ORACLE9I - SQL

FLAGGER {OFF|ENTRY|INTERMED[IATE]|FULL} Verifica sintaticamente o comando SQL informado com o padro ANSI/ISO SQL92. Este comando pode ser executado mesmo que no estejamos conectados ao banco de dados. Ficar acionado atravs de todas as conexes que estabelecermos, at que seja desabilitado ou que encerremos (EXIT) o SQL*Plus. SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]} Permite o alinhamento correto para terminais que mostrem caracteres shift junto com os dados (por exemplo IBM 3270). SQLCO[NTINUE] {> |text} Determina o caracter que o SQL*Plus mostra como prompt se quebrarmos uma linha de comando do SQL*Plus usando o hfen ( - ). SQLN[UMBER] {OFF|ON} Determina o prompt para a segunda (e subseqentes) linhas quando estamos efetuando a digitao de comandos SQL ou PL/SQL. ON indica que o prompt deve ser uma numerao seqencial. OFF indica que o valor deve ser SQLPROMPT. SQLPRE[FIX] {#|c} Indica um prefixo. Durante a digitao de um comando de SQL podemos, em uma linha separada prefixada pelo caracter escolhido, digitar um comando de SQL*Plus, que ser executado imediatamente aps o <enter> da linha. Deve ser um caracter no alfanumrico. TAB {OFF|ON} Determina como o SQL*Plus formata espaos no resultado. OFF usa brancos para formatar espaos no resultado. ON usa o caracter TAB. Esta opo aplicvel apenas a terminais. TABs no so colocados em arquivos.
SQL> SET FLAGGER INTERMEDIATE SQL> SET SQLCONTINUE = SQL> SET SQLNUMBER OFF SQL> SET SQLPREFIX $ SQL> SELECT CD_DEPTO, CD_DEPTO_CTB SQL> $SET LINESIZE 50 SQL> FROM DEPTO SQL> WHERE CD_DEPTO > 'A00'; WHERE CD_DEPTO > 'A00' * ERROR at line 3: ORA-00097: Use of Oracle SQL feature not in SQL92 Intermediate Level ORA-06550: line 4, column 16: PLS-01454: No operator may be used with values of data type CHAR SQL> COL CD_DEPTO HEAD "COD DEPTO" = FOR A9 CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 185

INTRODUO AO ORACLE9I - SQL

TERM[OUT] {OFF|ON} Controla a apresentao dos resultados gerados por comandos executados a partir de um arquivo de comandos. OFF suprime a apresentao do resultado no vdeo, mas o spool do resultado gerado. TERMOUT OFF no afeta a apresentao de comandos interativos. TI[ME] {OFF|ON} Controla a apresentao da hora atual. ON mostra a hora corrente antes do prompt. TIMI[NG] {OFF|ON} Controla a apresentao de estatsticas de tempo. ON mostra as estatsticas em cada comando SQL ou bloco de PL/SQL. TRIM[OUT] {OFF|ON} Determina se o SQL*Plus deixa os brancos finais de cada linha ou remove-os. ON remove os brancos ao fim de cada linha aumentando a performance, especialmente til quando executamos o SQL*Plus de um equipamento lento. No afeta Spool. TRIMS[POOL] {ON|OFF} Determina se o SQL*Plus retira os brancos ao final de cada linha enviada para spool. ON remove os brancos finais. No afeta o resultado para o terminal. UND[ERLINE] {-|c|ON|OFF} Determina o caracter usado para sublinhar cabealhos de colunas. ON altera o valor para o padro -. <c> no pode ser um caracter alfanumrico. WRA[P] {OFF|ON} Controla se o SQL*PLUS trunca a apresentao de linhas selecionadas se o comprimento a ser apresentado muito longo para a largura atual da linha. OFF trunca a linha. ON permite a quebra de linha.
SQL> SET SQL> SET SQL> SET SQL> SET SQL> SET 08:39:33 08:39:44 08:39:48 COD DEPTO ========= D11 D21 E01 E11 E21 real: 120 CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 186 LINESIZE 45 WRAP OFF UNDERLINE = TIMING ON TIME ON SQL> SELECT CD_DEPTO, CD_DEPTO_CTB, NM_DEPTO 2 FROM DEPTO 3 WHERE CD_DEPTO > 'D01'; CD_ === D01 D01 A00 E01 E01 NM_DEPTO =============================== GERENCIA DE SISTEMAS COMERCIAIS GERENCIA DE SISTEMAS ADMINISTRA DIRETORIA DE SUPORTE/PRODUCAO OPERACAO SUPORTE DE SOFTWARE

INTRODUO AO ORACLE9I - SQL

DESCRIBE [ DEPTH { 1 | n | ALL } ] [ LINENUM { ON | OFF} ] [ INDENT { ON | OFF} ] Determina o nvel de profundidade para o qual desejamos recursivamente descrever um objeto. Os valores vlidos variam de 1 a 50. As opes do comando possuem o seguinte significado: Depth determina a profundidade. O valor All estabelece o nvel mximo (50). Linenum determina que o nmero da linha deve ser apresentado. Indent determina que deve ser feita indentao quando o objeto contm outros objetos embutidos. SQLBL[ANKLINES] {ON|OFF} Esta clusula permite e preserva linhas em branco dentro de um comando SQL. SQL> SET SQLBLANKLINES ON SQL> SELECT * 2 3 FROM 4 5 DUAL 6 7 ;

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 187

INTRODUO AO ORACLE9I - SQL

COMANDOS DE FORMATAO
COLUMN
Especifica atributos de visualizao para uma determinada coluna. SINTAXE: COL[UMN] [ { column | expr } [option . . . ] ], OBS.: column | expr corresponde ao nome da coluna selecionada ou expresso. Caso seja informado um alias no comando SELECT para o nome da coluna ou expresso, este deve ser o nome utilizado no comando COLUMN. OPTION FOLD_A[FTER] Insere um carriage return aps o cabealho da coluna e aps cada linha na coluna. No haver insero de carriage return aps a ltima coluna da lista selecionada. FOLD_B[EFORE] Insere um carriage return antes do cabealho da coluna e antes cada linha na coluna. No haver insero de carriage return antes da primeira coluna da lista selecionada. FOR[MAT] format Especifica como os dados de determinada coluna sero apresentados. Pode conter os seguintes caracteres : 9 0 $ B MI S PR D G C L , . V EEEE RN, rn DATE An Determina o nmero de caracteres. Apresenta zeros esquerda. Prefixa o valor com um $. Mostra valores zero como branco. Mostra um - aps um valor negativo. Determina o aparecimento do sinal. Mostra valores negativos entre < e >. Mostra o caracter decimal nesta posio. Mostra o separador de milhar nesta posio. Mostra o smbolo financeiro ISO. Mostra o smbolo financeiro local. representa a posio da separao de milhar. representa o ponto decimal. Multiplica por 10n, onde n o n de 9s aps o V. Notao cientfica. Mostra o nmero em algarismos romanos. Mostra o valor como data no formato dd/mm/yy. Determina a largura da coluna para Char e Date.
CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 188

INTRODUO AO ORACLE9I - SQL

ALI[AS] alias Associa um alias para a coluna, que pode ser usado em outros comandos do SQL*Plus (Break, Compute OU Column). CLE[AR] Retorna os atributos de visualizao da coluna para os valores defaults. ENTMAP { ON | OFF } Quando utilizamos HTML no relatrio gerado pelo SQL*Plus, os smbolos <, >, e & podem ser substitudos pelos valores &lt;, &gt;, &quot; e &amp;. A converso ou no do contedo das colunas(ou expresses) que inclumos em nosso comando Select determinado pelo valor do parmetro Entmap dentro do comando Markup Html. Pode acontecer, porm, de desejarmos que para uma determinada coluna o padro seja diferente. Neste caso especificamos o parmetro Entmap diretamente no comando Column para a coluna que desejamos alterar o pdro. HEA[DING] text Indica o cabealho para a coluna. JUS[TIFY] {L[EFT] | C[ENTER] | R[IGHT] } Alinha o cabealho da coluna. O valor default para colunas numricas R e para as demais L. LIKE {expr|alias} Copia os atributos de display de outra coluna ou expresso j definidos. Somente os atributos ainda no alterados para a coluna corrente so copiados. ON | OFF Controla o estado dos atributos de apresentao para uma coluna. OFF desabilita os atributos sem afetar sua definio. ON reabilita os atributos. NEWL[INE] Idem a Fold_Before. NEW_V[ALUE] varivel Especifica uma varivel para receber o valor da coluna. A varivel pode ser usada em um TTITLE. NUL[L] char Determina o caracter a ser apresentado quando o contedo da coluna for NULL. NOPRI[NT] | PRI[NT] Controla a impresso da coluna (cabealho e todos os valores). OLD_V[ALUE] varivel Especifica uma varivel para receber o valor da coluna. A varivel pode ser usada em um BTITLE.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 189

INTRODUO AO ORACLE9I - SQL

WRA[PPED] | WOR[D_WRAPPED] | TRU[NCATED] Indica como o SQL*Plus ir tratar uma coluna (CHAR) quando o seu contedo maior que a largura. WRAPPED indica que o texto ser cortado na largura especificada e continuar na prxima linha. WORD_WRAPPED indica que o texto ser cortado sem quebrar palavra (semelhante a WRAPPED). TRUNCATED indica que o texto ser cortado na largura da coluna, sem continuao. SQL> COLUMN nm_func HEADING 'Nome do|Funcionrio' > JUS C > FOR A15 SQL> COLUMN dt_adm HEADING 'Admisso' > JUS C > NULL '#' > FOR A15 SQL> select nm_func, dt_adm 2 from func 3 where cd_mat in (100, 101) 4 / Nome do Funcionrio Admisso --------------- --------------LAURA # TEODORO 16/06/1990

BREAK
Determina as aes a serem tomadas quando ocorrer uma quebra. SINTAXE: BRE[AK] [ON report_element [ action [ action ] ] ] . . . , onde : REPORT_ELEMENT Pode ser uma das opes : { column | expr | ROW | REPORT } ACTION Pode ser uma das opes: [ SKI[P] n | [SKI[P]] PAGE ] | [NODUP[LICATES] | DUP[LICATES] ]

SQL> BREAK ON cd_depto SKIP PAGE NODUP ON nr_cargo SKIP 2 DUP

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 190

INTRODUO AO ORACLE9I - SQL

COMPUTE
Calcula e imprime linhas de sumrio. SINTAXE: COMP[UTE] [ function [ LAB[EL] text ... ] OF { expr | column | alias } ... ON { expr | column | alias | REPORT | ROW } ... ], onde: FUNCTION Pode ser uma das seguintes opes: AVG, COUNT (conta o nmero de valores no nulos), MAX, MIN, NUM (conta o nmero de linhas), STD, SUM, VAR OBS: Todas as opes presentes na clusula ON devem ter sido utilizadas como quebra na clusula BREAK. SQL> SQL> SQL> SQL> 2 BREAK ON cd_depto SKIP PAGE NODUP ON REPORT SKIP 1 COMPUTE SUM LABEL Tot OF vl_sal ON cd_depto COMPUTE SUM OF vl_sal on REPORT SELECT cd_depto, nr_cargo, nm_func, vl_sal FROM FUNC ORDER BY cd_depto, nr_cargo;

CD_ NR_CARGO NM_FUNC VL_SAL --- ---------- ------------ ---------A00 58 VICENTE 4650 58 SILVIO 2925 66 CRISTINA 5275 *** ---------Tot 12850 CD_ NR_CARGO NM_FUNC VL_SAL --- ---------- ------------ ---------B01 61 MIGUEL 4125 *** ---------Tot 4125 CD_ NR_CARGO NM_FUNC VL_SAL --- ---------- ------------ ---------C01 55 DOLORES 2380 56 HELENA 2842 60 SANDRA 3825 *** ---------Tot 9047

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 191

INTRODUO AO ORACLE9I - SQL

TTITLE
Formata um ttulo especfico no topo de cada pgina do relatrio. SINTAXE: TTI[TLE] [ printspec [ text | variable] . . . ] | [OFF | ON], onde : PRINTSPEC Representa uma ou mais das clusulas a seguir, visando a formatao do texto: COL n S[KIP] [n] TAB n LE[FT] CE[NTER] R[IGHT] BOLD FORMAT texto Alinha para a coluna n da linha corrente Pula para o incio de uma nova linha n vezes Pula n colunas para frente ou para trs (se negativo) Alinha esquerda Centraliza Alinha direita Imprime em negrito. No vdeo a linha ser repetida 3 vezes Especifica um formato de impresso

TEXT Representa o ttulo. Devemos coloc-lo entre aspas simples (apstrofes) se composto por mais de uma palavra. VARIABLE Representa uma varivel do usurio ou uma das variveis de sistema a seguir: SQL.PNO - pgina corrente SQL.LNO - linha corrente SQL.RELEASE - release do Oracle corrente SQL.SQLCODE - cdigo de erro corrente SQL.USER - usurio corrente ON | OFF Torna o ttulo ON ou OFF, sem afetar sua definio.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 192

INTRODUO AO ORACLE9I - SQL

BTITLE
Formata um ttulo especfico no rodap de cada pgina do relatrio. SINTAXE: BTI[TLE] [ printspec [ text | variable] . . . ] | [OFF | ON] SQL> > > > SQL> SQL> SQL> > > > SQL> 2 3 4 5 TTITLE LEFT 'Relacional' CENTER 'Relatorio de Teste' RIGHT 'Page: ' FORMAT 999 SQL.PNO SKIP CENTER BOLD 'Funcionarios' BTITLE CENTER 'FIM DO RELATORIO' BREAK ON cd_depto ON nr_cargo ON REPORT COMPUTE AVG LABEL media SUM LABEL total OF vl_sal ON cd_depto nr_cargo REPORT SELECT cd_depto, nr_cargo, nm_func, vl_sal FROM FUNC WHERE vl_sal < 2000 ORDER BY cd_depto, nr_cargo / Relatorio de Teste Funcionarios Funcionarios Funcionarios Page: 1

Relacional

CD_ NR_CARGO NM_FUNC VL_SAL --- ---------- ------------ ---------D11 52 WILIAM 1827 ********** ---------media 1827 total 1827 *** ---------med 1827 tot 1827 D21 52 DANIEL 1918 FIM DO RELATORIO

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 193

INTRODUO AO ORACLE9I - SQL

REPHEADER
Formata um ttulo a ser impresso no topo de cada relatrio ou lista a definio atual do RepHeader. SINTAXE: REPH[EADER] [PAGE] [ printspec [ text | variable ] ... ] | [ OFF | ON ], onde: PAGE Inicia uma nova pgina aps a impresso do Header do relatrio ou antes da impresso do Footer do relatrio. OBS: Devemos especificar SET NEWPAGE 0 para que seja criada uma quebra de pgina fsica antes de usarmos esta opo (Page). PRINTSPEC Representa uma ou mais das clusulas a seguir, visando a formatao do texto: COL n S[KIP] [n] TAB n LE[FT] CE[NTER] R[IGHT] BOLD FORMAT texto Alinha para a coluna n da linha corrente Pula para o incio de uma nova linha n vezes Pula n colunas para frente ou para trs (se negativo) Alinha esquerda Centraliza Alinha direita Imprime em negrito. No vdeo a linha ser repetida 3 vezes Especifica um formato de impresso

TEXT Representa o ttulo. Devemos coloc-lo entre aspas simples (apstrofes) se composto por mais de uma palavra.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 194

INTRODUO AO ORACLE9I - SQL VARIABLE Representa uma varivel do usurio ou uma das variveis de sistema a seguir: SQL.PNO - pgina corrente SQL.LNO - linha corrente SQL.RELEASE - release do Oracle corrente SQL.SQLCODE - cdigo de erro corrente SQL.USER - usurio corrente ON | OFF Torna o ttulo ON ou OFF, sem afetar sua definio.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 195

INTRODUO AO ORACLE9I - SQL

REPFOOTER
Formata um ttulo a ser impresso no fim de cada relatrio ou lista a definio atual do RepFooter. SINTAXE: REPF[OOTER] [PAGE] [ printspec [ text | variable ] ... ] | [ OFF | ON ]
SQL> SQL> SQL> > > SQL> SQL> SQL> SQL> > SQL> 2 3 4 5 SET NEWPAGE 0 REPHEADER PAGE CENTER 'Relatrio do usurio Teste' TTITLE LEFT 'Relacional' CENTER 'Relatorio de Teste' RIGHT 'Page: ' FORMAT 999 SQL.PNO SKIP CENTER BOLD 'Funcionarios' BTITLE CENTER 'FIM DO RELATORIO' REPFOOTER PAGE CENTER 'Fim do Relatrio do usurio Teste' BREAK ON cd_depto ON nr_cargo ON REPORT COMPUTE AVG LABEL media SUM LABEL total OF vl_sal ON cd_depto nr_cargo REPORT SELECT cd_depto, nr_cargo, nm_func, vl_sal FROM FUNC WHERE vl_sal < 2000 ORDER BY cd_depto, nr_cargo / Relatorio de Teste Funcionarios Funcionarios Funcionarios Page: 1

...............................................................................................Quebra de pgina ............................................................................................

Relacional

Relatrio do usurio Teste

FIM DO RELATORIO
...............................................................................................Quebra de pgina ............................................................................................

Relacional

Relatorio de Teste Funcionarios Funcionarios Funcionarios

Page:

CD_ NR_CARGO NM_FUNC VL_SAL --- ---------- ------------ ---------D11 52 WILIAM 1827 ********** ---------media 1827

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 196

INTRODUO AO ORACLE9I - SQL

SHOW
Lista o valor das variveis de sistema do SQL*PLUS. SINTAXE: SHO[W] option, onde: OPTION Pode ser um dos seguintes valores: <varivel> Apresenta informaes sobre a varivel de sistema nomeada no comando (qualquer das variveis utilizadas com o comando SET). ALL Apresenta informaes sobre todas as variveis de sistema. BTI[TLE] | TTI[TLE] valores atuais especificados para Btitle ou Ttitle.

PARAMETERS Apresenta informaes sobre os parmetros de inicializao do banco de dados. uma opo para uso por DBAs. SGA Apresenta a alocao de memria feita para o banco de dados. uma opo para uso por DBAs. ERRORS Apresenta informaes sobre o ltimo comando de PL/SQL compilado ou sobre uma rotina especfica nomeada no comando, de acordo com as opes abaixo: ERR[ORS] [ {FUNCTION | PROCEDURE |PACKAGE | PACKAGE BODY | TRIGGER | VIEW | TYPE | TYPE BODY | DIMENSION | JAVA CLASS} [ <schema>.] <nome objeto>] LNO line number. PNO page number. REL[EASE] verso do Oracle. REPF[OOTER] | REPH[EADER] valores atuais especificados para Repfooter ou Relheader. SPOO[L] valores atuais especificados para Spool. SQLCODE ultimo SQLCODE relativo ao ultimo comando de SQL executado. USER usurio atual.

SQL> show btitle btitle ON and is the following 25 characters: CENTER 'FIM DO RELATORIO'

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 197

INTRODUO AO ORACLE9I - SQL

CLEAR
Retorna ou limpa o valor atual da opo especificada. SINTAXE: CL[EAR] option, onde: OPTION Pode ser: BRE[AKS] - remove a definio de quebra. BUFF[ER] - limpa o texto do buffer (SQL BUFFER). COL[UMNS] - desativa os atributos de visualizao setados pelo comando COLUMN. COMP[UTES] - remove todas as definies feitas pelo comando COMPUTE. SCR[EEN] - limpa a tela. SQL - limpa o texto do SQL Buffer. TIMI[NG] - deleta todas as reas de controle de tempo criadas pelo comando TIMING.

SQL> clear sql sql cleared SQL> l No lines in SQL buffer. SQL> CLEAR BREAKS SQL> CLEAR COL

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 198

INTRODUO AO ORACLE9I - SQL

COMANDOS INTERATIVOS
DEFINE
Especifica uma varivel e associa um valor alfanumrico a ela. Ou lista o valor e tipo de uma ou de todas as variveis. SINTAXE: DEF[INE] [ variable ] | [ variable = text ] SQL> DEFINE VDEPTO = D21 SQL> DEFINE VDEPTO DEFINE VDEPTO = "D21" (CHAR) SQL> SELECT CD_MAT, NM_FUNC, CD_DEPTO 2 FROM FUNC 3 WHERE CD_DEPTO = '&VDEPTO'; antigo 3: WHERE CD_DEPTO = '&VDEPTO' novo 3: WHERE CD_DEPTO = 'D21' CD_MAT ---------70 230 240 250 260 NM_FUNC -----------EVA JOAQUIM SALVADOR DANIEL SILVIA CD_ --D21 D21 D21 D21 D21

UNDEFINE
Deleta uma determinada varivel. SINTAXE: UNDEF[INE] variable SQL> UNDEFINE vdepto

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 199

INTRODUO AO ORACLE9I - SQL

ACCEPT
Formata uma varivel de substituio. SINTAXE: ACC[EPT] variable [ NUM[BER] | CHAR | DATE ] [ FOR[MAT] format ] [ DEF[AULT] default ] [ PROMPT text | NOPR[OMPT] ] [HIDE] variable representa o nome da varivel de substituio a ser criada. format indica um formato para recepo do valor (til principalmente para datas) default indica um valor inicial para a varivel caso o usurio no fornea nenhum text indica o texto a ser apresentado para o usurio. HIDE indica que a informao digitada no ser mostrada.

ACCEPT MATR FORMAT 099 DEFAULT 100 PROMPT 'Informe a matrcula: ' ACCEPT GIT NUMBER PROMPT 'INFORME O GRAU DE INSTRUCAO: ' SELECT CD_MAT, NR_GIT FROM FUNC WHERE CD_MAT > &MATR AND NR_GIT = &GIT / SQL> @accept Informe a matrcula: INFORME O GRAU DE INSTRUCAO: 18 Input truncated to 1 characters old 3: WHERE CD_MAT > &MATR new 3: WHERE CD_MAT > 100 old 4: AND NR_GIT = &GIT new 4: AND NR_GIT = 18 CD_MAT NR_GIT ---------- ---------140 18 220 18 SQL> define matr DEFINE MATR SQL> define git DEFINE GIT = "100" (CHAR) = 18 (NUMBER)

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 200

INTRODUO AO ORACLE9I - SQL

VARIABLE
Declara uma varivel bind que pode ser usada em um programa PL/SQL. SINTAXE: VAR[IABLE] [ variable [ NUMBER | CHAR| CHAR (n) | NCHAR | NCHAR (n) | VARCHAR2 (n) | NVARCHAR2(n) | CLOB | NCLOB | REFCURSOR ] ] onde variable o nome da varivel a ser criada no SQL*PLUS. SQL> SQL> 2 3 4 5 6 VAR matr NUMBER BEGIN :matr := 11; INSERT INTO func (cd_mat, nm_func) VALUES (:matr, 'aluno novo '); END; /

OBS: A varivel matr poder ser usada em outros programas PL/SQL desta sesso. Seu valor pode ser visualizado nno SQL*Plus com o uso do comando PRINT. Ao trmino do PL/SQL a varivel permanece com o ltimo valor atribudo a ela.

PRINT
Mostra o valor atual de uma varivel bind. SINTAXE: PRI[NT] variable

SQL> print matr MATR ---------11

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 201

INTRODUO AO ORACLE9I - SQL

COMANDOS DE ACESSO AO DATABASE


CONNECT
Realiza o logon com o ORACLE RDBMS. SINTAXE: CONN[ECT] [ username [ / password ] [ @database_specification ] | / ] SQL> CONNECT aluno1/aluno1@relacx

OBS: database_specification corresponde string de conexo do SQL*NET. / representa o logon default (OPS$). Nesta opo a conexo feita com OPS$<name>, onde <name> o username do seu sistema operacional. Neste sintaxe no possvel a especificao de database_specification.

DISCONNECT
Executa um commit para as alteraes pendentes e realiza um logoff para o banco de dados. No encerra o SQL*PLUS. SQL> DISC

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 202

INTRODUO AO ORACLE9I - SQL

GERAIS
REMARK
Inicia um comentrio em um arquivo de comandos. O SQL*PLUS no interpreta o comentrio como um comando. Toda a linha considerada comentrio. Podemos, alm da palavra chave REM, utilizar dois hfens (--) e toda a linha ser considerada comentrio. E, ainda, /* como incio de comentrio e */ como fim de comentrio.

rem Comentrio de Teste -- Segundo comentrio de Teste /* Terceiro comentrio de Teste */ Select cd_mat from func where cd_mat = 100 / SQL> @teste Select cd_mat from func where cd_mat = 100 SQL> get teste 1 rem Comentrio de Teste 2 -- Segundo comentrio de Teste 3 /* Terceiro comentrio de Teste */ 4 Select cd_mat from func 5 where cd_mat = 100 6* / rem Comentrio de Teste * ERROR at line 1: ORA-00900: invalid SQL statement

OBS: No podemos usar o comando GET para copiar o script para o SQL*Buffer e execut-lo depois, uma vez que o SQL*Plus colocar todo o arquivo para memria, considerando-o como um nico comando, o que causar erro de execuo.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 203

INTRODUO AO ORACLE9I - SQL

ATTRIBUTE
Especifica as caractersticas de apresentao para um determinado atributo de um tipo objeto. Adicionalmente mostra as caractersticas de apresentao para um ou todos os atributos. SINTAXE: ATTRIBUTE [ tipo.atributo [option ...] ], onde: OPTION ALI[AS] alias Associa um alias para o atributo, que pode ser usado em outro comando Attribute. CLE[AR] Retorna os atributos de visualizao do atributo para os valores defaults. FOR[MAT] format Especifica como os dados de determinado atributo sero apresentados. Pode conter os seguintes caracteres : 9 0 $ B MI S PR D G C L , . V EEEE RN, rn An LIKE {expr|alias} Copia as caractersticas de display de outro atributo j definido. Somente as caractersticas ainda no alteradas para o atributo corrente so copiados. ON | OFF Controla o estado das caractersticas de apresentao de um atributo. OFF desabilita as caractersticas sem afetar sua definio. ON reabilita as caractersticas. Determina o nmero de caracteres. Apresenta zeros esquerda. Prefixa o valor com um $. Mostra valores zero como branco. Mostra um - aps um valor negativo. Determina o aparecimento do sinal. Mostra valores negativos entre < e >. Mostra o caracter decimal nesta posio. Mostra o separador de milhar nesta posio. Mostra o smbolo financeiro ISO. Mostra o smbolo financeiro local. representa a posio da separao de milhar. representa o ponto decimal. Multiplica por 10n, onde n o n de 9s aps o V. Notao cientfica. Mostra o nmero em algarismos romanos. Determina a largura da coluna para Char e Date.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 204

INTRODUO AO ORACLE9I - SQL

COPY
Copia os dados de uma consulta (query) para uma tabela num banco de dados local ou remoto. SINTAXE: COPY { FROM username [ / password ] @database_specification | TO username [ / password ] @database_specification | FROM username [ / password ] @database_specification TO username [ / password ] @database_specification } { APPEND | CREATE | INSERT | REPLACE } destination_table [ ( column, column, column ...) ] USING query, onde: username [ / password ] Indica o login para o qual ou do qual desejamos efetuar a cpia. Se no especificarmos a password na origem e no destino o SQL*Plus ir solicitar esta informao. database_specification Corresponde string de conexo com o banco de dados. destination_table Indica a tabela para a qual desejamos criar ou adicionar dados (column, column, column, ...) Indica o nome das colunas na tabela destino. Deve ser indicado entre aspas se o nome contiver letras minsculas ou brancos. Se as colunas da tabela destino no forem indicadas, devem ser informados dados para todas as colunas e na ordem de criao na tabela. USING query Especifica o comando Select para obteno dos dados. FROM username [ / password ] @database_specification Especifica o login e banco de dados que contm os dados a serem copiados. Se omitirmos esta clusula, o default o banco de dados no qual o SQL*Plus est atualmente conectado. TO username [ / password ] @database_specification Especifica o banco de dados que contm a tabela destino. Se omitirmos a clusula TO ser considerado o banco de dados no qual o SQL*Plus est conectado. APPEND Inclui as linhas obtidas pela query na tabela destino, es esta existir. Caso a tabela destino no exista o comando Copy a criar. O nome das colunas corresponde queles indicados na clusula (column...) ou ao nome das colunas selecionadas.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 205

INTRODUO AO ORACLE9I - SQL

CREATE Inclui as linhas obtidas pelo query na tabela destino aps cri-la. Se a tabela destino j existir ocorrer um erro. INSERT Inclui as linhas obtidas pela query na tabela destino. Se esta no existir ocorrer um erro. REPLACE Substitui a tabela destino e todo o seu contedo pelas linhas obtidas pela query. Se a tabela destino no existir, o comando Copy far sua criao. Caso contrrio efetuar um Drop Table e em seguida sua criao.

SQL> COPY TO ALUNO1/ALUNO1@RELACX2 CREATE > FUNC_TESTE(CD_MAT, NM_FUNC, CD_DEPTO) > USING SELECT CD_MAT, NM_FUNC, CD_DEPTO > FROM FUNC > WHERE CD_DEPTO = 'D11' Array fetch/bind size is 15. (arraysize is 15) Will commit when done. (copycommit is 0) Maximum long size is 80. (long is 80) Table FUNC_TESTE created. 9 rows selected from DEFAULT HOST connection. 9 rows inserted into FUNC_TESTE. 9 rows committed into FUNC_TESTE at ALUNO1@RELACX2.

OBS: No se esquea que o comando Copy um comando de SQL*Plus e que no podemos encerrar o comando no meio (dar enter). Para continuao de linha do mesmo comando utilize o hfen ( - ).

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 206

INTRODUO AO ORACLE9I - SQL

HOST
Permite o envio de um comando para o sistema operacional sem sair do SQL*Plus. SINTAXE: HO[ST] [command] Onde command representa o comando a ser enviado. OBS: Se executarmos o comando Host sem comando, ser apresentado o prompt do sistema operacional para que possamos executar diversos comandos.

PASSWORD
Permite que alteremos uma password do user corrente ou do user informado. SINTAXE: PASSW[ORD] [username] Onde username indica o usurio que desejamos modificar a password. Caso no seja informado, ser considerada a mudana para o usurio corrente.

PAUSE
Mostra o texto e aguarda que o usurio pressione [Return]. OBS: Se text no for informado mostra uma linha em branco e aguarda a ao do usurio. SINTAXE: PAU[SE] [text] Onde text corresponde ao texto que desejamos apresentar. SQL> PAUSE 'Posicione o papel na impressora e pressione [Enter]' 'Posicione o papel na impressora e pressione [Enter]' SQL> PAUSE SQL>

OBS: Como o comando Pause sempre aguarda uma ao do usurio, seria conveniente que na mensagem fosse solicitar esta ao.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 207

INTRODUO AO ORACLE9I - SQL

PROMPT
Envia a mensagem especificada ou uma linha em branco para a tela. SINTAXE: PROMPT [text] Onde text corresponde mensagem que desejamos apresentar. Podemos usar este comando dentro de um arquivo de comandos para informar ao usurio da etapa em execuo.

SQL> @pr 'Iniciando execuo da cpia' 'Informe a data de nascimento do funcionrio' 'A data deve ser informada com o formato : dd/mm/yy' Data Nascimento: > 10/12/65 'Iniciando a pesquisa para gerao do arquivo' 'Arquivo gerado' 'Fim de programa' SQL>

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 208

INTRODUO AO ORACLE9I - SQL

STORE
Salva os atributos do ambiente SQL*Plus em um arquivo do sistema operacional. SINTAXE: STORE SET file_name[.ext] [ CRE[ATE] | REP[LACE] | APP[END] ], onde: CREATE Cria um arquivo novo. Se o arquivo j existir ocorrer um erro. REPLACE Substitui um arquivo existente. APPEND Adiciona a lista de comandos a um arquivo existente. A extenso default .SQL. SQL> STORE SET AMBIENTE Criado file AMBIENTE SQL> ed ambiente.sql O contedo do arquivo gerado pelo comando anterior : set set set set set set set set set set set set set set set set set set set set set ... appinfo ON appinfo "SQL*Plus" arraysize 15 autocommit OFF autoprint OFF autotrace OFF shiftinout invisible blockterminator "." cmdsep OFF colsep " " compatibility NATIVE concat "." copycommit 0 copytypecheck ON define "&" echo OFF editfile "afiedt.buf" embedded OFF escape OFF feedback 6 flagger OFF

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 209

INTRODUO AO ORACLE9I - SQL

TIMING
Registra dados temporais durante um determinado perodo. Lista o nome do timer corrente e registra o tempo ou lista o nmero de timers ativos. SINTAXE: TIMI[NG] [ START text | SHOW | STOP ], onde: START text Inicializa um timer com o nome especificado por text. Podemos ter mais de um timer ativo, executando este comando mais de uma vez. SHOW Lista o nome do timer corrente e o tempo acumulado. STOP Lista o nome do timer corrente e o tempo acumulado e remove este timer. Se existirem outros timers o ltimo a receber Start torna-se o timer corrente.

OBS: Cada execuo do comando Timing sem clusulas lista o nmero de timers ativos. SQL> timi start t1 SQL> select count(*) from func; COUNT(*) ---------34 SQL> timi show timing for: t1 real: 29440 SQL> select count(*) from func; COUNT(*) ---------34 SQL> timi show timing for: t1 real: 43120

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 210

INTRODUO AO ORACLE9I - SQL

WHENEVER OSERROR
Encerra o SQL*Plus se ocorrer um erro de sistema operacional (por exemplo I/O error). SINTAXE: WHENEVER OSERROR { EXIT [ SUCCESS | FAILURE | n | variable | :BindVariable ] [ COMMIT | ROLLBACK ] | CONTINUE [ COMMIT | ROLLBACK | NONE ] }, onde: EXIT [ SUCCESS | FAILURE | n | variable | :BindVariable ] Indica ao SQL*Plus para encerrar o programa caso seja detectada uma falha de sistema operacional. Adicionalmente podemos informar um cdigo indicativo de sucesso ou falha ou, ainda, um valor determinado por ns. CONTINUE Desmarca a opo de Exit. COMMIT Indica ao SQL*Plus para executar um COMMIT antes de encerrar ou continuar. ROLLBACK Indica ao SQL*Plus para executar um ROLLBACK antes de encerrar ou continuar. NONE Indica ao SQL*Plus para no efetuar nenhuma ao antes de continuar.

OBS: Se no utilizarmos este comando, o SQL*Plus continuar executando mesmo que ocorra um erro de sistema operacional. SQL> WHENEVER oserror CONTINUE COMMIT

No exemplo foi solicitado que caso ocorra um erro de sistema operacional o SQL*Plus continue, mas antes envie um COMMIT para o banco de dados.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 211

INTRODUO AO ORACLE9I - SQL

WHENEVER SQLERROR
Encerra o SQL*Plus se um comando de SQL ou bloco de PL/SQL gerar um erro. SINTAXE: WHENEVER SQLERROR {EXIT [SUCCESS | FAILURE | WARNING | n | variable | :BindVariable] [COMMIT|ROLLBACK] | CONTINUE [ COMMIT | ROLLBACK | NONE ]}, onde: EXIT [ SUCCESS | FAILURE | WARNING | n | variable | :BindVariable ] Indica ao SQL*PLUS para encerrar to logo seja detectado um comando de SQL com erro ou um bloco de PL/SQL com erro (aps a apresentao da mensagem de erro). CONTINUE Desmarca a opo de Exit. COMMIT Indica ao SQL*Plus para executar um COMMIT antes de encerrar ou continuar. ROLLBACK Indica ao SQL*Plus para executar um ROLLBACK antes de encerrar ou continuar. NONE Indica ao SQL*Plus para no efetuar nenhuma ao antes de continuar.

OBS: Com esta opo o SQL*Plus controla erros de SQL ou de blocos PL/SQL. Ela no est associada a erros em comandos do prprio SQL*Plus. SQL> WHENEVER sqlerror EXIT WARNING COMMIT

No comando executado acima foi solicitado ao SQL*Plus que caso sejam encontrados erros de SQL ou em blocos de PL/SQL o programa encerre com um cdigo de aviso (Warning), mas que todas as alteraes realizadas na sesso sejam efetivadas no banco de dados.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 212

INTRODUO AO ORACLE9I - SQL

ACIONANDO O SQL*PLUS EM BATCH


Como j vimos anteriormente, podemos executar o SQL*Plus em um arquivo de comandos para favorecer a execuo de scripts em batch. Esta prtica muito utilizada em ambientes Unix.

Na sintaxe acima, so apresentadas as seguintes opes: s[ilent] Indica que a execuo ser em batch. No aberta janela para o SQL*Plus.

<logon> Indica o logon do usurio (username, password, string de conexo, etc.), / (barra) ou /Nolog. A / (barra) estabelece conexo no usurio default (Ops$<username do sistema operacional>). A opo /Nolog aciona o SQL*Plus mas no estabelece conexo. Supe-se que na primeira linha do arquivo de comandos encontraremos o logon adequado. <arquivo> Onde informamos o nome do script que desejamos executar. Se o arquivo no estiver local, todo o caminho (diretrio) deve ser informado. Adicionalmente podemos passar os parmetros necessrios execuo do script (veja o comando start e @). (menos) Mostra a sintaxe do SQL*Plus e retorna ao sistema operacional.

? Mostra a verso corrente do SQL*Plus e retorna ao sistema operacional. No deve haver espao entre o sinal de menos e a interrogao.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 213

INTRODUO AO ORACLE9I - SQL Markup com esta opo podemos gerar as sadas dos relatrios em formato HTML se habilitarmos a opo HTML (esta mesma ao pode ser obtida com o comando SET MARKUP HTML ON). O Sql*Plus gera pginas completas contidas nas tags <html> e <body>. A opo Spool OFF gera sada HTML para ser includa em uma pgina Web, porm sem a incluso das tags <html> e <body>. A opo PRE ON indica que o resultado do comando de sql ser includo entre as tags <pre> e </pre>. O texto ao lado da opo Head ser includo no arquivo de sada entre as tags <head> e </head>. O texto associado opo Body permite a especificao de parmetros para a tag Body. O texto ao lado de Table permite a especificao de atributos para a tabela tais como BORDER, CELLPADDING, CELLSPACING e WIDTH. Por default o valor de Width 90% e Border 1. A opo Entmap se receber o valor OFF manter os valores de <, > e encontrados nos dados lidos do banco de dados intactos, isto , considerar que as informaes so pertencentes a textos em HTML. Caso esta opo receba o valor ON, os textos sero traduzidos, onde < ser substitudo por &lt;, > ser substitudo por &gt; e ser substudo por &qt;. LINHA DE COMANDO DO SQL*PLUS sqlplus -s -m "html on head '<title>teste de html</title>' body BGCOLOR=#ff0000 entmap off spool on" aluno/aluno @arqhtm ARQHTM.SQL spool teste.htm Select cd_depto, nm_func from func where cd_depto = 'A00'; spool off exit

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 214

INTRODUO AO ORACLE9I - SQL RESULTADO <html> <head> <title>teste de html</title> <meta name="generator" content="SQL*Plus 9.0.1"> </head> <body BGCOLOR=#ff0000> <p> <table border="1" width="90%"> <tr> <th> CD_ </th> <th> NM_FUNC </th> </tr> <tr> <td> A00 </td> <td> CRISTINA </td> </tr> <tr> <td> A00 </td> <td> VICENTE </td> </tr> <tr> <td> A00 </td> <td> SILVIO </td> </tr> </table> <p> </body> </html>

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 215

INTRODUO AO ORACLE9I - SQL

LABORATRIO 6:
1. Sabendo-se que os cdigos de departamento possuem o significado abaixo, deseja-se uma listagem, com quebra por centro de custo dos funcionrios e seus respectivos salrios em ordem descendente, onde : cd_depto = XYY, sendo X YY letra indicativa do departamento centro de custo

2. Montar uma lista dos aniversariantes por ms. A lista deve conter, para cada ms (apresentado por extenso em portugus), o nome, idade e departamento do funcionrio. A lista deve vir ordenada por nmero de ms.

OPCIONAIS 3. Altere sua sesso no SQL*Plus para que as seguintes caractersticas sejam contempladas: Deve ser apresentada a hora na linha de prompt. Deve ser definido um caracter especial para indicao de Null. Todas as variveis host devem ser automaticamente apresentadas. O tamanho de uma linha deve ser limitado em 80 caracteres. Cada pgina de ser limitada a 24 linhas. Os comandos presentes em um arquivo de comandos devem ser mostrados antes de sua execuo. O formato padro para expresses numricas L999G999G999D99 A cada pgina deve ser enviada mensagem correspondente ao usurio. As linhas contendo variveis de substituio devem ser sempre apresentadas para o usurio na troca de valores. Todas estas modificaes devem ser repetidas automaticamente cada vez que o SQL*Plus for ativado.

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 216

INTRODUO AO ORACLE9I - SQL 4. Crie um relatrio com o layout abaixo, ordenado por departamento e matrcula: Relacional Consultoria Folha de Pagamento Departamento Matrcula Data Admisso Salrio ------------ ---------- ------------- ---------------E11 290 30/05/90 $1,534.00 300 19/06/92 $1,775.00 310 12/09/91 $1,590.00 ************ ---------------Tot Sal Dep $10,499.00 E21 100 320 330 340 16/06/90 07/07/90 23/02/96 05/05/96 $2,615.00 $1,995.00 $2,537.00 $2,384.00 ---------------$9,531.00 ---------------$90,371.50 pag.: 4

************ Tot Sal Dep

Tot Sal

Confidencial

CAPTULO 6: CONHECENDO MAIS O SQL*PLUS - 217

INTRODUO AO ORACLE9I - SQL

CAPTULO 7: CLUSULAS AVANADAS DO SQL


Neste captulo veremos as clusulas mais complexas presentes na clusula SELECT e, principalmente, na clusula WHERE de uma consulta, excluso ou atualizao. As seguintes caractersticas sero descritas neste captulo: Outer Join Subselects Correlacionados Clusula Exists Hierarquias Views Subquery na clusula FROM Merge Insert com ALL e WHEN Novos usos de Subqueries Case

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 218

INTRODUO AO ORACLE9I - SQL

OUTER JOIN
Em um Inner Join (j visto anteriormente) o resultado gerado conta apenas com as linhas da tabela A que tm correspondncia com alguma linha na tabela B. SQL> SELECT MAT, NOME, DEPTO, CARGO, SALARIO, GERENTE, DEPTNO 2 FROM F, P 3 WHERE DEPTO = DEPTNO; MAT ---------60 150 160 180 200 220 190 170 70 230 240 NOME -----------IRACY BRUNO ELIZABET MARIA DAVI JOANA JAIRO GABRIEL EVA JOAQUIM SALVADOR DEP CARGO SALARIO GERENTE --- ---------- ---------- -----------D11 55 3547,5 IRACY D11 55 2780,8 IRACY D11 54 2447,5 IRACY D11 53 2347,4 IRACY D11 55 3051,4 IRACY D11 55 3282,4 IRACY D11 53 2249,5 IRACY D11 54 2714,8 IRACY D21 56 3978,7 EVA D21 53 5115 EVA D21 55 3163,6 EVA DEP --D11 D11 D11 D11 D11 D11 D11 D11 D21 D21 D21

11 linhas selecionadas.

No exemplo acima, quando estabelecemos um Join da tabela F com a tabela P (que contm linhas referentes aos departamentos A00, D11 e D21), a linha referente ao departamento A00 no aparece no resultado. Isto ocorre porque na clusula Where estabelecemos a restrio de que apenas quando ocorresse a igualdade entre Depto e Deptno seria gerado uma linha resultante ou seja, um Inner Join. Suponhamos, no entanto, que desejssemos listar todos os dados da tabela de departamento (P), mesmo no havendo correspondncia na tabela de Funcionrios (F). SQL> SELECT MAT, NOME, DEPTO, CARGO, SALARIO, GERENTE, DEPTNO 2 FROM F, P 3 WHERE DEPTO (+) = DEPTNO; MAT NOME DEP CARGO SALARIO GERENTE ---------- ------------ --- ---------- ---------- -----------CRISTINA 60 IRACY D11 55 3547,5 IRACY ... 240 SALVADOR D21 55 3163,6 EVA 12 linhas selecionadas.
CAPTULO 7: CLUSULAS AVANADAS DO SQL - 219

DEP --A00 D11 D21

INTRODUO AO ORACLE9I - SQL A indicao de Outer Join feita com o smbolo (+) ao lado das colunas que estabelecem a relao na clusula Where. Caso o relacionamento fosse estabelecido com duas colunas, ambas receberiam a indicao. A indicao de Outer Join colocada direita das colunas que representam a linha que pode estar ausente no resultado. SQL> SELECT NM_DEPTO, NM_FUNC NM_GERENTE 2 FROM FUNC, DEPTO 3 WHERE FUNC.CD_MAT (+) = DEPTO.CD_GERENTE; NM_DEPTO ---------------------------------------DIRETORIA DA EMPRESA ASSESSORIA CENTRO DE INFORMACAO DIRETORIA DE SISTEMAS GERENCIA DE SISTEMAS COMERCIAIS GERENCIA DE SISTEMAS ADMINISTRATIVOS DIRETORIA DE SUPORTE/PRODUCAO OPERACAO SUPORTE DE SOFTWARE RECURSOS HUMANOS DEPTO PARA TESTE DAS FUNES DE GRUPO 11 linhas selecionadas. No exemplo acima, listamos cada departamento (tabela Depto) e o nome do gerente correspondente (tabela Func), porm sabamos que havia departamentos sem indicao do gerente. Para conseguirmos realizar o Join, precisamos informar ao Oracle que poderiam haver valores de cd_gerente que no teriam correspondncia na coluna cd_mat da tabela Func. OBS: Como restrio, temos que o indicador s pode ser colocado em um dos lados do sinal de igualdade. NM_GERENTE -----------CRISTINA MIGUEL SANDRA IRACY EVA JOAO ELIANE TEODORO

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 220

INTRODUO AO ORACLE9I - SQL O exemplo abaixo equivalente ao anterior, ou seja, todas as linhas de departamento (presente do lado direito da clusula OUTER JOIN) sero trazidas mesmo que no haja correspondncia com linhas em Func (lado esquerdo da clusula OUTER JOIN). OBS: A utilizao explcita da sintaxe RIGHT OUTER JOIN torna o comando SELECT mais claro para quem estiver lendo-o. A recomendao da Oracle de passemos a usar esta sintaxe no lugar da outra (+). SQL> SELECT NM_DEPTO, NM_FUNC NM_GERENTE 2 FROM FUNC RIGHT OUTER JOIN DEPTO ON FUNC.CD_MAT = DEPTO.CD_GERENTE; NM_DEPTO ---------------------------------------DIRETORIA DA EMPRESA ... SUPORTE DE SOFTWARE DEPTO PARA TESTE DAS FUNES DE GRUPO RECURSOS HUMANOS DIRETORIA DE SISTEMAS 11 linhas selecionadas. A sintaxe Full Outer Join permite que sejam trazidas linhas da tabela Func que no possuem correspondncia em Depto e linhas de Depto que no possuem correspondncia em Func, alm, claro, daquelas que se relacionam. Esta uma vantagem sobre a sintaxe anterior (+), que no permite o uso do sinal (+) em ambos os lados da operao. SQL> SELECT NM_DEPTO, NM_FUNC NM_GERENTE 2 FROM FUNC FULL OUTER JOIN DEPTO ON DEPTO.CD_DEPTO = FUNC.CD_DEPTO; NM_DEPTO ---------------------------------------DIRETORIA DA EMPRESA DIRETORIA DA EMPRESA DIRETORIA DA EMPRESA ASSESSORIA ... DEPTO PARA TESTE DAS FUNES DE GRUPO RECURSOS HUMANOS 44 linhas selecionadas. NM_GERENTE -----------SILVIO VICENTE CRISTINA MIGUEL TESTE1 Func s/Depto NM_GERENTE -----------CRISTINA TEODORO

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 221

INTRODUO AO ORACLE9I - SQL

SUBSELECTS CORRELACIONADOS
Nos subselects estudados at agora, no havia relao entre a query principal e a query do subselect. A execuo do subselect acontecia independente da query principal, gerando um resultado que seria utilizado para estabelecer a restrio nos dados da query principal. Suponhamos, porm, que desejssemos obter uma informao relativa linha lida na query principal. Por exemplo, se desejssemos saber quais os funcionrios que ganham mais que a mdia salarial de todos os funcionrios do mesmo departamento. Para atender a esta consulta precisaramos ler o funcionrio, obter o cdigo do departamento, calcular a mdia salarial e retornar ao funcionrio original para verificar se ele se enquadra na condio estabelecida. Um subselect correlacionado indica ao Oracle a necessidade de realizar estas operaes. SQL> SELECT NM_FUNC, VL_SAL FROM FUNC F 2 WHERE VL_SAL > (SELECT AVG(VL_SAL) FROM FUNC 3 WHERE CD_DEPTO = F.CD_DEPTO); NM_FUNC VL_SAL ------------ ---------CRISTINA 5802,5 SANDRA 4207,5 ... TESTE4 300 18 linhas selecionadas. A correlao estabelecida quando no subselect restringimos a pesquisa a uma informao vinda da query externa. No exemplo, limitamos o clculo da mdia ao departamento (F.cd_depto) obtido da query externa, que possui uma tabela Func apelidada de F.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 222

INTRODUO AO ORACLE9I - SQL No exemplo abaixo desejamos obter quais os funcionrios que ganham mais que seu respectivo gerente. SQL> SELECT CD_MAT, NM_SOBRENOME, VL_SAL, CD_GERENTE 2 FROM FUNC, DEPTO 3 WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO 4 AND VL_SAL > (SELECT VL_SAL FROM FUNC 5 WHERE CD_MAT = CD_GERENTE); CD_MAT NM_SOBRENOME VL_SAL CD_GERENTE ---------- ------------ ---------- ---------230 JANUARIO 5115 70 O Join da query externa garante que na linha lida haver dados de um funcionrio qualquer e o cdigo do gerente do departamento em que este funcionrio trabalha. Na subquery no houve necessidade de qualificao uma vez que CD_GERENTE no existe na tabela FUNC. OBS: A qualificao s necessria quando temos um caso particular em que a subquery necessita comparar dados de colunas que, internamente e externamente, tenham o mesmo nome.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 223

INTRODUO AO ORACLE9I - SQL

EXISTS
Exists um predicado, portanto deve ser usado sob condio, isto , na clusula WHERE. OBS: No pode ser usado em nvel de Select e nem independentemente das clusulas Where, Start With, Connect By ou Having. Este predicado tem a finalidade de verificar se a condio estabelecida em um subselect existe ou no. No feita comparao de valor, o retorno True ou False. To logo a condio seja verificada, a busca interrompida.

SQL> DELETE FROM DEPTO 2 WHERE CD_DEPTO = 'D11' 3 AND NOT EXISTS (SELECT 0 FROM FUNC 4 WHERE CD_DEPTO = 'D11'); 0 linhas deletadas. No exemplo acima, desejava-se remover um determinado departamento (D11), desde que no houvesse funcionrios associados. No subselect associado clusula Exists no houve necessidade de se obter nenhuma coluna em especial (Select 0). O objetivo era apenas determinar se existiam ou no linhas na tabela Func relativas ao departamento fornecido. SQL> INSERT INTO G (MAT, NOME, DEPTO, CARGO, SALARIO) 2 SELECT CD_MAT, NM_FUNC, CD_DEPTO, NR_CARGO, VL_SAL 3 FROM FUNC 4 WHERE CD_DEPTO IN ('A00', 'B01') 5 AND NOT EXISTS (SELECT 0 FROM G); 0 linhas criadas.

No exemplo acima, o objetivo era incluir linhas na tabela G, desde que ela estivesse vazia.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 224

INTRODUO AO ORACLE9I - SQL Como ltimo exemplo, suponhamos que desejssemos obter departamentos que no possuam funcionrios. A clusula Exists foi utilizada juntamente com a correlao.

SQL> SELECT CD_DEPTO, NM_DEPTO 2 FROM DEPTO 3 WHERE NOT EXISTS (SELECT * FROM FUNC 4 WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO); CD_ NM_DEPTO --- ---------------------------------------A01 RECURSOS HUMANOS Este, na verdade, o uso mais comum do predicado EXISTS, isto , em conjunto com uma subquery correlacionada.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 225

INTRODUO AO ORACLE9I - SQL HIERARQUIA As clusulas Start With e Connect By utilizadas em um comando Select permitem que faamos a leitura organizada de uma hierarquia. Uma hierarquia definida por um auto-relacionamento em diversos nveis. OBS: Como restrio, temos que a relao deve ocorrer entre colunas de uma mesma tabela. Observe a tabela DEPTO, de nosso ambiente, ela possui um auto-relacionamento indicativo do departamento contbil. O esquema abaixo representa a hierarquia contida na tabela.

No esquema acima vemos que os departamentos B01, C01, D01 e E01 apontam para o departamento A00. Observe o SELECT abaixo: SQL> SELECT CD_DEPTO, NM_DEPTO, CD_DEPTO_CTB 2 FROM DEPTO 3 WHERE CD_DEPTO_CTB = 'A00'; CD_ --B01 C01 D01 E01 NM_DEPTO ---------------------------------------ASSESSORIA CENTRO DE INFORMACAO DIRETORIA DE SISTEMAS DIRETORIA DE SUPORTE/PRODUCAO CD_ --A00 A00 A00 A00

desta forma que indicamos ao Oracle a montagem de uma hierarquia. Na linha filha a coluna de relacionamento aponta para a primary key da linha pai.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 226

INTRODUO AO ORACLE9I - SQL Para listarmos as informaes hierrquicas, contamos com duas clusulas e uma pseudocoluna: clusula Start With Indica ao Oracle em que ramo da hierarquia deve-se restringir a pesquisa. Note-se que o Oracle, a priori, no sabe quantas rvores diferentes e independentes existem na tabela. Esta clusula limita a lista aos ramos que desejamos listar. Se no informarmos esta clusula, o Oracle ler cada linha da tabela DEPTO e a considerar incio (topo) de hierarquia, tentando gerar uma rvore hierrquica independente para cada uma das linhas. clusula Connect By Indica ao Oracle como ocorre o auto-relacionamento. Que colunas devem ser comparadas e qual delas corresponde coluna-pai do relacionamento. pseudocoluna Level identifica o nvel hierrquico da linha listada. Esta pseudocoluna pode ser usada em qualquer comando SELECT, no entanto, somente ter um valor vlido (diferente de zero) quando no comando houver a clusula CONNECT BY. SQL> SELECT CD_DEPTO DEP, NM_DEPTO, CD_DEPTO_CTB CTB, LEVEL 2 FROM DEPTO 3 CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB 4 START WITH CD_DEPTO = 'A00'; DEP --A00 B01 C01 D01 D11 D21 E01 E11 E21 NM_DEPTO ---------------------------------------DIRETORIA DA EMPRESA ASSESSORIA CENTRO DE INFORMACAO DIRETORIA DE SISTEMAS GERENCIA DE SISTEMAS COMERCIAIS GERENCIA DE SISTEMAS ADMINISTRATIVOS DIRETORIA DE SUPORTE/PRODUCAO OPERACAO SUPORTE DE SOFTWARE CTB LEVEL --- ---------1 A00 2 A00 2 A00 2 D01 3 D01 3 A00 2 E01 3 E01 3

9 linhas selecionadas. Na sintaxe acima pudemos verificar que o Oracle ao fazer a leitura dos dados segue uma ordem recursiva. Observe que foram listados os dados em seqncia de nvel, exceto quando ocorria uma hierarquia inferior (filho), sendo seguido ento este nvel.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 227

INTRODUO AO ORACLE9I - SQL Podemos utilizar a pseudocoluna LEVEL para tornar o resultado mais legvel, observe a seguir:
SQL> SELECT CD_DEPTO DEP, RPAD(LPAD(' ', (LEVEL * 3) - 3)||NM_DEPTO,45) NOME, 2 CD_DEPTO_CTB CTB, LEVEL 3 FROM DEPTO 4 CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB 5 START WITH CD_DEPTO = 'A00'; DEP NOME --- --------------------------------------------A00 DIRETORIA DA EMPRESA B01 ASSESSORIA C01 CENTRO DE INFORMACAO D01 DIRETORIA DE SISTEMAS D11 GERENCIA DE SISTEMAS COMERCIAIS D21 GERENCIA DE SISTEMAS ADMINISTRATIVOS E01 DIRETORIA DE SUPORTE/PRODUCAO E11 OPERACAO E21 SUPORTE DE SOFTWARE 9 linhas selecionadas. CTB LEVEL --- ---------1 A00 2 A00 2 A00 2 D01 3 D01 3 A00 2 E01 3 E01 3

Nas sintaxes anteriores, no entanto, no temos controle sobre a ordem em que cada um dos ramos apresentada.
SQL> SELECT CD_DEPTO DEP, RPAD(LPAD(' ', (LEVEL * 3) - 3)||NM_DEPTO,45) NOME, 2 CD_DEPTO_CTB CTB, LEVEL 3 FROM DEPTO 4 CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB 5 START WITH CD_DEPTO = 'A00' 6 ORDER SIBLINGS BY 2 DESC; DEP NOME --- --------------------------------------------A00 DIRETORIA DA EMPRESA E01 DIRETORIA DE SUPORTE/PRODUCAO E21 SUPORTE DE SOFTWARE E11 OPERACAO D01 DIRETORIA DE SISTEMAS D11 GERENCIA DE SISTEMAS COMERCIAIS D21 GERENCIA DE SISTEMAS ADMINISTRATIVOS C01 CENTRO DE INFORMACAO B01 ASSESSORIA 9 linhas selecionadas. CTB LEVEL --- ---------1 A00 2 E01 3 E01 3 A00 2 D01 3 D01 3 A00 2 A00 2

Compare este resultado com o anterior. A hierarquia no foi quebrada, porm a ordem dos elementos subordinados foi invertida. A clusula SIBLINGS associada clusula ORDER BY permite que controlemos a ordem com que os ramos sero apresentados.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 228

INTRODUO AO ORACLE9I - SQL

VIEWS RELACIONAIS
Uma view relacional corresponde a um comando Select armazenado no banco de dados associado a um nome. O comando Create View pertence parte da linguagem que define objetos no banco de dados, chamada de DDL. SQL> CREATE VIEW EMP (NOME, DEPTO, SALARIO, CARGO, NASC, INST) 2 AS SELECT NM_FUNC||' '||NM_SOBRENOME, NM_DEPTO, VL_SAL, NR_CARGO, 3 TO_CHAR(DT_NASC, 'DD/MM/YYYY HH24:MI'), NR_GIT 4 FROM FUNC, DEPTO 5 WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO; View criada. SQL> DESC EMP Nome Nulo? ----------------------------------------- -------NOME DEPTO SALARIO CARGO NASC INST Tipo ------------VARCHAR2(25) VARCHAR2(40) NUMBER(9,2) NUMBER(3) VARCHAR2(16) NUMBER(2)

Na criao da view podemos alterar o nome das colunas para nomes mais amigveis. Elas so visualizadas, pelo usurio, como tabelas. Na verdade, no so tabelas capazes de armazenar dados. Fazem referncia a uma ou mais tabelas, outras views ou uma combinao de tabelas e views. Correspondem a um comando Select armazenado na base de dados, que obtido quando realizamos uma operao de DML fazendo referncia view. SQL> CREATE VIEW FUNCD11 (NOME, DEPTO, SALARIO, CARGO, NASC, INST) 2 AS SELECT NM_FUNC||' '||NM_SOBRENOME, NM_DEPTO, VL_SAL, NR_CARGO, 3 TO_CHAR(DT_NASC, 'DD/MM/YYYY HH24:MI'), NR_GIT 4 FROM FUNC, DEPTO 5 WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO 6 AND FUNC.CD_DEPTO = 'D11'; View criada. A view FUNCD11 possui como restrio que somente os funcionrios do departamento D11 devem ser selecionados.
CAPTULO 7: CLUSULAS AVANADAS DO SQL - 229

INTRODUO AO ORACLE9I - SQL Quando realizamos uma consulta utilizando na clusula From o nome da view, o Oracle junta as restries existentes nos dois Selects e realiza a consulta tabela bsica (pois nela que esto armazenados os dados). SQL> SELECT NOME, DEPTO, SALARIO, NASC FROM FUNCD11 2 WHERE CARGO = 55; NOME -------------IRACY SOUZA BRUNO AZEVEDO DAVI BARBOSA JOANA LUZ DEPTO SALARIO NASC -------------------------------- ------- ---------------GERENCIA DE SISTEMAS COMERCIAIS 3547,5 07/07/1955 00:00 GERENCIA DE SISTEMAS COMERCIAIS 2780,8 17/05/1967 00:00 GERENCIA DE SISTEMAS COMERCIAIS 3051,4 29/05/1971 00:00 GERENCIA DE SISTEMAS COMERCIAIS 3282,4 19/03/1968 00:00

OBS: As views possuem uma grande utilizao em um banco de dados: podemos armazenar queries complexas que sejam muito utilizadas, podemos armazenar queries que contenham restries permitindo o acesso apenas s views no lugar das tabelas bsicas (restries de linhas e/ou colunas), podemos armazenar queries que contenham clculos, colunas constantes que decodifiquem a forma real como a informao est armazenada. O comando Select empregado com a view utiliza para nomes de colunas aqueles definidos para a view tanto com referncia clusula Select quanto clusula Where. SQL> UPDATE FUNCD11 2 SET SALARIO = SALARIO * 1.1 3 WHERE INST = 17; 3 linhas atualizadas.

Uma view pode ser usada para Select e para Insert, Update ou Delete. As linhas atualizadas, na verdade, foram as linhas com nr_git = 17 e cd_depto = D11 da tabela Func.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 230

INTRODUO AO ORACLE9I - SQL No prximo exemplo, estaremos criando uma view que obtenha apenas os gerentes cadastrados na tabela Func. Utilizamos a clusula With Check Option para garantir que a restrio estabelecida para leituras (nr_cargo >= 60 ) tambm seja verificada nas incluses, alteraes e excluses. Caso esta opo no tivesse sido estabelecida, poderamos ter efetuado a incluso na view (na tabela Func, na verdade), porm no obteramos a linha criada quando efetussemos uma consulta usando a view. SQL> CREATE VIEW GERENTES 2 (MAT, NOME, SOBRENOME, DEPTO, CARGO, INSTR, NASC) AS 3 SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, 4 NR_CARGO, NR_GIT, DT_NASC 5 FROM FUNC WHERE NR_CARGO >= 60 6 WITH CHECK OPTION; View criada. SQL> INSERT INTO GERENTES VALUES 2 (11, 'TESTE', 'TESTE', 'D01', 55, 20, '12/01/65'); INSERT INTO GERENTES VALUES * ERRO na linha 1: ORA-01402: violao da clusula where da view WITH CHECK OPTION

Se desejarmos impedir que sejam feitas atualizaes utilizando a view, podemos dispor da clusula With Read Only em substituio a With Check Option. SQL> DROP VIEW GERENTES; View eliminada. SQL> CREATE VIEW GERENTES 2 (MAT, NOME, SOBRENOME, DEPTO, CARGO, INSTR, NASC) AS 3 SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, 4 NR_CARGO, NR_GIT, DT_NASC 5 FROM FUNC WHERE NR_CARGO >= 60 6 WITH READ ONLY; View criada. SQL> INSERT INTO GERENTES VALUES 2 (11, 'TESTE', 'TESTE', 'D01', 55, 20, '12/01/65'); INSERT INTO GERENTES VALUES * ERRO na linha 1: ORA-01733: coluna virtual no permitida aqui Neste caso, qualquer tentativa de atualizao (Insert, Update ou Delete) atravs da view resulta em erro.
CAPTULO 7: CLUSULAS AVANADAS DO SQL - 231

INTRODUO AO ORACLE9I - SQL

USO DE SUBQUERY NA CLUSULA FROM


A clusula From admite a utilizao de uma subquery. Seu funcionamento ser idntico ao de uma view, porm sem haver necessidade de armazenamento da query no banco de dados. A tempo de execuo, a sintaxe de cada uma das queries ser unida para estabelecer a obteno das linhas adequadas.

EM SELECTS
Veremos aqui a utilizao subquery na clusula From de um comando Select. SQL> 2 3 4 5 6 7 SELECT CD_DEPTO, (SAL_DEPTO / SAL_EMP) * 100 "%PART.DEPTO", SAL_DEPTO, SAL_EMP FROM (SELECT SUM(VL_SAL) SAL_DEPTO, CD_DEPTO FROM FUNC GROUP BY CD_DEPTO) D, (SELECT SUM(VL_SAL) SAL_EMP FROM FUNC) E;

CD_ %PART.DEPTO SAL_DEPTO SAL_EMP --- ----------- ---------- ---------A00 14,5045007 14135 97452,51 A02 1,02614084 1000 97452,51 B01 4,65611404 4537,5 97452,51 C01 10,2118457 9951,7 97452,51 D01 97452,51 D11 25,7678945 25111,46 97452,51 D21 16,6897702 16264,6 97452,51 E01 4,53477289 4419,25 97452,51 E11 11,8507979 11548,9 97452,51 E21 10,7581631 10484,1 97452,51 97452,51 11 linhas selecionadas. Neste exemplo, utilizamos um Join de duas subqueries. A primeira obtm o total salarial por departamento, a segunda, o total salarial de toda a empresa. Na query principal estabelecemos um Join com o resultado das duas subqueries, de tal forma que a soma salarial por departamento foi dividida pelo total da empresa, obtendo-se ento um percentual da participao de cada departamento na empresa.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 232

INTRODUO AO ORACLE9I - SQL SQL> SELECT CD_MAT, NM_FUNC, VL_SAL, MAXIMO, MINIMO 2 FROM FUNC, (SELECT MAX(VL_SAL) MAXIMO FROM FUNC), 3 (SELECT MIN(VL_SAL) MINIMO FROM FUNC) 4 WHERE VL_SAL = MAXIMO OR 5 VL_SAL = MINIMO; CD_MAT ---------101 105 107 10 NM_FUNC VL_SAL MAXIMO MINIMO ------------ ---------- ---------- ---------TESTE1 100 5802,5 100 TESTE5 100 5802,5 100 TESTE7 100 5802,5 100 CRISTINA 5802,5 5802,5 100

Neste exemplo acima utilizamos um Join da tabela FUNC com duas subqueries, uma obtm o maior salrio da tabela FUNC e a segunda obtm o menor. As subqueries na clusula From so bastante utilizadas, principalmente quando a subquery realiza uma agregao. NOMEANDO A SUBQUERY O ORACLE possui uma outra forma de utilizarmos subquery na clusula FROM, porm de uma maneira mais clara. Com a clusula WITH utilizada precedendo a query, damos um nome subquery, a partir da ela pode ser usada como se fosse uma view para todas as queries internas a esta, desde a principal at a mais interna. O nome dado tem visibilidade a partir da query principal. SQL> WITH QMAX AS (SELECT MAX(VL_SAL) MAXIMO FROM FUNC), 2 QMIN AS (SELECT MIN(VL_SAL) MINIMO FROM FUNC) 3 SELECT CD_MAT, NM_FUNC, VL_SAL, MAXIMO, MINIMO 4 FROM FUNC, QMAX, QMIN 5 WHERE VL_SAL = MAXIMO 6 OR VL_SAL = MINIMO; CD_MAT ---------101 105 107 10 NM_FUNC VL_SAL MAXIMO MINIMO ------------ ---------- ---------- ---------TESTE1 100 5802,5 100 TESTE5 100 5802,5 100 TESTE7 100 5802,5 100 CRISTINA 5802,5 5802,5 100

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 233

INTRODUO AO ORACLE9I - SQL

EM UPDATES
Para efeito de exemplificao, repetiremos as condies da view Gerentes, porm relacionada diretamente no lugar do nome da tabela bsica. SQL> UPDATE (SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, CD_DEPTO, 2 NR_CARGO, NR_GIT, DT_NASC 3 FROM FUNC 4 WHERE NR_CARGO >= 60 WITH CHECK OPTION) 5 SET NR_GIT = NR_GIT + 1 6 WHERE CD_DEPTO IN ('B01', 'D21'); 1 linha atualizada. At mesmo a clusula With Check Option pode ser utilizada para garantir que a verificao seja realizada. OBS: Com a seleo de apenas algumas colunas da tabela Func, somente estas podem ser atualizadas.

EM INSERTS
No exemplo a seguir, utilizamos a mesma query do exemplo anterior, porm violamos a restrio de cargo >= 60. OBS: A mensagem de erro exatamente a mesma de quando fizemos uma tentativa de incluso incorreta com a view. SQL> INSERT INTO (SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, 2 CD_DEPTO,NR_CARGO, NR_GIT, DT_NASC 3 FROM FUNC 4 WHERE NR_CARGO >= 60 WITH CHECK OPTION) 5 VALUES (12, 'TESTE', 'TESTE', 'D11', 55, 21, '14/04/1970'); INSERT INTO (SELECT CD_MAT, NM_FUNC, NM_SOBRENOME, * ERRO na linha 1: ORA-01402: violao da clusula where da view WITH CHECK OPTION

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 234

INTRODUO AO ORACLE9I - SQL

EM DELETES
A seguir, tentamos fazer referncia a uma coluna da tabela Func que no estava presente no Select usado na clusula From. SQL> DELETE FROM (SELECT CD_MAT FROM FUNC 2 WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO 3 WHERE CD_GERENTE IS NOT NULL)) 4 WHERE CD_MAT >= 210 5 AND NR_GIT = 20; AND NR_GIT = 20 * ERRO na linha 5: ORA-00904: nome invlido de coluna

A mensagem de erro indica que somente podemos mencionar na clusula Where da query principal colunas presentes na subquery.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 235

INTRODUO AO ORACLE9I - SQL

MERGE
O comando tem a funo de obter linhas de uma determinada tabela para atualizar ou incluir linhas em outra tabela.

Como restrio termos que no podemos atualizar mltiplas vezes a mesma linha da tabela destino em um mesmo comando Merge. As clusulas presentes nesse comando so: Into determina a tabela destino onde faremos a incluso ou atualizao. Using determina o dado (origem) que ser includo ou atualizado.

When Matched / Not Matched determina a condio a ser avaliada para incluso ou atualizao. Quando a condio for verdadeira ocorrer a atualizao caso contrrio ser realizada a incluso. SQL> MERGE INTO FUNC F 2 USING (SELECT EMPNO, ENAME, HIREDATE, SAL FROM SCOTT.EMP 3 WHERE ROWNUM < 11) 4 ON (F.CD_MAT = EMPNO) 5 WHEN MATCHED THEN UPDATE SET VL_SAL = VL_SAL + .10 * SAL 6 WHEN NOT MATCHED THEN INSERT (F.CD_MAT, F.NM_FUNC, F.DT_NASC, F.VL_SAL) 7 VALUES (EMPNO, ENAME, HIREDATE, SAL); 10 linhas intercaladas. No exemplo acima, a operao de Merge ser realizada sobre a tabela Func. A clusula Using determina a origem dos dados, que pode ser uma outra tabela (neste caso no h necessidade do parntese), um view ou, como usamos, uma subquery. A tabela Func foi apelidada de F para que pudesse ser qualificada no comando Insert. Isto foi necessrio pois usamos a mesma coluna VL_SAL tanto no trecho relativo ao Update quanto relativo ao Insert, o que causou um erro de ambigidade.
CAPTULO 7: CLUSULAS AVANADAS DO SQL - 236

INTRODUO AO ORACLE9I - SQL Abaixo, usamos o mesmo exemplo, mas como no fizemos a incluso na coluna VL_SAL, no tivemos necessidade de qualificao. SQL> MERGE INTO FUNC 2 USING (SELECT EMPNO, ENAME, HIREDATE, SAL FROM SCOTT.EMP 3 WHERE ROWNUM < 11) X 4 ON (CD_MAT = X.EMPNO) 5 WHEN MATCHED THEN UPDATE SET VL_SAL = VL_SAL + .10 * SAL 6 WHEN NOT MATCHED THEN INSERT (CD_MAT, NM_FUNC, DT_NASC) 7 VALUES (EMPNO, ENAME, HIREDATE); 10 linhas intercaladas. No nosso caso as colunas das tabelas envolvidas no possuem qualquer semelhana, porm havendo necessidade podemos apelidar a subquery e usar este apelido como qualificador das colunas similares.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 237

INTRODUO AO ORACLE9I - SQL

INSERT COM ALL E WHEN


As clusulas All e When do comando Insert permitem que faamos a incluso simutnea, em um nico comando Insert, de dados em diversas tabelas. As clsulas possuem o seguinte significado.

All <clusula Insert Into> - indica que o Oracle far uma incluso incondicional. Ser includa uma linha para cada clusula Insert definida para cada linha retornada pela subquery. When indica que ser feita uma filtragem. Podemos incluir at 127 clusulas When. Elas indicaro qual dos inserts ser realizado. All When todas as clusulas When sero verificadas e para cada uma delas em que a condio for verdadeira a linha ser includa. First When - as clusulas When sero verificadas na ordem estabelecida no comando e quando a primeira for verdadeira, a linha ser includa e as demais descartadas. SQL> INSERT ALL 2 INTO FUNC (CD_MAT, NM_FUNC, CD_DEPTO) VALUES (11, 'TESTE ALL', 'D12') 3 INTO DEPTO (CD_DEPTO, NM_DEPTO) 4 SELECT 'D12', 'NOVO DEPTO' FROM DUAL; INSERT ALL * ERRO na linha 1: ORA-02291: restrio de integridade (ALUNO.SYS_C002720) violada - chave-pai no localizada Neste exemplo, apesar das duas incluses serem realizadas pelo mesmo comando, elas so tratadas separadamente no banco de dados. Tentamos incluir um funcionrio com um departamento ainda inexistente, includo no mesmo comando, porm na linha seguinte. Isto no foi possvel.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 238

INTRODUO AO ORACLE9I - SQL Quando invertemos a operao obtemos sucesso. SQL> INSERT ALL 2 INTO DEPTO (CD_DEPTO, NM_DEPTO) VALUES ('D12', 'NOVO DEPTO') 3 INTO FUNC (CD_MAT, NM_FUNC, CD_DEPTO) 4 SELECT 11, 'TESTE ALL', 'D12' FROM DUAL; 2 linhas criadas.

A sintaxe do comando exige que se viermos a escrever determinar mais de uma tabela, utilizemos a clusula Values para todas as tabelas, exceto para a ltima, que dever, obrigatoriamente vir acompanhada de um comando Select. Como somente desejvamos que uma linha fosse includa em Func, usamos, como artifcio o uso de constantes de a leitura da tabela Dual (que possui somente uma linha). ALL COM WHEN SQL> INSERT ALL 2 WHEN EXTRACT 3 4 WHEN EXTRACT 5 6 ELSE 7 8 1 linha criada. Neste exemplo, utilizamos a clusula When em conjunto com a clusula All. Esta combinao faz com que todas as condies sejam analisadas e se mais de uma for verdadeira mais de um Insert ser realizado.

(DAY INTO (DAY INTO

FROM SYSDATE) < 15 THEN FUNC(CD_MAT, NM_FUNC) VALUES (12, 'TESTE WHEN') FROM SYSDATE) BETWEEN 16 AND 20 THEN FUNC(CD_MAT, NM_FUNC) VALUES (13, 'TESTE WHEN')

INTO FUNC(CD_MAT, NM_FUNC) SELECT 14, 'TESTE WHEN' FROM DUAL;

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 239

INTRODUO AO ORACLE9I - SQL FIRST COM WHEN Quando usamos First com When as condies so analisadas em ordem e a primeira atendida executada, sendo as demais descartadas. O uso da subquery obrigatrio. SQL> INSERT FIRST 2 WHEN EXTRACT 3 4 WHEN EXTRACT 5 6 ELSE 7 8 1 linha criada. SQL> SELECT CD_MAT, NM_FUNC FROM FUNC 2 WHERE CD_MAT BETWEEN 11 AND 17; CD_MAT ---------11 12 15 NM_FUNC -----------TESTE ALL TESTE WHEN TESTE WHEN

(DAY INTO (DAY INTO

FROM SYSDATE) < 15 THEN FUNC(CD_MAT, NM_FUNC) VALUES (15, 'TESTE WHEN') FROM SYSDATE) BETWEEN 16 AND 20 THEN FUNC(CD_MAT, NM_FUNC) VALUES (16, 'TESTE WHEN')

INTO FUNC(CD_MAT, NM_FUNC) SELECT 17, 'TESTE WHEN' FROM DUAL;

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 240

INTRODUO AO ORACLE9I - SQL

NOVOS USOS DE SUBQUERIES


Neste tpico veremos apenas a utilizao do comando SELECT em locais, normalmente, no imaginados. SQL> INSERT INTO FUNC (CD_MAT, NM_FUNC) 2 VALUES ((SELECT MAX(CD_MAT) + 1 FROM FUNC), 'TESTE SELECT'); 1 linha criada.

No exemplo acima obtivemos o maior valor de matrcula da prpria tabela Func para que a incluso no corresse o risco de receber erro de duplicidade. OBS: Nesta sintaxe temos de garantir que o comando Select retorne apenas uma linha. SQL> SELECT (SELECT MAX(CD_MAT) FROM FUNC) MAIOR, 2 (SELECT MIN(VL_SAL) FROM FUNC WHERE CD_DEPTO = 'D11') SAL 3 FROM DUAL; MAIOR SAL ---------- ---------7845 2210,67 Neste exemplo usamos um comando Select como expresso dentro da prpria clusula Select. Esta montagem similar ao uso do Select na clusula From, com a desvantagem de que o retorno de cada comando Select embutido dever conter apenas uma linha. SQL> SELECT (SELECT MAX(CD_MAT) FROM FUNC) MAIOR, 2 (SELECT MIN(VL_SAL) FROM FUNC WHERE CD_DEPTO = 'D11') SAL, 3 (SELECT CD_DEPTO FROM DEPTO) 4 FROM DUAL; (SELECT CD_DEPTO FROM DEPTO) * ERRO na linha 3: ORA-01427: a subconsulta de uma nica linha retorna mais de uma linha

Neste exemplo tentamos obter mais de uma linha de um dos comandos Selects embutidos e recebemos erro.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 241

INTRODUO AO ORACLE9I - SQL

CASE
O uso de uma expresso envolvendo a clusula Case, permite uma estrutura do tipo IF..THEN ELSE dentro de um comando de SQL sem que tenhamos de usar uma rotina. SQL> SELECT CASE IN_SEXO WHEN 'F' THEN 'Sra.' 2 WHEN 'M' THEN 'Sr.' 3 ELSE ' ' END, 4 NM_FUNC||' '||NM_SOBRENOME FROM FUNC 5 WHERE CD_DEPTO = 'A00'; CASE ---Sra. Sr. Sr. NM_FUNC||''||NM_SOBRENOME ------------------------CRISTINA HENDERSON VICENTE LOURENCO SILVIO OLIVA

Neste exemplo analisamos o valor retornado pela coluna IN_SEXO e de acordo com o contedo retornamos informaes diferentes linha a linha. SINTAXE:

Esta sintaxe similar ao uso do DECODE, no entanto, podemos usar a segunda forma sinttica que elimina a necessidade da comparao e na qual podemos definir diversas condies diferentes.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 242

INTRODUO AO ORACLE9I - SQL

LABORATRIO 7:
1. Deseja-se uma lista com todos os gerentes e seus respectivos funcionrios, contendo nome e sobrenome do gerente, cdigo e nome do departamento, nome e sobrenome do funcionrio. Todos os departamentos devem ser apresentados (mesmo que no haja gerentes ou funcionrios) e todos os funcionrios devem ser apresentados (mesmo que estejam sem departamento). 2. Deseja-se remover todas as atividades que no estejam em uso. 3. Deseja-se uma lista contendo nome, matrcula, cargo e salrio dos funcionrios que possuam o maior salrio da empresa e daqueles que possuam o menor salrio da empresa. 4. Deseja-se uma relao hierrquica de todos os departamentos da empresa (cdigo e nome), considerando-se que os departamentos esto subordinados aos seus respectivos departamentos contbeis. A relao deve apresentar endentao de trs espaos para identificar subordinao. O departamento no mais alto nvel da hierarquia no possui indicao de departamento contbil (Null). Apresente o caminho da hierarquia. Ordene o resultado pelo nome do departamento. 5. Deseja-se uma lista contendo nome, sobrenome, matrcula, ramal, cdigo e nome do departamento, cdigo e nome do projeto de todos os funcionrios que sejam responsveis por projeto e, simultaneamente, gerentes. 6. Deseja-se obter a mdia de idade, maior e menor salrio e mdia salarial dos funcionrios do sexo feminino, grupando por grau de instruo e cargo (somente dos cargos com mais de duas funcionrias). OPCIONAIS 7. Determine a quantidade de funcionrios por departamento separados por sexo. 8. Deseja-se uma lista das atividades que estejam associadas a mais de dois departamentos. 9. Atualize o salrio dos funcionrios com mais de cinco anos de casa (exceto os gerentes) para que ganhem salrio semelhante ao do funcionrio com maior cargo do seu prprio departamento (usar um nico comando UPDATE). 10. Criar uma view sobre a tabela de funcionrios que selecione apenas os funcionrios com salrio superior a R$ 2.000,00. Garanta que a atualizao atravs desta view somente possa incluir ou alterar funcionrios cujo salrio seja superior a R$ 2.000,00. 11. Incluir dados na tabela Depto provenientes da tabela Dept do usurio Scott, prefixando os departamentos com D. Caso exista um departamento com o mesmo cdigo, apenas atualize o nome, caso contrrio, inclua o novo departamento. O valor do departamento contbil para todos os novos departamentos D01.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 243

INTRODUO AO ORACLE9I - SQL 12. Em mais um estudo salarial, o departamento Pessoal solicitou a relao de funcionrios coma indicao de sexo (por extenso) e uma classificao dos funcionrios por idade, da seguinte forma: funcionrios com menos de 30 anos (jovem), entre 30 e 45 (maduro), entre 46 e 60 (meia idade) e maior que 60 anos (idoso). Ordene o resultado pelo nome do funcionrio.

CAPTULO 7: CLUSULAS AVANADAS DO SQL - 244

INTRODUO AO ORACLE9I - SQL

CAPTULO 8: DICIONRIO DE DADOS E DCL


Neste captulo estudaremos dois assuntos relacionados: o dicionrio de dados do Oracle e a Data Control Language.

O DICIONRIO DE DADOS DO ORACLE


O banco de dados Oracle possui um conjunto de tabelas especiais para registrar informaes de todos os objetos criados no banco. A este conjunto de tabelas chamamos de Dicionrio de Dados. As tabelas do dicionrio esto criadas no usurio SYS e possuem nomes utilizados internamente pelos softwares da Oracle. Porm, foram criadas views para que pudssemos consultar as informaes cadastradas. Estas views esto divididas em trs grandes grupos: aquelas prefixadas com User_, aquelas prefixadas com All_ e aquelas prefixadas com DBA_. USER_ esto associadas a objetos do usurio; desta forma, ficam disponibilizadas as informaes dos objetos criados no schema do usurio. ALL_ esto associadas a objetos a que o usurio tenha autorizao, sejam do seu schema ou de outros schemas. DBA_ possuem informaes sobre todos os objetos do banco de dados.

Conheceremos apenas algumas das views User que permitiro a obteno de diversas informaes sobre os objetos do usurio. Existem muitas outras views User, com informaes sobre privilgios, auditoria, clusters, dependncias, filas de jobs, roles, comentrios, histogramas, etc. USER_OBJECTS - Esta view contm informaes de todos os objetos do usurio, sejam tabelas, views, ndices, sinnimos, etc. Atravs da coluna Object_Type podemos identificar qual o tipo de objeto listado. Obtemos tambm informaes sobre a data e hora de criao, indicao de subobjeto (tabelas particionadas, por exemplo). USER_TABLES - Esta view contm a descrio das tabelas criadas no schema do usurio que realiza a consulta. Tambm apresenta informaes estticas sobre a tabela, tais como o tablespace onde ela est alocada, o tamanho de uma extenso, quantidade mxima de extenses, percentual de crescimento da extenso, etc., e, ainda, uma srie de informaes dinmicas, tais como o nmero de linhas, o nmero de blocos alocados, o tamanho mdio de cada linha e diversas outras. Estas informaes so alimentadas pelo comando Analyze, que armazena informaes estatsticas sobre os objetos do banco de dados a fim de dar ao Otimizador maiores condies de definir qual o melhor caminho para estabelecer acesso aos dados quando executamos os comandos de DML (ver o tpico Administrando o Banco de Dados).

CAPTULO 8: DICIONRIO DE DADOS E DCL - 245

INTRODUO AO ORACLE9I - SQL USER_TAB_COLUMNS - Esta view contm a descrio das colunas de todas as tabelas, views e clusters do schema do usurio. Com esta view, podemos obter informaes sobre as colunas de uma determinada tabela, view ou cluster. Da mesma forma que na User_Tables, encontramos informaes estticas tais como o tipo da coluna, tamanho, indicao de null e valor default, dentre outras, e, ainda, informaes dinmicas como o nmero de valores distintos, o nmero de nulls encontrados, o maior valor e o menor, etc. Estas informaes tambm so alimentadas pelo comando Analyze com finalidade de otimizao. USER_TAB_PARTITIONS - Encontraremos, aqui, informaes sobre as diversas parties de uma tabela particionada. Estas parties podem ser armazenadas em localizaes diferentes e possuir caractersticas fsicas diferentes daquelas das tabelas. USER_INDEXES - Esta view contm informaes sobre os ndices das tabelas. So informaes estticas (nome, tipo, tabela, tipo da tabela, unicidade, localizao, tamanho, etc.) e dinmicas (nmero de nveis, chaves distintas, nmero de linhas) preenchidas quando executamos o comando Analyze. USER_IND_COLUMNS - Esta view contm informaes sobre as colunas que so chaves dos ndices: nome, tabela, tamanho e posicionamento no ndice. USER_IND_PARTITIONS - Nesta view, encontramos informaes sobre as parties de ndices.

USER_CONSTRAINTS - Esta view contm informaes sobre as regras de integridade de uma determinada tabela. Sejam elas restries sobre colunas ou relacionamentos. USER_CONS_COLUMNS - Contm informaes sobre as colunas existentes nas definies das constraints. USER_SEQUENCES - Descrio das seqncias criadas no schema do usurio.

USER_SYNONYMS - Lista de todos os sinnimos criados no schema do usurio dos objetos presentes em seu schema ou em outros. USER_USERS - Contm informaes sobre os usurios do banco de dados. USER_VIEWS - Lista dos textos das views do banco de dados.

USER_UPDATABLE_COLUMNS - Nesta view, so apresentadas as colunas das tabelas e views indicando se as mesmas podem ser includas, modificadas ou anuladas. USER_TYPES - Apresenta a lista de tipos criados no banco de dados sob o schema do usurio.

USER_TYPE_ATTRS - Apresenta os atributos referentes a cada tipo criado no banco de dados sob o schema do usurio.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 246

INTRODUO AO ORACLE9I - SQL USER_TYPE_METHODS - Descreve os mtodos associados aos tipos criados no schema do usurio. USER_NESTED_TABLES - Descreve a relao entre a tabela nested e a tabela na qual ela est contida. USER_OBJECT_TABLES - Descreve as caractersticas de uma tabela Objeto. Contm informaes de armazenamento estticas e informaes geradas pelo Analyze relativas utilizao. USER_LOBS - Contm informaes sobre os Large Objects (Lobs), como, por exemplo, a tabela em que se encontra, se um dado armazenado dentro ou fora da linha da tabela, nome do ndice, nome do segmento. USER_METHOD_PARAMS - Esta view descreve os parmetros associados a cada mtodo dos tipos definidos. USER_METHOD_RESULTS - Aqui vemos a descrio dos resultados dos tipos definidos.

CONSULTANDO O DICIONRIO DE DADOS


Uma vez que o dicionrio de dados composto de views, sua consulta similar consulta a qualquer tabela: SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES 2 WHERE TABLE_NAME LIKE '%F%'; TABLE_NAME -----------------------------F FUNC TABLESPACE_NAME -----------------------------USERS USERS

No exemplo acima pesquisamos o dicionrio de dados para encontrar as tabelas no schema do usurio que tivessem a letra F em algum lugar de seu nome.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 247

INTRODUO AO ORACLE9I - SQL Neste segundo exemplo consultamos as colunas pertencentes a algumas das tabelas de nosso estudo. SQL> SQL> SQL> SQL> 2 3 COL TABLE_NAME FOR A10 COL COLUMN_NAME FOR A12 COL DATA_TYPE FOR A10 SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME IN ('DEPTO', 'HST_PROMO'); COLUMN_NAME -----------CD_DEPTO NM_DEPTO CD_GERENTE CD_DEPTO_CTB DT_PROMOCAO CD_MAT VL_SAL CD_DEPTO NR_CARGO TX_MOTIVO DATA_TYPE DATA_LENGTH ---------- ----------CHAR 3 VARCHAR2 40 NUMBER 22 CHAR 3 DATE 7 NUMBER 22 NUMBER 22 CHAR 3 NUMBER 22 VARCHAR2 200

TABLE_NAME ---------DEPTO DEPTO DEPTO DEPTO HST_PROMO HST_PROMO HST_PROMO HST_PROMO HST_PROMO HST_PROMO

22 linhas selecionadas. Na consulta abaixo verificamos que a tabela DEPTO possui todas as colunas passveis de atualizao, enquanto que a view EMP somente permite a atualizao das colunas SALARIO, CARGO e ISNT. SQL> SELECT TABLE_NAME, COLUMN_NAME, UPDATABLE, INSERTABLE, DELETABLE 2 FROM USER_UPDATABLE_COLUMNS 3 WHERE TABLE_NAME IN ('DEPTO', 'EMP'); TABLE_NAME ---------DEPTO DEPTO DEPTO DEPTO EMP EMP EMP EMP EMP EMP COLUMN_NAME -----------CD_DEPTO NM_DEPTO CD_GERENTE CD_DEPTO_CTB NOME DEPTO SALARIO CARGO NASC INST UPD --YES YES YES YES NO NO YES YES NO YES INS --YES YES YES YES NO NO YES YES NO YES DEL --YES YES YES YES NO NO YES YES NO YES

10 linhas selecionadas.
CAPTULO 8: DICIONRIO DE DADOS E DCL - 248

INTRODUO AO ORACLE9I - SQL

DATA CONTROL LANGUAGE


Esta parte da SQL nos dar uma viso dos mecanismos de controle. Trabalharemos com dois aspectos destes mecanismos:

COMANDOS PARA CONTROLE DA TRANSAO Contm os comandos necessrios para que possamos controlar a efetivao ou no das modificaes realizadas no banco de dados.

COMANDOS PARA CONTROLE DA SESSO Contm os comandos necessrios para que possamos modificar as caractersticas de nossa sesso.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 249

INTRODUO AO ORACLE9I - SQL

COMANDOS PARA CONTROLE DA TRANSAO


Sabemos que um software de banco de dados deve ser capaz de garantir a integridade fsica e lgica da base de dados, independente do nmero de usurios simultneos que estejam atualizando ou consultando dados. Para isso, o software utiliza mecanismos que permitam a concorrncia. Os comandos tratados neste captulo mostram como estes comandos funcionam e o que significam para o desenvolvimento de aplicativos. TRANSAO Transao um conceito que determina um intervalo de tempo durante o qual vrias modificaes podem ser realizadas para o banco de dados, e ao trmino do qual estas modificaes so efetivadas ou desmanchadas em conjunto. No possvel efetivar parte dos comandos da transao. A transao tratada como uma unidade, como se fosse um nico comando. COMMIT O Oracle possui dois comandos para que indiquemos ao banco de dados o momento em que conclumos a transao da aplicao. A indicao de que a transao deve ser efetivada feita com o comando Commit e a de que a transao deve ser desmanchada feita com o comando Rollback. At que uma transao seja encerrada e efetivada com o uso do comando Commit, nenhuma das alteraes feitas por ela sobre a base de dados fica visvel por qualquer outra sesso que estabelea conexo com o banco de dados, qualquer que seja o usurio conectado. Isto significa que as linhas modificadas por uma transao ficam bloqueadas, impedidas de uso por qualquer usurio do banco de dados, at que a transao seja concluda. Esse mecanismo de bloqueio chama-se Lock. Ele torna as transaes independentes, uma vez que, estando o acesso para atualizao impedido, no corremos o risco de tomar decises em relao a modificaes ainda pendentes, no efetivadas. Aps a execuo do Commit e conseqente efetivao da transao, podemos estar seguros de que as modificaes foram refletidas no banco de dados e no mais podero ser desfeitas. Uma transao inicia quando o primeiro comando de SQL DML encontrado no programa ou aps um Commit ou Rollback.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 250

INTRODUO AO ORACLE9I - SQL Uma transao termina quando: Executamos um Commit ou Rollback.

Um comando de DDL executado. Quando executamos um dos comandos de DDL (alguns sero vistos no tpico Administrando o Banco de Dados), o Oracle executa um Commit implcito antes de iniciar a execuo do comando. Isto encerra a transao que estava em andamento anteriormente e inicia uma outra contendo o comando de DDL. Um comando de DDL concludo. Aps a execuo do comando de DDL, o Oracle implicitamente executa um Commit. Isto encerra a transao que continha o comando. Observe que no podemos desfazer um comando de DDL com Rollback. Aps solicitarmos sua execuo, a transao em uso fechada, abre-se uma outra, faz-se a execuo do comando, a transao encerrada e aberta outra. Quando novamente temos acesso informao, a transao do comando j foi concluda. O usurio se desconecta do Oracle. Se o trmino da transao foi normal, isto , no ocorreram erros, o Oracle efetiva os comandos da ltima transao (Commit). Se o trmino foi anormal, com erros, o Oracle desmancha todos os comandos relativos ltima transao (Rollback). Para transaes terminadas normalmente em um programa Oracle Precompiler (Pro*C, Pro*Cobol, etc), no h efetivao da transao; o compilador no monta um comando de Commit. Neste caso o Oracle far um Rollback. Quando trabalhamos com aplicativos ou utilitrios da Oracle, este padro de trmino estabelecido, ou seja, para trmino normal Commit. recomendao da Oracle que o usurio explicitamente informe ao banco de dados qual a ao desejada tambm para a ltima transao da aplicao, antes de encerrar a conexo com o banco de dados. Como recomendao adicional, temos que um programa que altere o contedo de uma ou mais linhas em uma ou mais tabelas deve periodicamente fixar estas modificaes (Commit). Isto deve ocorrer pois cada uma das linhas modificadas fica bloqueada, impedida de ser atualizada por outra aplicao (Locked). Desta forma, quanto mais linhas Locked uma aplicao mantiver, menor a possibilidade de concorrncia e maior a necessidade de controle por parte do Oracle e, portanto, maior gasto de CPU.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 251

INTRODUO AO ORACLE9I - SQL Inicialmente, a modificao foi realizada apenas para a transao que solicitou o comando. Aps a execuo do Commit, todos os usurios tm acesso informao modificada. SQL> UPDATE FUNC SET VL_SAL = VL_SAL * 1.1 WHERE CD_MAT = 150; 1 linha atualizada. SQL> COMMIT WORK; Validao completa. A palavra Work mantida para compatibilidade com o SQL padro. Os comandos Commit e Commit Work so equivalentes.

ROLLBACK O comando Rollback tem a finalidade de concluir uma transao desmanchando todas as modificaes efetuadas desde o ltimo Savepoint ou Commit. SQL> UPDATE FUNC SET NR_GIT = 1; 57 linhas atualizadas. SQL> ROLLBACK; Rollback completo. SQL> SELECT COUNT(*) FROM FUNC 2 WHERE NR_GIT = 1; COUNT(*) ---------0

CAPTULO 8: DICIONRIO DE DADOS E DCL - 252

INTRODUO AO ORACLE9I - SQL SAVEPOINT Savepoints so utilizados junto com o comando Rollback. Tm a finalidade de marcar um ponto intermedirio na transao. Podem ser teis quando temos uma transao que executa diversos programas. Antes de cada programa podemos marcar um Savepoint e, caso ocorra um erro no programa, podemos realizar um Rollback somente at o ponto marcado, desfazendo todas as modificaes realizadas pelo programa e, ento, execut-lo novamente com as correes necessrias. Quando ocorre um Rollback para Savepoint, todas as modificaes ocorridas aps o Savepoint so desmanchadas e todos os locks adquiridos aps este ponto tambm so liberados. A transao, porm, no efetivada. Todas as modificaes ocorridas antes do Savepoint continuam Lockeds sem efetivao, aguardando que o usurio realize um Commit. SQL> SELECT VL_SAL FROM FUNC 2 WHERE NM_FUNC IN ('DAVI', 'DANIEL'); VL_SAL ---------3051,4 2109,8 SQL> UPDATE FUNC 2 SET VL_SAL = 4000 WHERE NM_FUNC = 'DANIEL'; 1 linha atualizada. SQL> SAVEPOINT DANIEL_SAL; Ponto de salvamento criado. SQL> UPDATE FUNC 2 SET VL_SAL = 3500 WHERE NM_FUNC = 'DAVI'; 1 linha atualizada. SQL> SAVEPOINT DAVI_SAL; Ponto de salvamento criado. No exemplo foram feitas modificaes em dois funcionrios, Davi e Daniel. Marcamos dois pontos de controle: um aps atualizarmos o salrio de Daniel e outro aps atualizarmos o salrio de Davi.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 253

INTRODUO AO ORACLE9I - SQL Abaixo, comprovamos que o salrio de ambos os funcionrios foi modificado. Realizamos, ento, um comando Rollback para um dos pontos intermedirios. O salrio de Davi foi desmanchado, mas o de Daniel no, pois o Savepoint foi marcado aps a ocorrncia da modificao no salrio de Daniel. Desta forma, todas as modificaes ocorridas aps o Savepoint Daniel_Sal foram desmanchadas.
SQL> SELECT VL_SAL FROM FUNC 2 WHERE NM_FUNC IN ('DAVI', 'DANIEL'); VL_SAL ---------3500 4000 SQL> ROLLBACK TO SAVEPOINT DANIEL_SAL; Rollback completo. SQL> SELECT VL_SAL FROM FUNC 2 WHERE NM_FUNC IN ('DAVI', 'DANIEL'); VL_SAL ---------3051,4 4000 SQL> UPDATE FUNC SET VL_SAL = 4000 WHERE NM_FUNC = 'DAVI'; 1 linha atualizada. SQL> SELECT VL_SAL FROM FUNC 2 WHERE NM_FUNC IN ('DAVI', 'DANIEL'); VL_SAL ---------4000 4000 SQL> ROLLBACK; Rollback completo. SQL> SELECT VL_SAL FROM FUNC 2 WHERE NM_FUNC IN ('DAVI', 'DANIEL'); VL_SAL ---------3051,4 2109,8

Caso o comando Rollback To Savepoint houvesse efetivado o salrio de Daniel, no conseguiramos desmanchar a modificao neste momento. Somente o comando Commit efetiva uma transao.
CAPTULO 8: DICIONRIO DE DADOS E DCL - 254

INTRODUO AO ORACLE9I - SQL CONSISTNCIA DE LEITURA o mecanismo do Oracle que regulamenta o processo de leituras e atualizaes simultneas, com as seguintes regras: Uma leitura nunca interrompida por um processo de atualizao, ela sempre prossegue. Uma leitura no bloqueia os dados. No faz Lock.

Uma leitura enxerga o dado com a imagem que ele tinha antes de a leitura se iniciar. Ela v todos os dados Commited antes do incio da consulta e v todas as modificaes feitas por sua prpria transao. Aps um comando Commit, todos os bloqueios (Locks) so liberados.

OBS: O comando Commit possui sintaxe especfica para forar ou comentar a execuo de transaes distribudas, que no sero vistas neste material.

O SEGMENTO DE ROLLBACK Cada base de dados contm um ou mais segmentos de rollback. Esta rea tem a finalidade de registrar as modificaes feitas por cada transao, e que podem ser desmanchadas. Essa rea utilizada para rollback das transaes, Read Consistency e Recovery. O segmento de rollback registra diversas informaes , dentre as quais: Identificador da transao. Descrio da informao como ela existia antes da modificao

Cada modificao que realizamos sobre um dado registrada no segmento de rollback, porm, no registrada a modificao e sim a imagem anterior do dado. A modificao desejada realizada diretamente na rea de memria que contm a informao (o buffer de dados do database). Sendo assim, quando efetuamos uma leitura e a informao ainda no foi efetivada no database (Commit), o Oracle obtm todas as linhas no modificadas dos blocos de dados em memria e todas as informaes modificadas diretamente do segmento de rollback em memria. O segmento de rollback registra o dado antes da alterao. Por este motivo, ele utilizado para rollback e pelo mecanismo de consistncia de leitura, pois contm a imagem original do dado. Uma instncia do banco de dados no pode ser ativada, isto , o banco de dados no inicia se no tiver acesso a pelo menos um segmento de rollback. Todo o controle das modificaes feito com a ajuda do segmento de rollback.
CAPTULO 8: DICIONRIO DE DADOS E DCL - 255

INTRODUO AO ORACLE9I - SQL SET TRANSACTION READ ONLY J discutimos anteriormente o mecanismo de consistncia do Oracle. Este mecanismo garante que o resultado de um comando seja consistente. Pode ser necessrio, porm, que ampliemos esta consistncia com referncia a diversos comandos. Desejamos executar vrias leituras na mesma tabela ou em tabelas diferentes, todas relativas ao mesmo momento de tempo. O comando Set Transaction Read Only garante que a consistncia seja considerada em relao ao momento da execuo do comando Set Transaction e no de cada comando individualmente. O uso do comando Set Transaction determina algumas regras: Deve ser o primeiro comando da transao (caso contrrio, ocorrer um erro). Somente consultas so permitidas na transao.

Um commit, rollback ou qualquer outro comando de DDL (possuem commits implcitos) encerram o efeito do comando Set Transaction. Durante a transao (read only), todas as consultas se referem ao momento da execuo do SET. Desta forma, todas as modificaes feitas na base de dados aps a execuo do comando SET no sero vistas por esta transao. Somente as transaes concludas (Committed) antes de seu incio sero visveis. Este processo no impede a atualizao do banco de dados pelas outras transaes. Novamente, usamos duas sesses lado a lado. OBS: Devemos, no entanto, avaliar com cuidado a necessidade de utilizar este comando, pois transaes Read Only muito longas podem receber erro (Snapshot Is Too Old), indicando que a base de dados j sofreu muitas modificaes desde que o comando foi executado. Quando isto ocorre, podemos encerrar a transao e reexecutar o comando Set Transaction, se necessrio.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 256

INTRODUO AO ORACLE9I - SQL SELECT FOR UPDATE O comando Select For Update um comando da DML que indica ao Oracle que desejamos forar um bloqueio sobre todas as linhas selecionadas, pois, provavelmente, faremos atualizao sobre algumas delas. A clusula For Update, quando adicionada ao comando Select, altera o mecanismo de Lock padro do Oracle (no temos bloqueio na leitura), fazendo com que o comando Select bloqueie as linhas lidas antes do momento da atualizao. s vezes, pode ser necessrio que faamos a leitura de uma informao para efetuar algum clculo ou verificao e posteriormente decidir pela atualizao ou no. Quando separamos o comando Select do comando Update, no temos a certeza de que as linhas atualizadas a tempo de Update ainda tenham a mesma informao que aquelas lidas pelo comando Select. A clusula For update adicionada ao comando Select d esta garantia. Quando executamos um comando Commit ou Rollback na transao que efetuou o comando Select For Update, todas as modificaes so efetuadas e todos os locks adquiridos so liberados, mesmo que no tenha havido modificao em todas as linhas. Recomenda-se a utilizao deste comando para um pequeno nmero de linhas, pois estaremos desfavorecendo a concorrncia.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 257

INTRODUO AO ORACLE9I - SQL DEADLOCKS Um DeadLock uma situao de bloqueio mltiplo em que as transaes envolvidas ficam aguardando umas pelas outras sem que seja possvel a alguma delas prosseguir. Isto causa um bloqueio recproco que s pode ser percebido e resolvido pelo banco de dados. SQL> UPDATE FUNC 2 SET VL_SAL = 1 3 WHERE NM_FUNC = 'GABRIEL'; 1 linha atualizada. SQL> UPDATE FUNC 2 SET VL_SAL = 1 3 WHERE NM_FUNC = 'DILSON'; 1 linha atualizada. USURIO 1

USURIO 2

Observe que ambos os locks so adquiridos, pois as transaes no so conflitantes. Cada uma delas adquire bloqueio sobre uma linha independente. O Oracle percebe a ocorrncia do conflito e cancela o ltimo comando de uma das transaes. Permitindo que o usurio cancele a transao e a execute novamente mais tarde. SQL> UPDATE FUNC USURIO 1 2 SET VL_SAL = 1 3 WHERE NM_FUNC = 'DILSON'; UPDATE FUNC * ERRO na linha 1: ORA-00060: conflito detectado durante espera pelo recurso SQL> UPDATE FUNC 2 SET VL_SAL = 1 3 WHERE NM_FUNC = 'GABRIEL'; USURIO 2

CAPTULO 8: DICIONRIO DE DADOS E DCL - 258

INTRODUO AO ORACLE9I - SQL SET CONSTRAINT Este comando tem por finalidade modificar o momento de verificao das restries de integridade. Normalmente, to logo enviemos um comando de atualizao para a base de dados, as regras de integridade so verificadas (esta a situao mais comum e o que era disponvel at a release 7.3). A partir da release 8 do Oracle, podemos determinar que uma restrio de integridade seja verificada apenas no momento em que a transao for encerrada com Commit. Estabelecemos o modo como a restrio ir trabalhar no momento da criao da regra de integridade. Esta condio poder ser fixa ou varivel. Caso especifiquemos que uma constraint Deferrable, ela poder ter sua condio de verificao alterada a tempo de transao. SQL> CREATE TABLE TA 2 (A NUMBER CHECK (A > 100) INITIALLY DEFERRED DEFERRABLE, 3 B VARCHAR2(20) CHECK(B=UPPER(B)) INITIALLY IMMEDIATE DEFERRABLE); Tabela criada. No exemplo, a coluna B possui uma restrio que ser verificada to logo um comando de DML seja executado. J a coluna A possui a especificao INITIALLY DEFERRED o que indica que a validao de integridade ser adiada (deferred) para o momento em que for executado o comando COMMIT. A opo Deferrable permite a modificao do momento da verificao dinamicamente pelo usurio atravs do comando SET CONSTRAINT. O comando Set Constraint se subdivide em: Set Constraints Immediate Indica que as restries de integridade especificadas por uma constraint com a indicao de Deferrable devem ser verificadas imediatamente aps cada comando de DML. Set Constraints Deferred Indica que as restries de integridade especificadas por uma constraint com a indicao de Deferrable devem ser verificadas apenas quando a transao executar um Commit.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 259

INTRODUO AO ORACLE9I - SQL No primeiro comando Insert, a restrio relativa coluna A violada, mas no ocorre erro porque esta restrio s ser verificada a tempo de Commit. No segundo comando Insert, a restrio relativa coluna B violada e o erro ocorre imediatamente. SQL> INSERT INTO TA VALUES (5, 'TESTE1'); 1 linha criada. SQL> INSERT INTO TA VALUES (101, 'teste2'); INSERT INTO TA VALUES (101, 'teste2') * ERRO na linha 1: ORA-02290: restrio de checagem (ALUNO.SYS_C002747) violada SQL> COMMIT; COMMIT * ERRO na linha 1: ORA-02091: transao repetida ORA-02290: restrio de checagem (ALUNO.SYS_C002746) violada Quando executamos o comando Commit, a verificao da constraint relativa coluna A ocorre e no feita a incluso na tabela TA. SQL> SET CONSTRAINT ALL DEFERRED; Conjunto de restries. SQL> INSERT INTO TA VALUES (5, 'teste3'); 1 linha criada. SQL> COMMIT; COMMIT * ERRO na linha 1: ORA-02091: transao repetida ORA-02290: restrio de checagem (ALUNO.SYS_C002746) violada O comando permite que faamos a alterao de uma constraint especfica ou de todas as constraints que possuem a opo de Deferrable. Para modificarmos o momento de validao de uma restrio especfica, devemos usar seu nome. Para sabermos as restries associadas a uma determinada tabela devemos consultar a view USER_CONSTRAINTS. No exemplo, alteramos a condio de validao para o momento do trmino da transao. Ambas as condies foram violadas, porm o erro somente foi verificado a tempo de Commit. Se alterssemos para a sintaxe ALL IMMEDIATE, to logo executssemos o comando receberamos erro (esta a opo default).
CAPTULO 8: DICIONRIO DE DADOS E DCL - 260

INTRODUO AO ORACLE9I - SQL

COMANDOS PARA CONTROLE DA SESSO


Os comandos presentes neste tpico modificam caractersticas da sesso do usurio; so eles Alter Session e Set Role. ALTER SESSION Este comando possui um amplo espectro de modificaes que pode realizar. Veremos algumas destas modificaes e suas conseqncias. Commit in Procedure Habilita ou desabilita (Enable ou Disable) a execuo do comando Commit (e Rollback) em stored procedures ou functions. SQL> 2 3 4 5 CREATE OR REPLACE PROCEDURE TESTE IS BEGIN COMMIT; END; /

Procedimento criado. SQL> ALTER SESSION DISABLE COMMIT IN PROCEDURE; Sesso alterada. SQL> EXECUTE TESTE; BEGIN TESTE; END; * ERRO na linha 1: ORA-00034: COMMIT no possvel na sesso PL/SQL atual ORA-06512: em "ALUNO.TESTE", line 3 ORA-06512: em line 1 Quando um comando Commit ou Rollback executado em uma sesso, isto afeta todos os comandos executados na sesso. Quando desejamos garantir que as rotinas que executamos na sesso no efetivem a transao, podemos utilizar este comando.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 261

INTRODUO AO ORACLE9I - SQL Set Sql_Trace Habilita ou desabilita (True ou False) a facilidade de trace para a sesso. SQL> ALTER SESSION SET SQL_TRACE = TRUE; Sesso alterada. SQL> SELECT COUNT(*) FROM FUNC; COUNT(*) ---------57 Esta opo aparentemente no muda o comportamento da sesso, porm passa a ser gerado em disco (no ambiente servidor) um arquivo contendo informaes sobre a execuo de cada um dos comandos de DML ocorridos durante a sesso (ou at que esta opo seja desabilitada). Isto ajuda o DBA a verificar a existncia de comandos com problemas de performance. Set NLS Modifica diversas caractersticas relativas National Language Support e sero tratadas no prximo tpico. Set Flagger Indica que os comandos de SQL executados na sesso devero passar pelo crivo de validao sinttica de acordo com o padro Ansi (Entry, Intermediate, Full ou OFF).
SQL> ALTER SESSION SET FLAGGER = ENTRY; Sesso alterada. SQL> SELECT TO_CHAR(SYSDATE, 'DD/MM/YY') 2 FROM DUAL; FROM DUAL * ERRO na linha 2: ORA-00097: o uso do recurso SQL Oracle no se encontra no Nvel SQL92 Entry ORA-06550: linha 2, coluna 8: PLS-01416: Uso de <id> (<valor>...) aqui ORA-06550: linha 2, coluna 16: PLS-01452: Esta funo no faz parte do padro ANSI ORA-06550: linha 2, coluna 8: PLS-01450: Esta <expresso de valor> contm um tipo de dados no-correspondente

O erro apresentado indica que a sintaxe informada se acha incompatvel com o padro SQL92 Entry.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 262

INTRODUO AO ORACLE9I - SQL Set Current_Schema - Possibilidade de alterao do schema corrente sem alterao do usurio corrente. SQL> ALTER SESSION SET current_schema = scott; Sesso alterada. SQL> select count(*) from dept; COUNT(*) ---------4 A alterao de schema faz com que as referncias feitas sem qualificao sejam direcionadas para o schema especificado no comando. Isso uma forma prtica de acesso a dados que esto em outro usurio. Observe que fizemos acesso tabela Emp do usurio Scott sem necessidaee de qualificao (Scott.emp). Essa caracterstica, no entanto, no d privilgios especiais ao usurio. Para que o acesso seja possvel, ele deve ter os privilgios necessrios sobre o objeto desejado. Set Constraints - Este comando tem a finalidade de modificar o momento de verificao das restries de integridade. SQL> ALTER SESSION SET constraints = default; Sesso alterada. SQL> INSERT INTO TA VALUES (5, 'TESTE1'); 1 linha criada. SQL> INSERT INTO TA VALUES (101, 'teste2'); INSERT INTO TA VALUES (101, 'teste2') * ERRO na linha 1: ORA-02290: restrio de checagem (ALUNO.SYS_C002747) violada SQL> COMMIT; COMMIT * ERRO na linha 1: ORA-02091: transao repetida ORA-02290: restrio de checagem (ALUNO.SYS_C002746) violada Com a opo Immediate, indicamos que as condies especificadas por uma Constraint Deferrable sero verificadas imediatamente aps cada comando de DML (similar ao Set Constraints All Immediate marcado no incio de cada transao).

CAPTULO 8: DICIONRIO DE DADOS E DCL - 263

INTRODUO AO ORACLE9I - SQL A opo Deferred indica que as condies especificadas por uma Constraint Deferrable sero verificadas quando a transao for Committed (similar ao Set Constraints All Deferred marcado no incio de cada transao). Finalmente, a opo Default restaura todas as Constraints, no incio de cada transao, ao seu estado inicial (Deferred ou Immediate). Set Time_Zone - Determina a forma de apresentao e a zona (meridiano) para a sesso corrente. Este parmetro est associado sesso (no um parmetro de inicializao). SQL> SELECT SESSIONTIMEZONE FROM DUAL; SESSIONTIMEZONE ------------------------------------------------02:00 SQL> ALTER SESSION SET TIME_ZONE = '+01:00'; Sesso alterada. SQL> SELECT SESSIONTIMEZONE FROM DUAL; SESSIONTIMEZONE -----------------------------------------------+01:00 Ao usarmos o formato +/- hh:mm, indicamos que o valor dever ser fornecido em relao ao meridiano de Greenwich. Os valores vlidos variam de 12:00 a +14:00. Se especificarmos LOCAL, ser usado o valor estabelecido quando a sesso teve incio. Se especificarmos DBTIMEZONE, desejamos que o valor seja igualado especificao do banco de dados. Podemos, ainda, informar um nome de regio. Para sabermos os nomes de regies existentes devemos consultr a coluna TZNAME da view V$TIMEZONE_NAMES. Neste caso a funo SESSIONTIMEZONE retornar um nome de regio.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 264

INTRODUO AO ORACLE9I - SQL

SET ROLE
O comando Set Role adquire para a sesso, dinamicamente, os privilgios das roles informadas. SQL> CONNECT ALUNO/ALUNO Conectado. SQL> CREATE ROLE LER; Funo criada. SQL> GRANT SELECT ON FUNC TO LER; Operao de Grant bem-sucedida. SQL> GRANT LER TO SCOTT; Operao de Grant bem-sucedida.

Na primeira parte deste exemplo, criamos a role Ler e autorizamos a leitura da tabela Func para ela. A role foi autorizada para o usurio Scott. SQL> SELECT COUNT(*) FROM ALUNO.FUNC; SELECT COUNT(*) FROM ALUNO.FUNC * ERRO na linha 1: ORA-00942: a tabela ou view no existe SQL> SET ROLE LER; Conjunto de funes. SQL> SELECT COUNT(*) FROM ALUNO.FUNC; COUNT(*) ---------57 No exemplo acima consideramos que o usurio Scott estava com sua sesso aberta no momento em que a role foi estabelecida. Ao estabelecermos uma nova conexo usando o usurio Scott, podemos ou no ter necessidade de usar o comando Set Role. Isto depender da forma como o DBA da instalao criou o usurio Scott. Procure seu DBA para saber detalhes desta especificao.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 265

INTRODUO AO ORACLE9I - SQL

GLOBALIZATION SUPPORT
A Globalization Support permite o armazenamento, processamento e recuperao de dados em linguagem nativa. Temos a garantida da Oracle de que os utilitrios do banco de dados, as mensagens de erro, a ordem para sort, data, informaes monetrias e convenes de calendrio se adaptem automaticamente linguagem e local nativos. At a verso 8i este conjunto de caractersticas era chamado de National Language Support. A NLS habilita o Oracle a apresentar mensagens na linguagem especificada e datas no formato determinado. Permite que as aplicaes utilizem um conjunto de caracteres para armazenamento de dados no banco de dados compatvel com o pas (acentuao, cedilha, etc.). As aplicaes desenhadas com National Language Support podem trabalhar com diferentes conjuntos de caracteres armazenados no banco de dados, com linguagens diferentes, com formatos de data, com formatos para nmeros, com regras de ordenao e de converso. Na verso 9i as capacidades anteriores foram ampliadas e a National Language Support passou a ser um subconjunto da Globalization Support. Nesta verso poderemos desenvolver aplicaes com capacidade multilingstica e produtos de software podem ser acessados e executados de qualquer parte do mundo sem modificao. CARACTERSTICAS DA GLOBALIZATION SUPPORT Suporte a processamento dos dados nos diversos esquemas de codificao de caracteres usados pelo hardware dos computadores (tanto o esquema de armazenamento single-byte quanto multi-byte so suportados). O ambiente cliente e o ambiente servidor podem usar diferentes esquemas de codificao para caracteres. O Oracle estabelece a converso automtica entre os ambientes. As mensagens oriundas do banco de dados podem ser apresentadas em diversas lnguas. Nomes de dias e nomes de meses so processadas em diversas lnguas.

A formatao de datas, nmeros e smbolos monetrios usa as convenes de linguagem e territrio. So respeitadas as convenes alfabticas locais relativas a maisculas e minsculas, assim como para ordenao. Suporte a 7 calendrios diferentes. Alguns calendrios podem requerer informaes adicionais referentes a era (calendrios imperiais) ou alteraes de dia (calendrios lunares), por este motivo a Oracle disponibilizou um utilitrio (Lxegen) capaz de ler os dados de um arquivo de texto e convert-lo para formato binrio adequado a que as rotinas do banco de dados faam acesso. Disponibilizao do utilitrio Oracle Locale Builder Utility (Lbuilder) para que possamos customizar os dados locais tais como linguagem, charset, territrio ou ordenao lingustica.
CAPTULO 8: DICIONRIO DE DADOS E DCL - 266

INTRODUO AO ORACLE9I - SQL ESQUEMA DE CODIFICAO Quando pressionamos uma tecla em um terminal qualquer, a aparncia do caracter apresentado depende do esquema de codificao em uso naquela estao. A tecla pressionada traduzida de acordo com o esquema de codificao (ou character set) em uso na estao. O mesmo ocorre quando o terminal recebe um cdigo e o converte para uma figura (letra, nmero e pontuao) no vdeo. UNICODE Unicode um esquema de codificao de caracteres universal que permite que armazenemos informaes de qualquer linguagem usando um nico charset. Unicode gera um cdigo nico para cada caracter, independentemente da plataforma, programa ou linguagem. A utilizao de Unicode em aplicaes multi-plataforma ou cliente-servidor ou em sites da web pode trazer grandes benefcios uma vez que ele permite que um software possa ser utilizados em diferentes plataformase pases sem necessidade de re-engenharia e, talvez o mais importante, ele permite que o dado seja transportado atravs de diferentes ambientes sem corrupo. OS CHARACTER SETS DO ORACLE O Oracle possui dois tipos de esquemas de codificao para armazenamento de informaes no banco de dados: o database charset e o national charset . A partir da verso 9i, o national charset somente aceita esquemas de codificao Unicode. O Oracle utiliza o database charset para os seguintes itens: Identificadores (tabelas, colunas e variveis PL/SQL). Dados armazenados em colunas Char, Varchar, Varchar2, Clob e Long. Fontes de programas PL/SQL e comandos de SQL armazenados.

O Oracle utiliza o national charset para os seguintes itens: dados armazenados em colunas Nchar, Nvarchar2 e Nclob. A definio destes conjuntos de caracteres feito a tempo de criao do banco de dados e no pode ser alterado posteriormente, a no ser para esquemas de codificao mais amplos que os originais.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 267

INTRODUO AO ORACLE9I - SQL DEFININDO OS PARMETROS DA GLOBALIZATION SUPPORT Os parmetros podem ser definidos em quatro locais: Parmetros de inicializao do banco de dados (no arquivo init.ora). A definio neste ponto funcionar como uma especificao default; as demais definies se sobrepe ao que especificarmos neste local. No init.ora podemos especificar: Nls_Calendar, Nls_Comp, Nls_Currency, Nls_Date_Format, Nls_Date_Language, Nls_Dual_Currency, Nls_Iso_Currency, Nls_Language, Nls_Length_Semantics, Nls_Numeric_Characters, Nls_Sort, Nls_Territory, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format. Variveis de ambiente (declaradas para a estao do usurio). No caso do Windows, no registrador. Podemos especificar: Nls_Calendar, Nls_Comp, Nls_Credit, Nls_Currency, Nls_Date_Format, Nls_Date_Language, Nls_Debit, Nls_Dual_Currency, Nls_Iso_Currency, Nls_Lang, Nls_List_Separator, Nls_Monetary_Characters, Nls_Nchar_Conv_Excp, Nls_Numeric_Characters, Nls_Sort, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format. As variveis declaradas em nvel de ambiente ficam associadas estao do usurio e sero utilizadas por todas as aplicaes Oracle que vierem a ser utilizadas na estao, ou seja, todas as sesses abertas nesta estao. Se sobrepem s definies feitas para o banco de dados. Variveis da sesso (definidas com o comando Alter Session). As variveis declaradas na sesso s valem para aquela sesso do usurio. So elas: Nls_Calendar, Nls_Comp, Nls_Currency, Nls_Date_Format, Nls_Date_Language, Nls_Dual_Currency, Nls_Iso_Currency, Nls_Language, Nls_Length_Semantics, Nls_Numeric_Characters, Nls_Sort, Nls_Territory, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format. Estas variveis se sobrepem quelas definies feitas para a estao. O ltimo grupo a utilizao dos parmetros em funes de SQL, que aceitam parmetros especficos. Neste estudo, trabalharemos com a sesso do usurio, modificaremos variveis no ambiente e testaremos algumas funes de SQL. O arquivo init.ora de utilizao exclusiva do DBA e no ser abordado.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 268

INTRODUO AO ORACLE9I - SQL ALTER SESSION O comando Alter Session tem a finalidade de alterar caractersticas relativas sesso do usurio. Veremos, a seguir, cada uma das opes e suas caractersticas. A opo Nls_Language mais geral, pois modifica simultaneamente as seguintes caractersticas da sesso: A linguagem usada para as mensagens do Oracle. No caso do leitor que seguiu os passos para instalao do Personal Oracle, as mensagens podem ser apresentadas, por default, em portugus (Brazilian Portuguese) ou ingls (American), dependendo da lngua em que o Windows est instalado. A linguagem usada para nomes de dias, nomes de meses e suas respectivas abreviaes. Smbolos equivalentes usados na linguagem para A.M., P.M., A.D. e B.C. Seqncia de ordenao dos caracteres.

SQL> ALTER SESSION SET NLS_LANGUAGE = AMERICAN; Session altered. SQL> SELECT TO_CHAR(SYSDATE, 'DAY-DD/MONTH/YY') "DATA 1", 2 TO_CHAR(SYSDATE, 'DAY-MON-YYYY HH:MI AM') "DATA 2" 3 FROM DUAL; DATA 1 DATA 2 ------------------------- --------------------------SUNDAY -10/NOVEMBER /02 SUNDAY -NOV-2002 07:53 PM

A tabela a seguir apresenta a lista de linguagens vlidas para o Oracle9i. As linguagens listadas com (*) indicam aquelas para as quais as mensagens de erro do Oracle foram traduzidas.
American Czech (*) Estonian Greek (*) Icelandic Korean (*) Malayalam Polish (*) Simplified Chinese (*) Tamil Ukrainian Arabic (*) Danish (*) Finnish (*) Gujarati Indonesian Marathi Portuguese (*) Slovak (*) Teluger Vietnamese Assamese Canadian French Dutch (*) French (*) Hebrew (*) Italian (*) Mexican Spanish Punjabi Slovenian Thai Bangla Catalan (*) Egyptian German (*) Hindi Japanese (*) Lithuanian Norwegian (*) Romanian (*) Spanish (*) Traditional Chinese (*) Bengali Croatian English German Din Hungarian (*) Kannada Malay Oriya Russian (*) Swedish (*) Turkish (*)

Brazilian Portuguese (*) Bulgarian

Latin American Spanish (*) Latvian

CAPTULO 8: DICIONRIO DE DADOS E DCL - 269

INTRODUO AO ORACLE9I - SQL O parmetro Nls_Territory tambm afeta a um conjunto de caractersticas da sesso: Formato de data default. Indicao de decimal e separao de milhar. Smbolo financeiro ISO. Smbolo financeiro local. Primeiro dia da semana para o formato D.

SQL> ALTER SESSION SET NLS_TERRITORY = AMERICA; Session altered. SQL> SELECT TO_CHAR(VL_SAL, 'L999G999D99') "SAL 1", 2 TO_CHAR(VL_SAL, 'C999G999D99') "SAL 2", 3 SYSDATE 4 FROM FUNC 5 WHERE ROWNUM < 2; SAL 1 SAL 2 SYSDATE --------------------- ------------------ --------$5,802.50 USD5,802.50 10-NOV-02 O formato L mostra o smbolo financeiro local e o smbolo C o smbolo ISO. A tabela a seguir apresenta a lista de territrios suportados pelo Oracle9i.
Algeria Belgium China Finland Hungary Israel Kuwait Macedonia Norway Puerto Rico Slovenia Switzerland Turkey Vietnam America Brazil Cis France Iceland Italy Latvia Malaysia Oman Qatar Somalia Syria Ukraine Yemen Australia Bulgaria Colombia Djibouti Guatemala India Japan Lebanon Mauritania Panama Romania South Africa Taiwan United Arab Emirates Yugoslavia Austria Canada Costa Rica Egypt Germany Indonesia Jordan Libya Mexico Peru Saudi Arabia Spain Thailand Bahrain Catalonia Croatia El Salvador Greece Iraq Kazakhstan Lithuania Morocco Poland Singapore Sudan The Netherlands Bangladesh Chile Cyprus Estonia Hong Kong Ireland Korea Luxembourg New Zealand Portugal Slovakia Sweden Tunisia Venezuela

Czech Republic Denmark

United Kingdom Uzbekistan

CAPTULO 8: DICIONRIO DE DADOS E DCL - 270

INTRODUO AO ORACLE9I - SQL O parmetro Nls_Date_Format especifica explicitamente um novo formato default para datas. SQL> ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/RRRR HH24:MI'; Session altered. SQL> SELECT SYSDATE, TO_DATE('15/01/1876 12:30'), 2 TO_CHAR(SYSDATE) FROM DUAL; SYSDATE TO_DATE('15/01/1 TO_CHAR(SYSDATE) ---------------- ---------------- ---------------10/11/2002 20:16 15/01/1876 12:30 10/11/2002 20:16 O parmetro Nls_Date_Language determina a linguagem a ser usada para os nomes de dias e meses e suas respectivas abreviaturas. No h necessidade de arquivo especfico, portanto podemos efetuar a alterao para qualquer linguagem vlida (para linguagens que usem caracteres multi-byte h necessidade de o terminal suportar este tipo de cdigo). SQL> ALTER SESSION SET NLS_LANGUAGE = FRENCH; Session modifie. SQL> SELECT TO_CHAR(SYSDATE, 'DAY-DD/MONTH/YY') "DATA 1", 2 TO_CHAR(SYSDATE, 'DAY-MON-YYYY HH:MI AM') "DATA 2" 3 FROM DUAL; DATA 1 DATA 2 ------------------------ -------------------------DIMANCHE-10/NOVEMBRE /02 DIMANCHE-NOV-2002 08:18 PM O parmetro Nls_Numeric_Characters explicitamente especifica o caracter a ser usado como separador decimal e o caracter a ser usado como separador de milhar. Estes caracteres devem ser informados na ordem <d> (decimal) e <g> (grupo, milhar). Os valores devem ser diferentes, no podem ser numricos nem um dos seguintes caracteres: +, -, <, >. SQL> ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ',.'; Session modifie. SQL> SELECT TO_CHAR(VL_SAL, 'L999G999D99') "SAL 1", 2 TO_CHAR(VL_SAL, 'C999G999D99') "SAL 2" 3 FROM FUNC 4 WHERE ROWNUM < 2; SAL 1 SAL 2 --------------------- -----------------$5.802,50 USD5.802,50
CAPTULO 8: DICIONRIO DE DADOS E DCL - 271

INTRODUO AO ORACLE9I - SQL O parmetro Nls_Currency permite que faamos a modificao do smbolo financeiro local e o parmetro Nls_Iso_Currency permite que determinemos o territrio cujo smbolo ISO deve ser usado. SQL> ALTER SESSION SET NLS_CURRENCY = 'R$'; Session modifie. SQL> ALTER SESSION SET NLS_ISO_CURRENCY = BRAZIL; Session modifie. SQL> SELECT TO_CHAR(VL_SAL, 'L999G999D99') "SAL 1", 2 TO_CHAR(VL_SAL, 'C999G999D99') "SAL 2" 3 FROM FUNC 4 WHERE ROWNUM < 2; SAL 1 SAL 2 --------------------- -----------------R$5.802,50 BRC5.802,50 OBS: s podemos modificar diretamente o smbolo local. O smbolo ISO determinado indiretamente, pelo territrio. O parmetro Nls_Sort altera a seqncia na qual o Oracle ordena os caracteres. SQL> ALTER SESSION SET NLS_SORT = 'CANADIAN FRENCH'; Session modifie. SQL> SELECT * FROM LETRAS ORDER BY 1; C a A SQL> ALTER SESSION SET NLS_SORT = BINARY; Session modifie. SQL> SELECT * FROM LETRAS ORDER BY 1; C A a

CAPTULO 8: DICIONRIO DE DADOS E DCL - 272

INTRODUO AO ORACLE9I - SQL A tabela a seguir apresenta a lista de linguagens vlidas para o parmetro Nls_Sort.
Arabic Big5 Czech Eec_Europa3 GBK Indonesian Malay Slovak Xcatalan Xfrench Xslovenian Arabic_Abj_Match Arabic_Abj_Sort Arabic_Match Binary Estonian Greek Italian Norwegian Slovenian Xcroatian Xgerman Xspanish Bulgarian Finnish Hebrew Japanese Polish Spanish Ukrainian Xczech Xgerman_Din Xswiss Canadian French Dutch French HKSCS Latin Punctuation Swedish Unicode_Binary Xhungarian Xturkish Czech_Punctution Danish Ascii7 Catalan Ebcdic German Hungarian Latvian Romanian Swiss Vietnamese Xpunctuation Xwest_European Bengali Croatian Eec_Euro German_Din Icelandic Lithuanian Russian Thai_Dictionary West_European Xdutch Xslovak

Thai_Telephone Turkish

Xczech_Punctuation Xdanish

O parmetro Nls_Calendar especifica um novo calendrio para a sesso. SQL> ALTER SESSION SET NLS_CALENDAR = 'THAI BUDDHA'; Session modifie. SQL> SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY') FROM DUAL; TO_CHAR(SY ---------10/11/2545 SQL> ALTER SESSION SET NLS_CALENDAR = 'ROC OFFICIAL'; Session modifie. SQL> SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY') FROM DUAL; TO_CHAR(SY ---------10/11/0091 A tabela a seguir apresenta a lista de calendrios vlidos para o Oracle9i. Japanese Imperial Persian ROC Official Arabic Hijrah Thai Buddha English Hijrah

CAPTULO 8: DICIONRIO DE DADOS E DCL - 273

INTRODUO AO ORACLE9I - SQL O parmetro NLS_COMP permite a utilizao de caractersticas da lngua para efeito de comparao. Normalmente, a comparao na clusula Where binria. Para que a comparao obedecesse s caractersticas especficas da linguagem era necessrio o uso da funo NLSSORT. SQL> ALTER SESSION SET NLS_COMP = BINARY; Session modifie. SQL> ALTER SESSION SET NLS_SORT = 'CANADIAN FRENCH'; Session modifie. SQL> SELECT * FROM LETRAS 2 WHERE COL > 'a'; C SQL> ALTER SESSION SET NLS_COMP = ANSI; Session modifie. SQL> SELECT * FROM LETRAS 2 WHERE COL > 'a'; C A

No exemplo acima pudemos observar que a modificao exclusiva do parmetro NLS_SORT no fez com que a comparao na clusula Where levasse em considerao as caractersticas lingusticas. Somente quando indicamos o valor ANSI para NLS_COMP conseguimos que as comparaes tambm levassem em considerao o parmetro NLS_SORT.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 274

INTRODUO AO ORACLE9I - SQL O parmetro NLS_Dual_Currency permite a definio de um outro smbolo financeiro a ser utilizado nas apresentaes monetrias. SQL> ALTER SESSION SET NLS_DUAL_CURRENCY = 'US$'; Session modifie. SQL> ALTER SESSION SET NLS_CURRENCY = 'R$'; Session modifie. SQL> SELECT TO_CHAR(123456.78, 'L999G999D99') Local, 2 TO_CHAR(123456.78, 'U999G999D99') Dual 3 FROM DUAL; LOCAL DUAL --------------------- --------------------R$123.456,78 US$123.456,78 No exemplo a seguir modificamos, simultaneamente, os formatos de Timestamp e Timestamp With Time Zone. Quando usamos no parmetro NLS_TIMESTAMP_TZ_FORMAT o formato TZD, indicamos que a indicao de fuso horrio deveria ser apresentada com a abreviatura da Zona de Tempo, no entanto, isto somente ocorre quando modificamos o atributo do parmetro TIME_ZONE. Quando usamos SET TIME_ZONE, a apresentao passou a ser nomeada e o formato funcionou.
SQL> COL LOCALTIMESTAMP FOR A35 SQL> COL CURRENT_TIMESTAMP FOR A35 SQL> SELECT LOCALTIMESTAMP, CURRENT_TIMESTAMP FROM DUAL; LOCALTIMESTAMP CURRENT_TIMESTAMP ----------------------------------- ----------------------------------10/11/02 20:55:45,000001 10/11/02 20:55:45,000001 -02:00 SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD/MM/YYYY HH24:MI:SS'; Sesso alterada. SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD/MM/YYYY HH24:MI:SS TZD'; Sesso alterada. SQL> ALTER SESSION SET TIME_ZONE = 'Brazil/East'; Sesso alterada. SQL> SELECT LOCALTIMESTAMP, CURRENT_TIMESTAMP FROM DUAL; LOCALTIMESTAMP CURRENT_TIMESTAMP ----------------------------------- ----------------------------------10/11/2002 20:55:45 10/11/2002 20:55:45 BRST

OBS: A relao de Zonas de tempo est presente na view V$TIMEZONE_NAMES.


CAPTULO 8: DICIONRIO DE DADOS E DCL - 275

INTRODUO AO ORACLE9I - SQL

VARIVEIS DE AMBIENTE
Aps verificarmos a utilizao diretamente na sesso, veremos quais as diferenas para a declarao usando as variveis de ambiente. Como exemplificao, trabalharemos o RegEdit do Windows. Todos os programas instalados no Windows gravam variveis de ambiente nestes registradores a fim de consultarem a tempo de inicializao. Uma alterao incorreta pode causar srios problemas na execuo de programas e at do prprio Windows. Vrios dos parmetros vistos junto com o comando Alter Session podem ser utilizados como variveis de ambiente: Nls_Calendar, Nls_Comp, Nls_Currency, Nls_Date_Format, Nls_Date_Language, Nls_Dual_Currency, Nls_Iso_Currency, Nls_Numeric_Characters, Nls_Sort, Nls_Timestamp_Format, Nls_Timestamp_Tz_Format. Estes valores no sero repetidos neste momento. Estudaremos apenas aqueles parmetros ainda no mencionados. O parmetro Nls_Lang composto de trs informaes: linguagem, territrio e character set, com o formato: <linguagem>_<territrio>.<charset>.Todos os componentes so opcionais. Se desejarmos informar o territrio sem a linguagem, por exemplo, devemos usar o formato: _<territrio>.<charset >. Este parmetro permite que associemos um charset para as aplicaes executadas no ambiente cliente. Observe que a definio de um charset s pode ser feita com referncia ao banco de dados (e torna-se imutvel) e na varivel de ambiente Nls_Lang, determinando o ambiente Cliente. Cada sesso estabelecida neste ambiente usar as informaes estabelecida na varivel Nls_Lang. Isto significa que podemos ter diferentes caractersticas de sesso conectadas ao banco de dados simultaneamente. A converso de um charset (banco para cliente) o outro (cliente para banco) feita de forma transparente. Se no especificarmos um valor para Nls_Lang, sero usadas as especificaes do banco de dados de Nls_Language e Nls_Territory. Alm disso, as demais especificaes que fizermos relativas a outras variveis de ambiente sero ignoradas. Por outro lado, ao especificarmos Nls_Lang, as especificaes feitas em nvel de init.ora so ignoradas para a sesso do usurio. Qualquer um dos demais parmetros devem ser criados explicitamente: O parmetro Nls_Credit determina a criao de um smbolo para indicao de crdito em relatrios. Este smbolo pode conter quaisquer caracteres at o comprimento de nove posies. O valor default obtido de Nls_Territory. O parmetro Nls_Debit determina a criao de um smbolo para indicao de dbitos em relatrios. Este smbolo pode conter quaisquer caracteres at o comprimento de nove posies. O valor default obtido de Nls_Territory.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 276

INTRODUO AO ORACLE9I - SQL O parmetro Nls_List_Separator especifica o caracter a ser usado para separar valores em uma lista de valores. Deve ser um caracter single-byte e no pode ser numrico, nem similar aos smbolos monetrios (Nls_Monetary_Characters) e nem um dos seguintes smbolos: (+), (-), (<), (>), (.). O valor derivado de Nls_Territory. O parmetro Nls_Monetary_Characters determina o smbolo para unidade monetria e centavos, por exemplo, ($) para o dlar americano e () para centavos de dlar. Os caracteres especificados devem ser diferentes entre si e no podem ser numricos, nem um dos seguintes smbolos: (+), (-), (<), (>), (.). O valor derivado de Nls_Territory. O parmetro Nls_Nchar_Conv_Excp indica se a perda de dados durante uma converso explcita ou implcita de tipo de dado deve ou no reportar um erro.

OS PARMETROS NLS EM USO NAS FUNES SQL


Em diversas funes de SQL, podemos utilizar parmetros NLS que modificam caractersticas exclusivamente na execuo daquele comando de SQL, independente das especificaes de banco de dados e sesso. A tabela a seguir apresenta quais os parmetros que podem ser usados em cada situao. Funo To_Date To_Number To_Char To_Nchar Nls_Upper Nls_Lower Nls_Initcap Nlssort Parmetros NLS Nls_Date_Language, Nls_Calendar Nls_Numeric_Characters, Nls_Currency, Nls_Iso_Currency, Nls_Dual_Currency Nls_Date_Language, Nls_Numeric_Characters, Nls_Currency, Nls_Iso_Currency, Nls_Calendar, Nls_Dual_Currency Nls_Date_Language, Nls_Numeric_Characters, Nls_Currency, Nls_Iso_Currency, Nls_Calendar, Nls_Dual_Currency Nls_Sort Nls_Sort Nls_Sort Nls_Sort

CAPTULO 8: DICIONRIO DE DADOS E DCL - 277

INTRODUO AO ORACLE9I - SQL

LABORATRIO 8:
1. Deseja-se uma lista de todas as tabelas do usurio contendo a quantidade de colunas, a quantidade de relacionamentos e a quantidade de ndices desta tabela. 2. Deseja-se obter, para cada restrio de integridade, a tabela associada, a tabela correspondente (no caso de relacionamento), o nome da restrio, o texto da restrio ordenado por tabela associada e nome da restrio. 3. Determinar, para cada tabela particionada, seu nome, o nome de cada partio e as regras do particionamento. 4. Deseja-se informaes sobre as views criadas no schema do usurio, contendo nome, texto associado, colunas que podem ser atualizadas. 5. Coloque outra cpia do SQL*PLUS ativa no usurio DESENV (sesso 2). 6. Atualize sua tabela Depto (sesso 1), mas no d Commit. O que o outro usurio (sesso 2) v? Por qu? 7. D Commit sobre suas atualizaes (sesso 1). A visibilidade na sesso 2 possvel agora? Por qu? 8. Atualize sua tabela Depto (sesso 1), mas no d Commit. Atravs da sesso 2, tente atualizar a mesma linha alterada anteriormente. O que acontece? Por qu? D Rollback nas duas sesses. 9. Atualize sua tabela Depto (sesso 1), mas no d Commit. Na sesso 2, execute um SELECT .. FOR UPDATE. Qual a diferena? OPCIONAIS 10. Explique, com suas palavras, o que acontece nos trechos de programa abaixo: SQL> UPDATE FUNC 3 SET VL_SAL = VL_SAL * 1.10; 33 linhas atualizadas; SQL> COMMIT; Validao completa. SQL> DELETE FROM FUNC WHERE NR_GIT = 21; 1 linhas deletada. SQL> ROLLBACK; Rollback completo.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 278

INTRODUO AO ORACLE9I - SQL SQL> UPDATE DEPTO 2 SET CD_GERENTE = 200 3 WHERE CD_DEPTO = 'A00'; 1 linha atualizada. SQL> SAVEPOINT ALTERA_GERENTE; Ponto de salvamento criado. SQL> UPDATE FUNC 2 SET VL_SAL = VL_SAL * 1.5 3 WHERE CD_MAT = 300; 1 linha atualizada. SQL> ROLLBACK TO SAVEPOINT ALTERA_GERENTE; Rollback completo. SQL> UPDATE FUNC 2 SET VL_SAL = VL_SAL * 1.2 3 WHERE CD_MAT = 200; 1 linha atualizada. 11. Para que serve o comando SET TRANSACTION READ ONLY? 12. Qual o objetivo de usarmos um SELECT ... FOR UPDATE? 13. Formatar as mensagens da sua sesso para Francs. 14. Formatar o layout default de datas para dd/mm/rrrr. 15. Deseja-se uma relao dos aniversariantes da empresa, contendo o nome e sobrenome de cada funcionrio, o dia do aniversrio e o ms do aniversrio (por extenso, em portugus). Ordene a relao por nmero de ms e estabelea quebra de pgina a cada troca de ms. 16. Deseja-se uma relao para a folha de pagamento, contendo a matrcula, nome, sobrenome, salrio bruto, INSS (8% do salrio), FGTS (10% do salrio), Ticket (8,00 por dia do ms), Vale Transporte (2,00 por dia do ms). O ms ser fornecido como parmetro. Os valores financeiros devero ser formatados, devendo ser apresentado o smbolo financeiro (R$). 17. Formatar Timestamp e Timestamp Tz para que o ano apresente 4 posies. 18. Iguale a zona de tempo da sesso zona de tempo do banco de dados. Verifique o resultado em seguida.

CAPTULO 8: DICIONRIO DE DADOS E DCL - 279

INTRODUO AO ORACLE9I - SQL

CAPTULO 9: DATA DEFINITION LANGUAGE


Neste captulo, analisaremos alguns comandos da Data Definition Language a fim de conhecermos a amplitude da linguagem SQL. De um modo geral, os comandos tratados na SQL DDL so executados por um Administrador de Banco de Dados (DBA) que possui um conhecimento mais profundo do funcionamento interno do Oracle e, portanto, mais condio de indicar as melhores formas de armazenamento. Nosso estudo dar ao desenvolvedor uma viso geral da SQL DDL e dos mecanismos de armazenamento do banco de dados.

SCHEMA
Os objetos do banco de dados esto divididos em dois grandes grupos: schema objects e non schema objects. Um schema uma coleo de estruturas de dados subordinadas a um user e possui o mesmo nome do user. Cada usurio dono de um nico schema. Os objetos subordinados a um usurio, ou seja, os schema objects, so os seguintes tipos de estruturas: clusters database links index-only tables e tables indexes object tables, object types, object views (#) sequences materialized views e materialized view logs stored functions, stored procedures, database triggers, packages e external procedure libraries (*) synonyms views (+) S disponveis se a opo de distribuio estiver instalada. No sero vistos neste material. (*) S disponveis se PL/SQL estiver instalado. Sero vistos no prximo captulo (PL/SQL). (#) S disponveis se a opo objects estiver instalada. No sero vistos neste curso.

CAPTULO 9: DATA DEFINITION LANGUAGE - 280

INTRODUO AO ORACLE9I - SQL Existem, no banco de dados, objetos que so compartilhados por diversos usurios e no esto subordinados ao schema de nenhum deles, so os non schema objects. Correspondem aos seguintes objetos: directories profiles roles rollback segments tablespaces users

DATA DEFINITION LANGUAGE


A DDL a parte da SQL que contm os comandos necessrios para a definio, alterao, remoo e autorizao de uso dos objetos pertencentes ao banco de dados. Para sua utilizao, o usurio deve ter privilgios especiais de manuseio do banco de dados. Os comandos podem ser subdivididos em grupos: Create Com este grupo de comandos, podemos definir a estrutura de diversos objetos no banco de dados. Cada um deles possui sintaxe prpria: Create Table, Create Tablespace, Create User, etc. Alter Com este grupo de comandos, podemos alterar a estrutura de um objeto previamente definido. De acordo com o objeto so estabelecidos limites especficos para as modificaes permitidas: Alter Table, Alter Profile, Alter Rollback Segment, etc. Drop Com este grupo de comandos, podemos remover o objeto e sua estrutura do banco de dados. As sintaxes variam por tipo de objeto: Drop Sequence, Drop Synonym, Drop Cluster, etc. Grant / Revoke Neste grupo de comandos, estabelecemos (ou revogamos) autorizao de uso sobre objetos criados ou sobre aes permitidas relativas ao banco de dados. Audit / NoAudit Este grupo de comandos coordena a gravao de informaes de auditoria para acompanhamento e investigao das aes realizadas pelos usurios no banco de dados. Diversos Neste grupo final se acham os comandos Analyze (responsvel por coletar estatsticas, validar estruturas ou identificar cadeias), Comment (que permitir que adicionemos comentrios ao dicionrio de dados), Rename (para alterarmos o nome de um objeto) e Truncate (para removermos todas as linhas de uma tabela ou cluster e liberarmos espao livre).

CAPTULO 9: DATA DEFINITION LANGUAGE - 281

INTRODUO AO ORACLE9I - SQL

ARMAZENAMENTO
Quando falamos em banco de dados Oracle, estamos tratando de duas partes bem distintas: a parte fsica de armazenamento (esttica), chamada de Database, e a parte dos mecanismos de software e memria (ativa), chamada de Instncia. Conceitualmente, diremos que um Database composto de: Arquivos de Banco de Dados (Database Files) Onde esto armazenados os dados do dicionrio de dados e os dados do usurio. Arquivos de Log (Redo Log Files) Onde esto armazenadas todas as aes executadas sobre os dados e que podem ser utilizadas para recuperao dos mesmos. Arquivos de Controle (Control Files) Onde esto armazenadas informaes sobre os arquivos de dados a fim de garantir a integridade do banco como um todo. Arquivo de Parmetros (Parameter File Init.ora) Onde esto armazenados os parmetros de inicializao do banco de dados.

Uma instncia Oracle composta basicamente de: Uma rea de memria compartilhada pelos componentes do software (processos), chamada de SGA (System Global Area). Diversos componentes do software, chamados de processos background (programas que trabalham para todos os usurios do banco de dados), dos quais quatro so indispensveis: Pmon (Process Monitor controle dos processos Server que agem para os usurios), Smon (System Monitor controle do sistema como um todo), Dbwr (Database Writer encarregado de efetuar a gravao nos arquivos do banco de dados) e Lgwr (Log Writer responsvel por efetuar a gravao nos arquivos de Redo Log).
CAPTULO 9: DATA DEFINITION LANGUAGE - 282

INTRODUO AO ORACLE9I - SQL Os processos Server tambm presentes no diagrama fazem o acesso e atualizao (em memria) nos dados dos usurios. Dependendo da arquitetura escolhida pelo DBA, podemos ter um processo Server para cada processo do usurio (nesta arquitetura, cada sesso estabelecida no ambiente cliente ativa um processo Server no ambiente servidor, que tem como tarefa executar todos os comandos solicitados pela sesso do cliente) ou podemos ter um processo Server compartilhado por diversos usurios (nesta arquitetura, cada sesso estabelecida no ambiente cliente envia solicitaes de execuo de comandos que so enfileirados e executados por um dos processos Server disponveis).

TABLESPACE
No esquema apresentado, vemos um conjunto de arquivos chamados de Database Files. Estes arquivos so visveis externamente pelo sistema operacional; internamente, o Oracle relaciona estes arquivos a objetos internos chamados de Tablespaces. Um tablespace pode estar associado a um ou mais database files, enquanto um database file s pode estar associado a um tablespace. O tablespace corresponde unidade lgica de armazenamento. dentro dele que armazenaremos as tabelas, ndices, dicionrio de dados, etc.

BLOCO ORACLE
Pelo esquema, observamos que um tablespace composto por diversas partes do mesmo tamanho. Estas partes so chamadas de blocos. O tamanho de um bloco definido pelo DBA na criao do banco de dados, no arquivo init.ora. O bloco ser a unidade mnima de leitura ou gravao para disco, ou seja, toda vez que desejarmos obter informaes de uma determinada linha de uma tabela, no mnimo estaremos solicitando a leitura de um bloco. Da mesma forma, quando estivermos alterando apenas uma determinada coluna de uma linha especfica, estaremos solicitando a gravao de um bloco. Observemos que o tamanho deste bloco afeta tanto o espao de disco quanto o de memria alocada, uma vez que esta passar a ser a unidade de alocao de espao. Como o prprio sistema operacional possui uma unidade mnima de leitura e gravao, quando o DBA determinar o tamanho do bloco Oracle, dever verificar o tamanho desta unidade mnima do sistema operacional em que far a instalao do banco de dados e calcular um mltiplo inteiro deste valor.

CAPTULO 9: DATA DEFINITION LANGUAGE - 283

INTRODUO AO ORACLE9I - SQL

SEGMENTOS
No esquema ao lado, vemos o espao reservado para um determinado tablespace ser utilizado por quatro segmentos: um segmento Func, um segmento Proj, um segmento de ndice e um segmento de rollback. Assim, formalizaremos dizendo que um database contm tipos de segmentos dos quais estamos conhecendo trs: segmentos para armazenamento de dados (Data Segment), segmentos para armazenamento de ndices (Index Segment) e segmentos para armazenamento de informaes de rollback (Rollback Segment). Os segmentos Func e Proj so segmentos de dados, o segmento S1 de ndice e o segmento R de rollback. Fica claro, no esquema, que um segmento pode ser composto de diversas partes de informao, isto , no necessariamente contnuo. Observe que o segmento Func possui duas partes (extenses), assim como o segmento R e o Proj.

EXTENSO
Uma extenso uma rea contnua para armazenamento de informaes, um conjunto de blocos contguos. Desta forma, um segmento pode ser composto de uma ou mais extenses. A primeira extenso alocada tem o nome especial de Initial. As demais so chamadas de Next. Por questes de performance, serial ideal que todos os dados de uma determinada tabela estivessem armazenados na extenso Initial. Como isto nem sempre possvel, devemos, na especificao de um segmento qualquer, estimar o tamanho das extenses Initial e Next e a quantidade de vezes que um segmento pode se esticar, anexando novas extenses sua rea til. Estas informaes so fundamentais para que o DBA faa um clculo preciso da rea necessria para cada segmento, da rea necessria ao tablespace e, conseqentemente, do espao requerido para o banco de dados.

CAPTULO 9: DATA DEFINITION LANGUAGE - 284

INTRODUO AO ORACLE9I - SQL

CREATE TABLE
A forma bsica de um comando Create Table apresentada a seguir: SQL> CREATE TABLE EMPREGADO 2 (EMPNO NUMBER(6) NOT NULL 3 CONSTRAINT EMP_PK PRIMARY KEY, 4 NOME VARCHAR2(30) NOT NULL 5 CONSTRAINT CHECK_NOME CHECK(NOME=UPPER(NOME)), 6 DEP CHAR(3) NOT NULL 7 CONSTRAINT DEPTO_FK REFERENCES DEPTO, 8 DATA DATE, 9 SEXO CHAR(01) 10 CONSTRAINT CHECK_SEXO CHECK(SEXO IN ('F', 'M')), 11 SAL NUMBER(6) 12 CONSTRAINT CHECK_SAL CHECK(SAL > 150)) 13 STORAGE (INITIAL 2K NEXT 2K MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 20) 14 TABLESPACE USERS; Tabela criada. Neste exemplo, vemos a especificao de uma tabela relacional. Cada coluna definida possui um tipo, que pode ser escalar ou um tipo definido pelo usurio. Alm do tipo, cada coluna pode ter uma ou mais restries associadas. Na especificao da tabela, determinamos o tamanho da rea a ser reservada para aquela tabela com a clusula Storage e o tablespace em que esta rea deve ser reservada. As restries de integridade tambm podem ser especificadas ao tempo de criao da tabela, inclusive com especificao do momento da validao (DEFERRED). Quando no determinamos este momento, o default que a validao seja feita no momento em que o comando executado.
SQL> CREATE TABLE IX_TABLE 2 (CD_CHAVE NUMBER PRIMARY KEY, 3 TX_DESCRICAO VARCHAR2(100)) ORGANIZATION INDEX; Tabela criada. SQL> INSERT INTO IX_TABLE VALUES (1, 'TESTE'); 1 linha criada. SQL> SELECT CD_CHAVE, ROWID FROM IX_TABLE; CD_CHAVE ROWID ---------- ----------------------------------------1 *BAIAAdICwQL+

Acima, criamos uma tabela relacional com organizao do tipo Index.

CAPTULO 9: DATA DEFINITION LANGUAGE - 285

INTRODUO AO ORACLE9I - SQL Com este tipo de organizao obrigatria a especificao de primary key. Os dados desta tabela esto organizados em relao esta primary key especificada, como se fosse um ndice. Este tipo de organizao pode ser muito til pois no h necessidade da criao de um ndice para a primary key em separado, uma vez que a prpria tabela j est organizada desta forma.

TIPOS DE DADOS
Quando especificamos uma coluna em uma tabela relacional ou um atributo em um objeto, devemos especificar o tipo de dado que ser armazenado naquele elemento. Os tipos de dados pr-definidos pelo Oracle so apresentados a seguir. Os tipos de dados padro Ansi tambm so aceitos. Char - uma string de caracteres de tamanho fixo (mximo de 2000 bytes). Tamanho default e mnimo de 1 byte. A palavra Byte indica que o tamanho ser considerado em bytes enquando Char indica caracteres. Para ambientes multi-bytes o uso desta informao faz diferena. Varchar2 uma string de tamanho varivel (mximo de 4000 bytes). O tamanho obrigatrio. A palavra Byte indica que o tamanho ser considerado em bytes enquando Char indica caracteres. Para ambientes multi-bytes o uso desta informao faz diferena. Nchar uma string de caracteres de tamanho fixo (mximo de 2000 bytes). Tamanho default e mnimo de 1 byte. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados. Nvarchar2 - uma string de tamanho varivel (mximo de 4000 bytes). O tamanho obrigatrio. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados. Number(p,s) - dados numricos, onde P varia de 1 a 38 dgitos. A escala S pode variar de 84 a 127. Long - uma string de caracteres de tamanho varivel com at 2Gb de comprimento. S possvel a definio de uma coluna do tipo long por tabela. Long Raw uma string de dados binrios com comprimento varivel at o limite de 2Gb de tamanho. Raw - armazena dados binrios. O tamanho obrigatrio. Semelhante ao VARCHAR2 para dados binrios. Comprimento mximo de 2000 bytes. Date - armazena data e hora. Consideradas vlidas no intervalo de 01/01/4712 AC. at 31/12/9999 DC. O formato default dd-mes-aa. Blob armazena um locator para uma rea que contenha dados binrios (tam. mximo de 4Gb).

CAPTULO 9: DATA DEFINITION LANGUAGE - 286

INTRODUO AO ORACLE9I - SQL Clob armazena um locator para uma rea que contenha dados alfanumricos de comprimento mximo de 4Gb. Usa o database character set. Nclob armazena um locator para uma rea que contenha dados alfanumricos de comprimento mximo de 4Gb. O contedo armazenado deve ser compatvel com o national charset definido para o banco de dados. Bfile armazena um locator para um arquivo do sistema operacional (tam. mximo de 4Gb).

Rowid string hexadecimal representando um endereo nico de uma linha na tabela. O tipo usado para valores retornados pela pseudo coluna ROWID. Urowid (n) string hexadecimal representando o endereo lgico de uma linha em uma IOT. O tamanho opcional e corresponde ao tamanho de uma coluna do tipo UROWID. O comprimento mximo e default de 4000 bytes. Timestamp Ano, ms e dia assim com hora, minuto, segundo e frao de segundo. O parmetro <prc> indica o nmero de dgitos da parte fracionria do segundo. Os valores podem variar de 0 a 9. O default 6. o A clusula With Time Zone inclui a apresentao da zona de tempo. Onde a zona de tempo corresponde diferena (em horas e minutos) entre a hora local e UTC (hora de Greenwich). o Se usarmos With Local Time Zone, so vlidos todos os valores. A diferena entre esta opo e a anterior que a zona de tempo no armazenada no banco de dados. O dado, quando armazenado, normalizado para a Dbtimezone e, quando recuperado, visualizado pelo usurio com a Time Zone da sesso (ocorre uma Segunda converso). Interval Year armazena um perodo de tempo em anos e meses, onde <prc> corresponde ao nmero de dgitos do campo Year. So aceitos valores de 0 a 9. O default 2. Interval Day armazena um perodo de tempo em dias, horas, minutos e segundos. O primeiro <prc> determina o nmero mximo de dgitos no campo Day. So aceitos valores de 0 a 9, sendo o default 2. O segundo <prc> determina o nmero mximo de dgitos na parte fracionria do campo Second. Os valores vlidos variam de 0 a 9. O default 2. Sys.AnyData contm uma instncia de um determinado tipo com um conjunto de instncias de dados daquele tipo. Pode ser usado como parmetro de rotina onde esta flexibilidade necessria. Os valores pode ser buit-in datatypes ou user-defined types. Sys.AnyType este tipo pode conte uma descrio de qualquer tipo SQL nomeado ou transiente.

CAPTULO 9: DATA DEFINITION LANGUAGE - 287

INTRODUO AO ORACLE9I - SQL Sys.AnyDataSet contm uma instncia de um determinado tipo com dado e descrio. Pode ser usado como coluna para uma tabela onde armazenamos valores heterogneos em uma nica coluna. Os valores podem ser buit-in datatypes ou user-defined types. Sys.XMLType pode ser usado para armazenamento de dados XML no banco de dados. Possui funes membro que podemos usar para acesso, extrao e consulta. Internamente, a informao armazenada em Clobs. Sys.UriType corresponde a um supertipo que pode ser especializado em HttpUriType ou DbUriType. O subtipo HttpUriType armazena URLs para pginas Web externar ou para arquivos usando o protocolo Http. O subtipo DbUriType faz referncias a dados (Uri) dentro do DB. Sys.UriFactoryType um tipo para fatorao. Pode criar e retornar outros tipos de objetos. Quando uma string URL atribuda a um tipo UriFactoryType podemos obter instncias dos vrios subtipos dos UriTypes. Ele analis a string URL e identifica o tipo da URL e cria uma instncia do subtipo adequado (Htto, Dburi, etc). Mdsys.SDO_Geometry uma coluna objeto para armazenamento da descrio geomtrica de um objeto do tipo spatial. No pode ser a nica coluna da tabela. Ordsys.OrdAudio um tipo objeto para armazenamento de audio. Ordsys.OrdImage - um tipo objeto para armazenamento de imagem. Ordsys.OrdVideo - um tipo objeto para armazenamento de video.

CONSTRAINTS
As constraints so restries estabelecidas para as colunas de uma tabela. Podem ser dos seguintes tipos: Primary Key Determina uma coluna ou conjunto de colunas como a chave primria da tabela. Esta restrio, implicitamente, cria um ndice nico que garanta a regra. Unique Determina uma coluna ou conjunto de colunas como chave nica. No sero admitidas duas linhas com o mesmo valor para estas colunas. Foreign Key Determina uma coluna ou conjunto de colunas como possuindo um conjunto vlido de valores presentes em outra tabela. Corresponde a uma referncia ou integridade referencial. A palavra-chave References identifica a primary key ou unique key que referenciada por uma foreign key em uma restrio de integridade referencial. Check Especifica a condio que cada linha da tabela deve satisfazer. Not Null Especifica que a coluna de preenchimento obrigatrio.

CAPTULO 9: DATA DEFINITION LANGUAGE - 288

INTRODUO AO ORACLE9I - SQL As restries podem ser validadas to logo o comando de SQL DML seja submetido, ou podemos adiar sua validao para o momento em que a transao for concluda.
SQL> CREATE TABLE EMPREGADO 2 (EMPNO NUMBER(6) NOT NULL CONSTRAINT EMP_PK PRIMARY KEY 3 INITIALLY IMMEDIATE DEFERRABLE, 4 NOME VARCHAR2(30) NOT NULL CONSTRAINT CHECK_NOME CHECK(NOME=UPPER(NOME)), 5 DEP CHAR(3) NOT NULL CONSTRAINT DEPTO_FK REFERENCES DEPTO 6 INITIALLY DEFERRED, 7 DATA DATE, 8 SEXO CHAR(01) CONSTRAINT CHECK_SEXO CHECK(SEXO IN ('F', 'M')), 9 SAL NUMBER(6) CONSTRAINT CHECK_SAL CHECK(SAL > 150)) 10 STORAGE (INITIAL 2K NEXT 2K MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 20) 11 TABLESPACE USERS; Tabela criada.

No exemplo acima, a restrio associada coluna Dep e a restrio associada coluna Sexo s sero verificadas quando a transao vier a ser concluda. J a restrio referente coluna Empno (primary key) ser verificada imediatamente; podemos, se desejarmos, adi-la at o trmino da transao. Isto possvel graas presena da clusula Deferrable, que indica que o adiamento pode ser utilizado (atravs da clusula Set Constraints, vista anteriormente).

CREATE TYPE
O comando Create Type permite a criao de um tipo de dado definido pelo usurio. Utilizamos a criao de tipos no tpico referente a objetos.

CREATE INDEX
J comentamos anteriormente que a criao de uma Constraint do tipo primary key para uma tabela estabelece a criao implcita de um ndice. Isto tambm ocorre quando a Constraint do tipo Unique. Desta forma, os ndices criados explicitamente pelo comando Create Index no possuem o objetivo de garantir a integridade lgica dos dados e sim produzir melhores resultados para as consultas efetuadas sobre a tabela que mencionem as colunas do ndice como restrio na clusula Where. Como a criao de ndices adicionais para uma tabela pode trazer tanto benefcios quanto prejuzos, devemos efetuar uma anlise criteriosa, juntamente com o DBA, para verificarmos a necessidade de tal criao. SQL> CREATE UNIQUE INDEX IX_NOME ON EMPREGADO (NOME ASC) 2 STORAGE (INITIAL 2K NEXT 2K MINEXTENTS 1 MAXEXTENTS 3 PCTINCREASE 0) 3 TABLESPACE USERS; ndice criado.
CAPTULO 9: DATA DEFINITION LANGUAGE - 289

INTRODUO AO ORACLE9I - SQL

CREATE DATABASE LINK


Um database link um objeto criado no schema do usurio que permite a conexo com um banco de dados remoto. SQL> CREATE DATABASE LINK CENTRO 2 CONNECT TO SCOTT IDENTIFIED BY TIGER USING 'DBCENTRO'; Vnculo de banco de dados criado. No exemplo acima, criamos um database link de nome Centro para estabelecer conexo com um banco de dados identificado pela string de conexo (Host String) DBCentro. Quando este link for usado, no banco de dados remoto, estabelecer conexo com o usurio Scott e password Tiger. A Host String ser analisada na instalao dos aplicativos de desenvolvimento.

CREATE SYNONYM
A criao de um sinnimo objetiva a definio de um nome alternativo para uma tabela ou view, presente no schema do prprio usurio ou de outro (desde que tenha autorizao para acesso). SQL> CREATE SYNONYM DEPT FOR SCOTT.DEPT; Sinnimo criado. SQL> DESC DEPT Nome Nulo? ----------------------------------------- -------DEPTNO NOT NULL DNAME LOC Tipo --------------NUMBER(2) VARCHAR2(14) VARCHAR2(13)

No exemplo, estamos criando um sinnimo para a tabela Scott.Dept no usurio Aluno. Desta forma, qualquer referncia que fizermos tabela Dept ser associada pelo Oracle tabela Dept do schema Scott. A associao s estabelecida se tivermos privilgios para acesso tabela desejada. A criao do sinnimo no suficiente para acesso. SQL> CREATE SYNONYM DEPT FOR DEPT@CENTRO; Sinnimo criado. No exemplo, estamos criando um sinnimo Dept para uma tabela Dept armazenada no schema do usurio Scott de um banco de dados remoto. A utilizao do sinnimo, neste caso, teve a finalidade de tornar transparente a localizao de uma tabela.
CAPTULO 9: DATA DEFINITION LANGUAGE - 290

INTRODUO AO ORACLE9I - SQL

CREATE SEQUENCE
Seqncias so objetos atualizados pelo Oracle Server com o objetivo de fornecer um nmero sequencial. Este nmero pode ser usado para a gerao de primary keys em tabelas. SQL> CREATE SEQUENCE SEQ_MAT 2 START WITH 400 3 INCREMENT BY 1 4 MAXVALUE 99999 5 CYCLE 6 CACHE 10; Seqncia criada. SQL> SELECT SEQ_MAT.NEXTVAL FROM DUAL; NEXTVAL ---------400 Acima, criamos uma seqncia com os parmetros: Start With Especifica o primeiro nmero de seqncia a ser gerado. Increment By Especifica o intervalo entre os nmeros gerados. Pode ser negativo.

MaxValue Determina o maior valor gerado para nmeros seqenciais crescentes ou valor inicial default para nmeros seqenciais decrescentes. MinValue Determina o menor valor gerado para nmeros seqenciais decrescentes ou valor inicial default para nmeros seqenciais crescentes. Cycle Indica que a gerao de nmeros ocorrer aps a seqncia ter atingido seu valor mximo (ou mnimo para seqncias decrescentes). O prximo nmero a ser gerado ser o valor mnimo (MINVALUE) para seqncias crescentes e o valor mximo (MAXVALUE) para seqncias decrescentes. Cache Especifica uma quantidade de nmeros que o Oracle pr-aloca e mantm em memria para acesso mais rpido. Para obtermos o valor atual da seqncia, devemos usar a palavra-chave CurrVal e, para obtermos o prximo nmero seqencial, devemos usar a palavra-chave NextVal.

CAPTULO 9: DATA DEFINITION LANGUAGE - 291

INTRODUO AO ORACLE9I - SQL SQL> INSERT INTO FUNC (CD_MAT, NM_FUNC) VALUES 2 (SEQ_MAT.NEXTVAL, 'SEQUENCE'); 1 linha criada. SQL> SELECT CD_MAT, NM_FUNC FROM FUNC WHERE CD_MAT > 400; CD_MAT ---------401 7369 ... 7845 NM_FUNC -----------SEQUENCE SMITH TESTE SELECT

12 linhas selecionadas. No exemplo, usamos o valor gerado seqencialmente para preenchimento do nmero da matrcula da tabela Func. Observe que no existe nenhum vnculo entre o sequence e a matrcula da tabela Func. A seqncia pode ser usada simultaneamente para o preenchimento da primary key de outra tabela ou outro uso qualquer.
SQL> SELECT * FROM USER_SEQUENCES; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER -------------- ---------- ---------- ------------ - - ---------- ----------SEQ_MAT 1 99999 1 Y N 10 410 SQL> SELECT SEQ_MAT.CURRVAL FROM DUAL; CURRVAL ---------401

OBS: A coluna Last_Number j possui valor 410, enquanto o valor atual da seqncia ainda 401. Essa discrepncia ocorre em funo do valor especificado no atributo Cache. Quando acionamos a numerao pela primeira vez, o Oracle pr-aloca dez nmeros (no nosso caso) de seqncia, atualiza o dicionrio de dados que possui esta informao e reserva estes nmeros em memria. medida que vamos utilizando a numerao, estes valores em memria vo sendo fornecidos. Existe um risco potencial de perda de numerao seqencial em caso de falha no sistema (em que a memria perdida) e quando ocorre uma falha de programa e desmanchamos a transao sem, efetivamente, utilizar os nmeros seqenciais solicitados. O sequence no volta a disponibilizar os nmeros perdidos, pois no tem controle sobre o uso dado seqncia.

CAPTULO 9: DATA DEFINITION LANGUAGE - 292

INTRODUO AO ORACLE9I - SQL

CREATE ROLE
Role um conjunto de privilgios que pode ser adquirido por usurios ou outras roles. O objetivo das roles auxiliar a administrao de privilgios no banco de dados. Podemos adicionar diversos privilgios a uma determinada role e, posteriormente, autorizar o uso desta role por diversos usurios. No esquema, a role Funcionrio recebe diversos privilgios: permisso para acesso tabela Func (schema Desenv), permisso para criar tabelas, permisso para criar seqncias, acesso irrestrito tabela Depto (schema Desenv). Estes privilgios so, agora, repassados para os usurios Scott, Aluno, Davi, Dilson e Gabriel. Em vez de o DBA passar cada um dos privilgios individualmente para cada usurio, a role estabelece uma forma de organizarmos perfis de usurio, de tal forma que podemos passar autorizao coletivamente de acordo com o perfil do usurio desejado. SQL> CREATE ROLE FUNCIONARIO; Funo criada. SQL> GRANT ALL PRIVILEGES ON DEPTO TO FUNCIONARIO; Operao de Grant bem-sucedida. SQL> GRANT SELECT ON FUNC TO FUNCIONARIO; Operao de Grant bem-sucedida. A diferena entre a atribuio direta dos privilgios e a utilizao da role que os privilgios adquiridos diretamente esto associados ao usurio at que o privilgio seja revogado. Quando atribumos o privilgio para a role e autorizamos o uso da role pelo usurio, os privilgios so adquiridos dinamicamente quando ocorre a conexo daquele usurio. Se modificarmos os privilgios contidos na role e outro usurio utilizar a mesma role, j receber privilgios diferentes do primeiro usurio. OBS: Os privilgios contidos em uma role so adquiridos por um determinado usurio a tempo de login. Esta ao pode ser automtica ou o usurio pode ser obrigado a executar o comando Set Role explicitamente. Na criao do usurio, esta diferena determinada (Create User).

CAPTULO 9: DATA DEFINITION LANGUAGE - 293

INTRODUO AO ORACLE9I - SQL

CREATE DIRECTORY
Esse comando cria um objeto diretrio no banco de dados e o associa a um diretrio existente no sistema operacional. Esse objeto ser usado para indicao do diretrio de armazenamento de arquivos associados s colunas do tipo Bfile. SQL> CREATE DIRECTORY DISCO_D AS 'D:\TESTE'; Diretrio criado. No exemplo foi criado o objeto Disco_D, cujo diretrio fsico corresponde a D:\teste.

CREATE VIEW
O comando Create View j foi visto anteriormente no item Views do captulo 7.

CREATE USER
Este comando cria um usurio para acesso ao banco de dados. Adicionalmente, indica o tablespace onde o usurio poder criar seus objetos, limita quota de espao por tablespace, determina um profile contendo limites sobre os recursos do sistema. SQL> CREATE USER GABRIEL 2 IDENTIFIED BY GABRIEL 3 DEFAULT TABLESPACE USERS 4 TEMPORARY TABLESPACE TEMP 5 QUOTA 2M ON USERS 6 PASSWORD EXPIRE; Usurio criado. SQL> GRANT CONNECT TO GABRIEL; Operao de Grant bem-sucedida. SQL> CONNECT GABRIEL/GABRIEL ERROR: ORA-28001: the password has expired Alterando senha para GABRIEL Nova senha: **** Redigite a nova senha: **** Senha alterada Conectado. Criamos o usurio Gabriel e autorizamos sua conexo com o Oracle.

CAPTULO 9: DATA DEFINITION LANGUAGE - 294

INTRODUO AO ORACLE9I - SQL

ALTER <OBJETO>
O comando Alter, de um modo geral, permite que faamos modificaes nas especificaes que tivermos feito a tempo de Create. Nem todos os objetos permitem modificaes. Por exemplo, no temos comando Alter para Database Link, Synonym e Directory. Cada objeto tambm possui limitaes sobre o que pode ser alterado. Por exemplo, o comando Alter View permite que refaamos a compilao da View.

DROP <OBJETO>
O comando Drop remove tanto o objeto quanto sua definio do dicionrio de dados. Esta ao irreversvel, pois se trata de um comando de SQL DDL. SQL> DROP TABLE F CASCADE CONSTRAINTS; Tabela eliminada. SQL> DROP VIEW FUNCD11; View eliminada. SQL> DROP SYNONYM DEPT; Sinnimo eliminado. SQL> DROP PROCEDURE TESTE; Procedimento eliminado. SQL> DROP DATABASE LINK CENTRO; Vnculo de banco de dados eliminado. A sintaxe do comando Drop simples e necessita apenas do tipo do objeto e de seu nome. Quando eliminamos a tabela F, usamos a expresso cascade constraints. Esta expresso fora a eliminao da tabela mesmo havendo relacionamentos associados a ela (o relacionamento eliminado tambm).

CAPTULO 9: DATA DEFINITION LANGUAGE - 295

INTRODUO AO ORACLE9I - SQL

TRUNCATE TABLE
O comando Truncate Table elimina todas as linhas da tabela (como se fosse um comando Delete sem clusula Where) e pode liberar espao no utilizado de volta para o tablespace. A diferena bsica para um comando Delete que no gerada nenhuma informao de rollback; desta forma o comando no pode ser desfeito, como o caso do Delete. SQL> TRUNCATE TABLE G DROP STORAGE; Tabela truncada. SQL> TRUNCATE TABLE P REUSE STORAGE; Tabela truncada. A tabela G foi truncada (todas as linhas eliminadas) e o espao reservado para ela foi retornado ao tablespace, podendo ser utilizado por outros objetos. J a tabela P foi truncada (todas as linhas eliminadas), porm o espao j alocado para ela foi preservado, permanecendo associado tabela, porm vazio.

RENAME
Altera o nome de uma tabela, view, sequence ou sinnimo privativo. O objeto deve estar contido no schema do usurio. SQL> RENAME LETRAS TO TAB_LETRAS; Tabela renomeada. SQL> RENAME IX_TABLE TO ITABLE; Tabela renomeada. SQL> RENAME SEQ_MAT TO SEQ_CD_MAT; Tabela renomeada.

CAPTULO 9: DATA DEFINITION LANGUAGE - 296

INTRODUO AO ORACLE9I - SQL

GRANT
O propsito do comando Grant ceder privilgios. Temos dois tipos de privilgios: sobre os objetos (que deve ser cedido pelos usurios donos dos objetos) e de sistema (cedido pelo DBA), que autorizam determinadas aes dos usurios no banco de dados. SQL> GRANT ALL PRIVILEGES ON DEPTO TO GABRIEL 2 WITH GRANT OPTION; Operao de Grant bem-sucedida. SQL> GRANT INSERT, UPDATE, DELETE, SELECT ON FUNC 2 TO SCOTT, GABRIEL; Operao de Grant bem-sucedida. SQL> GRANT READ ON DIRECTORY DISCO_D TO GABRIEL; Operao de Grant bem-sucedida. SQL> GRANT ALL PRIVILEGES ON DEPTO TO GABRIEL 2 WITH GRANT OPTION; Operao de Grant bem-sucedida. SQL> GRANT CONNECT TO GABRIEL; Operao de Grant bem-sucedida. SQL> GRANT ALTER SESSION, DROP USER 2 TO SCOTT WITH ADMIN OPTION; Operao de Grant bem-sucedida. SQL> GRANT CONNECT TO NOVO IDENTIFIED BY NOVO; Operao de Grant bem-sucedida.

REVOKE
O comando Revoke retira um privilgio previamente fornecido. Da mesma forma que o Grant, o comando Revoke se refere a privilgios de sistema e privilgios para os objetos. SQL> REVOKE UPDATE, INSERT, DELETE ON FUNC FROM SCOTT; Revogao bem-sucedida. SQL> REVOKE DELETE, INSERT, UPDATE ON FUNC FROM FUNCIONARIO; Revogao bem-sucedida. SQL> REVOKE CONNECT FROM SCOTT; Revogao bem-sucedida. SQL> REVOKE ALTER SESSION FROM SCOTT; Revogao bem-sucedida.
CAPTULO 9: DATA DEFINITION LANGUAGE - 297

INTRODUO AO ORACLE9I - SQL

LABORATRIO 9:
1. O que e para que serve o ROLLBACK SEGMENT? 2. Crie um usurio de nome PROD com as seguintes caractersticas: tablespace default User_data tablespace temporario Temporary_Data password Prod espao total no tablespace user_data

3. De que forma podemos autorizar e desautorizar o acesso a objetos no Oracle? 4. Qual a diferena entre o comando Truncate e o comando Delete? 5. Qual a utilidade de uma Role?

OPCIONAIS 6. Descreva com suas palavras o relacionamento entre Physical Files, Tablespaces e Tables. 7. Criar a tabela de Cargos (CARGO) baseado no layout abaixo: Nome da coluna CD_CARGO NM_CARGO TX_DESCRICAO Chave ? PK Null ? NN NN Check ? maisculas Fk reference Tipo da coluna NUMBER VARCHAR2 VARCHAR2 Tamanho mximo 3 10 200 8. Confirme a estrutura gerada. 9 Verifique todas as constraints sobre as tabelas geradas. 10. Adicione 1 linha na tabela cargo. 11. Destrua a tabela de Cargos. O que acontece ? 12. Crie uma seqncia com valor inicial de 400 e utilize-a para inserir 2 linhas na tabela funcionrio.

CAPTULO 9: DATA DEFINITION LANGUAGE - 298

INTRODUO AO ORACLE9I - SQL

CAPTULO 10: TABELAS DO CURSO


TABELA DE DEPARTAMENTOS
CD_DEPTO -------A00 B01 C01 D01 D11 D21 E01 E11 E21 NM_DEPTO CD_GERENTECD_DEPTO_CTB ------------------------------------ ------------------------DIRETORIA DA EMPRESA 10 ASSESSORIA 20 A00 CENTRO DE INFORMACAO 30 A00 DIRETORIA DE SISTEMAS A00 GERENCIA DE SISTEMAS COMERCIAIS 60 D01 GERENCIA DE SISTEMAS ADMINISTRATIVOS 70 D01 DIRETORIA DE SUPORTE/PRODUCAO 50 A00 OPERACAO 90 E01 SUPORTE DE SOFTWARE 100 E01

SQL> DESC DEPTO Name Null? ------------------------------- -------CD_DEPTO NOT NULL NM_DEPTO CD_GERENTE CD_DEPTO_CTB

Type ---CHAR(3) VARCHAR2(40) NUMBER(5) CHAR(3)

CAPTULO 10: TABELAS DO CURSO - 299

INTRODUO AO ORACLE9I - SQL

TABELA DE FUNCIONRIOS
CD_ MAT ----10 20 30 50 60 70 90 100 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270 280 290 300 310 320 330 340 NM_ FUNC -------CRISTINA MIGUEL SANDRA JOAO IRACY EVA ELIANE TEODORO VICENTE SILVIO DOLORES HELENA BRUNO ELIZABET GABRIEL MARIA JAIRO DAVI WILIAM JOANA JOAQUIM SALVADOR DANIEL SILVIA MARTA ELINE JOAO FELIPE MARINA ROBERTO WILSON DILSON NM_ SOBRENOME ---------HENDERSON TEIXEIRA KWAN GOMES SOUZA PEREIRA HONOFRE SIQUEIRA LOURENCO OLIVA QUEIROZ NOVAES AZEVEDO PINTO YVES SANTOS WILARES BARBOSA JONES LUZ JANUARIO MEDEIROS SANTANA JUVENTO PARENTE SEVERO PONTES SARAIVA SALGADO MARQUES LOPES GONCALVES CD_ DEPTO ----A00 B01 C01 E01 D11 D21 E11 E21 A00 A00 C01 C01 D11 D11 D11 D11 D11 D11 D11 D11 D21 D21 D21 D21 D21 E11 E11 E11 E11 E21 E21 E21 NR_ RAMAL -----3978 3476 4738 6789 6423 7831 5498 972 3490 2167 4578 1793 4510 3782 2890 1682 2986 4501 942 672 2094 3780 961 8953 9001 8997 4502 2095 3332 9990 2103 5698 DT_ NR_ NR_ IN_ ADM CARGO GIT SEXO ---------- ---- ---01/01/95 66 18 F 01/10/93 61 18 M 05/04/95 60 20 F 17/08/89 58 16 M 14/09/93 55 16 F 30/09/90 56 16 F 15/08/95 55 16 F 16/06/90 54 14 M 16/05/94 58 19 M 05/12/93 58 14 M 28/07/91 55 16 F 15/12/91 56 18 F 12/02/92 55 16 M 11/10/93 54 17 F 15/09/89 54 16 M 07/07/90 53 17 F 26/07/94 53 16 M 03/03/96 55 16 M 11/04/94 52 17 M 29/08/95 55 18 F 21/11/95 53 14 M 05/12/93 55 17 M 30/10/99 52 15 M 11/09/95 52 16 F 30/09/90 55 15 F 24/03/91 54 17 F 30/05/90 42 12 M 19/06/92 48 14 M 12/09/91 43 12 F 07/07/90 52 16 M 23/02/96 55 14 M 05/05/96 54 16 M DT_ NASC -----14/08/53 02/02/68 11/05/61 15/09/55 07/07/55 26/05/63 15/05/71 18/12/66 05/11/69 18/10/62 15/09/55 19/01/56 17/05/67 12/04/65 05/01/71 21/02/69 25/06/72 29/05/71 23/02/63 19/03/68 30/05/65 31/03/74 12/11/69 05/10/66 26/05/73 28/03/66 09/07/66 27/10/56 21/04/71 11/08/72 18/07/71 17/05/66 VL_ SAL -----5275 4125 3825 4017.5 3225 36170 2975 2615 4650 2925 2380 2842 2528 2225 2468 2134 2045 2774 1827 2984 2218 2876 1918 1725 2738 2625 1534 1775 1590 1995 2537 2384

SQL> DESC FUNC Name Null? ------------------------------- -------CD_MAT NOT NULL NM_FUNC NM_SOBRENOME CD_DEPTO NR_RAMAL DT_ADM NR_CARGO NR_GIT IN_SEXO DT_NASC VL_SAL

Type ---NUMBER(5) VARCHAR2(12) VARCHAR2(12) CHAR(3) NUMBER(4) DATE NUMBER(3) NUMBER(2) VARCHAR2(1) DATE NUMBER(9,2)

CAPTULO 10: TABELAS DO CURSO - 300

INTRODUO AO ORACLE9I - SQL

TABELA DE ATIVIDADES
CD_ATIV ------10 20 30 40 50 60 70 80 90 100 110 120 130 140 150 160 170 180 NM_SIGLA -------------GERENCIA CUSTO LEVANTAMENTO DEFINICAO APRESENTACAO LOGICA CODIGO TESTE FISICO CURSO PREPARACAO PESSOAL OPERACAO MANUTENCAO ADMPROD ADMDB ADMREDE DOC TX_DESCRICAO -----------------------------GERNCIA ESTIMATIVA DE CUSTO FASE DE LEVANTAMENTO DEFINIO DE PROGRAMAS APRESENTAO DO PROJETO DESCRIO DA LGICA CODIFICAO DE PROGRAMAS TESTE DE PROGRAMAS PROJETO FSICO MINISTRAR CURSOS DESENVOLVIMENTO DE CURSOS ADMINISTRAO DE PESSOAL OPERAO DE SISTEMAS MANUTENO DE SOFTWARE ADMINISTRAO DE PRODUO ADMINISTRAO BANCO DE DADOS ADMINISTRAO DE REDE DOCUMENTAO DE SISTEMAS

SQL> DESC ATIV Name Null? ------------------------------- -------CD_ATIV NOT NULL NM_SIGLA TX_DESCRICAO

Type ---NUMBER(3) VARCHAR2(12) VARCHAR2(30)

CAPTULO 10: TABELAS DO CURSO - 301

INTRODUO AO ORACLE9I - SQL

TABELA DE PROJETOS
CD_ PROJ -----AD3100 AD3110 AD3111 AD3112 AD3113 IF1000 IF2000 MA2100 MA2110 MA2111 MA2112 MA2113 OP1000 OP1010 OP2000 OP2010 OP2011 OP2012 OP2013 PL2100 NM_ PROJ --------------------------SERVICOS ADMINISTRATIVOS ADMINISTRACAO GERAL PROGRAMACAO DE PAGAMENTO PROGRAMACAO DE PESSOAL ASSISTENCIA MEDICA CONSULTORIA TREINAMENTO AUTOMACAO COMERCIAL PROGRAMACAO ANALISE LEVANTAMENTO DEPURACAO SUPORTE PRODUCAO OPERACAO SISTEMAS DE CONTROLE SUPORTE SISTEMAS SUPORTE SOFTWARE SUPORTE USUARIO SUPORTE DB/DC PLANEJAMENTO CD_ DEPTO ----A00 A00 D21 D21 D21 C01 C01 D21 D11 D11 D11 D11 E01 E11 E01 E21 E21 E21 E21 B01 CD_ QT_ DT_ RESP EQP INI ----- ---- -------10 6 01/01/96 110 6 01/01/96 240 2 01/01/96 250 1 01/01/96 70 2 01/01/96 30 2 01/01/96 130 1 01/01/96 70 12 01/01/96 60 9 01/01/96 150 2 01/01/96 60 3 01/01/96 170 3 15/02/96 50 6 01/01/96 90 5 01/01/96 50 5 01/01/96 320 4 01/01/96 330 1 01/01/96 340 1 01/01/96 100 1 01/01/96 20 1 01/01/96 DT_ FIM -------01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 15/09/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96 01/02/96

SQL> DESC PROJ Name ------------------------------CD_PROJ NM_PROJ CD_DEPTO CD_RESP QT_EQP DT_INI DT_FIM

Null? -------NOT NULL NOT NULL NOT NULL NOT NULL

Type ---CHAR(6) VARCHAR2(30) CHAR(3) NUMBER(5) NUMBER(2) DATE DATE

CAPTULO 10: TABELAS DO CURSO - 302

INTRODUO AO ORACLE9I - SQL

TABELA DE PROJETOS X ATIVIDADES


CD_PROJ --------AD3110 AD3110 AD3110 AD3111 AD3111 AD3111 AD3112 AD3112 AD3112 AD3113 AD3113 AD3113 IF1000 IF1000 IF1000 IF2000 IF2000 IF2000 MA2100 MA2100 MA2110 MA2110 MA2110 MA2110 MA2111 MA2111 MA2111 MA2113 MA2113 MA2113 OP2000 OP2000 OP2000 OP2010 OP2010 OP2010 OP2011 OP2011 OP2011 CD_ATIV -------10 40 70 20 50 80 20 50 80 30 60 90 10 40 70 30 60 90 40 70 10 40 70 100 20 50 80 30 60 90 20 50 80 10 40 70 30 60 90 DT_INI -------12/04/89 28/12/91 13/09/94 27/06/90 13/03/93 28/11/95 29/06/90 15/03/93 30/11/95 29/03/91 13/12/93 29/08/96 16/03/89 01/12/91 17/08/94 14/12/90 30/08/93 16/05/96 04/11/91 21/07/94 19/02/89 06/11/91 23/07/94 08/04/97 19/11/89 05/08/92 22/04/95 24/10/90 10/07/93 26/03/96 20/08/90 06/05/93 21/01/96 16/06/89 02/03/92 17/11/94 12/06/91 26/02/94 12/11/96 DT_FIM -------22/04/89 07/01/92 23/09/94 28/07/90 13/04/93 29/12/95 01/07/90 17/03/93 02/12/95 21/04/91 05/01/94 21/09/96 23/03/89 08/12/91 24/08/94 01/01/91 17/09/93 03/06/96 05/12/91 21/08/94 21/02/89 08/11/91 25/07/94 10/04/97 12/12/89 28/08/92 15/05/95 08/11/90 25/07/93 10/04/96 30/08/90 16/05/93 31/01/96 01/07/89 17/03/92 02/12/94 08/07/91 24/03/94 08/12/96

CAPTULO 10: TABELAS DO CURSO - 303

INTRODUO AO ORACLE9I - SQL CD_PROJ --------OP2012 OP2012 OP2012 OP2013 OP2013 OP2013 PL2100 PL2100 PL2100 CD_ATIV -------20 50 80 10 40 70 20 50 80 DT_INI ------24/07/90 09/04/93 25/12/95 06/08/89 22/04/92 07/01/95 02/02/90 19/10/92 06/07/95 DT_FIM ------31/07/90 16/04/93 01/01/96 24/08/89 10/05/92 25/01/95 28/02/90 14/11/92 01/08/95

SQL> DESC PRJATV Name ------------------------------CD_PROJ CD_ATIV DT_INI DT_FIM

Null? -------NOT NULL NOT NULL NOT NULL NOT NULL

Type ---CHAR(6) NUMBER(3) DATE DATE

CAPTULO 10: TABELAS DO CURSO - 304

INTRODUO AO ORACLE9I - SQL

RESPOSTAS DOS LABORATRIOS


LABORATRIO 1
1. Mostre a descrio da tabela DEPTO. SQL> DESC DEPTO 2. Mostre o nome e o ramal de cada funcionrio. SQL> SELECT nm_func, nr_ramal FROM func; 3. Mostre os departamentos em que existem funcionrios. No repita o cdigo do departamento no resultado. SQL> SELECT DISTINCT cd_depto 2 FROM func 3 WHERE cd_depto IS NOT NULL; 4. Qual o nome do funcionrio cuja matrcula 230 ? SQL> SELECT nm_func 2 FROM func 3 WHERE cd_mat = 230; 5. Mostre o sobrenome, nome e departamento de todos os funcionrios que no trabalhem no departamento D11. SQL> SELECT nm_sobrenome, nm_func, cd_depto 2 FROM func 3 WHERE NOT cd_depto = 'D11'; 6. Mostre o ltimo nome e salrio de todos os empregados que recebam entre R$2500,00 e R$5000,00 (inclusive). SQL> SELECT nm_sobrenome, vl_sal 2 FROM func 3 WHERE vl_sal between 2500 and 5000;

RESPOSTAS DOS LABORATRIOS - 305

INTRODUO AO ORACLE9I - SQL 7. Apresente o nome e telefone de todos os funcionrios que trabalhem nos departamentos A00, D11, D21 e E11. SQL> SELECT nm_func, nr_ramal FROM func 2 WHERE cd_depto in ('A00', 'D11','D21','E21'); 8. Mostre o nome e sobrenome de todos os funcionrios que tenham o sobrenome com 5 letras e que a terceira seja M e que sejam do sexo feminino. A listagem deve apresentar nome, data de nascimento e sexo. SQL> SELECT nm_func, dt_nasc, in_sexo 2 FROM func 3 WHERE nm_sobrenome like '_ _M_ _' 4 AND in_sexo = 'F'; 9. Deseja-se uma lista contendo cdigo do departamento e nome do departamento de todos os departamentos em que o cdigo do departamento contbil no est preenchido. SQL> SELECT cd_depto, nm_depto FROM depto 2 WHERE cd_depto_ctb IS NULL;

OPCIONAIS 10. Crie uma query para mostrar o nome, matrcula e salrio de todos os funcionrios que trabalhem no departamento D11. Salve a query com o nome de Lab.sql. SQL> SELECT nm_func, cd_mat, vl_sal 2 FROM func 3 WHERE cd_depto = 'D11'; SQL> SAVE Lab.sql 11. Execute a query Lab.sql. SQL> @Lab

RESPOSTAS DOS LABORATRIOS - 306

INTRODUO AO ORACLE9I - SQL 12. Recupere a query no SQL buffer. Nomeie as colunas CD_MAT de "Matricula", NM_FUNC de "Nome" e VL_SAL de "Salario". Re-execute a query. SQL> get Lab SQL> SELECT nm_func "Nome", cd_mat "Matrcula", vl_sal "Salrio" 2 FROM func 3 WHERE cd_depto = 'D11'; SQL> / 13. Produza uma listagem de todos os funcionrios do departamento X. O cdigo do departamento ser informado como parmetro a tempo de execuo. Deseja-se o nome do funcionrio e o cdigo do departamento que ele trabalha. SQL> SELECT nm_func, cd_depto 2 FROM func 3 WHERE cd_depto = '&coddep'; 14. Deseja-se saber quais os funcionrios (matrcula, cargo e departamento) que foram cadastrados na partio Anos95_99 da tabela de histrico de promoes. SQL> SELECT CD_MAT, NR_CARGO, CD_DEPTO 2 FROM HST_PROMO PARTITION (ANOS95_99);

RESPOSTAS DOS LABORATRIOS - 307

INTRODUO AO ORACLE9I - SQL

LABORATRIO 2:
1. Inclua-se como funcionrio. . Preencha todas as colunas da tabela. O nmero da matrcula deve corresponder ao nmero ao dia do seu aniversrio. SQL> 2 3 4 5 6 INSERT INTO func (cd_mat, nm_func, nm_sobrenome, vl_sal, nr_cargo, dt_nasc, dt_adm, nr_ramal, in_sexo, cd_depto, nr_git, nm_foto) VALUES (14, 'JOAO', 'DA SILVA', 1000, 55, '14/06/87', '08/12/97', 2398, 'M', 'E11', 16, 'c:\windows\esteira.bmp');

2. Complete, agora, as informaes. Sabendo-se que se novo ramal 1512 e a data de admisso 15/01/2003, necessrio que os dados na tabela Func sejam atualizados e que sejam includas as linhas correspondentes ao valor inicial dos funcionrios na tabela de histrico de promoes. SQL> UPDATE FUNC 2 SET NR_RAMAL = 1512, 3 DT_ADM = '15/01/03' 4 WHERE CD_MAT = 14; 1 linha atualizada. SQL> INSERT INTO HST_PROMO 2 SELECT DT_ADM, CD_MAT, VL_SAL, CD_DEPTO, NR_CARGO, 3 'Informao inicial do funcionrio' 4 FROM FUNC 5 WHERE CD_MAT = 14; 1 linha criada. 3. Aumente seu salrio e, simultaneamente, tente trocar o cdigo do departamento associado a voc para um cdigo de departamento invlido. O que acontece ? SQL> UPDATE FUNC 2 SET CD_DEPTO = 'D03' 3 WHERE CD_MAT = 14; UPDATE FUNC * ERRO na linha 1: ORA-02291: restrio de integridade (ALUNO.SYS_C002817) violada - chave-pai no localizada O erro ocorre porque existe um relacionamento entre a tabela Funcionrio e a tabela Departamento, onde cd_depto na tabela Funcionrio chave estrangeira (foreign key) em relao coluna cd_depto da tabela Departamento, que primary key. Desta forma, qualquer tentativa de atribuio de valor coluna cd_depto de FUNC resultar em erro se o valor no for encontrado na coluna cd_depto da tabela DEPTO.
RESPOSTAS DOS LABORATRIOS - 308

INTRODUO AO ORACLE9I - SQL 4. Inclua todos os funcionrios do departamento D11 no departamento D01, acrescentando ao nmero da matrcula o valor 400. SQL> INSERT INTO FUNC 2 SELECT CD_MAT + 340, NM_FUNC, NM_SOBRENOME, 'D01', 3 NR_RAMAL, DT_ADM, NR_CARGO, NR_GIT, 4 IN_SEXO, DT_NASC, VL_SAL, NM_FOTO 5 FROM FUNC 6 WHERE CD_DEPTO = 'D11'; 5. Altere o ramal de todos os funcionrios do departamento D11 para 1437. SQL> UPDATE FUNC 2 SET NR_RAMAL = 1437 3 WHERE CD_DEPTO = 'D11'; 6. Exclua todos os funcionrios que ganhem mais que voc. SQL> DELETE FROM func WHERE vl_sal > 1200; As linhas no foram excludas porque existe um relacionamento entre funcionrio e projeto. No podem ser excludos funcionrios que sejam responsveis por projetos. 7. Exclua todas as linhas da partio Anos80. SQL> DELETE FROM HST_PROMO PARTITION (ANOS80); 8. Aumente o salrio de todos os funcionrios em 10%. Retorne o valor dos novos salrios. O que acontece ? SQL> VARIABLE SALARIO NUMBER SQL> UPDATE FUNC 2 SET VL_SAL = VL_SAL * 1.1 3 RETURNING VL_SAL INTO :SALARIO; RETURNING VL_SAL INTO :SALARIO * ERRO na linha 3: ORA-24369: callbacks necessrios no registrados para um ou mais handles de ligao

Ocorreu um erro porque a rea de recepo (SALARIO) s comporta um nmero e diversos valores foram retornados.

RESPOSTAS DOS LABORATRIOS - 309

INTRODUO AO ORACLE9I - SQL OPCIONAIS 9. Produza um script para inserir uma linha na tabela funcionrio interativamente (preencha apenas matrcula, nome e departamento). SQL> 2 3 SQL> INSERT INTO func (cd_mat, nm_func, cd_depto) VALUES (&mat, '&nome', '&coddep')) / SAVE script

10. Execute o script do item anterior gerando 2 linhas na tabela. SQL> @script 11. Mostre em ordem alfabtica todos os funcionrios que contenham em seu primeiro nome a letra A. SQL> SELECT nm_func, nm_sobrenome 2 FROM func 3 WHERE nm_func like '%A%' 4 ORDER BY 1; 12. Apresente em ordem decrescente de salrio os funcionrios de um departamento indicado como parmetro de substituio. Os funcionrios sem salrio devem ser apresentados no fim da relao. SQL> SELECT CD_MAT, NM_FUNC, VL_SAL 2 FROM FUNC 3 WHERE CD_DEPTO = '&DEP' 4 ORDER BY VL_SAL DESC NULLS LAST;

RESPOSTAS DOS LABORATRIOS - 310

INTRODUO AO ORACLE9I - SQL

LABORATRIO 3
1. Atualize o salrio de todos os funcionrios de tal forma que as casas decimais sejam eliminadas. SQL> UPDATE func 2 SET vl_sal = TRUNC(vl_sal); 2. Calcule a durao das atividades de cada um dos projetos. O tempo (em unidades de 10 dias) deve ser arredondado para um valor inteiro. Usar a tabela PRJATV. SQL> SELECT cd_proj, cd_ativ, ROUND((dt_fim - dt_ini)/10) 2 FROM prjatv; 3. Mostre a matrcula e data de admisso de todos os funcionrios admitidos aps 17 de junho de 1992. SQL> SELECT cd_mat, dt_adm 2 FROM func 3 WHERE dt_adm > TO_DATE('17-jun-1992', 'DD-MON-YYYY'); 4. Produza uma listagem de todos os funcionrios que foram contratados com menos de 21 anos. Deseja-se saber o nome, matricula e a idade na contratao. SQL> SELECT nm_func, cd_mat, TRUNC((dt_adm - dt_nasc)/365.25) 2 FROM func 3 WHERE dt_adm - dt_nasc < (21 * 365.25) 5. Produza uma listagem dos funcionrios do sexo masculino, com mais de 25 anos e que ganhem mais de R$ 3.500,00. A listagem deve conter a matrcula, nome, salrio, sexo e idade do funcionrio. SQL> SELECT cd_mat, nm_func, vl_sal, in_sexo, 2 TRUNC((SYSDATE - dt_nasc) /365.25) Idade 3 FROM func 4 WHERE in_sexo = 'M' 5 AND vl_sal > 3500 6 AND (TRUNC(SYSDATE) - dt_nasc)) / 365.25 > 25;

RESPOSTAS DOS LABORATRIOS - 311

INTRODUO AO ORACLE9I - SQL 6. Produza uma listagem contendo o nome e sobrenome de todos os funcionrios cujo nome completo (nome concatenado com sobrenome excluindo-se as vogais) seja composto de mais de 9 caracteres. A lista deve apresentar o nome e o sobrenome (em uma nica coluna), a data e hora de nascimento, o ms e ano de admisso (nmero do ms em algarismos romanos) e o valor de salrio (editado). SQL> SELECT nm_func || ' ' || nm_sobrenome, 2 TO_CHAR(dt_nasc, 'DD/MM/YY HH24:MI'), 3 TO_CHAR(dt_adm, 'rm/YYYY'), 4 TO_CHAR(vl_sal, 'L999G999G999D99') 5 FROM func 6 WHERE LENGTH (TRANSLATE(nm_func || nm_sobrenome, 7 'GAEIOUaeiou ', 'G')) > 9; 7. Produza uma listagem contendo nome e sobrenome do funcionrio (concatenados e alinhados esquerda), cdigo do departamento (alinhado direita - tam 6), matrcula (alinhado direita), data de admisso (formato dd/mm/yy, centralizado - tam 12) dos funcionrios do departamento D11. SQL> SELECT nm_func || ' ' || nm_sobrenome, 2 LPAD (cd_depto,6, ' '), cd_mat, 3 RPAD(LPAD (TO_CHAR(dt_adm, 'dd/mm/yy'), 10, ' '), 12, ' ') 4 FROM FUNC 5 WHERE cd_depto = 'D11'; 8. Deseja-se uma listagem dos funcionrios que tenham mais de trs vogais em seu primeiro nome. A listagem deve apresentar o nome do funcionrio (completo) criptografado, de acordo com as regras abaixo: A B,C,D,F,G,H,J T,V,X,Y,Z E N,O K,L,M,P,Q,R,S I U,W 0 1 3 4 6 2 5 7

SQL> SELECT TRANSLATE (nm_func || nm_sobrenome, 2 'BCDFGHJTVXYZENOKLMPQRSAIUW', 3 '11111113333346622222220577') 4 FROM func 5 WHERE LENGTH (TRANSLATE (nm_func, 6 'ABCDFGHJKLMNPQRSTVWXYZbcdfghjklmnpqrstvwxyz', 'A')) > 3;
RESPOSTAS DOS LABORATRIOS - 312

INTRODUO AO ORACLE9I - SQL 9. Produza uma listagem contendo o nome, data de nascimento e sexo de todos os funcionrios cujo ramal esteja preenchido. Deseja-se que o nome seja composto pelo primeiro e ltimo nome do funcionrio, que sejam impressas as palavras feminino e masculino no lugar do indicador de sexo e que a data de nascimento apresente tambm a hora. SQL> SELECT nm_func || ' ' || nm_sobrenome "Nome", 2 TO_CHAR(dt_nasc, 'dd/mm/yy hh24:mi') "Nascimento", 3 DECODE(in_sexo, 'F', 'Feminino', 'Masculino') "Sexo" 4 FROM func 5 WHERE nr_ramal IS NOT NULL;

OPCIONAIS 10. Apresente uma listagem contendo informaes sobre a sesso do usurio: cdigo do usurio, linguagem, territrio, charset, identificador da sesso, data e hora do sistema. SQL> SELECT USER, USERENV('language'), 2 USERENV('sessionid'), 3 TO_CHAR(SYSDATE, 'DD/MM/YY HH24:MI') 4 FROM dual; 11. Deseja-se uma lista dos projetos (nome) com equipe maior que 3 e em cujo nome (do projeto) existam simultaneamente as letras M e A em qualquer ordem. SQL> SELECT nm_proj 2 FROM proj 3 WHERE qt_eqp > 3 4 AND (nm_proj LIKE '%M%A%' OR nm_proj LIKE '%A%M%'); 12. Deseja-se uma lista dos funcionrios com mais de 35 anos e que tenham cargo menor que 55. SQL> SELECT cd_mat, nm_func, (SYSDATE - dt_nasc) / 365.25, nr_cargo 2 FROM func 3 WHERE nr_cargo < 55 4 AND (SYSDATE - dt_nasc) / 365.25 > 35; 13. Deseja-se uma lista de projetos (cdigo) e atividades (cdigo) ocorridos durante o ano de 1996. SQL> SELECT cd_proj, cd_ativ, dt_ini, dt_fim 2 FROM prjatv 3 WHERE (dt_ini BETWEEN TO_DATE('01-jan-1996', 4 AND TO_DATE('31-dec-1996', 5 OR (dt_fim BETWEEN TO_DATE('01-jan-1996', 6 AND TO_DATE('31-dec-1996',

'DD-MON-YYYY') 'DD-MON-YYYY')) 'DD-MON-YYYY') 'DD-MON-YYYY'));

RESPOSTAS DOS LABORATRIOS - 313

INTRODUO AO ORACLE9I - SQL 14. Deseja-se uma lista de projetos (cdigo) e atividades (cdigo) que no tiveram atividades no ano de 1996 (Usar PRJATV). SQL> SELECT cd_proj, dt_ini, dt_fim 2 FROM prjatv 3 WHERE (dt_ini NOT BETWEEN TO_DATE('01-jan-1996', 'DD-MON-YYYY') 4 AND TO_DATE('31-dec-1996', 'DD-MON-YYYY')) 5 AND (dt_fim NOT BETWEEN TO_DATE('01-jan-1996', 'DD-MON-YYYY') 6 AND TO_DATE('31-dec-1996', 'DD-MON-YYYY')); 15. Deseja-se uma relao contendo nome completo do funcionrio usando letras maisculas e minsculas, sexo por extenso, nmero de dias entre a data de admisso e o ltimo dia do ms da data corrente e o valor do salrio (se houver definido; caso contrrio, 0) formatado. Esta relao deve ser ordenada do menor salrio para o maior. SQL> SELECT INITCAP(NM_FUNC||' '||NM_SOBRENOME) "Nome", 2 DECODE(IN_SEXO, 'F', 'Feminino', 3 'M', 'Masculino', 'Indefinido') "Sexo", 4 ROUND(LAST_DAY(SYSDATE) - DT_ADM) "Dias", 5 TO_CHAR(NVL(VL_SAL, 0), 'L999G990D00', 6 'NLS_CURRENCY = R$') "Salrio" 7 FROM FUNC 8 ORDER BY NVL(VL_SAL, 0);

16. Deseja-se uma relao com as seguintes informaes: linguagem em uso no banco de dados, o conjunto de caracteres nacionais e o do banco de dados, o endereo da linha do funcionrio com matrcula 100, a data de hoje (com dia, ms e ano por extenso), a data da prxima quinta-feira, o seno, cosseno e tangente do ngulo de 30 graus. SQL> SELECT USERENV('LANGUAGE') "Linguagem", 2 NLS_CHARSET_NAME(NLS_CHARSET_ID('CHAR_CS')) "Charset DB", 3 NLS_CHARSET_NAME(NLS_CHARSET_ID('NCHAR_CS')) "National", 4 ROWIDTOCHAR(ROWID) "Rowid", 5 TO_CHAR(SYSDATE, 'DD-DAY-MONTH-YEAR') "Hoje", 6 NEXT_DAY(SYSDATE, 'quinta-feira') "Prxima Quinta", 7 SIN(30), COS(30), TAN(30) 8 FROM FUNC 9 WHERE CD_MAT = 100;

17. Deseja-se realizar o enquadramento dos funcionrios da empresa em uma faixa salarial. O grupo ser dividio em 10 faixas iguais, sendo o intervalo salarial aprecivel entre 1500 e 5000. Determine a faixa de cada funcionrio.
SQL> SELECT CD_MAT, VL_SAL, WIDTH_BUCKET(VL_SAL, 1500, 5000, 10) FAIXAS 2 FROM FUNC 3 ORDER BY 2; RESPOSTAS DOS LABORATRIOS - 314

INTRODUO AO ORACLE9I - SQL 18. Deseja-se obter o valor numrico e nome da zona de tempo da sesso e do banco de dados.
SQL> COL REGIAO_DB for a20 SQL> COL REGIAO_SESSAO for a20 SQL> SELECT TZ_OFFSET(DBTIMEZONE) DBTIMEZONE, 2 TZ_OFFSET(SESSIONTIMEZONE) SESSIONTIMEZONE, 3 EXTRACT(TIMEZONE_ABBR FROM FROM_TZ(LOCALTIMESTAMP, DBTIMEZONE)) REGIAO_DB, 4 EXTRACT(TIMEZONE_ABBR FROM 5 FROM_TZ(LOCALTIMESTAMP, SESSIONTIMEZONE)) REGIAO_SESSAO 6 FROM DUAL;

19. Receba um timestamp como parmetro e sua zona de tempo e retorne este timestamp convertido para o horrio de Greenwich. SQL> SELECT SYS_EXTRACT_UTC( 2 TO_TIMESTAMP_TZ('&DATA '||'&HORA '||'&TZONE', 3 'DD/MM/YYYY HH24:MI:SS TZH:TZM')) HORAGMT 4 FROM DUAL;

RESPOSTAS DOS LABORATRIOS - 315

INTRODUO AO ORACLE9I - SQL

LABORATRIO 4:
1. Deseja-se uma lista contendo o nome do projeto, o nome das atividades e tempo de durao de cada atividade (fornecido em nmero de horas). Ordene o resultado por projeto e atividade. SQL> SELECT PROJ.NM_PROJ "Projeto", 2 ATIV.TX_DESCRICAO "Atividade", 3 TRUNC((PRJATV.DT_FIM - PRJATV.DT_INI) * 24) Horas 4 FROM PROJ, ATIV, PRJATV 5 WHERE PRJATV.CD_PROJ = PROJ.CD_PROJ 6 AND PRJATV.CD_ATIV = ATIV.CD_ATIV 7 ORDER BY "Projeto", "Atividade"; ou SQL> SELECT PROJ.NM_PROJ "Projeto", 2 ATIV.TX_DESCRICAO "Atividade", 3 TRUNC((PRJATV.DT_FIM - PRJATV.DT_INI) * 24) Horas 4 FROM PRJATV JOIN ATIV USING (CD_ATIV) 5 JOIN PROJ USING(CD_PROJ) 6 ORDER BY "Projeto", "Atividade"; 2. Produza uma relao dos funcionrios que possuam cargo igual ao cargo de algum dos funcionrios do departamento D11. SQL> SELECT nr_cargo, cd_mat, nm_func 2 FROM func 3 WHERE nr_cargo = ANY (SELECT DISTINCT nr_cargo 4 FROM func WHERE cd_depto = 'D11'); 3. Deseja-se uma lista (nome, sobrenome, matrcula, ramal e depto) de todos os funcionrios que sejam responsveis por projeto, porm no sejam gerentes. SQL> SELECT F.NM_FUNC, F.NM_SOBRENOME, F.VL_SAL, F.CD_DEPTO 2 FROM FUNC F, DEPTO D, PROJ P 3 WHERE P.CD_RESP = F.CD_MAT 4 AND D.CD_DEPTO = F.CD_DEPTO 5 AND D.CD_GERENTE <> F.CD_MAT; ou SQL> SELECT F.NM_FUNC, F.NM_SOBRENOME, F.VL_SAL, F.CD_DEPTO 2 FROM FUNC F JOIN DEPTO D ON D.CD_DEPTO = F.CD_DEPTO AND 3 D.CD_GERENTE <> F.CD_MAT 4 JOIN PROJ P ON P.CD_RESP = F.CD_MAT;

RESPOSTAS DOS LABORATRIOS - 316

INTRODUO AO ORACLE9I - SQL 4. Deseja-se uma lista (nome, sobrenome, matrcula, ramal e depto) de todos os funcionrios que sejam responsveis por projetos e sejam, simultaneamente, gerentes. SQL> SELECT nm_func, nm_sobrenome, cd_mat, 2 nr_ramal, cd_depto 3 FROM func 4 WHERE cd_mat IN (SELECT cd_resp FROM proj) 5 AND cd_mat IN (SELECT cd_gerente FROM depto); ou
SQL> SELECT F.CD_MAT, F.NM_FUNC||' '||F.NM_SOBRENOME 2 D.CD_DEPTO, D.NM_DEPTO, 3 P.CD_PROJ, P.NM_PROJ 4 FROM FUNC F INNER JOIN DEPTO D ON F.CD_MAT = 5 AND F.CD_DEPTO 6 INNER JOIN PROJ P ON F.CD_MAT = 7 AND P.CD_DEPTO "GER. RESPONSVEL", D.CD_GERENTE = D.CD_DEPTO P.CD_RESP = D.CD_DEPTO;

5. Produza uma lista (nome e salrio) dos funcionrios que ganhem menos que todos os funcionrios com idade menor que 25 anos (usar subselect). SQL> SELECT nm_func, vl_sal 2 FROM func 3 WHERE vl_sal < (SELECT MIN(vl_sal) FROM func 4 WHERE (SYSDATE - dt_nasc) < (25 * 365.25); 6. Produza uma lista dos funcionrios (nome e salrio) do sexo feminino que ganhem mais que todos os funcionrios do sexo masculino. SQL> SELECT nm_func, vl_sal FROM func 2 WHERE in_sexo = 'F' AND vl_sal > (SELECT MAX(vl_sal) 3 FROM func 4 WHERE in_sexo = 'M'); 7. Deseja-se saber quais os departamentos que no possuem funcionrios (usar Minus). SQL> SELECT CD_DEPTO, NM_DEPTO 2 FROM DEPTO 3 MINUS 4 SELECT DEPTO.CD_DEPTO, DEPTO.NM_DEPTO 5 FROM DEPTO, FUNC 6 WHERE FUNC.CD_DEPTO = DEPTO.CD_DEPTO;

RESPOSTAS DOS LABORATRIOS - 317

INTRODUO AO ORACLE9I - SQL 8. Deseja-se uma lista contendo o nome e departamento do gerente e nome e salrio de todos os funcionrios subordinados a ele. Apresente o resultado ordenado por departamento e salrio (descendente).
SQL> SELECT G.CD_DEPTO, G.NM_FUNC "Gerente", 2 F.NM_FUNC, F.VL_SAL 3 FROM FUNC G, FUNC F, DEPTO D 4 WHERE G.CD_MAT = D.CD_GERENTE 5 AND F.CD_DEPTO = D.CD_DEPTO ORDER BY 1, 4 DESC; ou SQL> SELECT G.CD_DEPTO, G.NM_FUNC "Gerente", 2 F.NM_FUNC, F.VL_SAL 3 FROM FUNC G INNER JOIN DEPTO D ON G.CD_MAT = D.CD_GERENTE 4 JOIN FUNC F ON F.CD_DEPTO = D.CD_DEPTO 5 ORDER BY 1, 4 DESC;

OPCIONAIS 9. Deseja-se uma lista contendo o nome do projeto, o nome do departamento responsvel e o nome do funcionrio responsvel, desde que ele trabalhe no departamento responsvel pelo projeto. SQL> SELECT P.NM_PROJ Projeto, D.NM_DEPTO Departamento, 2 F.NM_FUNC Responsavel 3 FROM PROJ P, DEPTO D, FUNC F 4 WHERE P.CD_DEPTO = D.CD_DEPTO 5 AND P.CD_DEPTO = F.CD_DEPTO 6 AND P.CD_RESP = F.CD_MAT 7 UNION 9 SELECT P.NM_PROJ, D.NM_DEPTO, 10 'Outro Depto' 11 FROM PROJ P, DEPTO D, FUNC F 12 WHERE P.CD_DEPTO = D.CD_DEPTO 13 AND P.CD_DEPTO <> F.CD_DEPTO 14 AND P.CD_RESP = F.CD_MAT; 10.Produza uma lista dos funcionrios (nome, nome departamento e tempo de empresa) que sejam gerentes e seus respectivos departamentos em ordem descendente de tempo de empresa. SQL> SELECT nm_func, nm_depto, 2 TRUNC((SYSDATE - dt_adm)/365.25) Tempo 3 FROM func, depto 4 WHERE func.cd_mat = depto.cd_gerente 5 ORDER BY 3 DESC;

RESPOSTAS DOS LABORATRIOS - 318

INTRODUO AO ORACLE9I - SQL 11. Deseja-se uma lista (nome depto, nome depto contbil e cdigos) ordenada por departamento contbil. SQL> SELECT D.cd_depto CDep, D.nm_depto NDep, 2 C.cd_depto CContab, C.nm_depto NContab 3 FROM depto D, depto C 4 WHERE D.cd_depto_ctb = C.cd_depto (+) 5 ORDER BY 3; 12. Deseja-se uma lista (nome, sobrenome, matrcula, ramal e depto) de todos os gerentes que sejam responsveis por projetos no pertencentes ao seu departamento. SQL> SELECT F.CD_MAT, F.NM_FUNC||' '||F.NM_SOBRENOME "GER. RESPONSVEL", 2 D.CD_DEPTO, D.NM_DEPTO, 3 P.CD_PROJ, P.NM_PROJ 4 FROM FUNC F, DEPTO D, PROJ P 5 WHERE F.CD_DEPTO <> D.CD_DEPTO 6 AND F.CD_MAT = P.CD_RESP 7 AND P.CD_DEPTO = D.CD_DEPTO 8 AND F.CD_MAT IN (SELECT CD_GERENTE FROM DEPTO);

13. Deseja-se obter uma lista(nome, salrio, depto) dos funcionrios que so gerentes. O salrio deve ser criptografado de acordo com as regras abaixo: 00 ser convertido para 9 ser convertido para 8, 7, 6 sero convertidos para 5 ser convertido para 4,3 sero convertidos para 2,1 sero convertidos para A X Y Z K W

SQL> SELECT nm_func, 2 TRANSLATE(REPLACE(TO_CHAR(vl_sal), '00', 'A'), 3 '123456789', 'WWKKZYYYX') vl_sal 4 FROM func 5 WHERE cd_mat in (SELECT cd_gerente FROM depto);

RESPOSTAS DOS LABORATRIOS - 319

INTRODUO AO ORACLE9I - SQL 14. Deseja-se saber o cdigo e nome do projeto, cdigo e nome da atividade e o tempo de durao da atividade durante o ano de 1996. Ordene o resultado por nome do projeto e nome da atividade. Se uma atividade se iniciou antes de 1996 e terminou durante o ano de 1996, desejamos saber apenas quanto tempo ela durou de 01/01/96 at a data de trmino. Se uma atividade comeou durante o ano de 1996 e terminou em outro ano, desejamos saber apenas o tempo da data de incio da atividade at dia 31/12/1996. Se uma atividade comeou antes de 1996 e terminou depois de 1996, sua durao ser de 01/01 a 31/12. Se uma atividade comeou e terminou em 1996, sua durao ser desde a data de incio at a data de trmino. SQL> SELECT P.CD_PROJ, P.NM_PROJ, 2 A.CD_ATIV, A.TX_DESCRICAO, 3 DECODE(TO_NUMBER(TO_CHAR(PJ.DT_FIM, 'YYYY')), 4 1996, PJ.DT_FIM, '31/12/96') 5 DECODE(TO_NUMBER(TO_CHAR(PJ.DT_INI, 'YYYY')), 6 1996, PJ.DT_INI, '01/01/96') + 1 Tempo 7 FROM PROJ P, ATIV A, PRJATV PJ 8 WHERE PJ.CD_PROJ = P.CD_PROJ 9 AND PJ.CD_ATIV = A.CD_ATIV 10 AND PJ.DT_FIM > TO_DATE('01/01/96') - 1/86400 11 AND PJ.DT_INI < TO_DATE('01/01/97') - 1/86400;

RESPOSTAS DOS LABORATRIOS - 320

INTRODUO AO ORACLE9I - SQL

LABORATRIO 5:
1. Deseja-se uma lista contendo matrcula, nome e salrio de todos os funcionrios que ganhem mais que a mdia salarial da empresa. SQL> SELECT CD_MAT, NM_FUNC, VL_SAL 2 FROM FUNC 3 WHERE VL_SAL > (SELECT AVG(VL_SAL) FROM FUNC); 2. Produza uma lista contendo a mdia salarial, total de salrios e quantidade de linhas selecionadas por departamento, de todos os funcionrios que tenham em seu primeiro nome a letra A. SQL> SELECT AVG(VL_SAL), SUM(VL_SAL), COUNT(*), CD_DEPTO 2 FROM FUNC 3 WHERE NM_FUNC LIKE '%A%' OR 4 NM_FUNC LIKE '%a%' 5 GROUP BY CD_DEPTO; 3. Produza uma lista contendo o cargo, a mdia salarial e o nmero de funcionrios grupados por cargo para os departamentos D01, D11, D21 e E11. Todos os cargos com menos de trs funcionrios devem ser excludos do resultado. A lista deve vir ordenada descendentemente por mdia salarial. SQL> SELECT NR_CARGO, AVG(VL_SAL), COUNT(*) 2 FROM FUNC 3 WHERE CD_DEPTO IN ('D01', 'D11', 'D21', 'E11') 4 GROUP BY NR_CARGO 5 HAVING COUNT(*) >= 3 6 ORDER BY 2 DESC; 4. Determine a quantidade de atividades diferentes por projeto (tabela Prjatv). SQL> SELECT CD_PRO, COUNT(DISTINCT CD_ATIV) Atividades 2 FROM PRJATV 3 GROUP BY CD_PROJ; 5. Deseja-se obter, em mdia, quantos funcionrios existem por departamento. SQL> SELECT AVG(COUNT(*)) Mdia 2 FROM FUNC 3 GROUP BY CD_DEPTO; 6. Deseja-se obter uma lista (nr_cargo) de todos os cargos que possuam mais de duas funcionrias. SQL> SELECT NR_CARGO, COUNT(*) 2 FROM FUNC 3 WHERE IN_SEXO = 'F' 4 GROUP BY NR_CARGO 5 HAVING COUNT(*) > 2;
RESPOSTAS DOS LABORATRIOS - 321

INTRODUO AO ORACLE9I - SQL 7. Deseja-se uma lista (cd_mat, vl_sal, nr_git) dos funcionrios mais graduados (com maior grau de instruo) da empresa. SQL> SELECT CD_MAT, VL_SAL, NR_GIT 2 FROM FUNC 3 WHERE NR_GIT = (SELECT MAX(NR_GIT) FROM FUNC); 8. Deseja-se saber qual departamento possui maior mdia salarial da empresa. SQL> SELECT CD_DEPTO, AVG(VL_SAL) 2 FROM FUNC 3 GROUP BY CD_DEPTO 4 HAVING AVG(VL_SAL) = (SELECT MAX(AVG(VL_SAL)) 5 FROM FUNC 6 GROUP BY CD_DEPTO); 9. Deseja-se saber quais os departamentos (cdigo e nome) responsveis por mais de dois projetos e que, simultaneamente, possuam mais de trs funcionrios (usar Intersect). SQL> 2 3 4 5 6 7 8 9 10 11 SELECT D.CD_DEPTO, D.NM_DEPTO FROM PROJ, DEPTO D WHERE PROJ.CD_DEPTO = D.CD_DEPTO GROUP BY D.CD_DEPTO, D.NM_DEPTO HAVING COUNT(*) > 2 INTERSECT SELECT D.CD_DEPTO, D.NM_DEPTO FROM FUNC, DEPTO D WHERE FUNC.CD_DEPTO = D.CD_DEPTO GROUP BY D.CD_DEPTO, D.NM_DEPTO HAVING COUNT(*) > 3;

OPCIONAIS 10. Deseja-se o total salarial e a mdia salarial por quantidade de anos trabalhados e por cargo dos funcionrios que tenham menos de 10 anos de casa e cargo superior a 50. Devem ser informados, simultaneamente, totais por cargo e por quantidade de ano, alm de um acumulado geral. SQL> COL CARGO FOR 999 SQL> COL ANOS FOR 999 SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS, 2 NR_CARGO CARGO, 3 SUM(VL_SAL) TOTAL, AVG(VL_SAL) MEDIA 4 FROM FUNC 5 WHERE (SYSDATE - DT_ADM) < 3652.5 6 AND NR_CARGO > 50 7 GROUP BY ROLLUP(TRUNC((SYSDATE - DT_ADM)/365.25), NR_CARGO);

RESPOSTAS DOS LABORATRIOS - 322

INTRODUO AO ORACLE9I - SQL 11. Deseja-se uma tabulao contendo a quantidade de funcionrios por sexo e por quantidade de anos na empresa. Alm dos dados individuais, deseja-se totalizaes por sexo, por quantidade de anos e por sexo e quantidade de anos simultaneamente. Identifique claramente os totais apresentados. SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS, 2 IN_SEXO SEXO, 3 COUNT(*) QTD 4 FROM FUNC 5 GROUP BY CUBE(TRUNC((SYSDATE - DT_ADM)/365.25), IN_SEXO); 12. Repita os dois exerccios anteriores de tal forma que os totais provenientes da quebra seja identificados diferentemente dos valores gerados em funo de valores NULL. SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS, 2 NR_CARGO CARGO, 3 SUM(VL_SAL) TOTAL, AVG(VL_SAL) MEDIA, 4 GROUPING(TRUNC((SYSDATE - DT_ADM)/365.25)) TOTCARGO, 5 GROUPING(NR_CARGO) TOTANO 6 FROM FUNC 7 WHERE (SYSDATE - DT_ADM) < 3652.5 8 AND NR_CARGO > 50 9 GROUP BY ROLLUP(TRUNC((SYSDATE - DT_ADM)/365.25), NR_CARGO); SQL> SELECT TRUNC((SYSDATE - DT_ADM)/365.25) ANOS, 2 IN_SEXO SEXO, 3 COUNT(*) QTD, 4 GROUPING(IN_SEXO) TOTANOS, 5 GROUPING(TRUNC((SYSDATE - DT_ADM)/365.25)) TOTSEXO 6 FROM FUNC 7 GROUP BY CUBE(TRUNC((SYSDATE - DT_ADM)/365.25), IN_SEXO); 13. Um novo funcionrio foi contratado na empresa, o cargo definido para ele foi 55 e seu salrio deve ser 2700, 2800 ou 2900. Determine qual dos trs salrios se enquadra nos requisitos estabelecidos pela gerncia de projetos: c) d) Seu salrio deve ser superior ao quarto maior salrio dentre os funcionrios com o mesmo cargo. Pelo menos 60% do grupo de funcionrios com o mesmo cargo deve ter salrio menor que o dele.
WITHIN WITHIN WITHIN WITHIN WITHIN WITHIN GROUP(ORDER GROUP(ORDER GROUP(ORDER GROUP(ORDER GROUP(ORDER GROUP(ORDER BY BY BY BY BY BY VL_SAL VL_SAL VL_SAL VL_SAL VL_SAL VL_SAL ASC NULLS LAST) S2700, ASC NULLS LAST) S2800, ASC NULLS LAST) S2900, DESC NULLS LAST) R2700, DESC NULLS LAST) R2800, DESC NULLS LAST) R2900

SQL> SELECT CUME_DIST(2700) 2 CUME_DIST(2800) 3 CUME_DIST(2900) 4 DENSE_RANK(2700) 5 DENSE_RANK(2800) 6 DENSE_RANK(2900) 7 FROM FUNC 8 WHERE NR_CARGO = 55;

RESPOSTAS DOS LABORATRIOS - 323

INTRODUO AO ORACLE9I - SQL 14. Para determina o percentual de promoo dos funcionrios, o departamento Pessoal solicitou: c) d) o menor, o maior e a mdia salrial do menor cargo o menor, o maior e a mdia salrial do maior cargo

SQL> SELECT MAX(VL_SAL) 2 KEEP (DENSE_RANK FIRST ORDER BY NR_CARGO ASC NULLS LAST) XSALMCARGO, 3 MIN(VL_SAL) 4 KEEP (DENSE_RANK FIRST ORDER BY NR_CARGO ASC NULLS LAST) MSALMCARGO, 5 MAX(VL_SAL) 6 KEEP (DENSE_RANK LAST ORDER BY NR_CARGO ASC NULLS LAST) XSALXCARGO, 7 MIN(VL_SAL) 8 KEEP (DENSE_RANK LAST ORDER BY NR_CARGO ASC NULLS LAST) MSALXCARGO 9 FROM FUNC;

15. O novo diretor do Departamento pessoal deseja estabelecer faixas salariais para futuro enquadramento dos funcionrios. Com este objetivo deseja obter informaes sobre a distribuio salarial atual. Considerando-se intervalos de 20% (.20, .40, .60, .80 ou 1) deseja-se saber qual o salrio correspondente.
SQL> SET NUMWIDTH 7 SQL> SELECT PERCENTILE_CONT(.20) WITHIN GROUP (ORDER BY VL_SAL ASC) PA20, 2 PERCENTILE_DISC(.20) WITHIN GROUP (ORDER BY VL_SAL ASC) PM20, 3 PERCENTILE_CONT(.40) WITHIN GROUP (ORDER BY VL_SAL ASC) PA40, 4 PERCENTILE_DISC(.40) WITHIN GROUP (ORDER BY VL_SAL ASC) PM40, 5 PERCENTILE_CONT(.60) WITHIN GROUP (ORDER BY VL_SAL ASC) PA60, 6 PERCENTILE_DISC(.60) WITHIN GROUP (ORDER BY VL_SAL ASC) PM60, 7 PERCENTILE_CONT(.80) WITHIN GROUP (ORDER BY VL_SAL ASC) PA80, 8 PERCENTILE_DISC(.80) WITHIN GROUP (ORDER BY VL_SAL ASC) PM80, 9 PERCENTILE_CONT(1) WITHIN GROUP (ORDER BY VL_SAL ASC) PA100, 10 PERCENTILE_DISC(1) WITHIN GROUP (ORDER BY VL_SAL ASC) PM100 11 FROM FUNC;

16 Deseja-se saber (somente para os cargos 55) o salrio do funcionrio com grau de instruo imediatamente inferior e superior ao seu, o resultado deve vir ordenado pelo nome do funcionrio.
SQL> SELECT cd_mat, nm_func, nr_git, 2 LAG(VL_SAL) over (order by NR_GIT ASC nulls last) ANTERIOR, 3 vl_sal, 4 LEAD(VL_SAL) over (order by NR_GIT ASC nulls last) POSTERIOR 5 FROM FUNC 6 WHERE NR_CARGO = 55 7 ORDER BY 2;

RESPOSTAS DOS LABORATRIOS - 324

INTRODUO AO ORACLE9I - SQL 17. Ainda estudando uma forma de enquadramento salarial o departamento Pessoal deseja dividir o grupo em trs faixas, considerando ordenao decrescente de cargo. Apresente o enquadramento para os funcionrios dos departamentos A00 e D11 e ordene o resultado pelo nome do funcionrio.
SQL> SELECT CD_MAT, NM_FUNC, NR_CARGO, VL_SAL, 2 NTILE(3) over (order by NR_CARGO DESC nulls last) FAIXA 3 FROM FUNC 4 WHERE CD_DEPTO IN ('A00', 'D11') 5 ORDER BY 2;

18. Deseja-se saber quanto o salrio de cada funcionrio representa (percentualmente) em relao ao seu prprio departamento e em relao empresa.
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL, 2 TRUNC(RATIO_TO_REPORT(VL_SAL) 3 over (PARTITION BY CD_DEPTO)* 100,2) "% PARA DEPTO", 4 TRUNC(RATIO_TO_REPORT(VL_SAL) 5 over () * 100, 2) "% PARA EMPRESA" 6 FROM FUNC;

19. Deseja-se saber para cada funcionrio: d) e) f) o salrio imediatamente anterior e posterior ao seu. o cargo imediatamente anterior e posterior ao seu. a classificao do salrio do funcionrio em relao empresa e a seu departamento.

O resultado deve vir ordenado pelo nome do funcionrio.


SQL> SELECT cd_mat, nm_func, vl_sal, 2 max(vl_sal) over(order by vl_sal nulls last 3 rows between 2 preceding and 1 preceding) MaxSal, 4 min(vl_sal) over(order by vl_sal nulls last 5 rows between 1 following and 2 following) MinSal, 6 max(nr_cargo) over(order by nr_cargo nulls last 7 rows between 2 preceding and 1 preceding) MaxCrg, 8 min(nr_cargo) over(order by nr_cargo nulls last 9 rows between 1 following and 2 following) MinCrg, 10 dense_rank() over(partition by cd_depto 11 order by vl_sal DESC nulls last) rank_depto, 12 dense_rank() over(order by vl_sal DESC nulls last) rank_emp 13 FROM FUNC 14 ORDER BY 2;

RESPOSTAS DOS LABORATRIOS - 325

INTRODUO AO ORACLE9I - SQL

LABORATRIO 6:
1. Sabendo-se que os cdigos de departamento possuem o significado abaixo, deseja-se uma listagem, com quebra por centro de custo dos funcionrios e seus respectivos salrios em ordem descendente, onde : cd_depto = XYY, sendo X YY letra indicativa do departamento centro de custo

SQL> BREAK ON CCusto NODUP SKIP 2 SQL> SELECT SUBSTR(cd_depto, 2) CCusto, nm_func, vl_sal 2 FROM func 3 ORDER BY 1, 3 DESC; 2. Montar uma lista dos aniversariantes por ms. A lista deve conter, para cada ms (apresentado por extenso em portugus), o nome, idade e departamento do funcionrio. A lista deve vir ordenada por nmero de ms. SQL> BREAK ON mes NODUP SKIP 2 SQL> SELECT DECODE(TO_NUMBER(TO_CHAR(dt_nasc, 'mm')), 2 1, 'Janeiro', 2, 'Fevereiro', 3, 'Maro', 3 4, 'Abril', 5, 'Maio', 6, 'Junho', 4 7, 'Julho', 8, 'Agosto', 9, 'Setembro', 5 10, 'Outubro', 11, 'Novembro', 'Dezembro') mes, 6 nm_func, TRUNC((SYSDATE - dt_nasc)/365.25) Idade, cd_depto 7 FROM func 8 ORDER BY TO_CHAR(dt_nasc, 'mm');

OPCIONAIS 3. Altere sua sesso no SQL*Plus para que as seguintes caractersticas sejam contempladas: Deve ser apresentada a hora na linha de prompt. Deve ser definido um caracter especial para indicao de Null. Todas as variveis host devem ser automaticamente apresentadas. O tamanho de uma linha deve ser limitado em 80 caracteres. Cada pgina de ser limitada a 24 linhas. Os comandos presentes em um arquivo de comandos devem ser mostrados antes de sua execuo. O formato padro para expresses numricas L999G999G999D99 A cada pgina deve ser enviada mensagem correspondente ao usurio. As linhas contendo variveis de substituio devem ser sempre apresentadas para o usurio na troca de valores.
RESPOSTAS DOS LABORATRIOS - 326

INTRODUO AO ORACLE9I - SQL Todas estas modificaes devem ser repetidas automaticamente cada vez que o SQL*Plus for ativado. SQL> SET 13:42:46 13:42:46 13:42:46 13:42:46 13:42:46 13:42:46 13:42:46 13:42:46 13:42:46 13:42:46 TIME SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> ON SET SET SET SET SET SET SET SET SET

NULL "#" AUTOPRINT ON LINESIZE 80 PAGESIZE 24 ECHO ON NUMFORMAT L999G999G999D99 PAUSE "Para prosseguir tecle <Enter>" PAUSE ON VERIFY ON

4. Crie um relatrio com o layout abaixo, ordenado por departamento e matrcula: Relacional Consultoria Folha de Pagamento Departamento Matrcula Data Admisso Salrio ------------ ---------- ------------- ---------------E11 290 30/05/90 $1,534.00 300 19/06/92 $1,775.00 310 12/09/91 $1,590.00 ************ ---------------Tot Sal Dep $10,499.00 E21 100 320 330 340 16/06/90 07/07/90 23/02/96 05/05/96 $2,615.00 $1,995.00 $2,537.00 $2,384.00 ---------------$9,531.00 ---------------$90,371.50 pag.: 4

************ Tot Sal Dep

Tot Sal

Confidencial

RESPOSTAS DOS LABORATRIOS - 327

INTRODUO AO ORACLE9I - SQL SQL> SET LINESIZE 54 SQL> SET PAGESIZE 30 SQL> COL cd_depto HEA Departamento FOR a12 SQL> COL cd_mat HEA Matrcula SQL> COL dt_adm HEA 'Data Admisso' FOR a13 SQL> COL vl_sal HEA Salrio FOR $999,999,990.00 SQL> BREAK ON cd_depto NODUP SKIP 2 > ON REPORT SQL> COMPUTE SUM LABEL "Tot Sal Dep" OF vl_sal ON cd_depto SQL> COMPUTE SUM LABEL "Tot Sal" OF vl_sal ON REPORT SQL> TTITLE LEFT 'Relacional Consultoria' > RIGHT 'pag.: ' FORMAT 999 SQL.PNO > SKIP 2 > CENTER 'Folha de ' > SKIP 1 > CENTER 'Pagamento' > SKIP 2 SQL> BTITLE SKIP 2 > CENTER 'Confidencial' > SKIP 2 SQL> SELECT LPAD(UPPER(cd_depto), 8) cd_depto, 2 cd_mat, 3 LPAD(TO_CHAR(dt_adm, 'dd/mm/yy'), 13) dt_adm, 4 vl_sal 5 FROM func ORDER BY 1, 2; SQL> CLEAR COLUMNS SQL> CLEAR BREAKS SQL> CLEAR COMPUTES SQL> TTITLE OFF SQL> BTITLE OFF SQL>

RESPOSTAS DOS LABORATRIOS - 328

INTRODUO AO ORACLE9I - SQL

LABORATRIO 7:
1. Deseja-se uma lista com todos os gerentes e seus respectivos funcionrios, contendo nome e sobrenome do gerente, cdigo e nome do departamento, nome e sobrenome do funcionrio. Todos os departamentos devem ser apresentados (mesmo que no haja gerentes ou funcionrios) e todos os funcionrios devem ser apresentados (mesmo que estejam sem departamento). SQL> SQL> 2 3 4 5 6 7 8 9 10 11 12 13 SET LINESIZE 200 SELECT D.CD_DEPTO, D.NM_DEPTO, G.NM_FUNC ||' '|| G.NM_SOBRENOME GERENTE, F.NM_FUNC ||' '|| F.NM_SOBRENOME FUNCIONRIO FROM FUNC F, DEPTO D, FUNC G WHERE G.CD_MAT (+) = D.CD_GERENTE AND F.CD_DEPTO(+) = D.CD_DEPTO UNION ALL SELECT NULL, NULL, NULL GERENTE, F.NM_FUNC||' '||F.NM_SOBRENOME FUNCIONRIO FROM FUNC F WHERE F.CD_DEPTO IS NULL ORDER BY 1, 4;

2. Deseja-se remover todas as atividades que no estejam em uso. SQL> DELETE FROM ATIV A 2 WHERE NOT EXISTS (SELECT 0 FROM PRJATV 3 WHERE CD_ATIV = A.CD_ATIV); 3. Deseja-se uma lista contendo nome, matrcula, cargo e salrio dos funcionrios que possuam o maior salrio da empresa e daqueles que possuam o menor salrio da empresa. SQL> SELECT CD_MAT, NM_FUNC, NR_CARGO, VL_SAL 2 FROM FUNC 3 WHERE VL_SAL = (SELECT MAX(VL_SAL) FROM FUNC) 4 OR VL_SAL = (SELECT MIN(VL_SAL) FROM FUNC) 5 ORDER BY 4 DESC;

RESPOSTAS DOS LABORATRIOS - 329

INTRODUO AO ORACLE9I - SQL 4. Deseja-se uma relao hierrquica de todos os departamentos da empresa (cdigo e nome), considerando-se que os departamentos esto subordinados aos seus respectivos departamentos contbeis. A relao deve apresentar endentao de trs espaos para identificar subordinao. O departamento no mais alto nvel da hierarquia no possui indicao de departamento contbil (Null). Apresente o caminho da hierarquia. Ordene o resultado pelo nome do departamento. SQL> SQL> 2 3 4 5 6 7 COL PATH FOR A15 SELECT RPAD(LPAD(' ', 3*LEVEL -3)||NM_DEPTO, 45) DEPARTAMENTO, CD_DEPTO, CD_DEPTO_CTB, SYS_CONNECT_BY_PATH (CD_DEPTO, '/') PATH FROM DEPTO CONNECT BY PRIOR CD_DEPTO = CD_DEPTO_CTB START WITH CD_DEPTO_CTB IS NULL ORDER SIBLINGS BY DEPARTAMENTO ASC;

5. Produza uma lista contendo nome, sobrenome e salrio de todos os funcionrios que possuam mais de cinco anos de casa e que recebam menos que a mdia dos funcionrios com o mesmo cargo. SQL> SELECT NM_FUNC, NM_SOBRENOME, NR_CARGO 2 FROM FUNC F 3 WHERE (SYSDATE - DT_ADM) > (5 * 365.25) 4 AND VL_SAL < (SELECT AVG(VL_SAL) FROM FUNC 5 WHERE NR_CARGO = F.NR_CARGO);

6. Deseja-se obter a mdia de idade, maior e menor salrio e mdia salarial dos funcionrios do sexo feminino, grupando por grau de instruo e cargo (somente dos cargos com mais de duas funcionrias). SQL> SELECT NR_CARGO "CARGO", NR_GIT "GRAU", 2 AVG(TRUNC((SYSDATE - DT_ADM)/365.25)) "MDIA IDADE", 3 MAX(VL_SAL) "MAIOR SALRIO", 4 MIN(VL_SAL) "MENOR SALRIO", 5 AVG(VL_SAL) "MDIA SALARIAL" 6 FROM FUNC 7 WHERE IN_SEXO = 'F' 8 AND NR_CARGO IN (SELECT NR_CARGO FROM FUNC 9 WHERE IN_SEXO = 'F' 10 GROUP BY NR_CARGO 11 HAVING COUNT(*) > 2) 12 GROUP BY NR_GIT, NR_CARGO;

RESPOSTAS DOS LABORATRIOS - 330

INTRODUO AO ORACLE9I - SQL OPCIONAIS 7. Determine a quantidade de funcionrios por departamento separados por sexo. SQL> SELECT CD_DEPTO "DEPTO", IN_SEXO "SEXO", COUNT(*) "QTD" 2 FROM FUNC 3 GROUP BY CD_DEPTO, IN_SEXO; 8. Deseja-se uma lista das atividades que estejam associadas a mais de dois departamentos. SQL> SELECT PA.CD_ATIV, COUNT(DISTINCT PJ.CD_DEPTO) 2 FROM PROJ PJ INNER JOIN PRJATV PA USING (CD_PROJ) 3 GROUP BY PA.CD_ATIV 4 HAVING COUNT(DISTINCT PJ.CD_DEPTO) > 2; 9. Atualize o salrio dos funcionrios com mais de cinco anos de casa (exceto os gerentes) para que ganhem salrio semelhante ao do funcionrio com maior cargo do seu prprio departamento (usar um nico comando UPDATE). SQL> UPDATE FUNC F 2 SET VL_SAL = (SELECT MAX(VL_SAL) FROM FUNC 3 WHERE CD_DEPTO = F.CD_DEPTO 4 AND NR_CARGO = (SELECT MAX(NR_CARGO) FROM FUNC 5 WHERE CD_DEPTO = F.CD_DEPTO)) 6 WHERE CD_MAT NOT IN (SELECT CD_GERENTE FROM DEPTO 7 WHERE CD_GERENTE IS NOT NULL); 10. Criar uma view sobre a tabela de funcionrios que selecione apenas os funcionrios com salrio superior a R$ 2.000,00. Garanta que a atualizao atravs desta view somente possa incluir ou alterar funcionrios cujo salrio seja superior a R$ 2.000,00. SQL> CREATE VIEW SAL_2000 AS 2 SELECT * FROM FUNC 3 WHERE VL_SAL > 2000 4 WITH CHECK OPTION; 11. Incluir dados na tabela Depto provenientes da tabela Dept do usurio Scott, prefixando os departamentos com D. Caso exista um departamento com o mesmo cdigo, apenas atualize o nome, caso contrrio, inclua o novo departamento. O valor do departamento contbil para todos os novos departamentos D01. SQL> MERGE INTO DEPTO D 2 USING (SELECT DEPTNO,DNAME FROM SCOTT.DEPT) 3 ON (CD_DEPTO = ('D'||DEPTNO)) 4 WHEN MATCHED THEN UPDATE SET NM_DEPTO = DNAME 5 WHEN NOT MATCHED THEN INSERT (CD_DEPTO, D.NM_DEPTO, CD_DEPTO_CTB) 6 VALUES ('D'||DEPTNO, DNAME, 'D01');
RESPOSTAS DOS LABORATRIOS - 331

INTRODUO AO ORACLE9I - SQL 12. Em mais um estudo salarial, o departamento Pessoal solicitou a relao de funcionrios coma indicao de sexo (por extenso) e uma classificao dos funcionrios por idade, da seguinte forma: funcionrios com menos de 30 anos (jovem), entre 30 e 45 (maduro), entre 46 e 60 (meia idade) e maior que 60 anos (idoso). Ordene o resultado pelo nome do funcionrio.
SQL> SELECT CD_MAT, NM_FUNC, VL_SAL, 2 CASE IN_SEXO WHEN 'F' THEN 'Feminino' 3 WHEN 'M' THEN 'Masculino' 4 ELSE 'Indefinido' END "Sexo", 5 CASE WHEN EXTRACT(YEAR FROM CURRENT_TIMESTAMP) 6 EXTRACT(YEAR FROM DT_NASC) > 60 THEN 'IDOSO' 7 WHEN EXTRACT(YEAR FROM CURRENT_TIMESTAMP) 8 EXTRACT(YEAR FROM DT_NASC) BETWEEN 46 AND 60 THEN 'MEIA IDADE' 9 WHEN EXTRACT(YEAR FROM CURRENT_TIMESTAMP) 10 EXTRACT(YEAR FROM DT_NASC) BETWEEN 30 AND 45 THEN 'MADURO' 11 ELSE 'JOVEM' END "IDADE" 12 FROM FUNC 13 ORDER BY NM_FUNC;

RESPOSTAS DOS LABORATRIOS - 332

INTRODUO AO ORACLE9I - SQL

LABORATRIO 8:
1. Deseja-se uma lista de todas as tabelas do usurio contendo a quantidade de colunas, a quantidade de relacionamentos e a quantidade de ndices desta tabela. SQL> SELECT T.TABLE_NAME, 2 COUNT(DISTINCT C.COLUMN_NAME) "COLUMNS", 3 COUNT(DISTINCT R.CONSTRAINT_NAME) "CONSTRAINTS", 4 COUNT(DISTINCT I.INDEX_NAME) "INDEXES" 5 FROM SYS.USER_TABLES T, 6 SYS.USER_TAB_COLUMNS C, 7 SYS.USER_CONSTRAINTS R, 8 SYS.USER_INDEXES I 9 WHERE T.TABLE_NAME = C.TABLE_NAME 10 AND T.TABLE_NAME = R.TABLE_NAME 11 AND R.CONSTRAINT_TYPE = 'R' 12 AND T.TABLE_NAME = I.TABLE_NAME 13 GROUP BY T.TABLE_NAME; 2. Deseja-se obter, para cada restrio de integridade, a tabela associada, a tabela correspondente (no caso de relacionamento), o nome da restrio, o texto da restrio ordenado por tabela associada e nome da restrio. SQL> SQL> SQL> SQL> SQL> SQL> 2 3 4 5 6 7 SET ECHO ON COL CONSTRAINT_NAME FOR A15 COL TABLE_NAME FOR A15 COL "REFERNCIA" FOR A15 COL SEARCH_CONDITION FOR A50 SELECT P.CONSTRAINT_NAME, P.TABLE_NAME, R.TABLE_NAME "REFERNCIA", P.SEARCH_CONDITION FROM SYS.USER_CONSTRAINTS P, SYS.USER_CONSTRAINTS R WHERE P.R_CONSTRAINT_NAME = R.CONSTRAINT_NAME(+) AND P.CONSTRAINT_TYPE = 'R' ORDER BY 2, 1;

3. Determinar, para cada tabela particionada, seu nome, o nome de cada partio e as regras do particionamento. SQL> COL HIGH_VALUE FOR A50 SQL> COL PARTITION_NAME FOR A15 SQL> SELECT TABLE_NAME, PARTITION_NAME, 2 HIGH_VALUE, PARTITION_POSITION "POSITION" 3 FROM USER_TAB_PARTITIONS 4 ORDER BY 4;

RESPOSTAS DOS LABORATRIOS - 333

INTRODUO AO ORACLE9I - SQL 4. Deseja-se informaes sobre as views criadas no schema do usurio, contendo nome, texto associado, colunas que podem ser atualizadas. SQL> SQL> SQL> SQL> SQL> SQL> SQL> SQL> 2 3 4 5 6 7 8 9 10 COL VIEW_NAME FOR A11 COL COLUMN_NAME FOR A15 COL TEXT FOR A35 SET LONG 1000 SET LONGCHUNKSIZE 1000 SET MAXDATA 2000 BREAK ON TEXT SELECT V.VIEW_NAME, V.TEXT, U.COLUMN_NAME, U.UPDATABLE, U.INSERTABLE, U.DELETABLE FROM SYS.USER_VIEWS V, SYS.USER_UPDATABLE_COLUMNS U WHERE V.VIEW_NAME = U.TABLE_NAME AND (U.UPDATABLE = 'YES' OR U.INSERTABLE = 'YES' OR U.DELETABLE = 'YES') ORDER BY 1, 3;

5. Coloque outra cpia do SQL*PLUS ativa no usurio ALUNO (sesso 2). Para realizar esta operao, basta efetuar um double-click no cone do SQL*Plus e, aps o login, dimensionar as janelas para que fiquem lado a lado. 6. Atualize sua tabela Depto (sesso 1), mas no d Commit. O que o outro usurio (sesso 2) v? Por qu? O usurio da sesso 2 v a linha com a informao de antes da modificao, porque o usurio da sesso 1 ainda no efetivou esta modificao. Quando for feito um Commit, o outro user ter acesso modificao realizada. 7. D Commit sobre suas atualizaes (sesso 1). A visibilidade na sesso 2 possvel agora? Por qu? Sim. Pois a informao modificada se torna disponvel para todos os usurios aps sua efetivao (Commit). 8. Atualize sua tabela Depto (sesso 1), mas no d Commit. Atravs da sesso 2, tente atualizar a mesma linha alterada anteriormente. O que acontece? Por qu? D Rollback nas duas sesses. O comando executado na sesso 2 fica em suspenso (preso). Isto acontece porque, quando uma linha est sendo modificada, ela fica bloqueada para os demais processos que desejem atualizar a mesma linha. Esse mecanismo de bloqueio chama-se Lock. Dizemos, ento, que a linha ficar locked at que o usurio da sesso 1 encerre a transao (Commit ou Rollback).
RESPOSTAS DOS LABORATRIOS - 334

INTRODUO AO ORACLE9I - SQL 9. Atualize sua tabela Depto (sesso 1), mas no d Commit. Na sesso 2, execute um SELECT .. FOR UPDATE. Qual a diferena? O bloqueio se repete. Isto acontece porque a clusula FOR UPDATE adicionada ao comando Select funciona, para efeito de LOCK, da mesma forma que um comando de atualizao (update, insert, delete). Desta forma, este comando Select permite que o usurio tenha acesso informao real que est no banco de dados e impede que outros processos modifiquem aquela informao enquanto ele tiver o controle da linha. OPCIONAIS 10. Explique, com suas palavras, o que acontece nos trechos de programa abaixo: SQL> UPDATE FUNC 3 SET VL_SAL = VL_SAL * 1.10; 33 linhas atualizadas; SQL> COMMIT; Validao completa. Todos os funcionrios da tabela Func tiveram seus salrios aumentados em 10%. Aps esta modificao, os dados esto sendo efetivados (Commit). SQL> DELETE FROM FUNC WHERE NR_GIT = 21; 1 linhas deletada. SQL> ROLLBACK; Rollback completo. Foi feita a excluso dos funcionrios com grau de instruo igual a 21. Como a transao no havia sido efetivada (Commit), foi possvel ao usurio desistir deste resultado e desmanchar a modificao (Rollback). Aps o comando Rollback a tabela fica com as mesmas caracterstica que tinha antes do incio da excluso. SQL> UPDATE DEPTO 2 SET CD_GERENTE = 200 3 WHERE CD_DEPTO = 'A00'; 1 linha atualizada. SQL> SAVEPOINT ALTERA_GERENTE; Ponto de salvamento criado. SQL> UPDATE FUNC 2 SET VL_SAL = VL_SAL * 1.5 3 WHERE CD_MAT = 300; 1 linha atualizada.

RESPOSTAS DOS LABORATRIOS - 335

INTRODUO AO ORACLE9I - SQL SQL> ROLLBACK TO SAVEPOINT ALTERA_GERENTE; Rollback completo. SQL> UPDATE FUNC 2 SET VL_SAL = VL_SAL * 1.2 3 WHERE CD_MAT = 200; 1 linha atualizada. Na seqncia, temos: 1. Atualizao da tabela de departamento, com a alterao do gerente para 200 no departamento A00. 2. 3. Marcao de um ponto de controle (Savepoint) de nome Altera_gerente. Atualizao do funcionrio de matrcula 300, com um aumento de 50% em seu salrio.

4. O comando Rollback desfaz a ltima atualizao (item 3). A modificao feita no passo 1 no desmanchada, porm ainda no foi efetivada; ainda est pendente. 5. Atualizao do funcionrio de matrcula 200, com um aumento de 20% em seu salrio. S no momento do Commit 1 e 5 sero realmente efetivados. 11. Para que serve o comando SET TRANSACTION READ ONLY? Este comando indica ao Oracle que todos os comandos desta transao devem ter como referncia de tempo o momento do Set Transaction e no o momento de incio de cada um deles (como o default). Todos os comandos da transao so apenas de consulta. O objetivo obter uma viso consistente em relao a um conjunto de leituras. 12. Qual o objetivo de usarmos um SELECT ... FOR UPDATE? O comando SELECT .... FOR UPDATE simula uma atualizao sobre os dados selecionados. O objetivo garantir que durante uma leitura nenhum outro usurio faa atualizao sobre os dados lidos por esta transao at que ela os libere explicitamente (Commit ou Rollback). 13. Formatar as mensagens da sua sesso para Francs. SQL> ALTER SESSION SET NLS_LANGUAGE = French; 14. Formatar o layout default de datas para dd/mm/rrrr. SQL> ALTER SESSION 2 SET NLS_DATE_FORMAT = 'DD/MM/RRRR';

RESPOSTAS DOS LABORATRIOS - 336

INTRODUO AO ORACLE9I - SQL 15. Deseja-se uma relao dos aniversariantes da empresa, contendo o nome e sobrenome de cada funcionrio, o dia do aniversrio e o ms do aniversrio (por extenso, em portugus). Ordene a relao por nmero de ms e estabelea quebra de pgina a cada troca de ms. SQL> ALTER SESSION 2 SET NLS_DATE_LANGUAGE = 'BRAZILIAN PORTUGUESE'; Session modifie. SQL> BREAK ON MES SKIP PAGE SQL> SELECT TO_CHAR(DT_NASC, 'MONTH') MES, 2 TO_NUMBER(TO_CHAR(DT_NASC, 'DD')) DIA, 3 NM_FUNC || ' ' || NM_SOBRENOME ANIVERSARIANTE 4 FROM FUNC 5 ORDER BY TO_NUMBER(TO_CHAR(DT_NASC, 'MM')), DIA; 16. Deseja-se uma relao para a folha de pagamento, contendo a matrcula, nome, sobrenome, salrio bruto, INSS (8% do salrio), FGTS (10% do salrio), Ticket (8,00 por dia do ms), Vale Transporte (2,00 por dia do ms). O ms ser fornecido como parmetro. Os valores financeiros devero ser formatados, devendo ser apresentado o smbolo financeiro (R$).
SQL> ALTER SESSION SET NLS_CURRENCY = 'R$'; Session modifie. SQL> SET LINESIZE 200 SQL> ACCEPT MES PROMPT 'Informe o Ms da folha : ' Informe o Ms da folha : 05 SQL> SELECT CD_MAT MAT, NM_FUNC ||' '||NM_SOBRENOME NOME, 2 TO_CHAR(VL_SAL,'L999G999D99') SAL, 3 TO_CHAR(VL_SAL*.08,'L999G999D99') INSS, 4 TO_CHAR(VL_SAL*.10,'L999G999D99') FGTS, 5 TO_CHAR(8*TO_NUMBER(TO_CHAR( 6 LAST_DAY('01/'||&MES||'/'||TO_CHAR(SYSDATE,'RRRR')), 'DD')), 'L999D99') TICKET, 7 TO_CHAR(2*TO_NUMBER(TO_CHAR( 8 LAST_DAY('01/'||&MES||'/'||TO_CHAR(SYSDATE,'RRRR')), 'DD')), 'L999D99') VALE 9 FROM FUNC 10 ORDER BY CD_DEPTO, CD_MAT;

17. Formatar Timestamp e Timestamp Tz para que o ano apresente 4 posies.


SQL> ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT = 'DD/MM/YYYY HH24:MI:SSXFF TZH:TZM'; Session modifie. SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD/MM/YYYY HH24:MI:SSXFF'; Session modifie. SQL> SELECT CURRENT_TIMESTAMP, LOCALTIMESTAMP FROM DUAL;

RESPOSTAS DOS LABORATRIOS - 337

INTRODUO AO ORACLE9I - SQL 18. Iguale a zona de tempo da sesso zona de tempo do banco de dados. Verifique o resultado em seguida. SQL> ALTER SESSION SET TIME_ZONE = DBTIMEZONE; Session modifie. SQL> SELECT DBTIMEZONE, SESSIONTIMEZONE FROM DUAL;

RESPOSTAS DOS LABORATRIOS - 338

INTRODUO AO ORACLE9I - SQL

LABORATRIO 9:
1. O que e para que serve o ROLLBACK SEGMENT? O segmento de Rollback uma rea do banco de dados em que so registradas todas as modificaes feitas por uma determinada transao, porm, que ainda no foram efetivadas na base (Commit). Isto permite que a transao desmanche as modificaes a qualquer momento (Rollback). utilizado ainda para garantir a consistncia de leitura (READ CONSISTENCY) e recuperao do banco (RECOVERY). 2. Crie um usurio de nome PROD com as seguintes caractersticas: tablespace default User_data tablespace temporario Temporary_Data password Prod espao total no tablespace user_data

SQL> CREATE USER PROD 2 IDENTIFIED BY PROD 3 DEFAULT TABLESPACE USER_DATA 4 TEMPORARY TABLESPACE TEMPORARY_DATA 5 QUOTA ULIMITED ON USER_DATA; 3. De que forma podemos autorizar e desautorizar o acesso a objetos no Oracle? O acesso a objetos pode ser autorizado com o comando GRANT e desautorizado com o comando REVOKE. Ambos comandos de SQL. 4. Qual a diferena entre o comando Truncate e o comando Delete? O comando Truncate um comando de DDL e o comando Delete um comando de DML. O comando Truncate permite que a rea liberada da tabela seja retornada para o tablespace. No h possibilidade de se executar um ROLLBACK aps um comando Truncate. 5. Qual a utilidade de uma Role? A utilizao de Role permite a associao de privilgios que caracterizem um grupo de usurios. Desta forma, cada Role tem a possibilidade de determinar um perfil com privilgios comuns. Posteriormente, esta Role pode ser associada a diversos usurios, que recebero simultaneamente estes privilgios.

RESPOSTAS DOS LABORATRIOS - 339

INTRODUO AO ORACLE9I - SQL OPCIONAIS 6. Descreva com suas palavras o relacionamento entre Physical Files, Tablespaces e Tables. Physical files so os arquivos fsicos (visveis pelo sistema operacional) para armazenamento dos dados de um banco de dados Oracle. Estes arquivos esto associados a um objeto lgico dentro do Oracle, os tablespaces. Cada arquivo fsico est associado a um e somente um tablespace; por outro lado um tablespace pode ser composto de mais de um arquivo fsico. Desta forma, um tablespace uma rea lgica, corresponde a um espao para armazenamento de objetos (tabelas, ndices, segmentos de rollback, etc.). Nessa rea, podemos definir diversas tabelas, ndices e outros objetos do banco de dados. 7. Criar a tabela de Cargos (CARGO) baseado no layout abaixo: Nome da coluna Chave ? Null ? Check ? Fk reference Tipo da coluna Tamanho mximo SQL> 2 3 4 5 6 7 8 9 10 11 CD_CARGO PK NN NUMBER 3 NM_CARGO NN maisculas VARCHAR2 10 VARCHAR2 200 TX_DESCRICAO

CREATE TABLE CARGO (CD_CARGO NM_CARGO TX_DESCRICAO PRIMARY KEY (CD_CARGO)

NUMBER(3) NOT NULL, VARCHAR2(10) NOT NULL CHECK (NM_CARGO = UPPER(NM_CARGO)), VARCHAR2(200),

) STORAGE (INITIAL 8K NEXT 8K MINEXTENTS 1 MAXEXTENTS 5 PCTINCREASE 0) PCTFREE 20 PCTUSED 40;

8. Confirme a estrutura gerada. SQL> DESC CARGO Nome ----------------------------------CD_CARGO NM_CARGO TX_DESCRICAO

Nulo? -------NOT NULL NOT NULL

Tipo ---------------NUMBER(3) VARCHAR2(10) VARCHAR2(200)

RESPOSTAS DOS LABORATRIOS - 340

INTRODUO AO ORACLE9I - SQL 9. Verifique todas as constraints sobre as tabelas geradas. SQL> SELECT table_name, constraint_name, constraint_type, 2 r_constraint_name, search_condition 3 FROM user_constraints 4 WHERE table_name = 'CARGO'; 10. Adicione 1 linha na tabela cargo. SQL> INSERT INTO CARGO (cd_cargo, nm_cargo, tx_descricao) 2 VALUES (10, 'AJRA', 'Analista Jr. A'); A incluso s possvel se NM_CARGO for preenchido com maisculas. 11. Destrua a tabela de Cargos. O que acontece ? SQL> DROP TABLE CARGO; Tabela eliminada. Quando a tabela eliminada, contedo so removidos. tanto sua descrio quanto seu

12. Crie uma seqncia com valor inicial de 400 e utilize-a para inserir 2 linhas na tabela funcionrio. SQL> CREATE SEQUENCE ultfunc 2 START WITH 400 3 MAXVALUE 999 4 CYCLE; SQL> INSERT INTO func (cd_mat, nm_func, cd_depto) 2 VALUES (ultfunc.NEXTVAL, 'Joao', 'E21'); SQL> INSERT INTO func (cd_mat, nm_func, cd_depto) 2 VALUES (ultfunc.NEXTVAL, 'Pedro', 'E01');

RESPOSTAS DOS LABORATRIOS - 341