Vous êtes sur la page 1sur 170

ORACLE RDBMS

CENTRO DE TREINAMENTO
Introduo ao ORACLE RDBMS Parte 1 IBM TREINAMENTO ORACLE SQL SQL*Plus Introduo ao Oracle RDBMS Parte 1

Pertence a:

Prof Vera Lcia L. Dias


1

ORACLE RDBMS

Introduo
O ORACLE Sistema Gerenciador de Banco de Dados Relacional (RDBMS) o produto central da ORACLE. Ele tem um alto-desempenho, falha-tolerante do Sistema Gerenciador de Banco de Dados desenhado para processos e transaes em tempo real, e tambm para grandes aplicaes de Banco de Dados. Este Curso provm uma geral introduo para o ORACLE RDBMS. A corrente verso do ORACLE RDBMS Verso 6 (V6 a qual a utilizao com ou sem os processos e transaes opcionais. Os processos e transaes opcionais oferece duas caractersticas com a qual contribui muito com os processos e transaes de alto nvel passo a passo. o nvel da linha de gerenciamento e fechamento. PL/SQL mquina. ORACLE V6 com e sem os processos e transaes opcionais contm algumas caractersticas com as excees do gerenciamento do fechamento das linhas e PL/SQL com o qual esto disponveis somente se voc tiver V6 com os processos e transaes opcionais. O mais das informaes deste manual comum ao ORACLE V6 com os processos e transaes opcionais e ORACLE V6 sem essa facilidade. Onde as informaes referentes unicamente para V6 com processos e transaes opcionais ou V6 sem essa opo, as diferenas estaro destacadas. Sua companhia pode acalmar-se pois vai usar a mais fcil verso do ORACLE RDBMS. A maioria das informaes neste manual curso relevante para a verso anterior do ORACLE RDBMS - Verso 5 (V5). Aquelas informaes que so especficas para V5 podem encontr-las no Apndice 5. No centro do ORACLE RDBMS est a Linguagem Estruturada de Pesquisa (SQL pronuncia-se sequel em Ingls). SQL uma linguagem Ingls, como aquele usado por dados atividades. Este curso cobre os comandos do SQL usados para: Retirar dados de um Banco de Dados Relacional. Definir e manter o objetivo do Banco de Dados. (Tal como as Tabelas do Banco de Dados). Popularizar os objetivos do Banco de Dados, e modificar Dados existentes. Controlar o acesso no Banco de Dados como bem os dados no Banco de Dados. No acrscimo, o SQL*Plus extenso, comandos esto examinados no contexto da criao e formatao de Relatrios.

ORACLE RDBMS

Prefcio
REVISO Este curso explora toda a potncia da linguagem SQL e A extenso SQL*Plus. Uma bsica introduo para concepo do Desenho do Banco de Dados Relacional o qual estamos discutindo. PBLICO Todos aqueles que esto tecnicamente envolvidos na criao do ORACLE aplicaes ou manutenes desse aplicativo, Programadores, Administradores de Banco de Dados, Analistas e Programadores Snior. Usurios finais quem deseja para estender seu conhecimento pode achar o curso benfico. PR-REQUISITOS Um grau de conhecimento em computao exigido. Uso de um Micro Computador desejvel. OBJETIVOS No final do curso os delegados estaro aptos para: Configurar e manter a estrutura de dados ORACLE. Efetuar complexas pesquisas. Completar bsico entendimento de Relacional o princpio e terminologia. MANEIRA DE APRESENTAO Este curso direcionado com combinaes tradicionais de sees com mdias projees e sees de demonstraes usando a tela com o Sistema de Broadcast. Delegados tero ampla oportunidade para praticar os tpicos trazidos nas sees anteriores. HORRIO Este curso exige no mnimo 40 horas divididas em 5 dias.

ORACLE RDBMS ndice

ORACLE RDBMS

Um Sistema Gerenciador de Banco de Dados


Explicao dessa sesso
Esta unidade coloca o ORACLE Sistema Gerenciador de Banco de Dados Relacional dentro do contexto de consideraes de Banco de Dados em geral e focalizando as caractersticas dos Banco de Dados Relacionais.

GERENCIAMENTO DE DADOS

ARMAZENAMENTO...

ACESSO.

MOSTRAGEM...

O qu um Banco de Dados?
Um Banco de Dados uma coleo de informao organizadas. Em um Sistema Manual tradicional os Dados so geralmente armazenados em arquivos de papel em gabinetes. Para acessar os dados uma manual pesquisa necessria. Em um Sistema Computacional, os dados esto tipicamente armazenados em fitas magnticas ou em disquetes. O acessos aos dados so feitos atravs de programas(software).

ORACLE RDBMS

Por que um Banco de Dados no Computador?


Vrias vantagens procedem de ter um sistema de dados Informatizado; Obter e Alterar as Informaes fcil. Informaes obtidas em menor espao do que no Sistema Manual. Diferentes pessoas podem usar alguns dados(e podem us-los para diferentes propsitos) Menor redundncia no armazenamento dos dados. Inconsistncias podem ser pr-definidas Padres podem ser obrigados Verificaes de segurana podem ser aplicadas.

O Sistema Gerenciador de Banco de Dados


Para o controle de acesso e armazenamento das informaes em um Sistema Gerenciador de Banco de Dados (DBMS) exigido. Um DBMS aquele programa que conduz todos os requerimentos dos usurios para acessar o Banco de Dados. Ele controla o armazenamento, retirada e modificao dos dados sobre o interesse dos usurios. O DBMS aciona tambm uma interface entre o armazenamento do Banco de Dados(Onde e como os dados real e fisicamente esto armazenados) e os usurios do Banco de Dados. Quando um usurio lana um requerimento de acesso o DBMS interpreta o requerimento, interpretado ele realiza a necessria operao no Banco de Dados.

ORACLE RDBMS Assim, o RDBMS protege o Banco de Dados dos usurios e de seus equipamentos(hardware) detalhando semelhante tambm a Estrutura de Armazenamento do Banco de Dados e os acessos estratgicos. Um nmero de alternativas chegam para implementar o DBMSs existente. O mais evidente usado tipo de DBMSs so os Hierrquicos, invertendo a lista, network e, mais recentemente, o Relacional. Muitos daqueles DBMS tem estado desenvolvendo recentemente Relacional. Realmente, o relacional chega para os Gerenciadores de Dados representando a tendncia dominncia do mercado de Banco de Dados e era descrito tambm como o nico mais importante desenvolvimento na histria no Campo dos Bancos de Dados.(C.J.Date). O ORACLE Sistema Gerenciador de Banco de Dados Relacional. Por essa razo, no restante dessa Unidade, ns nos concentraremos somente no Relacional ao dirigir-se ao Gerenciador de Banco de Dados.

O Acesso Relacional
Supplies(Fornecedor) S# S1 S2 S3 Parts(Produtos) P# P1 P2 P3 P4 SNAME SMITH JONES BLAKE PNAME NUT BOLT SCREW SCREW COLOUR RED GREEN BLUE RED STATUS 20 10 30 WEIGHT 12 17 17 14 CITY LONDON PARIS PARIS CITY LONDON PARIS ROME LONDON Coluna Orders(Pedidos) S# P# QTY S1 P1 300 linha S1 P2 200 S1 P3 400 S2 P1 300 campo S2 P2 400 S3 P3 200

ORACLE RDBMS

Operadores Relacionais
Os Operadores Relacionais so definidos abaixo: Relao RESTRICTION Descrio aquele operador que traz os resultados dos dados da Relao. Ele possibilita a mostrar todas as linhas, ou justamente aquela linha procurada em uma condio ou em vrias condies. Ele algumas vezes chamado de horizontal subconjunto. aquele operador que mostra certas colunas da Relao, e portanto geralmente chamado de Vertical subconjunto. o resultado quando linhas de dois conjuntos de dados so concatenados. Todas as linhas do primeiro conjunto esto concatenadas com as linhas do segundo conjunto. o resultado quando linhas de dois conjuntos esto concatenados de acordo com uma especfica condio ou condies. mostra todas as linhas que aparecem ou todas das duas Relaes. Mostras as linhas comuns na Relao. mostra as linhas da primeira relao que no pertence a segunda(SQL usa o operador MINUS) CLERK JONES ADAMS Product MANAGER -----------> JONES JONES ADAMS ADAMS JOIN CLARK MILLER SMITH TURNER 10 10 JOIN 20 30 30 40 SALES OPERATIONS 10 20 ACCOUNTING RESEARCH --> SMITH 20 20 RESEARCH SALES TURNER 30 30 CLARK MILLER 10 10 10 10 CLERK MANAGER CLERK MANAGER ACCOUNTING ACCOUNTING SMITH SMITH CLEARK MANAGER

PROJECTION PRODUCT JOIN UNION INTERSECTION DIFERENCE PRODUCT SMITH

ORACLE RDBMS

Union

Importante: Se houver linhas iguais o Union retornar somente uma linha. Se desejar que retorne todas acrescentar o comando all (Union All).

Intersection

Difference (SQL - Minus)

Propriedades do Banco de Dados Relacional


Um Banco de Dados Relacional possui tambm uma coleo de Relaes (Tabelas) para o usurio. A coluna/linha formato da Tabela um familiar meio de visualizao dos Dados. Existe um conjunto de operadores para particionar e combinar as relaes (seleo, projeo, produto, ligao, unio, interseco, diferena) No existe ponteiro entre tabelas, as coneces so feitas exclusivamente da base de dados. A Linguagem usada para pesquisar o Banco de Dados no-procedural e Ingls - como (English like). Os usurios no especificam o caminho de acesso e no necessitam saber como os dados esto arranjados fisicamente. Os comandos para retirar dados e aqueles para fazer modificaes para o Banco de Dados esto todos includos dentro de um nica linguagem, SQL. Existe plena independncia dos dados.

ORACLE RDBMS

Propriedade das Relaes Tabulares.


Uma nica Tabela tem um seguimento de Propriedades: No existem linhas duplicadas. No existem colunas com nomes duplicados. A ordem das linhas insignificante. A ordem das colunas insignificante. Um campo no pode ser excludo SQL*Plus SQL*Forms SQL*Menu CASE*Dictionary Easy*SQL Lotus 123 add-in SQL*Report SQL*QMX SQL*Reportwriter SQL*TextRetrieval Pro*Oracle SQL*Load SQL*Start Todos esse Programas utilizam a linguagem SQL que acessa o Gerenciador ORACLE KERNEL que retorna as informaes para o SQL. Arquitetura do Produto ORACLE O ORACLE RDBMS produzido pela Oracle. Ele inclui o Gerenciador de Banco de Dados e vrias ferramentas para assessorar os usurios e Administradores de Banco de Dados (DBAs) - o Gerenciador do sistema de Banco de Dados na manuteno, monitoramento e uso dos Dados. O centro do RDBMS o Kernel que puxa a prxima tarefa: Gernciar o Armazenamento e Definio dos Dados. Controlar e restringir o acesso aos dados e concorrncia. Conceder Backup (Cpia) e retorno dos dados. Interpretar o SQL

Os comandos SQL so usados por todos os programas e usurios para acessar dados no Banco de Dados ORACLE. Aplicaes e Ferramentas ORACLE geralmente permitem aos usurios acessar o Banco de Dados sem que percebam o SQL, mas essas aplicaes tambm precisam usar o SQL quando executam o requerimento do usurio. Assim o Banco de Dados pode ser acessado somente usando o SQL. Uma parte do kernel o optimiser. O optimiser examina a alternativa dos caminhos para acessar os dados, para encontrar a melhor rota para pegar o comando SQL. ORACLE oferece uma variao de ferramentas adicionais para acessar dados no Banco de Dados. Essas ferramentas incluem-se menu-driven e todas aplicaes de Tela, aplicaes spreadsheet e programas de interface avaliados por vrios Linguagens de Programao. Alguns dos produtos ORACLE esto identificados no diagrama. Para mais informaes dessas ferramentas especificar o produto no manual.

10

ORACLE RDBMS

Produtos ORACLE
SQL*Plus SQL*Forms SQL*Menu CASE*Dictionary uma interao dos comandos dirigidos para interface com o ORACLE para pesquisar e escrever Relatrios (tela) forma de interface com o ORACLE para pesquisar e manipular dados usado para criao de menu amigveis ao usurio para vrias aplicaes de programas. uma Engenharia de Sistemas de Ajuda Computacional ferramenta para assistncia com estratgia, anlises e construo de perodos de vrias aplicaes. uma interface amigvel com o usurio ORACLE com grficos, relatrios fceis. uma ferramenta para voc extrair, inserir, alterar e apagar dados no Banco de Dados ORACLE diretamente do aplicativo Lotus 123. geralmente chamado de RPT, permite extrair e formatar informaes do Banco de Dados uma ferramenta para usurios finais de pesquisa e relatrios. um novo produto Oracle para produzir relatrios usando apenas a interface de menus. um produto para retirar dados em formato texto compatvel com o Banco de Dados Oracle. uma srie de produtos onde se programa interfaces com SQL e C,COBOL,FORTRAN, PASCAL, ADA e PL/1 um produto para extrair dados armazenados em arquivos externos e introduzi-los no Banco de Dados Oracle usado para ligar Banco de Dados distribudos e um nico Banco de Dados lgico - igual se eles esto localizados sobre mltiplos, computadores diferentes.

Easy*SQL Add-in for Lotus123 SQL*Report SQL*QMX SQL*ReportWriter SQL*TextRetrieval Pro*ORACLE SQL*Loader SQL*Start

11

ORACLE RDBMS

Introduo ao SQL
Explicao dessa Unidade.
Esta Unidade provm em uma introduo a linguagem de pesquisa usada para acessar um Banco de Dados ORACLE. O conjunto de comandos SQL um rascunho bem como a bsica pesquisa em bloco. Em particular, ns discutiremos as declaraes do SQL usadas para: realizar clculos manipular valores nulos corretamente. especificar alternativas de colunas e cabealhos Concatenao de colunas ordenao de linhas entrar com critrio(s) de pesquisa

Para acessar um Banco de Dados o SQL o caminho mais fcil.


Reviso do SQL Um Sistema Gerenciador de Banco de Dados requer uma linguagem de pesquisa para habilitar os usurios a acessar os dados. A Linguagem Estruturada de Pesquisa (SQL) a linguagem mais usada pelos Sistemas de Banco de Dados Relacionais. A linguagem SQL era desenvolvida em um prottipo Sistema Gerenciador de Banco de Dados Relacional - Sistema R - pela IBM em meados de 1970. Em 1979, a Corporao Oracle introduziu o primeiro implementao comercial disponvel do SQL

Caractersticas do SQL
SQL uma linguagem com o Ingls. Ela usa palavras semelhantes como select, insert, delete e tambm parte de conjunto de comandos. SQL uma linguagem no procedural: voc especifica qual informao voc quer; no como voc quer peg-la. Em outras palavras, o SQL no requer que voc especifique o mtodo de acesso para os dados. Todas as declaraes de pesquisas so otimizadas - uma parte do RDBMS - para determinar a fantstico mtodo de retirar os especificados dados Esta caracterstica faz dele o mais fcil para voc concentrar-se e obter o resultado desejado. SQL processa conjuntos de registros melhor do que um nico registro no tempo. A melhor comum forma de conjunto de registros uma tabela. SQL pode ser usado por uma faixa de usurios incluindo DBAs, Programadores, Gerentes, e muitos outros tipos de usurios finais. SQL provm comandos para uma variedade de tarefas incluindo: pesquisando dados inserindo, alterando apagando linhas em uma tabela criando, modificando, e apagando objetos do Banco de Dados controlando acesso para Banco de Dados e objetos do Banco de Dados garantindo a consistncia do banco de dados Os mais fceis Sistemas Gerenciadores de Banco de Dados geralmente usam uma linguagem separada para cada categoria acima. SQL unificou todas essas tarefas em uma nica linguagem. SQL tem tornado de fato a linguagem industrial padro para os Bancos de Dados Relacionais. O Instituto Nacional Padro Americano (ANSI) adotou o SQL como linguagem padro para RDBMS em 1986. A Organizao de Padres Internacionais (ISO) tem adotado tambm o SQL como linguagem padro para o RDBMS. Todos os principais RDBMSs usam o SQL e os outros vendedores de RDBMS pretendem completar com o padro ANSI.

12

ORACLE RDBMS

SQL*Plus
SQL*Plus uma interface na qual os comandos SQL podem ser entendidos e executados. Existem um nmero de comandos do SQL*Plus os quais podem adicionar e formatar processos de sada nos comandos SQL, e provm facilidades para editar e salvar comandos SQL.

PL/SQL
ORACLE V6 com transaes e processos adicionais inclui uma nova extenso procedural para o SQL, chamada PL/SQL. PL/SQL estende a linguagem SQL para oferecer a construo Procedural Estruturada em bloco combinada com a no procedural potncia do SQL para manipular os dados. PL/SQL so procedimentos compatveis que incluem: declarao de variveis. tarefas (X := Y + Z) controles condicionais (IF, THEN, ELSE, ELSIF, GOTO) Loop (FOR, WHILE, EXIT, WHEN) manuseio de excees (exception) PL/SQL no ORACLE RDBMS ORACLE RDBMS PL/SQL mquina Bloco PL/SQL DECLARE Procedure Procedure BEGIN Procedure SQL Procedure SQL END Processos, declarao e execuo

Declaraes e execues SQL

13

ORACLE RDBMS PL/SQL voc tem tambm flexibilidade: Improvisar execuo. Quando voc usa SQL, suas declaraes e procedimentos sero enviadas para o RDBMS numa vez, quando voc interage com um bloco PL/SQL ele contm um nmero de declaraes do SQL combinadas com PL/SQL que construdas so enviadas para o kernel numa vez. Essa caracterstica do PL/SQL pode melhorar dramaticamente o desempenho em ambiente de trabalho. Comandos PL/SQL so partes como o PL/SQL mquina os quais fazem parte do kernel. As declaraes do SQL so processadas pelo executor de declaraes SQL, outras partes do RDBMS. Aumentando a Produtividade. PL/SQL adiciona processos potentes para aplicaes e ferramentas desenvolvidas como SQL*Forms. Na adio, aplicativos escritos em PL/SQL so portveis para vrios tipos de computadores ou Sistemas Operacionais o qual pode executar um ORACLE RDBMS suportando o PL/SQL. Neste curso, ns nos concentraremos somente no SQL. Para maiores informaes sobre o PL/SQL consulte o PL/SQL Reference and Users Guide. O curso (Cdigo do Curso PL/SQL for Application Developers) PLS tambm avaliado. No decorrer dessa unidade, ns explicaremos como escrever simplesmente os comandos SQL para retirar dados de uma tabela.

O Conjunto de Comandos SQL Comandos Descries


SELECT INSERT UPDATE DELETE Esse o mais comum comando usado, ele usado para retirar dados de uma Tabela Esses trs comandos so usados para o preenchimento de novas linhas, modificando linhas existentes e removendo linhas no desejadas das tabelas nos Banco de Dados respectivos. (Eles so algumas vezes coletivamente conhecidos como DML ou comandos de Linguagem de Manipulao dos Dados). Esses trs comandos so usados dinamicamente para configurar, modificam e removem vrias estruturas de dados como: tabelas, vises, ndices. (Eles so algumas vezes conhecidos como DDL ou comandos de Linguagem de Definio de Dados). Esses dois comandos so usados para dar ou remover direitos de acesso para ambos Banco de Dados ORACLE e nas Estruturas dentro dele..

CREATE ALTER DROP GRANT REVOKE

Nota: Existem mais comandos SQL. Referencia para SQL*Plus Reference Guide para compreender a lista de comandos SQL

14

ORACLE RDBMS

Escrevendo Comandos SQL


Quando escreve comandos SQL, ele importante para relembrar um pouco das simples regras e diretrizes na ordem para a construo vlida das declaraes aquelas so fceis para ler e editar: Os comandos SQL podem ser sobre uma ou mais linhas. clausulas so usualmente localizadas em linhas separadas. Tabulaes podem ser usadas Palavras comandos no podem ser divididas transversalmente nas linhas Os comandos SQL no podem ser exemplos sensitivos (a no ser indicando diferena) Um comando SQL entrado no SQL pronto, e subseqentemente as linhas so numeradas. Isto chamado de SQL buffer. Geralmente uma declarao pode estar corrente vrias vezes no buffer, e ela pode ser executada de vrias formas: colocado um ponto e vrgula(;) no final da ltima clausula. Colocar um ; ou / no final da linha no buffer colocar um / no SQL pronto colocar um comando R(UN) no SQL pronto

SELECT
Vrias declaraes so vlidas: SELECT * FROM EMP; SELECT * FROM EMP ; SELECT * FROM EMP; Neste manual, os comandos SQL so mostrados divididos em clausulas no interesse da claridade. A Bsica Pesquisa em Bloco A declarao SELECT retira informaes do Banco de Dados, implementando todos os operadores da lgebra Relacional. Neste simples forma, ele deve incluir: 1- Uma clausula SELECT, o qual ter a lista das colunas a serem mostradas. Ele essencialmente um PROJECTION. 2- Uma clausula FROM, a qual especifica a tabela envolvida. Par listar todos os nmeros de departamentos, nome dos empregados e nmeros dos gerentes na tabela EMP voc entra com o seguinte: SELECT DEPTNO, ENAME, MGR FROM EMP;

15

ORACLE RDBMS

DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

ENAME MGR ---------- ----SMITH 7902 ALLEN 7698 WARD 7698 JONES 7839 MARTIN 7698 BLAKE 7839 CLARK 7839 SCOTT 7566 KING TURNER 7698 ADAMS 7788 JAMES 7698 FORD 7566 MILLER 7782

Note aqueles nomes de colunas esto separados por uma vrgula. Ele possibilita selecionar todas as colunas da tabela, especificando um * (asterisco) depois do SELECT palavra comando. SELECT * FROM EMP;
EMPNO ----7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB ---------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK MGR ----7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782 HIREDATE --------13-JUN-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUN-84 14-MAY-84 05-MAR-84 09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 21-NOV-83 SAL ---------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00 COMM ---------300.00 500.00 1,400.00 DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

.00

Outros itens da clausula SELECT possvel incluir outros itens na clausula SELECT. Expresses Aritmticas. Colunas sinnimas Concatenao de colunas Literais Todos essas opes permitem ao usurio pesquisar os dados e manipul-los para as propostas pesquisas; por exemplo, fazendo clculos, juntando colunas um com a outra, ou mostrando pedaos de textos.

16

ORACLE RDBMS

Expresses Aritmticas
Uma expresso a combinao de um ou mais valores, operadores, e funes os quais avaliam para um valor. Expresses Aritmticas podem conter nome de colunas, valores numricos constantes e operadores aritmticos: Operadores + * / SELECT FROM
EMPNO ----7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934

Descries Adio Subtrao Multiplicao Diviso ENAME, SAL*12, COMM EMP;

SAL*12 ---------9600 19200 15000 35700 15000 34200 29400 36000 60000 18000 13200 11400 36000 15600

COMM ---------300.00 500.00 1,400.00

.00

Se a sua expresso aritmtica conter mais de um operador a prioridade *,/ primeiro, ento +,- segundo (deixe para direita se existir operadores com a mesma prioridade). No exemplo seguinte a multiplicao (250*12) avaliada primeiro; ento o valor do salrio adicionado no resultado da multiplicao (3000). Somente para linha do Smith: 800+3000=3800 select ename, sal + 250 * 12 from emp; ENAME SAL+250*12 ---------- ---------SMITH 3800 ALLEN 4600 WARD 4250 JONES 5975 Parnteses podem ser usados para especificar a ordem na qual sero executados es operadores, se, por exemplo, a adio e requerida antes da multiplicao. select ename, (sal + 250) * 12 from emp; ENAME (SAL+250)*12 ---------- -----------SMITH 12600 ALLEN 22200 WARD 18000 JONES 38700

17

ORACLE RDBMS

Colunas Sinnimas
Quando mostramos o resultado de uma pesquisa, o SQL*Plus normalmente usa o nome as colunas selecionadas como cabealho. Em alguns exemplos ele pode ser sem sentido. Voc pode modificar o cabealho de uma coluna usando sinnimos(alias). Uma coluna sinnima um cabealho de coluna alternativo na sada. Especifique o sinnimo (alias) depois da coluna na lista do SELECT. O cabealho sinnimo padro ser fornecido sem espaos em branco, amenos que o sinnimo esteja dentro de aspas duplos ( ). Para mostrar um cabealho ANNSAL para o salrio anual em vez de SAL*12 usamos uma coluna sinnima. SELECT ENAME, SAL*12 ANNSAL, COMM FROM EMP;
EMPNO ----7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 ANNSAL ---------9600 19200 15000 35700 15000 34200 29400 36000 60000 18000 13200 11400 36000 15600 COMM ---------300.00 500.00 1,400.00

.00

Aps definido o sinnimo pode ser usado com os comandos de SQL*Plus mostrados com as unidades 10 e 11. Nota: A declarao de colunas sinnimas no SQL, podem ser usadas unicamente na clausula SELECT. O Operador de Concatenao O Operador de Concatenao (||) permite que as colunas sejam juntadas com outras colunas, expresses aritmticas ou valores constantes para criar uma expresso alfanumrica. Colunas ficam lado a lado com operadores para formarem uma nica coluna. Para combinar EMPNO e ENAME e obter o sinnimo EMPLOYEE, entra-se: SELECT FROM ENPNO||ENAME EXPLOYEE EMP;

EMPLOYEE ------------------------------------------7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD

18

ORACLE RDBMS

7934MILLER

Literais
Um literal so um ou mais caracteres, expresses, nmeros includos na lista do SELECT o qual no um nome de coluna ou de um sinnimo Um literal na lista do SELECT ter uma sada para cada linha retornada. Literais de livre formatos de textos podem ser includos no resultado da pesquisa, e so tratados como uma coluna na lista do SELECT. Datas e caracteres alfanumricos devem ser colocados entre aspas simples(); nmeros no precisam de aspas simples. As declaraes seguintes contm literais selecionados com concatenao e colunas sinnimas. SELECT FROM EMPNO||'-'||ENAME EMPLOYEE, 'WORKS IN DEPARTMENT', DEPTNO EMP; 'WORKSINDEPARTAMENT' DEPTNO -------------------- -----WORKS IN DEPARTMENT 20 WORKS IN DEPARTMENT 30 WORKS IN DEPARTMENT 30 WORKS IN DEPARTMENT 20

EMPLOYEE ---------------7369-SMITH 7499-ALLEN 7521-WARD 7566-JONES

Manuseando Valores Nulos


Se uma linha necessitar de dados para uma coluna particular, se diz que a coluna est nula. Um valor nulo um valor indisponvel e desconhecido. O valor nulo no zero. Zero um nmero. Valores Nulos so manuseados corretamente pelo SQL.. Se algum valor de uma coluna em uma expresso for nulo, o resultado ser nulo.. Na declarao seguinte, salesmen tem um resultado na remunerao: SELECT FROM
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS

ENAME, SAL*12+COMM ANNUAL_SAL EMP;


ANNUAL_SAL ---------19500 15500 16400

18000

19

ORACLE RDBMS
JAMES FORD MILLER

Na ordem para realizar o resultado para todos os empregados, necessrio converter os valores nulos para numricos. Ns usamos a funo NVL para converter valores nulos para no nulos. Usando a Funo NVL para converter valores nulos da declarao anterior para zero. SELECT ENAME,SAL*12NVL(COMM,0) ANNUL_SAL FROM EMP;
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER ANNUAL_SAL ---------9600 19500 15500 35700 16400 34200 29400 36000 60000 18000 13200 11400 36000 15600

NVL conta com dois argumentos: 1- uma expresso 2- um valor no nulo. Note que voc pode usar a funo NVL para converter qualquer tipo de valor nulo. NVL(COLUNA_DATA_NULA,30-OCT-74) NVL(COLUNA_NUMRICA_NULA,21) NVL(COLUNA_ALFANUMRICA_NULA,QUALQUER VALOR)

Prevenindo a Seleo de Linhas Duplicadas


A menos que voc indique de outra maneira, SQL*Plus mostrar os resultados da pesquisa sem eliminar as duplicaes. Para listar todos os nmeros de departamentos da tabela EMP, faa: SELECT DEPTNO FROM EMP; DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

20

ORACLE RDBMS

A clausula DISTINCT
Para eliminar valores duplicados no resultado, inclumos o DISTINCT qualificador no comando SELECT. Para eliminar os valores Duplicados mostrados no exemplo anterior, faa: SELECT DISTINCT DEPTNO FROM EMP; DEPTNO -----10 20 30 Vrias colunas podem ser especificadas depois do qualificador DISTINCT a palavra DISTINCT agir sobre todas as colunas selecionadas. Para mostrar distintos valores de DEPTNO e JOB, faa: SELECT DISTINCT DEPTNO, JOB FROM EMP; DEPTNO -----10 10 10 20 20 20 30 30 30 JOB ---------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN

Essa mostra a lista de todas as combinaes de diferentes empregos e nmeros de departamentos. Note que o DISTINCT qualificador pode unicamente referir para uma vez e precisa do comando SELECT.

A clausula ORDER BY
Normalmente a ordem das linhas retornadas de uma pesquisa indefinida. A clausula ORDER BY pode ser usada para ordenar as linhas. Se usado, o ORDER BY precisa sempre ser a ltima clausula da declarao SELECT. Para ordenar pelo ENAME, faa: SELECT ENAME, JOB, SAL*12, DEPTNO FROM EMP ORDER BY ENAME;
ENAME ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD JOB ---------CLERK SALESMAN MANAGER MANAGER ANALYST CLERK MANAGER PRESIDENT SALESMAN CLERK ANALYST CLERK SALESMAN SALESMAN SAL*12 ---------13200 19500 34200 29400 36000 11400 35700 60000 16400 15600 36000 9600 18000 15500 DEPTNO -----20 30 30 10 20 30 20 10 30 10 20 20 30 30

21

ORACLE RDBMS

22

ORACLE RDBMS Padro da Ordenao dos Dados O padro da ordem de ordenao ascendente. valores numricos infinitos primeiro valores de data primeiro valores alfanumricos Invertendo o padro de ordenao Para inverter essa ordem, o comando DESC(Decrescente)do depois do nome das colunas da clausula ORDER BY. Para inverter a ordem da coluna HIREDATE, somente aquela data mais ressente estar mostrada primeiro, faa: SELECT ENAME, JOB, HIREDATE FROM EMP ORDER BY HIREDATE DESC;
ENAME ---------JAMES KING BLAKE ADAMS TURNER CLARK WARD SCOTT MARTIN FORD MILLER JONES ALLEN SMITH JOB ---------CLERK PRESIDENT MANAGER CLERK SALESMAN MANAGER SALESMAN ANALYST SALESMAN ANALYST CLERK MANAGER SALESMAN CLERK HIREDATE --------23-JUL-84 09-JUL-84 11-JUN-84 04-JUN-84 04-JUN-84 14-MAY-84 26-MAR-84 05-MAR-84 05-DEC-83 05-DEC-83 21-NOV-83 31-OCT-83 15-AUG-83 13-JUN-83

Ordenao por vrias colunas. possvel na clausula ORDER BY usar mais de uma coluna. O limite de colunas de fato o nmero de colunas da tabela. Na clausula ORDER BY especifica-se as colunas pelo que as linhas sero ordenadas, separando as por vrgula. Se algumas ou todas so invertidas especifique DESC depois de alguma ou cada uma das colunas Para ordenar por duas colunas, e mostrar inversa a ordem do salrio, faa: SELECT DEPTNO, JOB, ENAME FROM EMP ORDER BY DEPTNO, SAL DESC;
DEPTNO -----10 10 10 20 20 20 20 20 30 30 30 30 30 30 JOB ---------PRESIDENT MANAGER CLERK ANALYST ANALYST MANAGER CLERK CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN CLERK ENAME ---------KING CLARK MILLER SCOTT FORD JONES ADAMS SMITH BLAKE ALLEN TURNER WARD MARTIN JAMES

Para ordenar por uma coluna, ela no precisa necessariamente estar declarada no SELECT. ORDER BY e Valores Nulos Na Verso 6 do ORACLE RDBMS valores nulos so mostrados no final para seqncias ascendentes, e so os primeiros em relatrios quando as linhas so ordenadas na ordem descendente.

23

ORACLE RDBMS AVISO: A clausula ORDER BY usada na pesquisa quando voc quer mostrar as linhas em uma ordem especfica. Sem a clausula ORDER BY as linhas so retornadas na ordem conveniente para o ORACLE, e voc no deve contar com essa pesquisa nas prximas pesquisas. O comando no altera a ordem dos dados que esto armazenados no Banco de Dados ORACLE.

A Clausula WHERE
A clausula WHERE corresponde aos Operadores de Restries da lgebra Relacional. Ele contm condies nas quais a linha precisa se encontrar em ordem para ser mostrada. Estrutura da seleo com restries. SELECT FROM WHERE coluna(s) tabela(s) certa condio a ser encontrada

A clausula WHERE pode comparar valores em uma coluna, valores literais, expresses aritmticas ou funes. A clausula WHERE conta com trs elementos. 1- Um nome de coluna 2- Um operador de comparao 3- Um nome de coluna, um constante, ou lista de valores. Operadores de Comparao so usados na clausula WHERE e podem ser divididos em duas categorias, Lgicos e SQL. Operadores Lgicos Esses operadores lgicos testam as seguintes condies: Operador = > >= < <= Significado igual a maior que maior e igual a menor que menor e igual a

Alfanumricos e Datas na clausula WHERE. Colunas ORACLE devem ser: caracteres, numricas ou data. Alfanumricos e Datas na clausula WHERE devem estar entre aspas simples. Os caracteres devem combinar com o valor da coluna a menos que seja modificado por funes. Referncia para Funes de Alfanumricos na Unidade 4. Para listar os nomes, nmeros, emprego e departamentos de todos os escriturrios(CLERK). SELECT FROM WHERE ENAME, EMPNO, JOB, DEPTNO EMP JOB = 'CLERK';

ENAME EMPNO JOB DEPTNO ---------- ----- ---------- -----SMITH 7369 CLERK 20 ADAMS 7876 CLERK 20 JAMES 7900 CLERK 30 MILLER 7934 CLERK 10 Para encontrar todos os nomes de departamentos com nmero de departamento maior que 20, faa: SELECT DNAME, DEPTNO

24

ORACLE RDBMS

FROM WHERE

DEPT DEPTNO > 20;

DNAME DEPTNO ---------- -----SALES 30 OPERATIONS 40 Comparando uma coluna com outra coluna na mesma linha: Voc pode comparar uma coluna com outra coluna na mesma linha, da mesma forma com um valor constante. Por exemplo, suponhamos que voc quer encontrar os empregados os quais a comisso est maior que seu salrio, faa: SELECT ENAME, SAL, COMM FROM EMP WHERE COMM>SAL; ENAMES SAL COMM ---------- ---------- ---------MARTIN 1,250.00 1,400.00

Operadores SQL
Existem quatro operadores SQL os quais opera, com todos tipos de dados: Operador BETWEEN ... AND ... IN(Lista) LIKE IS NULL Significado Entre dois valores (inclusive) compara uma lista de valores Compara um parmetro alfanumrico um valor nulo

O Operador BETWEEN
Testa para um faixa de valores, e inclusive do menor a maior faixa. Suponhamos que ns quisemos ver aqueles empregados os quais o salrio est entre 1000 e 2000: SELECT FROM WHERE ENAME, SAL EMP SAL BETWEEN 1000 AND 2000;

ENAME SAL ---------- ---------ALLEN 1,600.00 WARD 1,250.00 MARTIN 1,250.00 TURNER 1,500.00 ADAMS 1,100.00 MILLER 1,300.00 Note aqueles valores especificados esto inclusive, e o menor precisa ser especificado primeiro.

25

ORACLE RDBMS

O Operador IN
Testa os valores especificados em uma lista. Para encontrar empregados que tenham um dos trs nmeros de MGR, faa: SELECT EMPNO, ENAME, SAL, MGR FROM EMP WHERE MRG IN (7902,7566,7788) EMPNO ----7369 7788 7876 7902 ENAME SAL MGR ---------- ---------- ----SMITH 800.00 7902 SCOTT 3,000.00 7566 ADAMS 1,100.00 7788 FORD 3,000.00 7566

Se alfanumricos ou datas forem usados na lista precisam ser colocados entre aspas simples( ). O Operador LIKE Algumas vezes voc precisa procurar valores que voc no conhece exatamente Usando o operador LIKE possvel selecionar linhas combinando parmetros alfanumricos. Dois smbolos podem ser usados para construir uma linha de procura. Smbolo Representa % _ Vrias seqncia de zero ou mais caracteres um nmero desejado de caracteres

Para listar todos os empregados os quais o nome comea com a letra S, faa: SELECT ENAME FROM EMP WHERE ENAME LIKE 'S%'; ENAME ---------SMITH SCOTT Eles podem ser usados para encontrar um determinado nmero de caracteres. Por exemplo para listar todos empregados que tenham exatamente quatro caracteres de tamanho do nome. SELECT ENAME FROM EMP WHERE ENAME LIKE '____' ENAME ---------WARD KING FORD

26

ORACLE RDBMS

O % e o _ pode ser usado em vrias combinaes com literais alfanumricos. Operador IS NULL Unicamente encontrar todos os empregados que no tenham gerente, voc testar um valor nulo: SELECT ENAME, MGR FROM EMP WHERE MGR IS NULL; ENAME MGR ---------- ----KING Expresses Negativas Os operadores seguintes so testes de negao: Operador != ^= <> NOT COLUNA_NOME= NOT COLUNA_NOME> Operadores SQL Operador NOT BETWEEN NOT IN NOT LIKE IS NOT NULL Descrio no igual para (VAX,UNIX,PC) no igual para (IBM) no igual para (todos sistemas operacionais) no igual que no maior que

Descrio tudo que estiver fora da faixa tudo que no estiver na lista tudo que no conter a linha de caracteres tudo que no for nulo

Para encontrar empregados os quais o salrio estiver fora da faixa, faa: SELECT ENAME, SAL FROM EMP WHERE SAL NOT BETWEEN 1000 AND 2000; ENAME SAL ---------- ---------SMITH 800.00 JONES 2,975.00 BLAKE 2,850.00 CLARK 2,450.00 SCOTT 3,000.00 KING 5,000.00 JAMES 950.00 FORD 3,000.00

27

ORACLE RDBMS Para encontrar aqueles empregados os quais o cargo no comece com a letra M, faa: SELECT ENAME, JOB FROM EMP WHERE JOB NOT LIKE 'M%'; ENAME ---------SMITH ALLEN WARD MARTIN SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB ---------CLERK SALESMAN SALESMAN SALESMAN ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

Para encontrar todos os empregados que tenham um gerente (MGR), faa: SELECT ENAME, MGR FROM EMP WHERE MGR IS NOT NULL; ENAME MGR ---------- ----SMITH 7902 ALLEN 7698 WARD 7698 JONES 7839 MARTIN 7698 BLAKE 7839 CLARK 7839 SCOTT 7566 TURNER 7698 ADAMS 7788 JAMES 7698 FORD 7566 MILLER 7782 Nota: Se um valor nulo usado em uma comparao, ento o operador de comparao deve ser IS ou IS NOT NULL. Se esses operadores no forem usados e valores nulos forem comparados, o resultado ser sempre FALSO. Por exemplo, COMM <> NULL ser sempre FALSO. O resultado ser falso porque um valor nulo no pode ser igual ou no igual a qualquer outro valor, Note que aquele erro no elevado, o resultado sempre falso Pesquisando Dados com Mltiplas Condies Os operadores AND e OR devem ser usados para fazer composies de expresses lgicas. O predicado AND esperar que ambas as condies sejam verdadeiras; onde o predicado OR esperar uma das condies seja verdadeira. Nos dois seguintes exemplos as condies so as mesmas, o predicado diferente. Veja como o resultado dramaticamente alterado.

28

ORACLE RDBMS Para encontrar todos os escriturrios que ganhem entre 1000 e 2000, faa: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB = 'CLERK'; EMPNO ----7876 7934 ENAME ---------ADAMS MILLER JOB SAL ---------- ---------CLERK 1,100.00 CLERK 1,300.00

Para encontrar todos os empregados que so escriturrios ou todos que ganhem entre 1000 e 2000 faa: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB = 'CLERK'; EMPNO ----7369 7499 7521 7654 7844 7876 7900 7934 ENAME ---------SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER JOB SAL ---------- ---------CLERK 800.00 SALESMAN 1,600.00 SALESMAN 1,250.00 SALESMAN 1,250.00 SALESMAN 1,500.00 CLERK 1,100.00 CLERK 950.00 CLERK 1,300.00

Voc pode combinar AND e OR na mesma expresso lgica. Quando AND e OR aparecer na mesma clausula WHERE, todos os ANDs sero feitos primeiros e ento todos os Ors sero feitos. Se AND no interfere sobre o OR a seguinte declarao SQL retornar todos os gerentes com salrio acima de 1500, e todos os vendedores. SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND JOB = 'MANAGER' OR JOB = 'SALESMAN' EMPNO ----7499 7521 7566 7654 7698 7782 7844 ENAME ---------ALLEN WARD JONES MARTIN BLAKE CLARK TURNER JOB SAL DEPTNO ---------- ---------- -----SALESMAN 1,600.00 30 SALESMAN 1,250.00 30 MANAGER 2,975.00 20 SALESMAN 1,250.00 30 MANAGER 2,850.00 30 MANAGER 2,450.00 10 SALESMAN 1,500.00 30

29

ORACLE RDBMS Se voc quiser selecionar todos os gerentes e vendedores com salrios acima de 1500 voc deveria fazer: SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1500 AND (JOB = 'MANAGER' OR JOB = 'SALESMAN'); EMPNO ----7499 7566 7698 7782 ENAME ---------ALLEN JONES BLAKE CLARK JOB SAL DEPTNO ---------- ---------- -----SALESMAN 1,600.00 30 MANAGER 2,975.00 20 MANAGER 2,850.00 30 MANAGER 2,450.00 10

Os parnteses especifica, a ordem na qual os operadores devem ser avaliados. No segundo exemplo, o operador OR avaliado antes do AND. Precedncia dos Operadores Todos operadores so organizados em uma hierarquia essa determina sua precedncia. Numa Expresso, as operaes so feitas na ordem de sua precedncia, do maior para o menor. Onde os operadores de igual precedentes so usados prximo a outro, eles so feitos da esquerda para direita. 1- Todos os comparativos e Operadores SQL tem igual precedente: =, !=, <, >, <=, >=, BETWEEN ... AND ..., IN, LIKE, IS NULL. 2- NOT (para inverter o resultado das expresses lgicas: WHERE NOT (SAL>2000)) 3- AND 4- OR Sempre que voc estiver em dvida sobre qual dos dois operadores ser feito primeiro quando a expresso avaliada, use parnteses para clarear seu significado e assegure o SQL*Plus que voc pretende. Suponha que voc queira encontrar todos os gerentes, em vrios departamentos, e todos os escriturrios no departamento 10 unicamente: P SELECT * FROM EMP WHERE JOB = 'MANAGER'OR (JOB = 'CLERK' AND DEPTNO = 10); O parnteses acima no necessrio, por que o AND precedente ao OR, mas ele esclarece o significado da expresso.

30

ORACLE RDBMS

Resumo do SELECT.
S por cima as clausulas que cobrem o comando SELECT: SELECT (DISTINCT) (*, COLUNA (SINNIMO), ...)

FROM
WHERE ORDER BY SELECT

tabela
condio ou condies (coluna, expresso) (ASC/DESC) Seleciona no mnimo uma coluna Pode ser usado para colunas unicamente na lista do SELECT Indica todas as colunas Pode ser usado para eliminar duplicaes. Indica a tabela onde as colunas origina. Restringe a pesquisa para linhas que encontram a condio. Ele pode conter colunas, expresses e literais Podem ser usados na clausula WHERE para construir mais complexa condies, AND tem prioridade sobre o OR. Pode ser usado para forar prioridade. Sempre o ltimo. Especifica a ordem de ordenao. Uma ou mais colunas podem ser especificadas. Ordem ascendente padro ordem de ordenao e no precisa ser especificado. Inverte a ordem padro de ordenao e deve ser especificada depois do nome da coluna.

Sinnimo(Alias) * DISTINCT FROM tabela WHERE AND/OR () ORDER BY ASC DESC

Clausulas devem ser feitas em linhas separadas no buffer e tabulao usada para clareza e fcil edio. Lgicas Sobre o SQL*Plus Esta sesso explicar como entrar no SQL*Plus, e resume os tipos de comandos que podem ser circulados nele.

31

ORACLE RDBMS

SQL*Plus Comandos.
SQL*Plus um programa escrito pela Corporao ORACLE, essa provm um ambiente para comandos SQL para ser fechada diretamente ou executar um arquivo de comandos. Estes so usados para: formatar resultados; configurar opes; editar e armazenar declaraes SQL. Uma vez voc tenha entrado no seu sistema operacional, existem trs caminhos para entrar no SQL*Plus: 1- SQLPLUS voc tem a mensagem : Enter Username: Entre com seu usurio e pressione (Enter) SQL*Plus mostrar outra mensagem Enter Password: Entre com sua senha e pressione (Enter) novamente Para sua proteo, sua senha(password) no aparecer na tela. SQL*Plus estar pronto: SQL> Isso indica a linha de comando. Existem duas classes de comandos que voc pode usar: comandos SQL ou SQL*Plus. 2-SQLPLUS usurio Ele pedir a senha. 3- SQLPLUS usurio/senha. Voc entrar direto no SQL*Plus. Esta forma sua senha aparecer na tela. Escolha o mtodo que voc prefere. Editando declaraes SQL Usando comandos SQL*Plus. 1- Quando voc faz um comando SQL, ele armazenado em uma parte da memria chamada SQL buffer, e permanece l at voc fazer um novo comando. 2- Se voc pressionar (Enter) antes de completar um comando SQL*Plus deixa pronto um numerao de linha. 3- Um finalizador para uma declarao SQL um ponto e vrgula. 4- Estando as declaraes no buffer, existem formas para editar essas operaes usando comandos SQL*Plus. Comando APPEND texto CHANGE CHANGE CLEAR BUFFER Abreviao A texto C/velho/novo/ C/texto/ CL BUFFER Propsito adiciona texto no final da corrente linha modifica texto na corrente linha apaga texto da linha corrente apara todas as linhas do SQL buffer

32

ORACLE RDBMS

Comando DEL INPUT INPUT LIST LISTn LIST m n RUN /

Abreviao I I texto L Ln Lmn R

Propsito apaga linha corrente Insere um linha insere um linha constituindo um texto lista todas as linhas no SQL buffer lista uma linha especificada lista uma faixa de linhas mostra e executa o comando SQL no buffer executa o comando SQL corrente no buffer

Diversos comandos do SQL*Plus


Os comandos SQL (como SELECT) so veculos para os dados via ORACLE kernel. Comandos SQL*Plus so usados fundamentalmente para controlarem o ambiente, formatando os resultados das pesquisas e controlando os arquivos. Muito desses comandos esto citados nas Unidades 10 e 11. Os comandos identificados aqui so diversos e voc deve us-los nos exerccios seguintes. Comandos SQL*Plus so feitos no prompt do SQL>, eles no entram no buffer. Comando SAVE arquivo GET arquivo START arquivo ED arquivo SPOOL arquivo Descrio permite o corrente contexto do SQL buffer ser salvo em um arquivo chama texto previamente salvo executa um comando previamente salvo em um arquivo. Comandos de arquivo so discutidos na Unidade 10 usa editor padro em ordem para edio do arquivo salvo. escreve todos os comandos subsequentes de sada no arquivo nomeado. O arquivo SPOOL estendido por .LIS (LST em algum sistemas) OFF fecha o arquivo SPOOL e OUT fecha o arquivo SPOOL e emite o arquivo para impressora. mostra a estrutura de uma tabela. invoca o interno sistema de ajuda ORACLE invoca um comando do sistema operacional. mesma funo acima Invoca outro usurio ORACLE

SPO(OL) OFF/OUT DESC(RIBE) tabela HELP $O/S comando HOST comando CONN(ECT) usurio/senha

33

ORACLE RDBMS

Comando EXIT PROMPT texto

Descrio sai SQL*Plus mostra o texto quando executa o comando arquivo.

34

ORACLE RDBMS

Exerccio 1 - Introduo ao SQL


Esses exerccios so feitos para introduzir todos os tpicos vistos anteriormente nas leituras. Se voc tem tempo faa essas trezes questes. Oficina 1- Selecione todas as informaes da tabela SALGRADE. GRADE ---------1 2 3 4 5 LOSAL ---------700 1201 1401 2001 3001 HISAL ---------1200 1400 2000 3000 9999

2- Selecione todas as informaes da tabela EMP.


EMPNO ----7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB ---------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK MGR ----7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782 HIREDATE --------13-JUN-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUN-84 14-MAY-84 05-MAR-84 09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 21-NOV-83 SAL ---------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00 COMM ---------300.00 500.00 1,400.00 DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10

.00

3-Liste todos os empregados que tenham salrio entre 1000 e 2000.


ENAME ---------ALLEN WARD MARTIN TURNER ADAMS MILLER DEPTNO -----30 30 30 30 20 10 SAL ---------1,600.00 1,250.00 1,250.00 1,500.00 1,100.00 1,300.00

4- Liste nmero e nome de departamentos em ordem de nome. DEPTNO -----10 40 20 30 DNAME ---------ACCOUNTING OPERATIONS RESEARCH SALES

35

ORACLE RDBMS 5- Mostrar todos os diferentes tipos de cargos. JOB ---------ANALYST CLERK MANAGER PRESIDENT SALESMAN 6- Listar todos os detalhes dos empregados dos departamentos 10 e 20 em ordem de nome
EMPNO ----7876 7782 7902 7566 7839 7934 7788 7369 ENAME ---------ADAMS CLARK FORD JONES KING MILLER SCOTT SMITH JOB ---------CLERK MANAGER ANALYST MANAGER PRESIDENT CLERK ANALYST CLERK MGR ----7788 7839 7566 7839 7782 7566 7902 HIREDATE --------04-JUN-84 14-MAY-84 05-DEC-83 31-OCT-83 09-JUL-84 21-NOV-83 05-MAR-84 13-JUN-83 SAL ---------1,100.00 2,450.00 3,000.00 2,975.00 5,000.00 1,300.00 3,000.00 800.00 COMM ---------DEPTNO -----20 10 20 20 10 10 20 20

7- Listar nome e cargo de todos os escriturrios do departamento 20.


ENAME ---------SMITH ADAMS JOB ---------CLERK CLERK

8- Mostre todos os nomes dos empregados os quais tenham TH ou LL.


ENAME ---------SMITH ALLEN MILLER

9- Listar os seguintes detalhes para todos empregados que tenham um gerente.


ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES FORD MILLER JOB ---------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST SALESMAN CLERK CLERK ANALYST CLERK SAL ---------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00

36

ORACLE RDBMS 10- Mostrar nome e total da remunerao para todos os empregados
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER REMUNERATION -----------9600 19500 15500 35700 16400 34200 29400 36000 60000 18000 13200 11400 36000 15600

11- Mostrar todos os empregados que foram admitidos durante 1983


ENAME ---------SMITH ALLEN JONES MARTIN ADAMS FORD MILLER DEPTNO -----20 30 20 30 20 20 10 HIREDATE --------13-JUN-83 15-AUG-83 31-OCT-83 05-DEC-83 04-JUN-84 05-DEC-83 21-NOV-83

12- Mostrar nome, salrio anual e comisso de todos os vendedores que o salrio mensal maior que sua comisso. A sada deve ser ordenada pelo maior salrio primeiro. Se duas ou mais empregados tiverem o mesmo salrio ordenar por nome de empregado. ENAME ANNUAL_SAL COMM ---------- ---------- ---------ALLEN 19200 300.00 TURNER 18000 .00 WARD 15000 500.00 Desafio sua habilidade com isto: 13- Selecione dados tambm mostre: Who, what and when -----------------------------------------------------------------------SMITH HAS HELD THE POSITION OF CLERK IN DEPT 20 SINCE 13-JUN-95 ALLEN HAS HELD THE POSITION OF SALESMAN IN DEPT 30 SINCE 15-AUG-83 Assim para todos os empregados.

37

ORACLE RDBMS

14-Selecione todos os dados da tabela EMP, classificando-os por MGR. Se MGR for nulo coloque no fim da lista. Introduo ao SQL 1SELECT * FROM SALGRADE; 23SELECT FROM SELECT FROM WHERE SELECT FROM ORDER BY SELECT FROM SELECT FROM WHERE ORDER BY SELECT FROM WHERE AND SELECT FROM WHERE OR SELECT FROM WHERE SELECT FROM SELECT FROM WHERE SELECT FROM WHERE AND ORDER BY SELECT * EMP; ENAME, DEPTNO, SAL EMP SAL BETWEEN 1000 AND 2000; DEPTNO, JOB DEPT DNAME; DISTINCT JOB EMP; * EMP DEPTNO IN (10,20) ENAME; ENAME, JOB EMP JOB = 'CLERK' DEPTNO = 20; ENAME EMP ENAME LIKE '%TH%' ENAME LIKE '%LL%'; ENAME, JOB, SAL EMP MGR IS NOT NULL; ENAME, SAL*12+NVL(COMM,0) REMUNERATION EMP; ENAME, DEPTNO, HIREDATE EMP HIREDATE LIKE '%83'; ENAME, SAL*12 ANNUAL_SAL, COMM EMP SAL>COMM JOB = 'SALESMAN' SAL DESC, ENAME: ENAME|| ' HAS HELD THE POSITION OF '|| JOB||

4-

56-

7-

8-

9-

1011-

12-

13-

38

ORACLE RDBMS

FROM 14SELECT FROM ORDER BY

' IN DEPT '|| DEPTNO|| ' SINCE '|| HIREDATE "Who, what and when" EMP; * EMP NVL(MGR,9999);

39

ORACLE RDBMS

Executando Pesquisas Padres com Variveis Substituveis


Explicao dessa Unidade Nesta Unidade Variveis Substituveis so descritas. Variveis Substituveis so usadas em declaraes SQL e permitem valores serem identificados na execuo.

nica Varivel Substituvel


Voc pode usar variveis substituveis no arquivo comando ou nas declaraes SELECT para representar valores que sejam entrados na hora da execuo. Uma varivel pode ser uma idia de como uma valor pode ser armazenado temporariamente. Uma varivel representado por um nico i comercial(&), e o valor atribudo nela. A seguinte declarao apresenta ao usurio um nmero de departamento na execuo: SELECT FROM WHERE EMPNO, ENAME, SAL EMP DEPTNO = &DEPARTMENT_NUMBER;

Enter value for department_number : 10 EMPNO ----7782 7839 7934 ENAME SAL ---------- ---------CLARK 2,450.00 KING 5,000.00 MILLER 1,300.00

O exemplo acima usa a condio WHERE DEPTNO = 10. Com o nico "e" comercial o usurio solicitado toda vez que o comando executado, porque a varivel no definida e consequentemente o valor digitado no salvo. Um valor alfanumrico ou data precisa ser includo entre aspas simples na entrada. Para evitar a entrada das aspas simples na execuo, declara-se a varivel entre aspas simples. Na declarao seguinte, as variveis esto includas entre aspas simples, s que as aspas simples no so requeridas na execuo: SELECT ENAME, DEPTNO, SAL*12 FROM EMP WHERE JOB = '&JOB_TITLE'; Enter value for job_title: MANGER ENAME DEPTNO SAL*12 ---------- ------ ---------JONES 20 35700 BLAKE 30 34200 CLARK 10 29400

40

ORACLE RDBMS O tamanho da varivel indefinido, o valor ser entrado todo vez que for executado a declarao possvel entrar com um nome de coluna de um tabela na execuo. No seguinte exemplo voc entrar com um expresso aritmtica. SELECT DEPTNO, &ARITHMETIC_EXPRESSION FROM EMP Enter value for arithmetic_expression: sal/12 DEPRNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10 SAL/12 ------66.6667 133.333 104.167 247.917 104.167 237.5 204.167 250 416.667 125 91.6667 79.1667 250 108.333

Duplo & para Variveis substituveis


Se uma varivel prefixada com um duplo "e" comercial(&&), SQL*Plus preenche o valor da varivel com o primeiro valor fornecido na execuo da declarao SQL.. SELECT ENAME, DEPTNO, JOB FROM EMP WHERE DEPTNO = &&DEPTNO_PLEASE; Enter value for deptno_please: 10 ENAME -------------CLARK KING MILLER DEPTNO -----------10 10 10 JOB ------------MANAGER PRESIDENT CLERK

perguntado uma vez e no mais. Voc pode usar o comando DEFINE para determinar se uma varivel j est definida. Se a varivel definida, ela mostra o valor atribudo. SQL>DEFINE DEFINE DEPTNO_PLEASE = "10" (CHAR) O comando DEFINE ento usado para criar uma varivel para o usurio.

O Comando DEFINE
Um valor pode ser atribudo para uma varivel usando o comando DEF[INE] do SQL*Plus. O valor atribudo pode ser referenciado na declarao SELECT ou comando de arquivo pelo nome de varivel predefinido de um (&). Despreenchida usando o comando UNDEF[INE].

41

ORACLE RDBMS No exemplo seguinte, uma varivel tem seu contedo definido como uma expresso aritmtica que calcula a remunerao. Na subsequente declarao, a varivel REM referenciada para um nmero de vezes. A varivel ento despreenchida usando UNDEF(INE). DEFINE REM = "SAL*12+NVL(COMM,0)" SELECT ENAME, JOB, &REM FROM EMP ORDER BY &REM; UNDEFINE REM
ENAME ---------SMITH JAMES ADAMS WARD MILLER MARTIN TURNER ALLEN CLARK BLAKE JONES SCOTT FORD KING JOB ---------CLERK CLERK CLERK SALESMAN CLERK SALESMAN SALESMAN SALESMAN MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT SAL*12+NVL(C OMM,0) -----------------9600 11400 13200 15500 15600 16400 18000 19500 29400 34200 35700 36000 36000 60000

As Aspas duplas em volta da expresso so opcionais a menos que a expresso tenha espaos. Iniciando um Arquivo comando Contendo Variveis Substituveis. Suponhamos que voc queira uma srie de relatrios para listar os empregados com vrios cargos por exemplo; um para Vendedores, um para escriturrio, um para gerentes, etc. Voc j sabe como usar variveis substituveis para obter esses diversos relatrios de uma nica declarao SELECT. Porm, existe uma alternativa tcnica que voc pode usar , se voc quiser armazenar a declarao SELECT em um arquivo e ento usar o comando START para execut-lo. Essa tcnica requer o uso de algumas variveis substituveis especiais. Existem nove dessas variveis e seus nomes vo de um nove. Para e usar essas variveis no "e" comercial & coloca-se um numeral (1-9) no comando SQL. Essas variveis podem ser usados vrios nmeros ao mesmo tempo e em vrias ordens. Cada vez que o comando executado, cada &1 no comando alterado pelo primeiro parmetro depois de START arquivo, cada &2 substitudo pelo segundo parmetro, e assim por diante. Para criar um arquivo comando com um parmetro especificando o cargo para ser mostrado, faa: SELECT EMPNO, ENAME, SAL FROM EMP WHERE JOB = '&1'; SQL> SAVE JOB1 SQL retornar a mensagem

42

ORACLE RDBMS

Created File Job1 Agora execute o comando com o parmetro CLERK. SQL*Plus substituir a varivel com o parmetro. SQL> START JOB1 CLERK EMPNO ----7369 7876 7900 ENAME SAL ----- ----SMITH 800 ADAMS 1100 JAMES 950

Note que voc no pode usar essas variveis quando executar um comando com RUN. Voc somente armazena o comando em um arquivo e executa ele com o comando START.

O comando ACCEPT
O comando ACCEPT permite criar um varivel com valor, a qual entrada na execuo, armazenando nela. O ACCEPT geralmente usado num arquivo comando. Esta varivel ento pode ser referenciada na declarao do SQL. Existem benefcios em usar o ACCEPT para definir Variveis Substituveis. Dados tipo Data podem ser checados. A mensagem de entrada de dados pode ser mais explicativa Valores da resposta pode ser escondido A sintaxe do comando : ACC(EPT) (HIDE) Sintaxe NUMBER/CHAR PROMPT texto NOPROMPT HIDE variable (NUMERICO/ALFANUMERICO) (PROMPT/NOPROMPT 'texto')

Descrio determina o tipo de varivel. Se o valor entrado for invlido uma mensagem ser mostrada. mostra o texto se for especificado faz o ACCEPT omitir uma linha aguardando a entrada esconde entrada para o usurio. No caso de senha

Exemplos SQL> ACCEPT SALARY NUMBER PROMPT 'Salary figure : ' Salary figure : 30000 SQL> ACCEPT PASSWORD CHAR PROMPT 'Password : ' HIDE Password : SQL> ACCEPT COMM NUMBER NOPROMPT 500

43

ORACLE RDBMS

SQL> DEFINE DEFINE SALARY DEFINE PASSWORD DEFINE COMM = = = 30000 (NUMBER) "FREEBIES" (CHAR) 500 (NUMER)

Resumo
Quando SQL*Plus encontra &VARIVEL: 1- Se a &VARIVEL j estiver definida, a definio usada. 2- Se a &VARIVEL no estiver definida: O usurio recebe uma mensagem para defini-la A definio do usurio usada A definio do usurio ento descartada Quando SQL*Plus encontra &&VARIVEL Mesmo passo 1 e 2 acima exceto aquele a definio salva e no descartada. &1 tratado como &&. Para encontrar sada se uma varivel j definida, usar o comando DEFINE DEF DEPARTMENT Se definido, pega a definio do DEPARTMENT. Se no, espcie indefinida. Para definir uma varivel, tambm usar i comando DEF(INE); DEF COMM = NVL(COMM,0) A aspas duplas no exigida, mas ajuda se sua expresso contiver embutida brancos ou apstrofos.

Como fazer variveis permanecer definidas? At voc UNDEF(INE) elas ou redefini-las ento ou at voc sair do SQL*Plus. Duas outras maneiras para definir uma varivel: SQL> ACCEPT varivel (tipo) (PROMPT 'texto') (HIDE) SQL> COLUMN nome coluna NEW_VALUE varivel (explicado na Unidade 11)

44

ORACLE RDBMS

Exerccio 2 - Executando Pesquisas Com Parmetros


Esse exerccio dar a voc oportunidade para criar arquivos os quais podem ser executados interativamente, e o qual usa variveis substituveis para criar durante a execuo selecionando critrio. Oficina 1- Gerar u declarao na qual o usurio recebe um mensagem de entrada na execuo. A inteno mostrar os empregados admitidos entre duas datas. Execute a pesquisa duas vezes. Modifique a pesquisa e use aspas duplas. Execute a pesquisa um nmero de vezes, Note a diferena. 2- Desenvolva uma pesquisa que entre com o cargo. Execute a pesquisa um nmero de vezes para testar. ENAME ---------SCOTT FOR JOB SAL MGR DEPTNO ---------- ---------- ----- -----ANALYST 3,000.00 7566 20 ANALYST 3,000.00 7566 20

3- Defina uma varivel representando a expresso de remunerao total anual dos empregados. Use a varivel na declarao a qual encontra todos os empregados que ganhem 30000 um ano ou mais. ENAME SAL*12+NVL(COMM,0) ---------- -----------------JONES 35700 BLAKE 34200 SCOTT 36000 KING 60000 FORD 36000 1SELECT FROM WHERE SELECT FROM WHERE ENAME, HIREDATE EMP HIREDATE BETWEEN '&FIRST_DATE' AND '&LAST_DATE'; ENAME, JOB, SAL, MGR, DEPTNO EMP JOB = '&JOB';

2-

3-

DEFINE REM = 'SAL*12+NVL(COMM,0)' SELECT FROM WHERE ENAME, &REM EMP &REM > 30000;

45

ORACLE RDBMS

Funes
Explicao dessa Unidade Nessa Unidade estamos introduzindo as Funes. Funes fazem a pesquisa de bloco mais potente, e so usadas para manipular valores. Nessa Unidade falaremos de funes numricas e alfanumricas. Funes de Data, funes de Converso, e funes as quais operam sobre tipos de dados que discutimos na Unidade 5. Finalmente funes de grupo que falamos na Unidade 6. Introduo a Funes Funes so usadas para manipular dados. Elas aceitam um ou mais argumentos e retorna um valor. Um argumento uma constante, refece-se a varivel ou coluna. O formato para uma funo a seguinte:
funo_nome (arumento1,argument2,...)

Funes podem ser usadas para: Clculos sobre datas modificar valores de itens individuais manipular sada para grupos de linhas alterar formatos de datas para mostr-los Existem diferentes tipos de funes: ALFANUMRICAS NUMRICAS DATA CONVERSO FUNES QUE ACEITAM VRIOS TIPOS DE DADOS GRUPO Algumas funes operam unicamente sobre linhas simples; outras manipulam grupo de linhas. A mais comuns funes usadas esto nesse manual. Por favor ver o SQL*Plus Reference Guid para a lista completa das funes. Funes de linhas simples sero discutidas nessa Unidade e Unidade 5. Funes de Grupo sero mencionadas na Unidade 6. Funes de Linha nica age sobre cada linha retornada na pesquisa retorna um resultado por linha espera um ou mais argumento do usurio pode ser aninhada podem ser usadas com variveis do usurio, colunas, expresses podem ser usadas por exemplo nas : clausulas SELECT, WHERE, ORDER BY.

46

ORACLE RDBMS

Explicao da notao Notao Significado Col Value n string chars date qualquer nome de coluna do Banco de Dados qualquer valor literal (alfanumrico/data/numrico) representa um nmero representa a linha de caracter representa o nmero de caracteres especificados representa uma coluna data ou valor de data

Funes Alfanumricas e Numricas:

47

ORACLE RDBMS

Funes Alfanumricas
Funes Alfanumricas aceitam dados alfanumricos e podem retornar alfanumrico ou valores numricos. A funo seguinte influncia na construo de valores alfanumricos.

LOWER
LOWER(col/value) fornece valores alfanumricos os quais esto em letra maiscula ou minscula e retornam em letra minscula

Para mostrar o nome dos departamentos em letra minscula e a constante SQL COURSE, faa: SELECT LOWER(DNAME), LOWER('SQL COURSE') FROM DEPT; LOWER(DNSAME) ------------reseatch sales operations accounting LOWER(SQL COURSE) ------------------sql course sql course sql course sql course

UPPER
UPPER(col/value) fornece caracteres alfanumricos, os quais esto em letra maiscula ou minscula e retornar em letra maiscula.

No exemplo seguinte, a funo UPPER fora o usurio entrar em letra maiscula. SELECT ENAME FROM EMP WHERE ENAME = UPPER('&ENAME'); Enter value for ename : smith ENAME ---------SMITH

INITCAP
INITCAP(col/value) INITCAP(DANAME) --------------Accounting Research Sales Operations fora a primeira letra da Palavras ser em maiscula e o resto minscula INITCAO(LOC) -----------New York Dallas Chicago Boston

SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT;

48

ORACLE RDBMS

LPAD e RPAD
As funes LPAD e RPAD enchem valores alfanumricos para tamanhos especificados. LPAD(col/value,n,caracter) preenche a coluna ou valor literal da esquerda para o total tamanho de n posies. Os principais espaos esto preenchidos com o caracter. Se o caracter for omitido o valor padro espaos. SELECT LPAD(DNAME,20,'*'), LPAD(DNAME,20), LPAD(DEPTNO,20,'.') FROM DEPT; LPAD(DNAME,20,'*') -------------------*************RESEACH ***************SALES **********OPERATIONS ***********ACCOUTING RPAD(col/value,n,caracter) LPAD(DNAME,20) -------------------RESEACH SALES OPERATIONS ACCOUNTING LPAD(DEPTNO,20,'.') -------------------..................20 ..................30 ..................40 ..................10

preenche a coluna ou valor literal da direita para o total tamanho de n posies. Os espaos a direita so preenchidos com o caracter. Se o caracter for omitido o preenchimento fica em branco.

SELECT RPAD(DNAME,20,'*'), RPAD(DNAME,20), RPAD(DEPTNO,20,'.') FROM DEPT; RPAD(DNAME,20,'*') -------------------RESEACH************* SALES*************** OPERATIONS********** ACCOUTING*********** RPAD(DNAME,20) -------------------RESEACH SALES OPERATIONS ACCOUNTING RPAD(DEPTNO,20,'.') -------------------20.................. 30.................. 40.................. 10..................

Essa vez a segunda coluna alinhada para a direita com brancos por padro.

SUBSTR
A funo seguinte assume os caracteres na linha estando numerados da esquerda para a direita comeando com 1. SUBSTR(col/value,pos,n) Retorna um linha de n caracteres da coluna ou valor literal, iniciando na posio nmero pos. Se n omitido a linha extrada da posio pos at o fim. O prximo exemplo mostra o seguinte sublinha; quatro caracteres do literal ORACLE iniciando na segunda posio. contedo do Dname iniciando no segundo caracter. cinco caracteres do DNAME iniciando na terceira posio.

49

ORACLE RDBMS

SELECT SUBSTR('ORACLE',2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5) FROM DEPT; SUBSTR('ORACLE',2,4) -------------------RACL RACL RACL RACL SUBSTR(DNAME,2) ---------------------ESEARCH ALES PERATIONS CCOUNTING SUBSTR(DNAME,3,5) ----------------------SEAC LES ERATI COUNT

Note que os valores esto alinhados para a esquerda. Isso porque SQL*Plus sempre mostra dados alfanumricos alinhados para a esquerda por padro.

INSTR
INSTR(col/value,caracter) INSTR(col/value,caracter,pos,n) encontra a primeira ocorrncia do caracter. encontra a posio do caracter do tamanho do caracter na coluna ou valor literal iniciando na posio nmero pos

SELECT DNAME, INSTR(DNAME,'A'), INSTR(DNAME,'ES'), INSTR(DNAME,'C',1,2) FROM DEPT; DNAME INSTR(DNAME,'A') INSTR(DNAME,'ES') INSTR(DNAME,'C',1,2) -------------- ----------------- ----------------- -------------------ACCOUNTING 1 0 3 RESEACH 5 2 0 SALES 2 4 0 OPERATIONS 5 0 0

LTRIM e RTRIM
LTRIM e RTRIM removem especficos caracteres de um linha. LTRIM(col/value,caractere(s)) removem da esquerda principalmente ocorrncias de caracteres (ou combinao de caracteres especficos). Se o caracter no especificado cortar os brancos da esquerda SELECT DNAME, LTRIM(DNAME,'A'), LTRIM,'AS'), LTRIM(DNAME,'ASOP') FROM DEPT; DNAME ---------------RESEARCH SALES OPERATIONS ACCOUNTING LTRIM(DNAME,'A') ---------------RESEARCH SALES OPERATIONS CCOUNTING LTRIM(DNAME,'AS') ----------------RESEARCH LES OPERATIONS CCOUTING LTRIM(DNAME,'ASOP') ------------------RESEARCH LES ERATIONS CCOUTING

50

ORACLE RDBMS

RTRIM(col/value,caractere(s))

remove da direita ocorrncia de caracter(s) (ou combinaes de caracteres especficos). Se os caracteres no forem especificados sero removidos os brancos.

SELECT DNAME, RTRIM(DNAME,'G'), RTRIM,'GHS'), RTRIM(DNAME,'N') FROM DEPT; DNAME ---------------RESEARCH SALES OPERATIONS ACCOUNTING RTRM(DNAME,'G') ---------------RESEARCH SALES OPERATIONS ACCOUNTING RTRIM(DNAME,'GHS') -----------------RESEARC SALE OPERATION ACCOUTIN RTRIM(DNAME,'N') ------------------RESEARCH SALES OPERATIONS ACCOUTING

RTRIM pode ser usada para ajudar na remoo de brancos ou caracter do final de um campo. SOUNDEX(col/value) retorna uma linha de caracteres representando o som da palavra para um coluna ou um valor literal. Esta funo retorna a fontica representao de uma palavra, voc pode comparar palavras que tenham escrita diferente e sons iguais. SELECT ENAME, SOUNDEX(ENAME) FROM EMP WHERE SOUNDEX(ENAME) = SOUNDEX('FRED'); ENAME SOUNDEX(ENAME) ---------- --------------FORD F630

LENGTH
LENGTH(col/value) retorna o nmero de caracteres na coluna ou valor literal. SELECT LENGTH('SQL COURSE'), LENGTH(DEPTNO), LENGTH(DNAME) FROM DEPT; LENGTH('SQL COURSE') LENGTH(DEPTNO) LENGTH(DNAME) -------------------- -------------- ------------10 2 8 10 2 5 10 2 10 10 2 10 Note como a funo INSTR, LENGTH retorna um valor numrico.

51

ORACLE RDBMS

TRANSLATE e REPLACE
As funes TRANSLATE e REPLACE so usadas para substituir caracteres. TRANSLATE(col/value,from,to) transforma caracteres de para. Mais de um caracter pode ser combinado. Todas as ocorrncias from so substitudas com a correspondente caracter no to. Se o correspondente to no for digitado o from ser removido SELECT ENAME, TRANSLATE(ENAME,'C','P'), JOB, TRANSLATE(JOB,'AR','IT') FROM EMP WHERE DEPTNO = 10; ENAME TRANSLATE(ENAME,'C','P') JOB TRANSLATE(JOB,'AR','IT') ------------------------------------------------------------------CLARK PLARK MENAGER MINIGET KING KING PRESIDENT PTESIDENT MILLER MILLER CLERK CLETK REPLACE(col/value,linha,linha_alterada) Retorna o valor da coluna com toda a ocorrncia da linha de alterao. Se a linha alterada for omitida todo a linha especificada ser removida.

SELECT JOB, REPLACE(JOB,'SALESMAN','SALESPERSON'), ENAME, REPLACE(ENAME,'CO','PX') FROM EMP;


JOB ----------ANALYST SALESMAN SALESMAN MANAGER REPLACE(JOB,'SALESMAN','SALESPERSON') ------------------------------------ANALYST SALESPERSON SALESPERSON MANAGER ENAME ------------SCOTT TURNER ALLEN CLARK REPLACE(ENAME,'CO','PX') -----------------------SPXTT TURNER ALLEN CLARK

A Funo REPLACE um complemento da funo TRANSLATE que substitui caracteres um a um e o REPLACE substitui um linha por outra. Aninhamento de Funes Funes de linhas nicas podem ser aninhadas para vrias finalidades. Se funes so aninhadas, elas so avaliadas de dentro para fora. Isto por exemplo: X(D(A(B(C(caracter))))) ordem lgica de execuo C,B,A,D e X. Suponhamos que voc queira encontrar o nmero de vezes que um determinado caracter ocorre em uma linha. Como voc faria isso?

52

ORACLE RDBMS Voc pode aninhar as funes LENGTH e TRANSLATE para realizar um requisitado resultado. O exemplo seguinte permite contar o nmero de Ss em uma linha SELECT DNAME, LENGTH(DNAME), LENGTH(DNAME) - LENGTH(TRANSLATE(DNAME,'AS','A')) FROM DEPT; DNAME LENGHT(DNAME) LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A')) ---------- ------------- ----------------------------------------------RESEARCH 8 1 SALES 5 2 OPERATIONS 10 1 ACCOUNTING 10 0 Aqui esto os passos para realizar esse resultado 1. Usa-se o LENGTH para identificar

nmero

de

caracteres

da

linha.

2. Ento usa a funo TRANSLATE para fazer todas as ocorrncias de S sair da linha. SELECT LENGTH(TRANSLATE(DNAME,'AS','A')) FROM DEPT; LENGTH(TRANSLATE(DNAME,'AS','A')) --------------------------------REEARCH ALE OPERATION ACCOUNTING 3. Note que A modificado para A, e S no corresponde a nenhum caracter para ser alterado. Como S no tem nenhum caracter correspondente ele removido da linha.. 4. Agora subtrai o tamanho da linha retirado os Ss do tamanho da linha original.(com os Ss) LENGTH(DNAME)-LENGTH(TRANSLATE(DNAME,'AS','A')) 5- O Resultado o nmero de ocorrncias do caracter S na linha.

Funes Numricas
As funes aceitam entrada de nmeros e retornam valores numricos.

ROUND
ROUND(col/value,n) arredonda um coluna, expresso ou valor para n casas decimais. Se n omitido no tem casas decimais. Se n for negativo, os nmeros para esquerda do decimal so arredondados.

SELECT

ROUND(45.923,1), ROUND(45.923), ROUND(45.323,1), ROUND(45.323,-1), ROUND(SAL/32,2)

FROM EMP WHERE DEPTNO = 10;


ROUND(45.923,1) --------------45.9 ROUND(45.923) ------------46 ROUND(45.323,1) --------------45.3 ROUND(45.323,-1) ---------------40 ROUND(SAL/32,2) --------------76.56

53

ORACLE RDBMS
45.9 45.9 46 46 45.3 45.3 40 40 156.25 40.63

TRUNC
TRUNC(col/value.n) trunca a coluna, expresso ou valor para n casas decimais, ou se n omitido no tm casas decimais. Se n negativo os nmeros para esquerda das casas decimais so truncados para zero.

SELECT

TRUNC(45.923,1), TRUNC(45.923), TRUNC(45.323,1), TRUNC(45.323,-1), TRUNC(SAL/32,2)

FROM EMP WHERE DEPTNO = 10;


TRUNC(45.923,1) --------------45.9 45.9 45.9 TRUNC(45.923) ------------45 45 45 TRUNC(45.323,1) --------------45.3 45.3 45.3 TRUNC(45.323,-1) ---------------40 40 40 TRUNC(SAL/32,2) --------------76.56 156.25 40.62

CEIL
CEIL(col/value) encontra o menor valor maior que ou igual para a coluna, expresso ou valor.

SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000; CEIL(SAL) --------3000 5000 3000 CEIL(99.9) ---------100 100 100 CEIL(101.76) -----------102 102 102 CEIL(-11.1) -----------11 -11 -11

FLOOR
FLOOR(col/value) encontra o maior valor menor que ou igual para a coluna, expresso ou valor

SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000; FLOOR(SAL) ---------3000 5000 5000 FLOOR(99.9) ----------99 99 99 FLOOR(101.76) ------------101 101 101 FLOOR(-11.1) ------------12 -12 -12

54

ORACLE RDBMS

POWER
POWER(col/value,n) eleva uma coluna, expresso ou valor por uma potncia, n pode ser negativo mas deve ser um nmero, se no um erro ser retornado

SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5) FROM EMP WHERE DEPTNO = 10; SAL --------------2450.0 5000.0 1300.00 POWER(SAL,2) --------------6002500 25000000 1690000 POWER(SAL,3) --------------14706125000 125000000000 2197000000 POWER(50,5) --------------312500000 312500000 312500000

SQRT
SQRT(col/value) encontra a raiz quadrada da coluna ou valor. Se a coluna ou valor for menor que zero ser retornado nulo.

SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM) FROM EMP WHERE COMM > 0; SAL SQRT(SAL) SQRT(40) SQRT(COMM) ------------ ----------------- ------------ -------------1600.00 40 6.32455532 17.3205081 1250.00 35.3553391 6.32455532 22.3606798 1250.00 35.3553391 6.32455532 37.4165739

SIGN
SIGM(col/value) retorna -1 se a coluna, expresso ou valor negativa ou zero e 1 se for positivo

SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL) FROM EMP WHERE DEPTNO = 30; SAL-COMM ---------------1300 750 -150 1500 SIGN(SAL-COMM) ---------------1 1 -1 1 COMM-SAL ----------------1300 -750 150 -1500 SIGN(SAL-COMM) ----------------1 -1 1 -1

Freqentemente a funo SIGN usada para testar um valor se menor, maior ou igual a um segundo valor. O seguinte exemplo apresenta todos os empregados os quais o salrio maior que sua comisso. SELECT ENAME, SAL, COMM FROM EMP WHERE SIGN(SAL-COMM) = 1; ENAME ------------ALLEN WARD SAL ---------------1600 1250 COMM -------------300 500

55

ORACLE RDBMS

TURNER

1500

ABS
ABS(col/value) encontra o valor absoluto de um coluna, expresso ou valor SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL), ABS(-35) FROM EMP WHERE DEPTNO = 30; SAL -----------1600.00 1250.00 1250.00 2850.00 1500.00 950.00 COMM -----------300.00 500.00 1400.00 .00 COMM-SAL ------------1300 -750 150 -1500 ABS(COMM-SAL) -----------1300 750 150 1500 ABS(-35) -----------35 35 35 35 35 35

MOD
MOD(val1,val2) encontra o resto da diviso val1 por val2 SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40) FROM EMP WHERE DEPTNO = 30 ORDER BY COMM; SAL --------------2,850.00 950.00 1,600.00 1,250.00 1,250.00 1,500.00 COMM --------------300.00 500.00 1,400.00 .00 MOD(SAL,COMM) --------------100 250 1250 1500 MOD(100,40) --------------20 20 20 20 20 20

56

ORACLE RDBMS

Exerccio 3 - Usando Funes


Esses exerccios convm o uso de funes no somente para o SELECT mas no WHERE e ORDER BY. Se colunas sinnimas so usadas no resultado, use ento na clausula SELECT da sua declarao SQL. Oficina 1. Liste os nomes e salrios incrementados de 15% dos empregados e tambm os valores mostrados inteiros.
DEPTNO -----20 30 30 20 30 30 10 20 10 30 20 30 20 10 ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER PCTSAL ---------920 1840 1438 3421 1438 3278 3818 3450 5750 1725 1265 1093 3450 1495

2. Fazer a seguinte sada. EMPLOYEE_AND_JOB -------------------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

3. Mostrar uma lista de todos os empregados com um identificador o qual composto das primeiras duas letras de seu cargo, o meio de dois dgitos de seu nmero e o cdigo soundex do seu nome.
NAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER CODE ----------CL36S530 SA49A450 SA52W630 MA56J520 SA65M635 MA69B420 MA78C462 AN78S300 PR83K520 SA84T656 CL87A352 CL90J520 AN90F630 CL93M460

57

ORACLE RDBMS 4. Fazer uma ferramenta intensiva de pesquisa para listar os empregados com o cargo que o usurio entrar. Enter value for job : clerk
EMPNO ----7369 7876 7900 7934 ENAME ---------SMITH ADAMS JAMES MILLER JOB ---------CLERK CLERK CLERK CLERK MGR ----7902 7788 7698 7782 HIREDATE --------13-JUN-83 04-JUN-84 23-JUL-84 21-NOV-83 SAL ---------800.00 1,100.00 950.00 1,300.00 COMM ---------DEPTNO -----20 20 30 10

Se voc tiver tempo: 5. Imprima um lista dos nomes de departamentos centralizados. Assuma a coluna com a largura de 20 caracteres. DEPARTMENT -------------------ACCOUNTING OPERATIONS RESEACH SALES 6. Encontrar a primeira ocorrncia de L no nome do empregado, e substitu-la por X.
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER FIRST_OCCURENCE_OF_ L ------------------SMITH AXLEN WARD JONES MARTIN BXAKE CXARK SCOTT KING TURNER ADAMS JAMES FORD MIXLER

Funes Numricas e Alfanumricas 1. SELECT DEPTNO, ENAME, ROUND(SAL*1.15)PCTSAL FROM EMP; 2. SELECT RPAD(ENAME,10)||LPAD(JOB,10) EMPLOYEE_AND_JOB FROM EMP; 3. SELECT ENAME NAME, SUBSTR(JOB,1,2)|| SUBSTR(EMPNO,2,2)|| SOUNDEX(ENAME CODE FROM EMP; 4. SELECT * FROM EMP WHERE UPPER(JOB) = UPPER('&JOB'); 5. SELECT LPAD(' ',(20-LRNGTH(DNAME))/2)||DNAME DEPARTMENT FROM DEPT;

58

ORACLE RDBMS

6. SELECT ENAME, TRANSLATE(SUBSTR(ENAME,1,INSTR(ENAME,'L')),'L','X')|| SUBSTR(ENAME,INSTR(ENAME,'L') + 1) FIRST_OCCURRENCE_OF_L FROM EMP;

Mais Funes de Linha nica


Explicao dessa Unidade Nessa Unidade ns cobriremos funes de Data, de converso e funes que aceitam vrios tipos de entrada de dados.

Funes de Data
Funes de data operam sobre datas do ORACLE. Todas as funes de datas retornam valores de tipo data exceto MONTHS_BETWEEN o qual retorna um valor numrico.

59

ORACLE RDBMS

Armazenamento de Datas no ORACLE


Armazenamento de Datas internamente no ORACLE formato numrico, representao: Sculo Ano Ms Dia Horas Minutos Segundos O padro de data mostrados nas pesquisas DD-MON-YY.

Sysdate
Sysdate uma coluna que retorna a data e horrio corrente. Voc pode usar o SYSDATE como uma outra coluna qualquer. Por exemplo, voc pode mostrar data corrente selecionando o sysdate de uma tabela simulada chamada DUAL. A tabela DUAL uma tabela do sistema e deve ser permitido acess-la para todos os usurios. Ela contm uma coluna DUMMY e uma linha com o valor X. A tabela DUAL usada quando voc quer retornar apenas uma linha. Para mostrar a data corrente: SELECT SYSDATE FROM DUAL; Voc poderia facilmente selecionar o sysdate da tabela EMP, mas 14 sysdate seriam retornados. Usando Operadores Aritmticos Devido o fato das datas serem armazenadas como nmero, possvel fazer clculos com datas usando operadores aritmticos tal como adio e subtrao. Voc pode adicionar e subtrair nmeros constantes e bem como data de data. As operaes que voc pode realizar so: data + nmero data - nmero data - data data+nmero/24 Adicionando um nmero de dias em uma data, produzindo uma nova data subtraindo um nmero de dias de uma data, produzindo uma nova data subtraindo uma data de outra, produzindo um nmero de dias adicionando um nmero de horas em uma data produzindo um nova data

SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE - HIREDATE FROM EMP WHERE HIREDATE LIKE '%JUN%'; HIREDATE ---------------13-JUN-83 11-JUN-84 04-JUN-84 04-JUN-84 HIREDATE+7 ---------------20-JUN-83 18-JUN-84 11-JUN-84 11-JUN-84 HIREDATE-7 ---------------06-JUN-83 04-JUN-84 28-MAY-84 28-MAY-84 SYSDATE-HIREDATE ---------------1982.70628 1618.70628 1625.70628 1625.70628

60

ORACLE RDBMS

Subtraindo SYSDATE de HIREDATE coluna da tabela EMP retorna o nmeros de dias que o empregado est admitido.

MONSTHS_BEETWEEN
MONTHS_BETWEEN(data1,data2) encontra o nmero de meses entre data 1 e data2. O resultado pode ser positivo ou negativo. Se a data 1 for posterior a data2, ento o resultado ser positivo, se a data 1 for menor que a data 2 o resultado ser negativo.

SELECT MONTHS_BETWEEN(SYSDATE,HIREDATE), MONTHS_BETWEEN('01-JAN-84','05-NOV-88') FROM EMP WHERE MONTHS_BETWEEN(SYSDATE,HIREDATE)> 59;


MONTHS_BETWEEN(SYSDATE,HIREDATE) -------------------------------65.0873622 63 60.5067171 59.3454267 59.3454267 59.8292977 MONTHS_BETWEEN('01-JAN-84','05-NOV-88') ---------------------------------------58.429332 -58.429332 -58.429332 -58.429332 -58.429332 -58.429332

A parte no inteira do resultado representa um parcela do ms.

ADD_MONTHS
ADD_MONTHS(data,n) adiciona n nmeros de meses na data. n deve ser inteiro e pode ser negativo.

SELECT HIREDATE, ADD_MONTHS)HIREDATE,3), ADD_MOSTHS(HIREDATE,-3) FROM EMP WHERE DEPTNO = 20; HIREDATE ---------------------13-JUN-83 31-OCT-83 05-MAR-84 04-JUN-84 05-DEC-83 ADD_MONTHS)HIREDATE,3) ---------------------13-SEP-83 31-JAN-84 05-JUN-84 04-SEP-84 05-MAR-84 ADD_MOSTHS(HIREDATE,-3) ---------------------13-MAR-83 31-JUL-83 05-DEC-83 04-MAR-84 05-SEP-83

NEXT_DAY
NEXT_DAY(data1,caracter) data do prximo dia especificado da semana(caracter) seguinte data.1. Caracter deve ser um nmero representado um dia, ou o dia semana descrito em ingls.

SELECT HIREDATE, NEXT_DAY(HIREDATE,'FRIDAY'), NEXT_DAY(HIREDATE,6) FROM EMP WHERE DEPTNO = 20;

61

ORACLE RDBMS

HIREDATE ----------------14-MAY-84 09-JUL-84 21-NOV-83

NEXT_DAY(HIREDATE,'FRIDAY') --------------------------18-MAY-84 13-JUL-84 25-NOV-83

NEXT_DAY(HIREDATE,6) -------------------18-MAY-84 13-JUL-84 25-NOV-83

LAST_DAY
LAST_DAY(data) encontra a data do ultimo dia do ms da data especificada SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE), LAST_DAY('15-FEB-88') FROM EMP WHERE DEPTNO = 20;
SYSDATE --------------04-DEC-89 04-DEC-89 04-DEC-89 04-DEC-89 04-DEC-89 LAST_DAY(SYSDATE) --------------------------------31-DEC-89 31-DEC-89 31-DEC-89 31-DEC-89 31-DEC-89 HIREDATE --------------17-DEC-80 02-APR-81 09-DEC-82 12-JAN-83 03-DEC-81 LAST_DAY(HIREDATE) ---------------------------------31-DEC-80 30-APR-81 31-DEC-82 31-JAN-83 31-DEC-81 LAST_DAY(15-FEB-88) -----------------------------------29-FEB-88 29-FEB-88 29-FEB-88 29-FEB-88 29-FEB-88

A funo ROUND pode ser aplicada para datas.


ROUND(data) ROUND(data,MONTH) ROUND(data,YEAR) retorna a data com o horrio em 12:00(meio-dia) Isso usamos quando comparamos datas que tenham diferentes horrios. retorna o primeiro dia do ms da data, Se a data estiver na primeira metade do ms; se no retorna o primeiro do ms seguinte. retorna o primeiro dia do ano da data se data estiver na primeira metade do ano; se no retorna o primeiro do ano seguinte.

SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') FROM DUAL; SYSDATE ---------------------04-DEC-89 ROUND(SYSDATE,'MONTH') ---------------------01-DEC-89 ROUND(SYSDATE,'YEAR') ---------------------01-JAN-90

TRUNC
TRUNC(data,caracter) encontra a data do primeiro dia do ms da data quando o caracter = MONTH. Se o caracter = YEAR ele encontra o primeiro dia do ano.

SELECT SYSDATE, TRUNC(SYSDATE,'MONTH'), TRUNC(SYSDATE,'YEAR') FROM DUAL; SYSDATE ---------------------04-DEC-89 TRUNC(SYSDATE,'MONTH') ---------------------01-DEC-89 TRUNC(SYSDATE,'YEAR') ---------------------01-JAN-89

TRUNC usado se voc quiser remover o horrio do dia. O horrio contido no dia removido por padro.

62

ORACLE RDBMS

Funes de Converso
SQL possui um nmero de funes para controlar os tipos de converso de dados. Essas funes de converses converte um valor de um tipo de dado para outro. TO_CHAR(nmero,data,formato) converte nmeros e datas para formatos alfanumricos TO_NUMER(caracter) TO_DATE(caracter,formato) converte alfanumricos os quais possuem nmeros para numricos. converte um alfanumrico representando uma data, para um valor de data de acordo com o formato especificado. Se o formato omitido o formato padro DD=MON-YY.

TO_CHAR
A funo TO_CHAR freqentemente usada para modificar um formato de data padro para um formato alternativo para mostrar. TO_CHAR(data,mscara) especifica que a data est sendo convertida para um novo formato na sada.

Para converter a data corrente do formato padro (DD-MON-YY) para uma nova mscara. SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') FROM DUAL; TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') --------------------------------------TUESDAY , 05TH SEPTEMBER 1989 Note que: A mscara a qual deve estar entre aspas simples, pode ser includa em vrios formatos listados anteriormente. A coluna e mscara deve ser separadas por uma vrgula. DAY e MONTH na sada so espaados automaticamente com brancos no tamanho de 9 caracteres Para remover um espao em branco usar o FM(maneira de enchimento) prefixo: SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') FROM DUAL; TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') --------------------------------------TUESDAY, 05TH

SEPTEMBER

1989

FM pode ser usado para suprimir zeros para o formato ddth, ex.: 05TH alterado para 5TH A formato que a data ser entrada o formato que ser mostrado. TO_CHAR pode tambm ser usado para extrair o horrio de um nico dia, e mostr-lo no especificado formato. Para mostrar o formato de um dia:

63

ORACLE RDBMS

SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; TO_CHAR(SYSDATE,'HH:MI:SS') --------------------------------------08:16:24 A funo TO_CHAR tambm usada para converter um valor do tipo numrico para um valor do tipo alfanumrico. TO_CHAR(numer,nmero mscara) SELECT TO_CHAR(SAL,'$9,999') FROM EMP; TO_CHAR(SAL,'$9,999') ---------------------$1,000 $1,600 $1,250 $2,975 Note que os formatos das mscaras so opcionais. Se a mscara omitida, a data convertida para um alfanumrico valor ORACLE que padro DD-MON-YY. Se o mscara no especificada, o nmero convertido para alfanumrico. Ento note que o formato modelo no afetam o valor interno que representam o valor das colunas. Eles somente afetam como a coluna mostrada quando retirada com uma declarao SELECT. Formatos de Data Mscara Significado SCC ou CC YYYY ou SYYYY YYY ou YY ou Y Y,YYY SYEAR ou YEAR BC ou AD B.C. ou A.D. Q MM MONTH MON WW ou W DDD ou DD ou D DAY Sculo, prefixo S BCdata com - Ano, prefixo S BC data com - ltimo 3, 2 ou 1 digito(s) do ano Ano com vrgula nessa posio Ano, soletrado na sada S prefixo BC data com - BC/AD perodo BC/AD indicador com perodos Um quarto do Ano Ms nome do ms, espaamento com brancos do tamanho de 9 caracteres nome do ms, 3 letras abreviadas Semana do ano ou ms dia do ano, ms ou semana nome do dia, espaado com brancos com 9 caracteres de tamanho

64

ORACLE RDBMS DY J AM ou PM A.M. ou P.M. HH ou HH12 HH24 MI SS SSSSS /.,etc. ... nome do dia, 3 letras abreviadas data Juliana, o nmero de dias Cristo Indicador meridiano indicador meridiano com perodos horas do dia (1-12) horas do dia (0-23) minuto segundos segundos passado meia-noite(0-86399) pontuao reproduzida no resultado cotas de linhas so representadas no resultado. desde 31 dezembro 4713 antes de

Os prefixos abaixo devem ser adicionados em frente aos cdigos. Fm (mode de enchimento) Prefixo para MONTH ou DAY suprime os espaamentos em brancos, partindo um tamanho de uma varivel, FM suprimir zeros para o formato ddth. No significa que em outros cdigos uma segunda ocorrncia for FM torne brancos os espaos de novo. Os sufixos abaixo devem ser adicionados em frente dos cdigos: TH nmero ordinal(DDTH para 4TH) SP SPTH ou thsp soletrando sada do nmero(DDSP para FOUR) soletra o nmero ordinal na sada(DDSPTHpara FOURTH)

Nota: Os cdigos so ferramentas sensitivas e afetaram a amostragem dos elementos da data: DAY MONDAY Day Monday Month July Ddth 14th DdTh 14Th

65

ORACLE RDBMS Formatos Numricos Os elementos do formato numrico modelo so: Mscara 9 0 $ . , MI PR EEEE V B Significado Exemplo 1234 001234 $1234 1234.00 1,234 1234<1234> 1.234E+03 123400 1234.00

posio numrica (nmero de 9s determinam a 999999 largura mostrada) mostra zeros mostra sinal de dlar ponto decimal na posio especificada vrgula na posio especificada sinal de menos direita(valores negativos) parnteses para nmeros negativos 0999999 $999999 999999.99 999,999 999999MI 999999PR

notao cientfica(formato de conter quatro Es 99.999EEEE unicamente) multiplica pela dcima potncia 10n(n = nmero 9999V99 9s depois da V mostra valores zero em branco, no zero B9999.99

Nota: A lista de formatos numricos listas acima na tabela podem ser usados no comando Column do SQL*Plus (Ver Unidade 10).

TO_NUMER
No seguinte exemplo a funo TO_NUMBER usada para transformar um nmero armazenado como um alfanumrico para um tipo numrico: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL > TO_NUMBER('1500');
EMPNO ----7499 7566 7698 7782 7788 7839 7902 ENAME ---------ALLEN JONES BLAKE CLARK SCOTT KING FORD JOB ---------SALESMAN MANAGER MANAGER MANAGER ANALYST PRESIDENT ANALYST SAL ---------1600 2975 2850 2450 3000 5000 3000

66

ORACLE RDBMS

TO_DATE
Para mostrar todos os empregados admitidos em 4 de junho de 1984 (no formato padro), ns podemos usar a funo TO_DATE: SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE = TO_DATE('June 4,1984','Month dd, yyyy'); EMPNO ENAME HIREDATE ----- ---------- --------7844 TURNER 04-JUN-84 O contedo convertido para data e comparado com o valor de HIREDATE. A funo TO_DATE freqentemente usada para suprir o valor ORACLE em um outro valor que o do padro, Por exemplo, quando voc insere um data, o ORACLE espera ser passado o valor no formato padro DD-MON-YY. Se voc no quer usar o formato padro, voc deve usar a funo TO_DATE e apropriar o alternativo formato Por exemplo: Para entrar um linha na tabela EMP com a data no no formato padro: INSERT INTO EMP (EMPNO, DEPTNO,HIREDATE) VALUES(7777,20,TO_DATE('19/08/90','DD/MM/YY')); O comando INSERT comentado em detalhes na Unidade 14.

Funes que Aceitam Vrios Tipos de Entrada de Dados DECODE


DECODE a mais potente funo do SQL. Ele facilita pesquisas condicionais fazendo o trabalho de ferramentas ou comandos se-ento-se no. Sintaxe: DECODE(col/expresso, procurado1,resultado1,...,padro) Col/expresso comparado com cada um dos valores procurado e retorna o resultado se a col/expresso igual ao valor procurado. Se no for encontrada nenhum dos valores procurados, a funo DECODE retorna o valor padro. Se o valor padro for omitido ele retornar um valor nulo. Argumentos DECODE deve ter no mnimo 4 parmetros ou argumentos. COL/EXPRESSO - a nome da coluna ou expresso a ser avaliado. PROCURADO1 - o primeiro valor para ser testado RESULTADO1- o valor para ser retornado se o procurado1 for encontrado.

67

ORACLE RDBMS PROCURADO1 e RESULTADO1 podem ser repetidos quantas vezes forem necessrios.(PROCURADO2,RESULTADO2, PROCURADO3,RESULTADO3,...) PADRO - o valor a ser retornado se nenhum procurado for encontrado. Nota: col/expresso pode ser vrios tipos de dados. PROCURADO deve ser um dado do tipo coluna ou expresso O valor retornado forado para alguns tipos de dados como o terceiro argumento(resultado1). O seguinte exemplo decodifica os cargos dos tipos MANAGER e CLERK unicamente. Os outros cargos sero padro alterados para UNDEFINED. SELECT ENAME, JOB, DECODE(JOB,'CLERK','WORKER', 'MANAGER','BOSS', 'UNDEFINED' DECODE_JOB FROM EMP;
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB ---------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK DECODE_JOB ---------WORKER UNDEFINED UNDEFINED BOSS UNDEFINED BOSS BOSS UNDEFINED UNDEFINED UNDEFINED WORKER WORKER UNDEFINED WORKER

Para mostrar a gratificao percentual dependendo do grau do salrio: SELECT GRADE, DECODE(GRADE,'1','15%', '2','10%' '3','8%', '5%') BONUS FROM SALGRADE; GRADE --------1 2 3 4 5 BONUS ----15% 10% 8% 5% 5%

Esse exemplo ilustra como a funo decode, o valor retornado forado a ter um tipo de dado no terceiro argumento.

68

ORACLE RDBMS Ns permitimos o usurio especificar a ordem na qual a informao empregado mostrada por entrada de um valor na hora da execuo select * from emp order by decode(&orderby, 1,sal, 2,ename sal); Enter value for orderby: 2 ERROR at line 2: ORA-1722: invalid number Note que esse comando causa um erro porque o tipo de dado de ename (alfanumrico) diferente que o do sal (numrico) o qual o terceiro argumento. No exemplo abaixo, ns queremos retornar o salrio incrementado de acordo com o tipo de cargo. SELECT JOB, SAL, DECODE(JOB,'ANALYST',SAL*1.1, 'CLERK',SAL*1.15, 'MANAGER',SAL*.095, SAL) FROM EMP;

NVL
NVL(col/valor,valor) converte um valor nulo para um valor desejado. Tipo de dados devem combinar(col/valor e valor).

SELECT SAL*12+NVL(COMM,0), NVL(COMM,1000), SAL*12+NVL(COMM,1000) FROM EMP WHERE DEPTNO = 10; SAL*12+NVL(COMM,0) --------------------29400 60000 15600 NVL(COMM,1000) --------------------1000 1000 1000 SAL*12+NVL(COMM,1000) --------------------30400 61000 16600

GREATEST
GREATEST(col/valor1,col/valor2,... retorna o maior da lista de valores. Todos os col/valores so ) convertidos para um valor antes da comparao. SELECT GREATEST(1000,2000), GREATEST(SAL,COMM) FROM EMP WHERE DEPTNO = 30; GREATEST(1000,2000), ----------------------2000 2000 2000 2000 2000 GREATEST(1000,2000), ----------------------1600 1250 1400 1500

69

ORACLE RDBMS Nota: Na funo GREATEST quando na lista de valores existe um valor nulo ele considerado como o maior.

LEAST
LEAST(col/valor1,col/valor2,...) retorna o menor valor de um lista de valores. Todos os valores so convertidos antes da comparao.

SELECT LEAST(1000,2000), LEAST(SAL,COMM) FROM EMP WHERE DEPTNO = 30; LEAST(1000,2000), ----------------------1000 1000 1000 1000 1000 LEAST(1000,2000), ----------------------300 500 1250 0

Nota: Na funo LEAST quando na lista de valores existe um valor nulo ele considerado como o menor.

VSIZE
VSIZE(col/valor) retorna o nmero de bytes interno do ORACLE representando um col/valor. SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), VSIZE(SAL), VSIZE(ENAME) FROM EMP WHERE DEPTNO = 10; DEPTNO ------10 10 10 VSIZE(DEPTNO) ------------2 2 2 VSIZE(HIREDATE) ------------7 7 7 VSIZE(SAL) ------------3 2 2 VSIZE(ENAME) ------------5 4 6

Revisando Aninhamento de Funes Relembrando que funes podem ser aninhadas em vrios nveis, e que o interior do aninhamento avaliado primeiro, trabalhamos com a ltima funo externa. Ela ento seguida de um trilha de abertura e fechamento de parnteses, que deve ser o nmero de cada uma. As funes abaixo tem sido aninhadas e so executadas como a seguir: SELECT ENAME, NVL(TO_CHAR(MGR),'UNMANAGEABLE') FROM EMP WHERE MGR IS NULL; ENAME --------KING NVL(TO_CHAR(MGR),'UNMANAGEABLE') --------------------------------UNMANAGEABLE

1. MGR um coluna convertida para alfanumrica com a funo TO_CHAR. 2. A funo NVL troca um MGR nulo por uma linha de caracteres UNMANAGEABLE.

70

ORACLE RDBMS Funes aninhadas podem ento serem usadas para mostrar a data de Quinta-feira que de dois meses de hoje no formato de Day dd Month YYYY. SELECT SYSDATE, TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day dd Month YYYY') FROM DUAL;
SYSDATE --------04-DEC-89 TO_CHAR(NEXT_DAY(ADD_MONTHS(SYSDATE,2),'FRIDAY'),'Day dd Month YYYY') --------------------------------------------------------------------09 February 1990

1. A funo ADD_MONTHS adiciona dois meses para o corrente ms (dezembro). 2. A funo NEXT_DAY encontra a Quinta-feira dois meses de SYSDATE. 3. A funo TO_CHAR converte a coluna data para um tipo de alfanumrico na ordem para mostrar um no formato padro de data Day dd Month YYYY.

71

ORACLE RDBMS

Exerccio 4 - Mais Funes


Esse exerccio convm de funes de linha nica discutidas nessa Unidade, como tambm revisando algumas funes apresentadas na Unidade 4. 1. Mostrar nome e admisso dos empregados do departamento 20. Fazer com que a expresso fique com o nome de DATE_HIRED com o tamanho de 80 colunas. ENAME -------SMITH JONES SCOTT ADAMS FORD DATE_HIRED ------------------------------------------------------------June, Thirteenth 1983 October, Thirty-First 1983 March, Fifth 1984 June, Fourth 1984 December, Fifth 1983

2. Mostrar o nome com a admisso do empregado, e salrio revisando a data. Assumindo a reviso da data um ano depois da admisso. Ordem de sada por reviso de data.
ENAME ---------SMITH ALLEN JONES MILLER MARTIN FORD SCOTT WARD CLARK TURNER ADAMS BLAKE KING JAMES HIREDATE --------13-JUN-83 15-AUG-83 31-OCT-83 21-NOV-83 05-DEC-83 05-DEC-83 05-MAR-84 26-MAR-84 14-MAY-84 04-JUN-84 04-JUN-84 11-JUN-84 09-JUL-84 23-JUL-84 REVIEW --------13-JUN-84 15-AUG-84 31-OCT-84 21-NOV-84 05-DEC-84 05-DEC-84 05-MAR-85 26-MAR-85 14-MAY-85 04-JUN-85 04-JUN-84 11-JUN-85 09-JUL-85 23-JUL-85

3. Imprima uma lista de empregados mostrando justamente se o salrio maior que 1500. Se for exatamente igual 1500 mostre On Target, se menor mostre Below 1500.
ENAME ---------ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD SALARY --------------------------------------------Below 1500 1600 2850 2450 3000 Below 1500 2975 5000 Below 1500 Below 1500 3000 Below 1500 On Target Below 1500

4. Escreva uma pesquisa na qual retorne o dia da semana, para diferentes datas entradas no formato DD.MM.YY. Enter value for anydate: 12.11.88 DAY -------------------------------------------------

72

ORACLE RDBMS

SATURDAY Teste seu crebro se voc tiver tempo: 5. Escreva uma pesquisa que calcule o tempo que o empregado tem estado na companhia. Usar DEFINE para evitar as repeties tpico das funes. Enter value for employee_name: King ENAME -----------------KING LENGTH_OF_SERVICE ---------------------4 YEARS 4 MONTHS

6. Dado uma linha no formato nn/nn, muito que a primeiro e dois ltimos caracteres sejam nmeros, e que o meio um alfanumrico /. Imprima a expresso YES se vlido, 'NO' se no vlido. Use os seguintes valores para testar sua soluo 12/34 , 01/1a.99\88. VALUE VALID? ----- -----12/34 YES 7. Empregados admitidos antes da 15th dia do ms so espaados na ltima Quinta do ms. Aqueles admitidos depois do 15th so espaados da ltima quinta do ms seguinte. Imprima a lista dos empregados com suas datas de admisses e o primeiro dia de pagamento. Ordene por admisso.
ENAME ---------SMITH ALLEN JONES MILLER MARTIN FORD SCOTT WARD CLARK TURNER ADAMS BLAKE KING JAMES HIREDATE --------13-JUN-83 15-AUG-83 31-OCT-83 21-NOV-83 05-DEC-83 05-DEC-83 05-MAR-84 26-MAR-84 14-MAY-84 04-JUN-84 04-JUN-84 11-JUN-84 09-JUL-84 23-JUL-84 PAYDAY --------24-JUN-83 26-AUG-83 25-NOV-83 30-DEC-83 30-DEC-83 30-DEC-83 30-MAR-84 27-APR-84 25-MAY-84 29-JUN-84 29-JUN-84 29-JUN-84 27-JUN-84 31-AUG-84

Mais Funes Datas, Converses, Funes que aceitam vrios tipos de entrada de Dados 1. SELECT ENAME, TO_CHAR(HIREDATE,'fmMonth, Ddspth YYYY') date_hired FROM EMP WHERE DEPTNO = 20; 2. SELECT ENAME, HIREDATE, ADD_MONTHS(HIREDATE,12) REVIEW FROM EMP ORDER BY ADD_MONTHS(HIREDATE,12);

73

ORACLE RDBMS

3. SELECT ENAME, DECODE(SIGN(1500-SAL),1,'BELOW 1500',0,'On Target', SAL) SALARY FROM EMP ORDER BY ENAME; 4. SELECT TO_CHAR(TO_DATE('&ANYDATE','DD.MM.YY'),'DAY') DAY FROM DUAL; 5. DEFINE TIME = MONTHS_BETWEEN(SYSDATE,HIREDATE) SELECT ENAME, FLOOR(&TIME/12)||' YEARS '||FLOOR(MOD(&TIME,12)|| 'MONTHS' "LRNGTH OF SERVICE" FROM EMP WHERE ENAME = UPPER('&EMPLOYEE_NAME'); 6. SELECT '12/34' VALUE, DECODE( TRANSLAYE('12/34','1234567890','9999999999'), '99/99','YES','NO') "VALID?:" FROM DUAL; 7. SELECT ENAME, HIREDATE, DECODE(SIGN(TO_CHAR(HIREDATE,'DD')-151, NEXT_DAY(LAST_DAY(ADD_MONTHS(HIREDATE,1)),'FRIDAY'-7, NEXT_DAY(LAST_DAY(HIREDATE,'FRIDAY')-7) PAYDAY FROM EMP ORDER BY HIREDATE; ou SELECT ENAME, HIREDATE, NEXT_DAY(LKAST_DAY(ROUND(HIREDATE,'MONTH'))-7,'FRIDAY') PAYDAY FROM EMP ORDER BY HIREDATE;

74

ORACLE RDBMS

Funes de Grupo
Esta Unidade explica como resumir informaes permitindo ser obtida por grupos de linhas e at o uso de grupos ou agregamento de funes. Ns discutiremos como voc divide a linha em uma tabela em uma menor configurao, e como especificar critrio de pesquisa para grupo de linhas.

GROUP BY
Funes de grupo operam sobre conjuntos de linhas. Elas retornam resultados baseados sobre um grupo de linhas, antes que um resultado por linha tenha retornado como uma funo de linha nica. Como padro todas as linhas de um tabela so trilhadas como um grupo. A clausula GROUP BY da declarao do SELECT usada para dividir as linhas em menores grupos. As funes de grupos so listadas abaixo: Funo Valor Retornado AVG([DINSTINCT/ALL]n) COUNT([DINSTINCT/ALL]expr*) Valor mdio de n, ignorando os valores nulos. Contador * conta todas as linhas selecionadas, incluindo duplicadas e linhas nulas MAX([DISTINCT/ALL]expr) MIN([DISTINCT/ALL]expr) STDDEV([DISTINCT/ALL]n) SUM([DISTINCT/ALL]n) VARIANCE([DISTINCT/ALL],n) valor mximo da expresso valor mnimo da expresso Desvio padro de n, ignorando valores nulos. Valor soma de n, ignorando valores nulos. variao de n, ignorando valores nulos.

Todas as funes acima operam sobre um nmero de linhas (por exemplo, uma tabela inteira) e so portanto funes de GRUPO. DISTINCT faz uma funo de grupo considerar valores no duplicados; ALL considera todos os valores sua declarao no necessria. Os tipos de dados dos argumentos devem ser alfanumricos, numricos ou data onde a expresso listada. Todas as funes de grupo exceto o COUNT(*) ignoram os valores nulos.

75

ORACLE RDBMS

Usando Funes de Grupo: AVG


Para calcular a mdia salarial dos empregados, faa: SELECT AVG(SAL) FROM EMP; AVG(SAL) ---------2073.21429 Note que as linhas da tabela EMP so trilhadas num nico grupo.

MIN
Uma funo de grupo pode ser usada para subconjunto de linhas de uma tabela usando a clausula WHERE. Para encontrar o mnimo salrio ganho por um escriturrio, faa: SELECT MIN(SAL) FROM EMP WHERE JOB = 'CLEARK'; MIN(SAL) --------800

COUNT
Para Encontrar o nmero de empregados do departamento 20, faa: SELECT COUNT(*) FROM EMP WHERE DEPTNO = 20; COUNT(*) -------5 Nota: A funo COUNT usada dessa forma COUNT(1) tem o mesmo resultado que a acima e mais rpida.

76

ORACLE RDBMS

A clausula GROUP BY
A clausula GROUP BY pode ser usada para dividir as linhas de uma tabela em um menor grupo. Funes de grupo devem ser usadas para resumir informaes por cada grupo. Para calcular a mdia salarial de cada grupo de cargo, faa: SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB; JOB ------------ANALYST CLERK MANAGER PRESUDENT SALESMAN AVG(SAL) -------------3000 1037.5 2758.33333 5000 1400

Excluindo linhas quando estiver Usando o GROUP BY


Linhas devem ser excludas com a clausula WHERE, antes da diviso por grupos. Para mostrar a mdia salarial para cada cargo excluindo os gerentes, faa: SELECT JOB, AVG(SAL) FROM EMP WHERE JON <> 'MANAGER' GROUP BY JOB; JOB ------------ANALYST CLERK PRESUDENT SALESMAN AVG(SAL) -------------3000 1037.5 5000 1400

77

ORACLE RDBMS

Grupos dentro de Grupos


Ns podemos ento usar a clausula GROUP BY para prover resultados para grupos dentro de grupos. Para mostrar a media salarial mensal faturado por cada cargo dentro de um departamento, faa: SELECT DEPTNO, JOB, AVG(SAL) FROM EMP GROUP BY DEPTNO, JOB; DEPTNO -----10 10 10 20 20 20 30 30 30 JOB ---------CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN AVG(SAL) ---------1300 2450 5000 3000 950 2975 950 2850 1400

Funes de Grupo e Resultados Individuais


A seguinte declarao SQL retorna o mximo salrio para cada grupo. O resultado no significativo porque o cargo no mostrado no resultado. SELECT MAX(SAL) FROM EMP GROUP BY JOB; MAX(SAL) -------------3000 1300 2975 5000 1600 A mostra do cargo opcional, mas a pesquisa fica um pouco sem sentido sem ele. MAX(SAL) -------------3000 1300 2975 5000 1600 JOB ------------ANALYST CLERK MANAGER PRESIDENT SALESMAN

78

ORACLE RDBMS Suponha na mente a seguinte regra quando usar funes de grupo: Se voc inclui uma funo de grupo no comando SELECT, voc no deve selecionar resultados que no estejam declarados no GROUP BY. Por exemplo: SELECT DEPTNO, MIN(SAL) FROM EMP; ERROR at line 1: ORA-0937: not single row set function. O comando invlido porque DEPTNO tem um valor para cada linha da tabela, enquanto MIN(SAL) tem um valor para tabela inteira. Para corrigir o erro, ns devemos agrupar o item individual: SELECT DEPTNO, MIN(SAL) FROM EMP; DEPTNO -----10 20 30 MIN(SAL) ------------1300 800 950

DEPTNO no exemplo acima, no permanece um valor individual ele um nome de um grupo. Portanto existe uma regra para usar a funo GROUP BY. Se existir mais de uma coluna na declarao SELECT, ela(s) devem ser transformadas em nome de Grupo colocando-as na clausula WHERE.

A clausula HAVING
Use a clausula HAVING se voc quiser especificar o qual grupo ser mostrado. Para mostrar a mdia salarial para todos os departamentos que tiverem mais de trs empregados, faa: SELECT FROM GROUP BY HAVING DEPTNO, AVG(SAL) EMP DEPTNO COUNT(1) > 3; AVG(SAL) ----------------2175 1566.6667

DEPTNO --------------20 30

Para mostrar s os cargos, onde o mximo salrio maior ou igual a $3000, faa: SELECT JOB, MAX(SAL) FROM EMP HAVING MAX(SAL)>=3000 GROUP BY JOB; JOB ------------ANALYST MAX(SAL) -------------3000

79

ORACLE RDBMS

PRESIDENT

5000

Nota: A clausula HAVING deve preceder uma clausula GROUP BY, recomendado que seja colocado primeiro pois mais lgico. Grupos so formados e funes de grupos so calculadas antes da clausula HAVING aplicado para selecionar a sada dos grupos. A clausula WHERE no pode ser usada para restringir itens de grupo. A seguinte declarao da clausula WHERE errada. SELECT DEPTNO, AVG(SAL) FROM EMP WHERE AVG(SAL) > 2000 GROUP BY DEPTNO; ERROR at line 3: ORA-0934: set function is not allowed here Voc pode unicamente usar WHERE para restringir linhas individuais. Para restringir colunas de grupos usa-se a clausula HAVING. SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > 2000; DEPTNO -----10 20 AVG(SAL) ---------2916.66667 2175

Nota: Voc pode excluir todos os gerentes usando a clausula WHERE quando estiver agrupando por cargo. SELECT JOB, AVG(SAL) FROM EMP WHERE JOB <> 'MANAGER' GROUP BY JOB; JOB ------------ANALYST CLERK PRESIDENT SALESMAN AVG(SAL) -------------3000 1037.5 5000 1400

80

ORACLE RDBMS

A Ordem das clausulas na declarao SELECT.


SELECT FROM WHERE GROUP BY HAVING ORDER BY SQL avaliaes: 1 WHERE 2. GROUP BY 3. HAVING coluna(s) tabela(s) condio linha coluna(s) condio de grupo de linhas coluna(s); - para estabelecer linhas candidatas (no pode conter funes de grupos. - para configurar grupos para selecionar grupos para mostrar

81

ORACLE RDBMS

Exerccio 5 - Funes de Grupo


No final desses exerccios voc j se familiarizou com o uso das funes de Grupo e estar selecionando grupo de dados. Note as colunas sinnimas usadas. Oficina 1. Encontrar o mnimo salrio dos empregados. MINIMUM ------800 2. Encontrar o mnimo, mximo e a mdia dos salrios de todos os empregados. MAX(SAL) --------5000 MIN(SAL) --------800 AVG(SAL) ---------2073.21429

3. Listar o mnimo e mximo salrio para os tipos de cargo. JOB ------------ANALYST CLERK MANAGER PRESIDENT SALESMAN MAXIMUM -------------3000 1300 2975 5000 1600 MINIMUM -------------3000 1300 2975 5000 1600

4.Encontrar sada quantos gerentes sem listagem. MANAGERS --------3 5. Encontrar a mdia salarial e mdia total remunerao para cada cargo. Lembre-se vendedores recebem comisso. JOB ------------ANALYST CLERK MANAGER PRESIDENT SALESMAN MAXIMUM -------------3000 1037.5 2758.33333 5000 1400 MINIMUM -------------36000 12450 33100 60000 17350

6. Encontrar sada a diferena entre maior e menor salrio. DIFFERENCE ---------4200 7. Encontrar todos os departamentos os quais tem mais que 3 empregados DEPTNO -----COUNT(1) ---------

82

ORACLE RDBMS

20 30

5 6

8. Cheque se todos os nmeros de empregados so nicos. 9.Liste o menor espaamento empregados trabalham para cada gerente. Exclua os grupos onde o mnimo salrio menor que 1000. Ordene pelo salrio. MGR ----7788 7782 7839 7566 MIN(SAL) ---------1100 1300 2450 3000 5000

Funes de Grupo 1. SELECT MIN(SAL) MINIMUM FROM EMP; 2. SELECT FROM 3. SELECT MAX(SAL), MIN(SAL), AVG(SAL) EMP;

JOB, MAX(SAL) MAXIMUM, MIN(SAL) MINIMUM, FROM EMP GROUP BY JOB; COUNT(1) MANAGERS EMP JOB = 'MANAGER';

4. SELECT FROM WHERE 5. SELECT

JOB, AVG(SAL) AVSAL, AVG(SAL*12+NVL(COMM,0))AVCOMP FROM EMP GROUP BY JOB; MAX(SAL) - MIN(SAL) DIFFERENCE EMP; DEPTNO, COUNT(1) EMP DEPTNO COUNT(1) > 3; EMPNO EMP EMPNO COUNT(1) > 1; MGR, MIN(SAL) EMP MGR MIN(SAL) >= 1000 MIN(SAL);

6. SELECT FROM 7. SELECT FROM GROUP BY HAVING 8. SELECT FROM GROUP BY HAVING 9. SELECT FROM GROUP BY HAVING ORDER BY

83

ORACLE RDBMS

84

ORACLE RDBMS

Extraindo Dados de Mais de uma Tabela


Ligaes (Joins)
Uma ligao usada quando a pesquisa SQL requer dados de mais de uma tabela do Banco de Dados. Linhas em uma tabela devem ser ligadas a outras linhas de acordo com o valor comum existente na coluna correspondente. Existem dois tipos principais de condies de ligaes: 1. Equi-join 2. Non-equi-join

Equi-Join
Na ordem para descobrir, manualmente, qual departamento vrios empregados esto, ns comparamos a coluna DEPTNO da tabela EMP com a mesmo valor de DEPTNO na tabela DEPT. O relacionamento entre a tabela EMP e a DEPT um equi-join, em que o valor da coluna DEPTNO seja igual para ambas as tabelas( o = operador de comparao usado). Uma condio de ligao especificada na clausula WHERE: SELECT FROM WHERE coluna(s) tabela(s) condio de ligao

Para ligar as duas tabelas EMP e DEPT, faa: SELECT FROM WHERE
ENAME ---------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD

ENAME, JOB, DNAME EMP, DEPT EMP.DEPTNO = DEPT.DEPTNO;


JOB ---------MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN DNAME ---------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Voc percebe que todos os empregados tem seu respectivo nome de departamento. As linhas da EMP so combinadas com a da DEPT e s retornaram se o valor do MP.DEPTNO e DEPT.DEPTNO forem iguais. Note que a condio de ligao especifica o nome da tabela antes do nome da coluna. Isso requerido quando o nome da coluna o mesmo em ambas as tabelas. Ele necessrio para o ORACLE saber qual a coluna que ele est se referindo.

85

ORACLE RDBMS Esses requerimento ento aplicado para colunas as quais so ambguas nas clausulas SELECT ou ORDER BY. Para distinguir entre a coluna DEPTNO na EMP e uma na DEPT, faa: SELECT DEPT.DEPTNO, ENAME, JOB, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO ORDER BY DEPT.DEPTNO;
DEPTNO ---------10 10 10 20 20 20 20 20 30 30 30 30 30 30 ENAME ---------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD JOB ---------MANAGER CLERK PRESIDENT CLERK ANALYST MANAGER CLERK ANALYST SALESMAN MANAGER SALESMAN CLERK SALESMAN SALESMAN DNAME ---------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

Note que cada nmero de departamento da tabela DEPT est ligado com o nmero de departamento da EMP. Por exemplo, trs empregados trabalham no departamento 10 - ACCOUNTING - s existe trs ocorrncias.

Usando Tabelas com Sinnimos


Pode ser tedioso repetir o nome inteiro de um tabela em uma coluna. Nomes temporrios (ou sinnimos) podem ser usados na clausula FROM. Estes nomes temporrios valem unicamente para a declarao de SELECT corrente. Tabelas sinnimas devem ento ser declaradas na clausula SELECT. Isso agiliza a pesquisa em que a declarao contm muitas informaes. Tabelas Sinnimas esto sendo usadas na seguinte declarao: SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY D.DEPTNO;

86

ORACLE RDBMS Tabelas Sinnimas podem ter 30 caracteres de largura, mas os nomes curtos so melhores. Se um sinnimo for usado para uma determinada tabela na clausula FROM. Ento todas as declaraes do SELECT deve usar esse sinnimo. Produto EMPNO ENAME JOB MGR HIREDATE SAL COMM DETPNO 7788 DEPTNO 10 20 30 40 SCOTT ANALYST 766 05-MAR-84 LOC NEW YORK DALLAS CHICAGO BOSTON 3000 20

DNAME ACCOUNTING RESEARCH SALES OPERATIONS

... na ausncia da condio WHERE, cada linha da EMP ligada com cada linha de DEPT ... 56 linhas retornadas Note: Tendo a tabela EMP 14 linhas e a DEPT 4 linhas foi feito produto cartesiano.(4X14=56) Produto Quando a condio de ligao invlida ou omitida completamente o resultado um PRODUTO, e todas combinaes de linhas sero mostradas. Um produto cuida para gerar um grande nmero de linhas, e o resultado raramente usado. Voc sempre deve incluir a condio de ligao no WHERE a menos que voc no tenha nenhuma ligao entre as tabelas envolvidas.

Nom-Equi-Join
O relacionamento entre as tabelas EMP e SALGRADE um nom-equi-join, em que a coluna na EMP corresponde direto a uma coluna na SALGRADE. O relacionamento obtido usando um outro operador que o igual(=). Para avaliar um grau do salrio de um empregado necessrio que o salrio esteja entre o menor e maior faixa de salrio. O operador BETWEEN usado para construir a condio, faa: SELECT FROM WHERE
ENAME ---------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING

E.ENAME, E.SAL, S.GRADE EMP E, SALGRADE S E.SAL BETWEEN S.LOSAL AND S.HISAL;
SAL ---------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00 GRADE ---------1 1 1 2 2 2 3 3 4 4 4 4 4 5

87

ORACLE RDBMS Outros operadores como <= e >= podem ser usados. Lembre-se de especificar o menor valor primeiro, e o maior no final quando usar BETWEEN. Outra vez as tabelas sinnimas foram usadas, no porque pode haver colunas ambguas, mas por causa da performance. Regras para Ligaes de Tabelas. Na ordem para trs tabelas necessrio no mnimo duas condies de ligaes.. Para quatro necessrio no mnimo trs condies de ligaes. Uma regra simples: O nmero de tabelas menos um igual ao nmero de condies de ligaes. Essa regra no se aplica se sua tabela tiver uma Primary Key que contm mais de uma coluna. Resumo da Sintaxe SELECT [DISTINCT] coluna(s), expr, alias... FROM tabelas [alias]... WHERE [condio de ligao]... AND [condio de linha]... OR [outras condies de linhas].. GROUP BY [expr/coluna] HAVING [grupo de condies] ORDER BY [expr/coluna] [DESC/ASC] Nota: voc pode especificar condies de ligaes e outras condies juntas

88

ORACLE RDBMS

Exerccio 6 Simples Ligaes (Join)


Esses exerccios so feitos para praticar a experincia em extrair dados de mais de uma tabela, e tambm inclui tpicos que foram vistos anteriormente. Oficina 1. Mostra todos os nomes dos empregados e o nome de seus departamentos em ordem de nome de departamento.
ENAME ---------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD DNAME ---------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

2. Mostrar o nome de todos os empregados, nome e nmero do departamento:


ENAME ---------CLARK MILLER KING SMITH SCOTT JONES ADAMS FORD ALLEN BLAKE TURNER JAMES MARTIN WARD DEPTNO ---------10 10 10 20 20 20 20 20 30 30 30 30 30 30 DNAME ---------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES

3. Mostrar o nome, localizao e departamento dos empregados que tem o salrio maior que 1500 por ms.
ENAME ---------CLARK KING JONES FORD SCOTT ALLEN BLAKE LOCATION ---------NEW YORK NEW YORK DALLAS DALLAS DALLAS CHICAGO CHICAGO DNAME ---------ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH SALES SALES

89

ORACLE RDBMS 4. Proceder uma lista mostra o salrio e grau do salrio do empregado:
ENAME ---------SMITH ADAMS JAMES WARD MARTIN MILLER ALLEN TURNER JONES BLAKE CLARK SCOTT FORD KING JOB ---------CLERK CLERK CLERK SALESMAN SALESMAN CLERK SALESMAN SALESMAN MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT SAL ---------800.00 1,100.00 950.00 1,250.00 1,250.00 1,300.00 1,600.00 1,500.00 2,975.00 2,850.00 2,450.00 3,000.00 3,000.00 5,000.00 GRADE ---------1 1 1 2 2 2 3 3 4 4 4 4 4 5

5. Mostrar somente os empregados de grau 3:


ENAME ---------ALLEN TURNER JOB ---------SALESMAN SALESMAN SAL ---------1,600.00 1,500.00 GRADE ---------3 3

6. Mostrar todos os empregados de Dallas


ENAME ---------SMITH JONES BLAKE SCOTT ADAMS SAL ---------800.00 2,975.00 2,850.00 3,000.00 1,100.00 LOCATION ---------DALLAS DALLAS DALLAS DALLAS DALLAS

7.Listar nome, cargo, salrio, grau e nome do departamento para todo os empregados da companhia exceto os escriturrios. Ordene pelo salrio, mostrando o maior primeiro. ENAME JOB SAL GRADE DNAME -------------------------------------------------------KING PRESIDENT 5,000.00 5 ACCOUNTING FORD ANALYST 3,000.00 4 RESEARCH SCOTT ANALYST 3,000.00 4 RESEARCH JONES MANAGER 2,975.00 4 RESEARCH BLAKE MANAGER 2,850.00 4 SALES CLARK MANAGER 2,450.00 4 ACCOUNTING ALLEN SALESMAN 1,600.00 3 SALES TURNER SALESMAN 1,500.00 3 SALES MARTIN SALESMAN 1,250.00 2 SALES WARD SALESMAN 1,250.00 2 SALES

90

ORACLE RDBMS 8. Listar o seguinte detalhes por empregado quem ganha $36000 em um ano ou quem so escriturrios. ENAME ---------FORD SCOTT MILLER JAMES ADAMS SMITH JOB ---------ANALYST ANALYST CLERK CLERK CLERK CLERK ANNUAL_SAL ---------36000 36000 15600 11400 13200 9600 DEPTNO ---------20 20 10 30 20 20 DNAME ---------RESEARCH RESEARCH ACCOUNTING SALES RESEARCH RESEARCH GRADE ---------4 4 2 1 1 1

Simples Ligaes 1. SELECT ENAME, DNAME FROM EMP, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO; 2. SELECT ENAME, E.DEPTNO, DNAME FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO; 3. SELECT FROM WHERE AND ENAME, LOC LOCATION, DNAME EMP, DEPT EMP.DEPTNO = DEPT.DEPTNO SAL > 1500;

4. SELECT ENAME, JOB, SAL, GRADE FROM EMP, SALGRADE WHERE SAL BETWEEN LOSAL AND HISAL; 5. SELECT FROM WHERE AND 6. SELECT FROM WHERE AND ENAME, JOB, SAL, GRADE EMP, SALGRADE SAL BETWEEN LOSAL AND HISAL GRADE = 3; ENAME, SAL, LOC LOCATION EMP, DEPT EMP.DEPTNO = DEPT.DEPTNO LOC = 'DALLAS';

7. SELECT ENAME, JOB, SAL, GRADE, DNAME FROM EMP, SALGRADE, DEPT WHERE EMP.DEPTNO = DEPT.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND JOB <> 'CLERK' ORDER BY SAL DESC;

91

ORACLE RDBMS

8. SELECT ENAME, JOB, SAL*12+NVL(COMM,0) ANNUAL_SAL, D.DEPTNO, DNAME, GRADE FROM EMP E, SALGRADE, DEPT D WHERE E.DEPTNO = D.DEPTNO AND SAL BETWEEN LOSAL AND HISAL AND (SAL*12+NVL(COMM,0) = 36000 OR E.JOB = 'CLERK') ORDER BY E.JOB;

92

ORACLE RDBMS

Outros Mtodos de Ligao


Outros Mtodos de Ligao Nessa unidade estudaremos as alternativas de mtodos de ligaes.

Ligaes Externas (Outher Join)


Se uma linha no satisfazer a condio de ligao, a linha no aparecer no resultado da pesquisa. De fato no equi-join da EMP e DEPT, o departamento 40 no aparece. Isso porque no existe empregados no departamento 40. Ligao Externa EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

DEPTNO 40

DNAME OPERATIONS

LOC BOSTON

..No existe nenhum empregado no departamento 40, mas ele pode ser ligado com uma linha nula... O que falta das linhas pode ser retornado se uma ligao externa (outher join) usada na condio de ligao. O operador um sinal de mais entre parnteses (+), e colocado do lado da ligao a qual deficiente a informao. O operador tem o efeito de criar uma ou mais linha nula, para que uma ou mais linha que no tenha ligao na tabela possa ser ligada. Uma ou mais linha nula ser criada para todas as ligaes que no possui resultado. SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO (+) = D.DEPTNO AND D.DEPTNO IN (30,40) ENAME ---------------ALLEN BLAKE TURNER JAMES MARTIN WARD DEPTNO -------------30 30 30 30 30 30 40 DNAME ----------------SALES SALES SALES SALES SALES SALES OPERATIONS

O operador de ligao externa pode unicamente aparecer sobre um dos lados da expresso, do lado que tem informao faltando. Ele retorna aquelas linhas de uma tabela que no diretamente se iguala com a outra tabela. Ligando uma Tabela com Ela mesma possvel usando nomes de tabelas (sinnimas) para ligar uma tabela com ela mesma, com se ela fosse duas tabelas separadas. Isso permite linhas de uma tabela ligar com linhas na mesma tabela.

93

ORACLE RDBMS

A seguinte pesquisa mostra todos os empregados que ganham menos que seu gerente: SELECT E.ENAME EMP_NAME, E.SAL EMP_SAL, M.ENAME MGR_GSAL FROM EMP E, EMP M WHERE E.MGR = M.EMPNO AND E.SAL < MSAL; EMP_NAME -------------ALLEN WARD MARTIN TURNER JAMES MILLER ADAMS JONES BLAKE CLARK SMITH EMP_SAL --------------1600 1250 1250 1500 950 1300 1100 2975 2850 2450 800 MGR_NAME ------------BLAKE BLAKE BLAKE BLAKE BLAKE CLARK SCOTT KING KING KING FORD MGR_SAL -----------2850 2850 2850 2850 2850 2450 3000 5000 5000 5000 3000

Por favor note que a clausula FROM refere-se para EMP duas vezes, e portanto EMP tem que ter um sinnimo para cada caso - E e M. Atribuir sinnimo para um tabela significa por exemplo E significa empregados e M significa gerentes. Quando um empregado gerente o nmero de seu gerente o seu mesmo. Operadores de Conjunto Durante a introduo, o conceito de Operadores de Conjunto foram discutidos. Assim distante o curso tem falado sobre restries, ligaes, projees e produtos. INTERSECT, UNION e MINUS so falados aqui. UNION, INTERSECT e MINUS so geralmente usados para diferenciar tabelas. Eles combinam resultados de duas ou mais declaraes de SELECT em um resultado. A pesquisa deve consistir de duas ou mais declaraes do SQL ligadas por um ou mais operador de conjunto. Operadores de conjunto so geralmente chamados de Ligaes Verticais, porque a ligao no de acordo para linhas entre tabelas, mas colunas. Nos seguintes trs exemplos, as pesquisas so as mesmas, mas o operador diferente em cada caso produzido um resultado de pesquisa diferente.

94

ORACLE RDBMS

UNION
Para retornar as linhas distintas de cada uma das pesquisas, faa: SELECT FROM WHERE UNION SELECT FROM WHERE JOB EMP DEPTNO = 10 JOB EMP DEPTNO = 30;

JOB ---------CLERK MANAGER PRESIDENT SALESMAN Nota: UNION ALL retorna todas as linhas das duas pesquisas independente se houver mais de uma linha igual

INTERSECT
Para retornar somente as linhas que esto em ambas as pesquisas, faa: SELECT JOB FROM EMP WHERE DEPTNO = 10 INTERSECT SELECT JOB FROM EMP WHERE DEPTNO = 30; JOB ---------CLERK MANAGER

MINUS
Para retornar todas as linhas que tem na primeira pesquisa que no tem na segunda, faa: SELECT JOB FROM EMP WHERE DEPTNO = 10 MINUS SELECT JOB FROM EMP WHERE DEPTNO = 30; JOB ----------

95

ORACLE RDBMS

PRESIDENT possvel construir pesquisas com vrios operadores de conjuntos. Se vrios operadores de conjuntos forem usados, a ordem de execuo para declarao SQL de cima para baixo. Parnteses podem ser usados para produzir uma alternativa ordem de execuo. ORDER BY ORDER BY tem que ser nico em uma pesquisa que emprega operadores de conjunto. Se usado, o ORDER BY deve ser colocado no final da pesquisa. Ento, porque voc deve selecionar diferentes colunas em cada SELECT voc no pode usar o nome das colunas na clausula ORDER BY. Entretanto as colunas no ORDER BY devem ser referidas pelo sua relativa posio na lista do SELECT. SELECT EMPNO, ENAME, SAL FROM EMP UNION SELECT ID, NAME, SALARY FROM EMP_HISTORY ORDER BY 2; Note que no ORDER BY um numeral (2) usado para representar a posio do ENAME coluna da lista do SELECT. Esse significa que as linhas sero retornadas em ordem ascendente nome do empregado. Regras Quando Usar Operadores de Conjuntos. 1. Declaraes do SELECT devem selecionar o mesmo nmero de colunas. 2. As colunas correspondentes devem ser do mesmo tipo. 3. Linhas duplicadas sero automaticamente eliminadas.,(DISTINCT no pode ser usado). 4. O nome das colunas da primeira pesquisa ser os que aparecero no resultado. 5. A clausula ORDER BY aparecer no final da declarao. 6. Na clausula ORDER BY ser colocada apenas as posies das colunas 7. Operadores de Conjuntos podem ser usados em sub-pesquisas, ver Unidade 11/ 8. A declarao das pesquisas sero executadas de cima para baixo. 9. Vrios operadores de conjuntos podem ser usados juntos com parnteses para alterar a seqncia de execuo.

96

ORACLE RDBMS

Exerccio 7 - Outros Mtodos de Ligaes


Esses exerccios tem a funo para voc ter a oportunidade de descobrir mtodos alternativos de ligaes e algumas experincia com operadores de conjuntos. Oficina 1. Mostrar a seguinte informao
EMPNO ----7782 7839 7934 7876 7902 7566 7788 7369 7499 7698 7900 7654 7844 7521 ENAME ---------CLARK KING MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD DNAME ---------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES LOC ---------NEW YORK NEW YORK NEW YORK DALLAS DALLAS DALLAS DALLAS DALLAS CHICAGO CHICAGO CHICAGO CHICAGO CHICAGO CHICAGO

2. Mostrar os departamentos que no tem empregados DEPTNO -------------40 DNAME ----------------OPERATIONS

3. Listar todos os empregados com seus nomes e nmeros adiante seus gerentes com nome e nmero:
EMPNO ----7782 7934 7876 7902 7566 7788 7369 7499 7698 7900 7654 7844 7521 ENAME ---------CLARK MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD MGRNO ----7839 7782 7788 7566 7839 7566 7902 7698 7839 7698 7698 7698 7698 MGR_NAMR ---------KING CLARK SCOTT JONES KING JONES FORD BLAKE KING BLAKE BLAKE BLAKE BLAKE

97

ORACLE RDBMS 4. Modifique a soluo da questo 2 para mostrar KING que no tem gerente:
EMPNO ----7839 7782 7934 7876 7902 7566 7788 7369 7499 7698 7900 7654 7844 7521 ENAME ---------KING CLARK MILLER ADAMS FORD JONES SCOTT SMITH ALLEN BLAKE JAMES MARTIN TURNER WARD MGRNO ----7839 7782 7788 7566 7839 7566 7902 7698 7839 7698 7698 7698 7698 MGR_NAMR ---------KING CLARK SCOTT JONES KING JONES FORD BLAKE KING BLAKE BLAKE BLAKE BLAKE

5.Encontre o cargo que era preenchido no primeiro semestre de 1983, e o mesmo cargo que era preenchido durante o mesmo perodo em 1984. JOB ---------CLERK 6. Encontre todos os empregados que ligaram-se a companhia antes de seu gerente.
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK TURNER MILLER HIREDATE --------13-JUN-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUN-84 14-MAY-84 04-JUN-84 21-NOV-83 MGR ---------FORD BLAKE BLAKE KING BLAKE KING KING BLAKE CLARK HIREDATE --------05-DEC-83 11-JUN-84 11-JUN-84 09-JUL-84 11-JUN-84 09-JUL-84 09-JUL-84 11-JUN-84 14-MAY-84

7. Encontre outra mtodo de pesquisa para questo 2: DEPTNO -------------40 DNAME ----------------OPERATIONS

Outros Mtodos de Ligaes 1. SELECT EMPNO, ENAME, DNAME, LOC FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO; 2. SELECT FROM WHERE AND D.DEPTNO, DNAME EMP E, DEPT D E.DEPTNO(+) = D.DEPTNO E.EMPNO IS NULL;

3. SELECT EMPS.EMPNO, EMPS.ENAME, MGRS.EMPNO MGRNO, MGRS.ENAME MGR_NAMR FROM EMP EMPS, EMP MGRS WHERE EMPS.MGR = MGRS.EMP;

98

ORACLE RDBMS

4. SELECT EMPS.EMPNO, EMPS.ENAME, MGRS.EMPNO MGRNO, MGRS.ENAME MGR_NAMR FROM EMP EMPS, EMP MGRS WHERE EMPS.MGR = MGRS.EMP (+); 5. SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-83' AND '30-JUN-83' INTERSECT SELECT JOB FROM EMP WHERE HIREDATE BETWEEN '01-JAN-84' AND '30-JUN-84' 6. SELECT E.ENAME EMPLOYEE, E.HIREDATE, M.ENAME MANAGER, M.HIREDATE FROM EMP E, EMP M WHERE E.MGR = M.EMPNO AND E.HIREDATE < M.HIREDATE; 7. SELECT FROM MINUS SELECT FROM WHERE DEPTNO, DNAME DEPT EMP.DEPTNO, DNAME EMP, DEPT EMP.DEPTNO = DEPT.DEPTNO;

99

ORACLE RDBMS

Sub-pesquisas (Subqueries)
Explicao dessa Unidade Nessa Unidade ns devemos falar sobre mais avanados traos da declarao SELECT, isto : pesquisas contendo na clausula WHERE ou HAVING de outra declarao SQL Aninhamento de Sub-pesquisas. Uma sub-pesquisa uma declarao SELECT que aninhada com outra declarao SELECT e a qual retorna resultados intermedirios. Por exemplo: SELECT coluna1, coluna2, ... FROM tabela WHERE coluna = (SELECT coluna FROM tabela WHERE condio) A sub-pesquisa geralmente referida como SUB-SELECT ou SELECT interno; ele geralmente executa primeiro e a sada usada para completar a condio da pesquisa principal ou outra pesquisa. Usando sub-pesquisas permite um desenvolvimento para construes de potentes comandos de sada fceis. O aninhamento de sub-pesquisas pode ser usado quando voc precisa selecionar linhas de uma tabela com uma condio que depende de dados na mesma tabela. Sub-pesquisas de Linha nica Para encontrar o empregado que ganha o mnimo salrio na companhia (o mnimo salrio uma quantidade desconhecida), dois passos devem ser seguidos: 1. Encontrar o salrio mnimo: SELECT MIN(SAL) FROM EMP; MIN(SAL) -------800 2. Encontrar o empregado que ganha o salrio mnimo: SELECT ENAME, JOB, SAL FROM EMP WHERE SAL = (menor salrio o qual desconhecido) Ns podemos combinar os dois comandos como uma sub-pesquisa aninhada: SELECT ENAME, JOB, SAL FROM EMP WHERE SAL = SELECT MIN(SAL) FROM EMP; ENAME --------------SMITH JOB --------------CLERK SAL -----------800

100

ORACLE RDBMS

Como so processadas as Sub-pesquisas Aninhadas?


Uma declarao SELECT pode ser considerada como uma pesquisa em bloco. O exemplo acima consiste de duas pesquisas em bloco - a principal pesquisa e a pesquisa interna. A interna declarao SELECT executada primeiro, produzindo um resultado : 800. A principal pesquisa em bloco est ento processando e usa o valor retornado pela pesquisa interna para completar a condio procurada. Na essncia, a principal pesquisa finaliza-se olhando como isso: SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL = 800; No exemplo acima, o 800 um valor nico. A sub-pesquisa que retorna o valor 800 chamada de sub-pesquisa de linha nica. Quando uma sub-pesquisa retorna uma nica linha: uma linha ou operador lgico deve ser usado. Por exemplo: =, <, >, <=, etc. Para encontrar todos os empregados que tem o mesmo cargo como BLAKE ns fazemos: SELECT ENAME, JOB FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'BLAKE'); ENAME --------------JONES BLAKE CLARK JOB -----------------MANAGER MANAGER MANAGER

A pesquisa interna retorna o cargo de BLAKE o qual usado na condio WHERE da pesquisa principal. Sub-pesquisas que Retorna mais de Uma Linha A seguinte pesquisa atende para encontrar os empregados que ganham o menor salrio nos departamentos. SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL IN (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO); ENAME ------------------SMITH JAMES MILLER SAL -------------------800 950 1300 DEPTNO --------------20 30 10

101

ORACLE RDBMS Note que a pesquisa interna tem a clausula GROUP BY. Isso significa que ele pode retornar mais que um valor. Ns precisamos para usar mltiplas linhas de um operador de comparao. Neste caso o operador IN deve ser usado porque especfica uma lista de valores. O resultado obtido no mostra o departamento em que o qualificado empregado trabalha. No entanto, porque ns estamos comparando unicamente o valor do salrio, a pesquisa interna pode retornar um valor simples porque ela combina o menor salrio para um departamento, no necessariamente um empregado para cada departamento. A pesquisa deve ser rescrita em ordem para possuir a combinao de salrios de empregados e o mero do departamento com os salrios mnimos e os nmeros de departamentos:

Comparando mais de um valor:


A seguinte pesquisa encontrar aqueles empregados que ganham o menor salrio no seu respectivo departamento: SELECT ENAME, SAL, DEPTNO FROM EMP WHERE (SAL,DEPTNO) IN (SELECT MIN(SAL), DEPTNO FROM EMP GROUP BY DEPTNO); ENAME ------------------SMITH JAMES MILLER SAL -------------------800 950 1300 DEPTNO --------------20 30 10

A pesquisa acima compara uma parte da coluna. Note que as colunas da esquerda da condio procurada esto entre parnteses e que as colunas esto separadas com uma vrgula. Colunas listadas na clausula SELECT da sub-pesquisa deve estar na mesma ordem das colunas listadas na clausula WHERE da outra pesquisa e o mesmo tipo de colunas. Por exemplo: ....WHERE (numcoluna, charcoluna) = (SELECT datacoluna, numcoluna, charcoluna... ilegal. Erros Encontrados Quando uma sub-pesquisa retorna mais que uma linha e um operador de linha nica usado, SQL*Plus mostra o seguinte mensagem de erro: SELECT ENAME, SAL, DEPTNO FROM EMP WHERE SAL = (SELECT MIN(SAL) FROM EMP GROUP BY DEPTNO); ERROR: ORA-1427: single-row subquery returns more than one row (Sub-pesquisa de linha nica retornou mais de uma linha)

102

ORACLE RDBMS Se a pesquisa interna no retornar linhas, voc tem o erro: SELECT ENAME, JOB FROM EMP WHERE JOB = (SELECT JOB FROM EMP WHERE ENAME = 'SMYTHE'); ERROR: ORA-1426: single-row subquery returns no rows (Sub-pesquisa de linha nica no retornou nenhuma linha)

Operadores ANY ou ALL


Os operadores ANY ou ALL devem ser usados para sub-pesquisas que retornam mais de uma linha. Eles so usados na clausula WHERE ou HAVING em conjunto com os operadores lgicos. (=,<>, <, >, >=, <=). ANY compara um valor para cada valor retornado em uma sub-pesquisa. Para mostrar os empregados que ganham mais que o menor salrio no departamento 30, faa: SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL>ANY (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) ORDER BY SAL DESC;
ENAME ---------KING SCOTT FORD JONES BLAKE CLARK ALLEN TURNER MILLER WARD MARTIN ADAMS SAL ---------5000 3000 3000 2975 2850 2450 1600 1500 1300 1250 1250 1100 JOB ---------PRESIDENT ANALYST ANALYST MANAGER MANAGER MANAGER SALESMAN SALESMAN CLERK SALESMAN SALESMAN CLERK DEPTNO -----10 20 20 20 30 10 30 30 10 30 30 20

O menor salrio do departamento 30 950(James). A principal pesquisa tem que retornar os empregados que ganham o salrio maior que o menor salrio no departamento 30. <ANY equivalente ao IN. Quando usamos ANY, a palavra chave DISTINCT usada para prevenir a seleo de linhas ocupadas. ALL compara um valor todos os valores retornados em uma sub-pesquisa.

103

ORACLE RDBMS A seguinte pesquisa encontra os empregados que ganham mais que todos os empregados no departamento 30. SELECT ENAME, SAL, JOB, DEPTNO FROM EMP WHERE SAL>ALL (SELECT DISTINCT SAL FROM EMP WHERE DEPTNO = 30) ORDER BY SAL DESC;
ENAME ---------KING SCOTT FORD JONES SAL ---------5000 3000 3000 2975 JOB ---------PRESIDENT ANALYST ANALYST MANAGER DEPTNO -----10 20 20 20

O maior salrio no departamento 30 2850 (Blake), a pesquisa tem que retornar aqueles empregados que ganham mais que 2850. Existe salrio maior que o maior do departamento 30. O operador NOT podem ser usado com IN, ANY ou ALL.

Clausula HAVING com Sub-pesquisas aninhadas.


Sub-pesquisa aninhadas ento podem ser usadas na clausula HAVING. (Lembre-se que WHERE refere-se para linha nica e HAVING a grupos de linhas especificadas na clausula GROUP BY. Por exemplo, para mostrar os departamentos que tenham a mdia salarial maior que a do departamento 30, faa: SELECT DEPTNO, AVG(SAL) FROM EMP HAVING AVG(SAL) > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = 30) GROUP BY DEPTNO; DEPTNO ------------10 20 AVG(SAL) ------------------2916.66667 2175

Para construir uma pesquisa que encontre o cargo com maior mdia salarial, faa: SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB HAVING AVG(SAL) = (SELECT MAX(AVG(SAL)) FROM EMP GROUP BY JOB); JOB ------------PRESIDENT AVG(SAL) ------------5000

A primeira pesquisa interna encontra as mdias salariais de cada diferente grupo de cargo, e a funo MAX seleciona a maior mdia salarial. Aquele valor (5000) usada na clausula HAVING. A clausula

104

ORACLE RDBMS GROUP BY na pesquisa principal necessria porque a declarao SELECT possui uma coluna que no um item de grupo. Ordenando Dados com Sub-pesquisas Voc no deve ter uma clausula ORDER BY na sub-pesquisa. A regra restante que voc pode ter unicamente uma clausula ORDER BY para uma declarao SELECT e, se especificar, deve ser a ltima clausula no comando SELECT.

Sub-pesquisas Aninhadas
Sub-pesquisas devem ser aninhadas (usadas com outras sub-pesquisas): Mostrar o nome, cargo e admisso para os empregados que o salrio maior que o maior salrio no departamento SALES. SELECT ENAME, JOB, HIREDATE, SAL FROM EMP WHERE SAL > (SELECT MAX(SAL) FROM EMP WHERE DEPTNO = (SELECT DEPTNO FROM DEPT WHERE DNAME = 'SALES'));
ENAME ---------JONES SCOTT KING FORD JOB ---------MANAGER ANALYST PRESIDENT ANALYST HIREDATE --------31-OCT-83 05-MAR-84 09-JUL-84 05-DEC-83 SAL ---------2,975.00 3,000.00 5,000.00 3,000.00

Limites de Alinhamento
No existe limite para nveis de aninhamento para sub-pesquisas.

Diretriz
A pesquisa interna precisa ser includa entre parnteses. e precisa estar do lado direito da condio. Uma sub-pesquisa no deve ter uma clausula ORDER BY. As vrias colunas na lista do SELECT da pesquisa interna deve ser na mesma ordem como as colunas aparecem na clausula de condio da pesquisa principal. Sub-pesquisas so sempre executadas da mais profunda at a menos profunda, a menos que sejam correlatas. Operadores Lgicos e SQL devem ser usados como ANY e ALL. Sub-pesquisas podem: Retornar uma ou mais linhas. Retornar uma ou mais colunas Usar o GROUP BY e funes de grupo

105

ORACLE RDBMS

Ser usada em vrios predicados AND ou OR da mesma pesquisa externa Ligar Tabelas Retirar de diferentes tabelas que a externa Aparecer em declaraes de SELECT, UPDATE, DELETE, INSERT, CREATE TABLE. Correlacionar com uma pesquisa externa. Usar operadores de Conjunto.

Sub-pesquisas Correlatas
Uma Sub-pesquisa Correlata uma sub-pesquisa aninhada que executada uma vez para cada linha candidata considerada pela pesquisa principal e que e na execuo usa um valor de coluna da pesquisa externa. Isso origina a sub-pesquisa correlata para ser processada em uma diferente forma normal de Aninhamento de Sub-pesquisas. Uma Sub-pesquisa Correlata identificada pelo uso de colunas da pesquisa externa em sua condio. Com uma Sub-pesquisa aninhada normal, a seleo interna executada primeiro e ela executa uma vez, retornando valores para serem usados na pesquisa principal. Uma Sub-pesquisa Correlata, um outro modo, executa uma vez para cada linha candidata considerada na pesquisa externa. A pesquisa interna dirigida pela externa. Passos para executar Sub-pesquisas Correlatas. 1. Pegar linhas candidatas (trazer na pesquisa externa) 2. Executar pesquisa interna usando valores da linha candidata. 3. Usar valores retornados da pesquisa interna para qualificar ou desqualificar candidatas. 4. Repetir at no haver mais linhas candidatas. Embora as Sub-pesquisas correlatas executam repetitivamente, uma vez para cada linha da pesquisa principal, no existem sugestes de que elas so menos eficiente que sub-pesquisas no correlatas. Ns podemos usar Sub-pesquisas Correlatas para encontrar empregados que ganham um salrio maior que a mdia salarial para seus departamentos: SELECT EMPNO, ENAME, SAL, DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) ORDER BY DEPTNO;
EMPNO ----7839 7566 7788 7902 7499 7698 ENAME ---------KING JONES SCOTT FORD ALLEN BLAKE SAL ---------5000 2975 3000 3000 1600 2850 DEPTNO -----10 20 20 20 30 30

Ns podemos ver imediatamente que esse uma pesquisa correlata ento ns temos de usar uma coluna do SELECT externo no WHERE do SELECT interno. Note que o sinnimo necessrio para evitar ambigidade nos nomes das colunas. Vamos ns analisar o exemplo acima usando a tabela EMP:

106

ORACLE RDBMS A Pesquisa Principal 1. Seleciona primeiro a linha candidata - Smith no departamento 20 ganhando 800. 2. EMP da clausula FROM tem um sinnimo E o qual qualifica a coluna DEPTNO referenciada no WHERE da pesquisa interna. 3. Clausula WHERE compara 800 como valor retornado pela pesquisa interna.

A Pesquisa Interna
4. Calculo AVG(SAL) para empregados do departamento. 5. O valor da coluna E.DEPTNO o valor passado pela pesquisa externa. 6. AVG(SAL) para Smith do departamento 20 2175. 7. A linha candidata no encontra a condio, por isso descartada. 8. Repetir o passo 1 para cada linha candidata. A seleo das linhas candidatas continua com aquelas que encontrar as condies que aparecem no resultado da pesquisa. Lembre-se uma Sub-pesquisa Correlata originada por uma coluna de uma tabela ou tabela sinnima na clausula WHERE que refere-se ao valor da coluna em cada linha candidata da seleo externa. Ento Sub-pesquisa Correlata executa repetitivamente para cada linha candidata da pesquisa principal. O comando UPDATE pode conter Sub-pesquisas Correlatas. UPDATE EMP E SET (SAL,COMM) = (SELECT AVG(SAL)*1.1, AVG(COMM) FROM EMP WHERE DEPTNO = E.DEPTNO) WHERE HIREDATE = '11-JUN-85'; O comando UPDATE citado na Unidade 14.

107

ORACLE RDBMS

Operadores
Quando voc est aninhando declaraes do SELECT os operadores lgicos so todos validos como tambm ANY e ALL. Nas demais o operador EXISTS precisa ser usado.

Operador EXISTS
O operador EXISTS freqentemente usado com Sub-pesquisas correlatas. Ele testa quando um valor existe. (NOT EXISTS garante que no existe). Se o valor existir ser retornado Verdadeiro, se no existir ser retornado Falso. Para encontrar os empregados que tem no mnimo uma pessoa subordinada a ele, faa: SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP E WHERE EXISTS (SELECT EMPNO FROM EMP WHERE EMP.MGR = E.EMPNO) ORDER BY EMPNO;
EMPNO ----7566 7698 7782 7788 7839 7902 ENAME ---------JONES BLAKE CLARK SCOTT KING FORD JOB ---------MANAGER MANAGER MANAGER ANALYST PRESIDENT ANALYST DEPTNO -----20 30 10 20 10 20

Encontrar os empregados que o departamento no o da tabela DEPT: SELECT, ENAME, DEPTNO FROM EMP WHERE NOT EXISTS (SELECT DEPTNO FROM DEPT WHERE DEPT.DEPTNO = EMP.DEPTNO); no records selected Outro caminho para encontrar o departamento que no tem nenhum empregado : SELECT DEPTNO, DNAME FROM DEPT D WHERE NOT EXISTS (SELECT 'X' FROM EMP E WHERE E.DEPTNO = D.DEPTNO); DEPTNO ------------40 DNAME -------------OPERATIONS

Note que o SELECT interno no precisa retornar um valor especfico, unicamente um literal para ser selecionado.

108

ORACLE RDBMS

Por que Usar uma Sub-pesquisa Correlata?


A Sub-pesquisa Correlata um caminho de ler todas as linhas na tabela, e comparando os valores em cada linha retornada. Ela usada quando uma sub-pesquisa precisa retornar um diferente resultado ou conjuntos de resultados para cada linha candidata considerada na pesquisa principal. Em outras palavras, uma sub-pesquisa correlata usada para responder questes que as respostas dependem de valores em cada linha da pesquisa parente. O SELECT interno normalmente executado uma vez para cada linha candidata. Consideraes de Eficincia. Ns temos agora examinadas dois tipos de sub-pesquisas. Ela importante referncia que a sub-pesquisa correlata ( com EXISTS) pode ser o mais eficiente caminho de agilizar algumas pesquisas. Performance depende do uso dos ndices, o nmero de linhas retornadas pela pesquisa, o tamanho da tabela e se tabelas temporrias so requeridas para avaliar resultados temporrios. As tabelas temporrias geradas pelo ORACLE no so indexadas, e essa pode levar para o degradamento na performance para sub-pesquisas usando IN, ANY e ALL.

109

ORACLE RDBMS

Exerccio 8 - Sub-pesquisas
Esses exerccios permite a voc a escrever complexas pesquisas usando selees aninhadas e selees correlatas. Oficina. 1. Encontrar os empregados que ganham o maior salrio em cada cargo e ordenar o salrio da forma descendente.
JOB ---------PRESIDENT ANALYST ANALYST MANAGER SALESMAN CLERK ENAME ---------KING SCOTT FORD JONES ALLEN MILLER SAL ---------5,000.00 3,000.00 3,000.00 2,975.00 1,600.00 1,300.00

2. Encontrar os empregados que ganham o mnimo salrio para seu cargo. Mostrar o resultado em ordem ascendente de salrio.
ENAME ---------SMITH WARD MARTIN CLARK SCOTT FORD KING JOB ---------CLERK SALESMAN SALESMAN MANAGER ANALYST ANALYST PRESIDENT SAL ---------800.00 1,250.00 1,250.00 2,450.00 3,000.00 3,000.00 5,000.00

3. Encontrar o mais recente admitido empregado em cada departamento. Ordenado por admisso.
DEPTNO -----20 10 30 ENAME ---------ADAMS KING JAMES HIREDATE --------04-JUN-84 09-JUL-84 23-JUL-84

4. Mostre os seguintes detalhes para qualquer empregado que ganhe um salrio maior que a mdia para seu departamento. Ordenar pelo nmero de departamento.
ENAME ---------KING JONES SCOTT FORD ALLEN BLAKE SAL ---------5,000.00 2,975.00 3,000.00 3,000.00 1,600.00 2,850.00 DEPTNO -----10 20 20 20 30 30

5. Lista todos os departamentos onde no existem empregados. (Usando dessa vez um sub-pesquisa). DEPTNO --------------40 DNAME ----------------OPERATIONS

110

ORACLE RDBMS 6. Mostrar as seguintes informaes para o departamento com o maior remunerao anual faturada. DEPTNO --------------20 COMPENSATION ----------------130500

7. Quem so os trs maiores salrios da companhia? Mostrar nome e salrio.


ENAME ---------SCOTT KING FORD SAL ---------3,000.00 5,000.00 3,000.00

8. Em qual ano de maior ligaes de pessoas a companhia? Mostrar o ano e nmero de empregados. YEAR ---1984 NUMBER_OF_EMPS -------------8

9. Modificar a questo 4 para ento mostrar a mdia salarial figurada para o departamento.
ENAME ---------KING JONES SCOTT FORD ALLEN BLAKE SAL ---------5,000.00 2,975.00 3,000.00 3,000.00 1,600.00 2,850.00 DEPTNO -----10 20 20 20 30 30 DEPAVG ---------1566.66667 1566.66667 2175 2175 2175 2916.66667

10. Escrever uma pesquisa para mostrar um * na linha do mais recente empregado admitido. Mostrar o nome, admisso e mostrar um * no (MAXDATE).
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER HIREDATE --------13-JUN-83 15-AUG-83 26-MAR-84 31-OCT-83 05-DEC-83 11-JUN-84 14-MAY-84 05-MAR-84 09-JUL-84 04-JUN-84 04-JUN-84 23-JUL-84 05-DEC-83 21-NOV-83 MAXDATE -------

Sub-pesquisas 1. SELECT JOB, ENAME, SAL FROM EMP WHERE (SAL,JOB) IN (SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB) ORDER BY SAL DESC;

111

ORACLE RDBMS

2. SELECT ENAME, JOB, SAL FROM EMP WHERE (SAL,JOB) IN (SELECT MIN(SAL), JOB FROM EMP GROUP BY JOB) ORDER BY SAL; 3. SELECT DEPTNO, ENAME, HIREDATE FROM EMP WHERE (HIREDATE,DEPTNO) IN (SELECT MAX(HIREDATE), DEPTNO FROM EMP GROUP BY DEPTNO) ORDER BY HIREDATE; 4. SELECT ENAME, SAL SALARY, DEPTNO FROM EMP E WHERE SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) ORDER BY DEPTNO; 5. SELECT DEPTNO, DNAME FROM DEPT WHERE DEPTNO NOT IN (SELECT DEPTNO FROM EMP); 6. DEFINE REM = SAL*12+NVL(COMM,0) SELECT DEPTNO, SUM(&REM) COMPENSATION FROM EMP GROUP BY DEPTNO HAVING SUM(&REM) = (SELECT MAX(SUM(&REM)) FROM EMP GROUP BY DEPTNO): 7. SELECT ENAME, SAL FROM EMP E WHERE 3 > (SELECT COUNT(1) FROM EMP WHERE E.SAL < SAL); 8. COLUMN YEAR FORMAT A4 COLUMN NUMBER_OF_EMPS FORMAT 9 HEADING 'NUMBER OF EMPS' SELECT TO_CHAR(HIREDATE,'YYYY' YEAR, COUNT(EMPNO) NUMBER_OF_EMPS FROM EMP GROUP BY TO_CHAR(HIREDATE,'YYYY') HAVING COUNT(EMPNO) = (SELECT MAX(COUNT(EMPNO)) FROM EMP

112

ORACLE RDBMS

GROUP BY TO_CHAR(HIREDATE,'YYYY'));

113

ORACLE RDBMS

9. COLUMN SALARY FORMAT 999,999.99 COLUMN DEPT_AVG LIKE SALARY BREAK ON DEPTNO ON DEPT_AVG SELECT FROM WHERE AND E.ENAME ENAME, E.SAL SALARY, E.DEPTNO, AVG(A.SAL) DEPT_AVG EMP A, EMP E E.DEPTNO = A.DEPTNO E.SAL > (SELECT AVG(SAL) FROM EMP WHERE DEPTNO = E.DEPTNO) GROUP BY E.ENAME, E.SAL, E.DEPTNO ORDER BY AVG(A.SAL); 10. SELECT ENAME, HIREDATE, '*' MAXDATE FROM EMP WHERE HIREDSTE = (SELECT MAX(HIREDATE) FROM EMP) UNION SELECT ENAME, HIREDATE, ' ' FROM EMP WHERE HIREDATE <> (SELECT MAX(HIREDATE) FROM EMP);

114

ORACLE RDBMS

Escrevendo Relatrios: Parte 1


Explicao dessa Unidade Nessa Unidade os comandos SQL*Plus so usados para formatar a sada da declarao SELECT para produzir mais sofisticados relatrios. A unidade est dividida em duas partes. Parte 1 inclui comados SET para controlar a sesso do SQL*Plus, comandos para formatar colunas, e simples ttulos. Parte 2 falaremos como modificar ttulos e rodaps, NEW_VALUE, quebras e clculos resumos. No mais, ser mostrado como reunir os comandos SQL*Plus no comando arquivo com as declaraes SQL SQL v Comandos SQL*Plus SQL*Plus uma sesso na qual dois tipos de comandos devem ser usados: 1. Comandos SQL (como SQL) 2. Comandos SQL*Plus (como SAVE) Comandos SQL*Plus diferem-se de comandos SQL: 1. Eles no so relacionados com qualquer declarao SELECT. 2. Eles so entrados sobre linhas nicas. Como, uma continuao do caracter, um hfen, devem ser usados se o comando muito longo para entrar em uma linha nica. Os comandos SQL*Plus devem ser usados para afetar a apresentao dos dados retirados da declarao SELECT, e so usados para produzir relatrios, como tambm controlar a sesso e manuseio de arquivos. Algumas das seguintes caractersticas possveis em um relatrio SQL*Plus so ilustradas na prxima pgina.

115

ORACLE RDBMS

Comandos SET
Os comados SET controlam as sees na qual o SQL*Plus est correntemente operando. Os comandos geralmente um valor para uma varivel de sistema, ou torna ela ligada ou desligada. Esses comandos podem ser feitos o padro para todas as sees, incluindo as m um arquivo chamado LOGIN.SQL, o qual l todas as vezes que o SQL*Plus executado. Alternativamente se um comando SET editado durante a sesso alterando o padro, ele unicamente efetivo para aquela sesso. Existindo uma sada do sistema as variveis retornaro ao valor padro. Comandos SQL*Plus podem ser abreviados. Os sublinhados destacam as configuraes padro dos comandos abaixo. Comando ECHO(OFF/ON) FEED(BACK)(6n OFF/ON) Descrio ON faz o SQL*Plus mostrar os comandos como eles so executados de um arquivo comando. OFF no mostra. n faz SQL*Plus mostrar o nmero de registros selecionados na pesquisa quando no ltimo n ou mais registros so selecionados ON ou OFF torna isso ligado ou desligado. Tornando feedback ON configure n para 1. Setando o feedback para 0 o equivalente para tornar ele OFF.

116

ORACLE RDBMS

Comando HEAD[DING](OFF/ON) LIN[ESIZE](80n)

Descrio ON faz SQL*Plus imprimir os ttulos das colunas no relatrio. OFF no imprime. configura o nmero de caracteres que o SQL*Plus mostrar sobre uma linha antes de ser uma nova linha e ento controlar a posio de centralizao e alinhamento direita do texto. O mximo valor de n 500 configura o nmero de linhas em branco entre o ltimo ttulo da cada pgina e o primeiro ttulo da prxima pagina. Um valor de 0 faz o SQL*Plus encontrar um formulrio entre pginas. Esse limpa a tela nos demais terminais. configura o formato padro para mostrar itens de dados numricos. Texto deve ser um formato numrico, veja o comando COLUMN e a clausula FORMAT para formatos numricos descritos inferior ao tpico Opes de Coluna posterior na sesso. configura largura padro para mostrar os valores numricos. configura o nmero de linhas por pgina. ON faz com que o SQL*Plus espere um enter antes de mostrar a nova pgina. OFF suprime a espera. Texto especifica o texto que deve ser mostrado antes da espera. ON faz o SQL*Plus mostrar o texto de um comando de linha antes e depois de substituir uma varivel substituvel referente a um valor. OFF suprime a mostragem. ON faz o SQL*Plus oferecer sincronizao estatstica sobre cada declarao SQL executada. OFF suprime essa opo. configura o nmero de espaos entre colunas em uma tabela mostrada. O mximo valor de n 10 espaos entre colunas.

NEWP[AGE](1n)

NUMF[ORMAT] texto

NUM[WIDTF](10n) PAGES[ISE](24n) PAU[SE](OFF/ON texto) VER[IFY](ON/OFF)

TIMI[NG](OFF/ON) SPA[CE](1n) TERM[OUT](OFF/ON)

SQLCASE LOWER/UPPER converte os comandos SQL justamente antes a (MIXED/LOWER/UPPER) execuo. Todos os textos que o comando convertido. MIXED permite texto protegido contra modificao. Referncia para SQL*Plus Users Guide para completa lista de comandos SET.

117

ORACLE RDBMS

SHOW
Para encontrar a sada do valor de variveis SEL usar o comando SHOW. Por exemplo, para encontrar a sada do PAGESIZE, faa: SHOW PAGES[ISE] Para mostrar todos as variveis SET, faa: SHOW ALL

COLUMN
Opes de Coluna (COLUMN) O comando COLUMN estabelece opes de mostra para uma coluna. O formato : COL[UMN] coluna_nome / sinnimo lista de opes Note sobre as opes do COLUMN. 1. O nome da coluna deve referir-se para uma coluna sinnima se a coluna sinnima usada na clausula SELECT. 2. As opes devem aparecer em qualquer ordem. Elas so explicadas na seguinte pgina. 3. Uma vez que a declarao da COLUMN editada, ela permanece ativa at o final da seo do SQL*Plus. Ela continua para ser configurada enquanto outras tabelas (sem essa coluna) so mostradas. 4. Opes COLUMN podem ser desfeitas durante uma sesso.

5. Para encontrar a configurao de uma opo COLUMN, digite: COL coluna_nome/sinnimo Opes de Formatos no comando COLUMN FORMATOS PARA MOSTRAR COLUNAS COL A FORMAT A20 HEADING Department TRUNC Na 9 0 $ . , MI PR alfanumrico, n extenso posio numrica fora mostrar zeros a esquerda dlar flutuante ponto decimal Vrgula sinal de menos para direita nmeros negativos entre parnteses 999999 099999 $999999 999999.99 999,999 999999MI 999999PR 1234 001234 $1234 1234.00 1,234 1234(1234)

118

ORACLE RDBMS EEEE V B notao cientfica multiplica por 10n valores zeros em branco 99.999EEEE 9999V99 B9999.99 1.234E+03 123400 1234.00

Note
1) FORMAT 999999 2) FORMAT B9999.99 3) FORMAT B99999 - mostra brancos para zero - se um ponto decimal includo no formato, B requerido para fazer zeros ficarem brancos - no tem efeito porque 99999 j representa os zeros por brancos

ERROR MESSAGES
##### ... valor muito grande para o formato . % ... valor de diferente do formato

Outras Opes do COLUMN


WRAP TRUNC segue voc para informar ao SQL*Plus que quando o atual comentrio de uma coluna excede o tamanho especificado, que a adicional informao extendida at a prxima linha ou truncada. WARP o valor padro. move uma palavra para a prxima linha antes que divida ela entre duas linhas. Uma palavra no ser dividida em duas linhas a menos que ela seja maior que o tamanho da coluna. remove um formato de uma coluna especifica o ttulo da coluna seguinte voc especifica a justificao do ttulo da coluna. Por padro os ttulos de alfanumricos e data so mostrados justificados para a esquerda e numricos so para a direita. copia uma definio de uma coluna para definir outra. inicia uma nova linha antes a especificada coluna mostrada. configura qualquer nulo na coluna para o especificado texto. faz com que a coluna seja mostrada ou no no relatrio. especifica que o formato da coluna para uma pesquisa unicamente, depois ela ser limpada.

WORD_WRAPPED

CLEAR HEADING JUSTIFY LEFT CENTER RIGHT LIKE coluna_nome NEWLINE NULL texto PRINT NOPRINT TEMP

119

ORACLE RDBMS

Exemplos de Formatao de Colunas. COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' COLUMN JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT COLUMN EMPNO FORMAT 9999 HEADING 'Empl | No' COLUMN SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COLUMN COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' NULL 'No Comm' COLUMN REM FORMAT 999,999.99 HEADING 'Total Rem.' SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(CCOMM,0) REM FROM EMP; Dept. ------020 030 030 020 030 030 010 020 010 030 020 030 020 010 Job ----------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK Empl No ----------7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 Monthly Salary ----------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00 Y-T-D Commission ----------No Comm 300.00 500.00 No Comm 1,400.00 No Comm No Comm No Comm No Comm 0.00 No Comm No Comm No Comm No Comm Total Rem. ----------9,600.00 19,500.00 15,500.00 35,700.00 36,400.00 34,200.00 29,400.00 36,000.00 60,000.00 18,000.00 13,200.00 11,400.00 36,000.00 15,600.00

O resultado da pesquisa mostra caractersticas das opes de Formatao COLUMN. Cada coluna tem um diferente cabealho. Cabealhos justificados tem sido modificado do padro em alguns casos acima dividido em um nmero de linhas usando uma barra vertical (|). A opo NULL tendo sido usada para forar um texto ser mostrado quando um nulo normalmente aparecer. Note que o texto na coluna comisso alinhada a esquerda e nmeros so justificados para direita. Para a linha acima alfanumricos e nmeros alinh-los, atribuindo a opo NULL, com brancos. Por exemplo:

120

ORACLE RDBMS

COLUMN COLUMN COLUMN COLUMN COLUMN NULL ' COLUMN

DEPTNO FORMAT 099 HEADING 'Dept.' JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT EMPNO FORMAT 9999 HEADING 'Empl | No' SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' No Comm' REM FORMAT 999,999.99 HEADING 'Total Rem.'

SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(CCOMM,0) REM FROM EMP; Dept. ------020 030 030 020 030 030 010 020 010 030 020 030 020 010 Job ----------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK Empl No ----------7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934 Monthly Salary ----------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00 Y-T-D Commission ----------No Comm 300.00 500.00 No Comm 1,400.00 No Comm No Comm No Comm No Comm 0.00 No Comm No Comm No Comm No Comm Total Rem. ----------9,600.00 19,500.00 15,500.00 35,700.00 36,400.00 34,200.00 29,400.00 36,000.00 60,000.00 18,000.00 13,200.00 11,400.00 36,000.00 15,600.00

A clausula SELECT pode conter colunas sinnimas, colunas com uma tabela fixa, expresses e textos os quais determinam o nome da coluna especificado no comando COLUMN do SQL*Plus. Se esta for a lista de itens do SELECT. Usar esse nome de coluna no comando COLUMN: Sal emp.sal e.sal sal*12+nvl(comm,0) sal*12 annsal Sysdate empno||-||ename To_char(hiredate,ddth MONYYYY) To_char(sysdate,Day Mon YY) Today sal sal sal sal*12+nvl(comm,0) sal*12 annsal sysdate empno||-||ename To_char(hiredate,ddth MONYYYY) Today

121

ORACLE RDBMS

122

ORACLE RDBMS

Os comandos TTITLE e BTITLE


Os comandos TTITLE e BTITLE so usados para produzir ttulos nas pginas. Comando TTITLE texto BTITLE texto Descrio imprime a data corrente no topo esquerdo de cada pgina, o nmero da pgina no topo a direita e o ttulo na linha abaixo centralizado. imprime o texto centralizado no rodap de cada pgina. Em ambos os casos se um | for colocado causa o seguinte o texto centraliza-se na prxima linha. mostra o corrente TTITLE e BTITLE cancela os ttulos e rodaps definidos anteriormente.

TTITLE BTITLE TTITLE OFF BTITLE OFF

COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' COLUMN JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT COLUMN EMPNO FORMAT 9999 HEADING 'Empl | No' COLUMN SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COLUMN COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' NULL 'No Comm' COLUMN REM FORMAT 999,999.99 HEADING 'Total Rem.' TTITLE 'COMPANY REPORT|Produced by Personnel Dept' BTITLE 'Company Confidential' SELECT DEPTNO, JOB, EMPNO, SAL, COMM, FROM EMP; Thu Dec 1 COMPANY Produced by Personnel Dept Empl Dept. Job No ------- --------------------020 CLERK 7369 030 SALESMAN 7499 030 SALESMAN 7521 020 MANAGER 7566 030 SALESMAN 7654 030 MANAGER 7698 010 MANAGER 7782 020 ANALYST 7788 010 PRESIDENT 7839 030 SALESMAN 7844 020 CLERK 7876 030 CLERK 7900 020 ANALYST 7902 010 CLERK 7934 Company Confidential SAL*12+NVL(CCOMM,0) REM Page 1 Monthly Salary ----------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00 Y-T-D Commission ----------No Comm 300.00 500.00 No Comm 1,400.00 No Comm No Comm No Comm No Comm 0.00 No Comm No Comm No Comm No Comm

Total Rem. ----------9,600.00 19,500.00 15,500.00 35,700.00 36,400.00 34,200.00 29,400.00 36,000.00 60,000.00 18,000.00 13,200.00 11,400.00 36,000.00 15,600.00

123

ORACLE RDBMS

Exerccio 9 - Um bsico relatrio tabular.


Esse exerccio d a voc a oportunidade para usar comandos de formatao para produzir um relatrio muito simples da pesquisa SQL usando os comandos SQL*Plus. Questes de Relatrios: 1. Construir um declarao SELECT. Fazer uma coluna e dados ordenados e qualquer funo requerida incorporada 2. Salvar a declarao SELEC. (Save arquivo_nome) 3. Editar o arquivo salvo. Fazer todos os controles da sesso e opes de formatao para o SELECT, e adicionar todos os comandos para limpar as configuraes aps o comando de execuo. 4. Salve o arquivo com as modificaes e usar o comando START para executar seu arquivo. select initcap(ename) sal*12+nvl(comm,0) To_char(hiredate,'MM/YY') mgr from emp order by ename / a, b, c,

COMANDO ARQUIVO SQL*PLUS


1. Compor uma declarao SELECT. 2. SAVE arquivo_nome 3. Edit arquivo_nome SET COL TTITLE BTITLE SELECT ... / TTITLE OFF COL DEPTNO CLEAR COL EMPNO CLEAR etc. 4. CTRL Z 5. EXIT ou QUIT 6. START arquivo_nome Configurao acima SQL*Plus Sesso

SQL

Limpar Sesso SQL*plus

124

ORACLE RDBMS

Exerccio 9 - Relatrio Tabular


Produzir um relatrio o qual mostra similar ao seguinte. Fri Mar 31 EMPLOYEE REPORT
Department ---------ACCOUNTING ACCOUNTING ACCOUNTING RESEARCH RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES SALES SALES SALES SALES Job ---------CLERK MANAGER PRESIDENT ANALYST ANALYST CLERK CLERK MANAGER CLERK MANAGER SALESMAN SALESMAN SALESMAN SALESMAN

Page 1
Emp. No. ---------7934 7782 7839 7788 7902 7369 7876 7566 7900 7698 7499 7654 7844 7521 Name ---------MILLER CLARK KING SCOTT FORD SMITH ADAMS JONES JAMES BLAKE ALLEN MARTIN TURNER WARD Hire Date ---------01/82 06/81 11/81 12/82 12/81 12/80 01/83 04/83 12/81 05/81 02/81 09/81 09/81 02/81 Monthly Salary ---------1,300.00 2,450.00 5,000.00 3,000.00 3,000.00 1,000.00 1,100.00 2,975.00 950.00 2,850.00 1,600.00 1,250.00 1,500.00 1,250.00 Annual Comm ---------Total ---------15,600.00 29,400.00 60,000.00 36,000.00 36,000.00 12,000.00 13,200.00 35,700.00 11,400.00 34,200.00 19,500.00 16,400.00 18,000.00 15,500.00

300.00 1,400.00 0.00 500.00

CONFIDENTIAL

125

ORACLE RDBMS

Escrevendo Relatrios Bsicos


SET SET SET SET COL COL COL COL COL COL COL COL ECHO OFF PAGESIZE 24 FEEDBACK OFF LINESIZE 78 A B C D E F G H FORMAT A10 HEADING 'Department' FORMAT A9 HEADING 'Job' FORMAT 9999 HEADING 'Emp.|No.' FORMAT A8 HEADING 'Name' FOMAT A5 HEADING 'Hire|Date' FORMAT B99,999.99 HEADING 'Monthly|Salary' FORMAT 9,990.00 HEADING 'Annual|Comm' FORMAT 999,999.99 HEADING 'Total'

TTITLE 'EMPLOYEE REPORT' BTITLE 'CONFIDENTIAL' SELECT DNAME A, JOB B, EMPNO C, ENAME D, TO_CHAR(HIREDATE,'MM/YY') E, SAL F, COMM G, SAL*12+NVL(COMM,0) H FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY DNAME, JOB / CLEAR COLUMNS TTITLE OFF BTITLE OFF SET FEEDBACK ON SET PAGES 24

126

ORACLE RDBMS

Escrevendo Relatrio: Parte 2


Nessa Unidade ns falaremos: Fazendo Ttulos e Rodaps A varivel NEW_VALUE O comando BREAK O comando COMPUTE.

Os comandos TTITLE e BTITLE


Fazendo Ttulos e Rodaps Os comandos TTITLE e BTITLE podem incluir um nmero de clausulas, habilitar a aparncia do ttulo para ser especificada em mais detalhes. TI[TLE] (printspec OFF ON) printspec define o ttulo e deve conter vrias clausulas BTI[TLE] (printspec OFF ON) printspec define o rodap e deve conter vrias clausulas. Clausulas no Printspec: COL n SKIP n salto para imprimir a posio n da corrente linha salto para o incio da nova linha n vezes. Se n omitido, salta uma linha; se 0, retorna para o incio da linha corrente.(retorna se n for negativo) salta adiante n posies (retorna se n negativo) alinhar esquerda, centralizar ou alinhar direita dados na linha corrente. Os dados itens com o seguinte essa clausula so alinhados como um grupo, acima para o final; do comando TTITLE ou o prximo LEFT, CENTER ou COLUMN. (CENTER e RIGHT usam o valor do SET LINESIZE para calcular a posio dos dados). define o formato dos dados, acima a prxima clausula FORMAT ou o final do comando. O especificao formato como a clausula FORMAT do comando COLUMN. Unicamente um formato deve ser efetivado por vez. Se o formato for diferente do tipo do item ele no tem efeito sobre o item em particular.

TAB n LEFT, CENTER e RIGHT

FORMAT

Incluindo Nmeros de Pginas e Outras Variveis do Sistema: SQL.PNO A varivel de sistema para a corrente nmero da pgina do relatrio. Voc deve referir-se para uma varivel de sistema prefixada de SQL.. Por exemplo para usar a varivel PNO voc escreve: TTITLE RIGHT Page SQL.PNO. Isso produzir Page 1 no final do lado direito da linha se a corrente pgina for 1.

127

ORACLE RDBMS

SQL.LNO SQL.USER SQL.SQLCODE

A varivel de sistema para o nmero da linha. Ele deve ento ser referenciado da mesma forma que PNO. A varivel de sistema para o nome do usurio. Ele deve ento ser referenciado da mesma forma que PNO. O varivel que mostra e valor para o mais recente operao do SQL retorna cdigo de erros.

O seguinte exemplo mostra algumas formas da opes TTITLE e BTITLE avaliadas: TTITLE LEFT FORMAT 0999 'Page :'SQL.PNO RIGHT 'Produced by : Accounting' SKIP 2 CENTER 'Confidential Sales Report' SKIP CENTER '-------------------------' SKIP 2 BTITLE CENTER 'End of Report' SEKIP CENTER '-------------' SELECT ENAME, JOB, SAL COMM FROM EMP WHERE COMM IS NOT NULL Page : 0001 Confidential Sales Report
ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER JOB ---------CLERK SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER ANALYST PRESIDENT SALESMAN CLERK CLERK ANALYST CLERK

Produced by : Accounting
COMM ---------300.00 500.00 1,400.00

SAL ---------800.00 1,600.00 1,250.00 2,975.00 1,250.00 2,850.00 2,450.00 3,000.00 5,000.00 1,500.00 1,100.00 950.00 3,000.00 1,300.00

.00

End of Report -------------

A opo NEW_VALUE
Uma usual caracterstica de valores de colunas planejadas no SQL*Plus. As variveis podem ser usadas: para dinmica modificao do SQL para um relatrio para configurar os ttulos dos relatrios para passar um valor de uma declarao SQL para outra.

128

ORACLE RDBMS

COLUMN SYSDATE NEW_VALUE TODAY NOPRINT SELECT SYSDATE FROM SYS.DUAL; TTITLE LEFT 'Date : 'TODAY RIGHT FORMAT 999 'Page : 'SQL.PNO SKIPLEFT 'User : ' SQL.USER SKIP CENTER 'A Report with Reformatted Date in Title' skip 2 Date : 01-DEC-88 1 User : JCOLLINS A Report with Reformatted Date in Title Note as vrias novidades sobre o exemplo acima: COLUMN SYSDATE NEW_VALUE TODAY NOPRINT A opo new_value do comando column especifica que quando o nome da coluna SYSDATE selecionado, ele ser passado para a varivel TODAY a qual retornar o novo valor. A opo NOPRINT suprime a impresso do SYSDATE como separao do relatrio. SELECT SYSDATE FROM SYS.DUAL SYSDATE selecionada da tabela SYS.DUAL. SYSDATE uma pseudo-coluna a qual sempre retorna a data corrente. SYS.DUAL uma tabela conveniente para referenciar como ela contm uma nica linha e deixa portanto retornar o dia de hoje unicamente. TTITLE LEFT 'Date : ' TODAY TTITLE referencia a varivel chamada TODAY. Porque TODAY j foi definida pela declarao COLUMN, ela reorganizada pelo SQL*Plus para conter a data atual. O exemplo abaixo mostra no incio NEW_VALUE usado para passar um valor de uma declarao SQL para outra. COL MAX_SAL NEW_VALUE MAX_SAL SELECT MAX(AVG(SAL)) MAX_SAL FROM EMP GROUP BY JOB / SELECT JOB FROM EMP GROUP BY JOB HAVING AVG(SAL) = &MAX_SAL Os relatrios produzidos pelas declaraes SQL sero os seguintes: MAX_SAL ---------5000 JOB ----------Page :

129

ORACLE RDBMS

PRESIDENT Suprimindo Valores Duplicados e Quebrando um Relatrio em Sesses As linhas de um relatrio devem ser quebradas em sesses usando o comando BREAK. Pela quebra na coluna, a mostra de valores duplicados na coluna suprimida. Voc pode ento deixar linhas em branco ou iniciar uma nova pgina entre sesses. Desde ento uma quebra ocorrer para cada vez que o valor da coluna for modificado, voc deve lembrar-se do ORDER BY a coluna na declarao SELECT ou seu relatrio ser dividido sem sentido de sesso. Esse pode unicamente ser um comando BREAK ativo de uma vez; onde se voc requerer mltiplas quebras elas devem todas ser especificadas em um comando BREAK. Voc deve listar as colunas de quebra em ordem de importncia.

Opes de Quebra
Quebras podem ser ativadas em: coluna linha pgina relatrio Um comando BREAK ON REPORT deixa um resumo dos clculos. Em qualquer quebra, as seguintes opes podem ser especificadas. Opes Descrio PAGE SKIP n DUP[LICATE] joga uma pgina quando o valor da coluna modificado salta n nmero de linhas quando o valor modificado duplica valores. O padro NODUP[LICATE]

Exemplos: BREAK ON REPORT ON DEPTNO PAGE ON JOB SKIP 2 BREAK ON REPORT ON DEPTNO PAGE ON JOB DUP Para limpar as quebras edite o comando: CLEAR BREAK Para mostrar as quebras correntes edite o comando: BREAK O seguinte exemplo mostra o seguinte uso de QUEBRAS: COLUMN DEPTNO FORMAT 099 HEADING COLUMN JOB FORMAT A9 HEADING COLUMN EMPNO FORMAT 9999 HEADING COLUMN SAL FORMAT 99,999.99 HEADING COLUMN COMM FORMAT 99,990.99 HEADING NULL 'No Comm' COLUMN REM FORMAT 999,999.99 HEADING 'Dept.' 'Job' JUSTIFY RIGHT 'Empl|No' 'Monthly|Salary' 'Y-T-D|Commission' 'Total Rem.'

130

ORACLE RDBMS

TTITLE 'COMPANY REPORT|Produced by Personnel Dept' BTITLE 'Company Confidential' BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM EMP ORDER BY DEPTNO, JOB; Nota: No esquecer da ordem pois sem ela a quebra por sesso fica sem sentido. Thu Dec 1 COMPANY Produced by Personnel Dept Empl Dept. Job No ------- --------------------010 CLERK 7934 MANAGER 7782 PRESIDENT 7839 020 ANALYST CLERK MANAGER 030 CLERK MANAGER SALESMAN 7788 7902 7369 7876 7566 7900 7698 7499 7521 7654 7844 Page 1 Monthly Salary ----------1,300.00 2,450.00 5,000.00 3,000.00 3,000.00 800.00 1,100.00 2,975.00 950.00 2,850.00 1,600.00 1,250.00 1,250.00 1,500.00 Y-T-D Commission ----------No Comm No Comm No Comm No No No No No Comm Comm Comm Comm Comm

Total Rem. ----------15,600.00 29,400.00 60,000.00 36,000.00 36,000.00 9,600.00 13,200.00 35,700.00 11,400.00 34,200.00 19,500.00 15,500.00 36,400.00 18,000.00

No Comm No Comm 300.00 500.00 1,400.00 0.00

Company Confidential

O Comando COMPUTE
Clculos Resumos O comando COMPUTE realiza clculos sobre as quebras estabelecidas pelo comando BREAK. COMPUTE clausula(s) OF coluna(s) ON quebras Comando OF ON Clausula AVG COU(NT) Descrio especifica a coluna ou expresso que o valor ser calculado. especifica os dados ou elementos da tabela para ser usado como na quebra. Calculo Valor Mdio conta os valores no nulos Aplicvel colunas numrica todos os tipos para os tipos de

131

ORACLE RDBMS

MAX[IMUM] MIN[IMUM] NUM[BER] STD SUM

valor mximo valor mnimo contador de linhas desvio padro soma de valores no nulos

numrica, alfanumrica numrica, alfanumrica todos os tipos numrica numrica

VAR[IANCE] variao numrica Aqueles podem ser muitos comandos COMPUTE, Embora ele facilitado para especificar todos os requeridos clculos em um comando. Por exemplo: COMPUTE SUM AVG OF SAL COMM ON DEPTNO REPORT deixa o calculo total e mdia salarial e comisso figuradas na sesso DEPTNO e no final do relatrio. Para limpar todos os clculos configurados, edite o comando: CLEAR COMPUTES Para mostrar o corrente, edite o comando: COMPUTE A sada derivada do seguinte comando SQL*Plus pode ser vista sobre a pgina. COLUMN DEPTNO FORMAT 099 HEADING 'Dept.' COLUMN JOB FORMAT A9 HEADING 'Job' JUSTIFY RIGHT COLUMN EMPNO FORMAT 9999 HEADING 'Empl|No' COLUMN SAL FORMAT 99,999.99 HEADING 'Monthly|Salary' COLUMN COMM FORMAT 99,990.99 HEADING 'Y-T-D|Commission' NULL 'No Comm' COLUMN REM FORMAT 999,999.99 HEADING 'Total Rem.' TTITLE 'COMPANY REPORT|Produced by Personnel Dept' BTITLE 'Company Confidential' BREAK ON DEPTNO SKIP 1 ON JOB ON REPORT COMPUTE AVG SUM OF SAL COMM ON DEPTNO REPORT SELECT DEPTNO, JOB, EMPNO, SAL, COMM, SAL*12+NVL(COMM,0) REM FROM EMP ORDER BY DEPTNO, JOB;

Thu Dec 1 COMPANY Produced by Personnel Dept Empl Dept. Job No ------- --------------------010 CLERK 7934 MANAGER 7782 PRESIDENT 7839 avg

Page 1 Monthly Salary ----------1,300.00 2,450.00 5,000.00 ----------2,916.67 Y-T-D Commission ----------No Comm No Comm No Comm -----------

Total Rem. ----------15,600.00 29,400.00 60,000.00

132

ORACLE RDBMS

sum 020 ANALYST CLERK MANAGER avg sum 030 CLERK MANAGER SALESMAN 7900 7698 7499 7521 7654 7844 7788 7902 7369 7876 7566

8,750.00 3,000.00 3,000.00 800.00 1,100.00 2,975.00 ----------2,175.00 10,875.00 950.00 2,850.00 1,600.00 1,250.00 1,250.00 1,500.00 ----------1,566.67 9,400.00 ----------2,073.21 29,025.00

0.00 No Comm No Comm No Comm No Comm No Comm ----------0.00 No Comm No Comm 300.00 500.00 1,400.00 0.00 ----------550.00 2,200.00 ----------550.00 2,200.00 11,400.00 34,200.00 19,500.00 15,500.00 36,400.00 18,000.00 36,000.00 36,000.00 9,600.00 13,200.00 35,700.00

avg sum

Company Confidential SQL*PLUS ARQUIVO DE COMANDOS 1. Compor uma declarao SELECT 2. SAVE arquivo_nome 3. EDIT arquivo_nome SET COL TTITLE BREAK COMPUTE etc. SELECT ... / TTITLE OFF CLEAR BREAKS CLEAR COMPUTERS CLEAR COLUMNS Etc. 4. CTRL Z 5. EXIT ou QUIT 6. START arquivo_nome CONFIGURAO SESSO SQL*Plus

SQL LIMPAR SESSO SQL*Plus

133

ORACLE RDBMS

Exerccio 10 - Relatrios com Quebras.


Esse exerccio ser para voc ter a oportunidade de produzir relatrios com ttulos e clculos. Oficina Acrescentaremos na simples criao do relatrio do exerccio 9 para produzir o seguinte relatrio baseado na apresentao a seguir: Thu Dec 1 E M P L O Y E E Dept. ------010 sum R E P O R T Empl No ----------7934 7782 7839 Monthly Salary ----------1,300.00 2,450.00 5,000.00 ----------8,750.00 3,000.00 3,000.00 1,000.00 1,100.00 2,975.00 ----------11,075.00 950.00 2,850.00 1,600.00 1,250.00 1,250.00 1,500.00 ----------9,400.00 ----------29,205.00 Confidential Y-T-D Commission ----------No Comm No Comm No Comm ----------0.00 No Comm No Comm No Comm No Comm No Comm ----------0.00 No Comm No Comm 300.00 500.00 1,400.00 0.00 ----------2,200.00 ----------2,200.00 Total Rem. ----------15,600.00 29,400.00 60,000.00 ----------105,000.00 36,000.00 36,000.00 12,000.00 13,200.00 35,700.00 ----------132,900.00 11,400.00 34,200.00 19,500.00 15,500.00 36,400.00 18,000.00 ----------115,000.00 ----------352,900.00 Page 1

Job ----------CLERK MANAGER PRESIDENT

020

ANALYST CLERK MANAGER

7788 7902 7369 7876 7566

sum

030

CLERK MANAGER SALESMAN

7900 7698 7499 7521 7654 7844

134

ORACLE RDBMS 2. Tente o seguinte relatrio baseado na tabela abaixo Por favor entre com o departamento nmero : 30 Thu Dec 1 Page 1 E M P L O Y E E Dept. ------030 R E P O R T Empl No ----------7900 7698 7499 7521 7654 7844 Monthly Salary ----------950.00 2,850.00 1,600.00 1,250.00 1,250.00 1,500.00 ----------9,400.00 ----------9,400.00 Confidential Y-T-D Commission ----------No Comm No Comm 300.00 500.00 1,400.00 0.00 ----------2,200.00 ----------2,200.00 Total Rem. ----------11,400.00 34,200.00 19,500.00 15,500.00 36,400.00 18,000.00 ----------115,000.00 ----------115,000.00

Job ----------CLERK MANAGER SALESMAN

135

ORACLE RDBMS

Escrevendo Relatrios com Quebras


1. SET SET SET SET ECHO OFF PAGESIZE 37 FEEDBACK OFF LINESIZE 78 R E P O R T '

TTITLE 'E M P L O Y E E BTITLE 'Confindential'

DEFINE COMM = 'NVL(COMM,0)' COL COL COL COL COL COL COL A B C D E F G FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT A10 A9 9999 A5 B99,999.99 9,990.99 999,999.00 HEADING HEADING HEADING HEADING HEADING HEADING HEADING 'Department' TEMP 'Job' TEMP 'Emp.|No' TEMP 'Hire|Date' TEMP 'Monthly|Salary' TEMP 'Annual|Comm' TEMP 'Total' TEMP

BREAK ON REPORT ON A SKIP 2 ON B COMPUTE SUM OF E F G SKIP 2 ON REPORT A SELECT DNAME A, JOB B, EMPNO C, TO_CHAR(HIREDATE,'MM/YY') D, SAL E, &COMM F, SAL*12+&COMM G FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO ORDER BY DNAME, JOB / TTITLE OFF BTITLE OFF SET FEEDBACK ON SET PAGES 24 CLEAR BREAKS CLEAR COMPUTES 2. SET SET SET SET

ECHO OFF PAGESIZE 37 FEEDBACK OFF LINESIZE 78 R E P O R T '

TTITLE 'E M P L O Y E E BTITLE 'Confindential'

DEFINE COMM = 'NVL(COMM,0)'

136

ORACLE RDBMS

ACCEPT DEPTNO NUMBER PROMPT 'Por favor entre com o numero do departamento'

COL COL COL COL COL COL COL

A B C D E F G

FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT FORMAT

A10 A9 9999 A5 B99,999.99 9,990.99 999,999.00

HEADING HEADING HEADING HEADING HEADING HEADING HEADING

'Department' TEMP 'Job' TEMP 'Emp.|No' TEMP 'Hire|Date' TEMP 'Monthly|Salary' TEMP 'Annual|Comm' TEMP 'Total' TEMP

BREAK ON REPORT ON A SKIP 2 ON B COMPUTE SUM OF E F G SKIP 2 ON REPORT A SELECT DNAME A, JOB B, EMPNO C, TO_CHAR(HIREDATE,'MM/YY') D, SAL E, &COMM F, SAL*12+&COMM G FROM EMP E, DEPT D WHERE E.DEPTNO = D.DEPTNO AND E.DEPTNO = &DEPTNO ORDER BY DNAME, JOB / TTITLE OFF BTITLE OFF SET FEEDBACK ON SET PAGES 24 CLEAR BREAKS CLEAR COMPUTES

137

ORACLE RDBMS

Desenho e Termologia do Bsico Banco de Dados Relacional


Explicao dessa Unidade O objetivo dessa Unidade introduzir a voc alguns Desenhos e Terminologia do Bsico Relacional. Ns no pretendemos ensina como desenhar um Banco de Dados. Desenho de Banco de Dados mencionado em detalhes no Curso de Desenho de Sistemas Relacionais (Curso RSD). Desenho Para qualquer Sistema de Banco de Dados que deve realmente ser uma estratgia, analisado, desenhado e construindo por fase. A sada de uma fase comea na entrada da prxima. Nesse caminho erros so encontrados mais facilmente e assim nessa ordem diminuem os custos. A sada do estgio de DESENHO especifica a entrada na fase de CONSTRUO. Ns temos alcanado o ponto onde precisamos para construir tabelas, como Desenho e Terminologia Bsica que precisamos para sermos introduzidos. O Desenho tem o propsito para criar um fsico desenho para implementao baseado sobre as sadas das fases analisadas. O Estgio de Anlise produz o Diagrama de Entidade e Relacionamento o qual provm uma descrio detalhada do negcio. O modelo e entidade uma ferramenta de comunicao. Ela usada para representar o significado da coisa - pessoa, objeto fsico, atividades - sobre o qual ns queremos armazenar dados e associar-se entre eles. Essa ordem de modelo algumas vezes referido como o Modelo Conceitual.

138

ORACLE RDBMS

Simples Diagrama de Entidade e Relacionamento

TAREFA Data Incio Data Trmino Taxa Faturamento Tipo Tarefa

PROJETO Nmero Projeto Decrio Projeto Data Incio

EMPREGADO Nmero Empregado Nome Empregado Cargo

DEPARTAMENTO Nmero Departamento Nome Departamento Localizao

Como ler o Diagrama


DEPARTAMENTO EMPREGADO

Cada departamento pode possuir um ou mais empregado(s). Cada empregado deve possuir um nico departamento.

O Diagrama de Tabelas
O Diagrama de Tabelas provm de descries da tabela. Basicamente entidade provm um molde para as tabelas do Banco de Dados. O desenho produz inicialmente desenhos das tabelas sobre mapas simples de entidades para as tabelas. Nossa explicao no para ensinar a voc a converter Diagramas para scripts de tabelas, mas para mostrar a voc como ler um diagrama para ajudar nessa fase. Sobre um Diagrama de Tabelas, tabelas so representadas por caixas. As colunas marcadas e ligadas so escritas sobre a linha. Colunas especificas so escritas nas caixas.

139

ORACLE RDBMS

CHAVE PARA UM DIAGRAMA DE TABELA Tabelas Colunas Formatos das Colunas Caixas Retangulares Listadas dentro das caixas, nicas identificadas primeiro, obrigatrias e nulas nessa ordem. c- caracter n-numrica d-date * no nula assume diferente de nulo # O F nome da coluna de ligao significa um ou mais Obrigatrio Opcional Diagrama de Tabelas So listados na prxima Pgina.

Obrigatria coluna chave primria coluna opcional Coluna chave estrangeira Relacionamento

140

ORACLE RDBMS Diagrama de Tabelas:


DEPARTAMENTO #DEPTNO n2 0 DNAME c20 0 LOC c20

EMPREGADO # EMPNO n4 *ENAME c20 * DEPTNO n2 0 COMM n7,2 0 HIREDATE d 0 JOB c20 0 MGR n4 0 SAL N7,2

`DEPTNO

SAL

LOSAL HISAL

NIVELSALARIAL #LOSAL n5 #HISAL n5 *GRADE n1

MGR

EMPNO

TAREFA #PROJNO n4 f #EMPNO n4 f *ASTART d 0 AEND d 0 ASSIGN.TYPE c2 0 BILLRATE n4,2

PROJETO #PROJNO n4 * PDESC c20 0 BUDGET n7,2 0 MAXSTAFF n2 0 PEND d 0 PSTART d

PROJNO

Quando ns estamos desenhando tabelas, devemos especificar: Chave Primria(Primary Key) O # prximo de uma coluna significa que ela faz parte da chave primria. Uma chave primria uma coluna ou combinao de colunas as quais os valores so nicos e identificam as linhas nas tabelas. Por exemplo, a coluna EMPNO na tabela EMP distingue cada linha. No deve ter valor duplicado. Se a chave primria for feita de mais de um a coluna, ento nenhuma das colunas que fazem parte da chave primria devem ser nulas; ento, chave primria deve possuir valor. Chave Estrangeira(Foreign Key) O prximo da coluna indica que ela um chave estrangeira. Uma chave estrangeira uma coluna ou colunas que contm valores de chaves primrias de outras tabelas. EMPREGADOS Chave estrangeira EMPNO NAME ADRESS DEPTNO chave primria

141

ORACLE RDBMS

DEPARTAMENTO DEPTNO chave primria

DNAME

Chave Estrangeira permite ns ligarmos tabelas. A coluna DEPTNO na tabela EMP uma chave estrangeira e temf prximo dela. Seu valor deve ser igual ao valor da coluna DEPTNO da tabela DEPT a qual tem # prximo e significa que ela um coluna chave primria. Colunas Chaves Algumas colunas podem sem ambos chaves primrias e estrangeiras. DEPTNO uma chave primria na tabela DEPT, e chave estrangeira na tabela EMP. EMPNO uma chave primria . Ela ento uma chave estrangeira da coluna MGR. No ORACLE chave primria tem ndice nico para prevenir a entrada de valores duplicados. Colunas Obrigatrias e Opcionais Se uma coluna e prefixada com um *, seu preenchimento obrigatrio. Uma coluna prefixada com um 0 pode conter valor nulo. O Prximo Estgio Uma vez o Diagrama da Tabela tenha sido especificado, n os justamente converteremos a descrio da tabela em um declarao CREATE TABLE . Criao de tabela ser comentada na prxima Unidade.

142

ORACLE RDBMS

Linguagem de Definio de Dados e Dicionrios de Dados


Explicao dessa Unidade Nessa Unidade, os comandos necessrios para criao, remanejamento, adio de comentrios e destruio de tabelas so conjuntos de sada. O Dicionrio de Dados ento comentado.

Estrutura de Dados ORACLE


Tabelas podem ser criadas a qualquer momento, igualmente com usurios em tempo real usando o Banco de Dados. Tamanho dos dados so variveis, em que unicamente caracteres/nmeros especificados so armazenados. Espaos e brancos no so armazenados. No existe nenhuma especificao de tamanho para qualquer tabela. Existe definio como o espao ser alocado no Banco de Dados como um todo. Ele importante, porm, para estimar o espao ocupado pela tabela usaremos outra vez. Estruturas de Tabelas podem ser modificadas em tempo real.

Criando uma Tabela


O nome que voc escolhe para uma tabela deve seguir a regra padro de nomeao de objetos no Banco de Dados ORACLE. 1. O nome deve iniciar com uma letra, A-Z ou a-z. 2. Ele pode conter letras, nmeros, e o caracter especial ' _ ' (underscore). Os Caracteres $ e # so permitidos mas no so aconselhados. 3. O nome o mesma para qualquer forma de escrita maiscula ou minscula ou os dois. 4. Ele deve ter no mximo 30 posies. 5. O nome no pode ser igual ao de outra tabela, sinnimo, viso. 6. O nome no deve ser uma palavra reservada do SQL. Nome EMP85 85EMP FIXED_ASSETS FIXED ASSTES UPDATE TABLE1 Vlido? Sim No, no inicia com uma letra Sim No, contm um espao em branco No, uma palavra reservada do SQL Sim, mas voc no deve esquecer qual essa tabela. Escolha um nome mais sugestivo.

143

ORACLE RDBMS

Diretriz para Nomear Tabelas


Usar nomes sugestivos para tabelas, colunas, ndices e outros objetos. Ser consistente em abreviaes e no uso do singular ou plural na forma de nomear tabelas e colunas, Use consistentes regras de nomeao. Uma regra deve ser seguida por todas as tabelas que pertencerem a aplicao FINANCEIRA com FIN_. Consistentes regras de nomeao ajudam os usurios a entender o papel que cada tabela exerce em sua aplicao. Use o mesmo nome para descrever a mesma entidade ou atributo por tabela. Por exemplo, a coluna nmero do departamento das tabelas EMP e DEPT so ambos nomeados como DEPTNO. Tipos de Colunas Quando voc cria uma tabela, voc precisa especificar cada tipo de dado por coluna. A tabela abaixo mostra os mais importantes tipos de dados. O tipos de dados podem ser acompanhar um ou mais nmero em parnteses os quais tem informaes sobre a largura da coluna. A largura da coluna determina o tamanho mximo que valores na coluna podem ter. Colunas CHAR devem ter o tamanho especificado. Colunas NUMBER podem ter tamanhos especificados, mas no necessariamente. Tipos de Dados CHAR(tamanho) Devem Conter Valores CHAR consiste de letras maisculas ou minsculas, nmeros e caracteres especiais (*,&,%,$,etc.). Tamanho a mxima largura, em caracteres de valores dessa coluna, e no pode ser maior que 255. CHAR (alfanumrico) dados no maior que 255 caracteres. Tamanho o mximo nmero de caracteres que podem ser armazenados em uma coluna VARCHAR. Na Verso 6 CHAR e VARCHAR tem o mesmo efeito. NUMBER NUMBER(tamanho) Valor numrico consiste de 1-9 com opcional sinal de + ou - e um ponto decimal. Mesmo que NUMBER mas nesse o tamanho especificado. Se o tamanho no for especificado o tamanho ser assumido como 38. Mesmos que NUMBER(tamanho), mas especifica o tamanho do decimal. Valor Data de 14 Janeiro de 712 Antes de Cristo 14 Dezembro de 4712 depois de cristo. Informaes de Horas so armazenadas. Similar ao CHAR mas o valor deve ser maior que 65535 caracteres. No mais que uma coluna LONG deve ser especificada em uma tabela.

VARCHAR(tamanho)

NUMBER(tamanho,decimal) DATE

LONG

144

ORACLE RDBMS Exemplos de Especificaes de Colunas Especificao CHAR(12) VARCHAR(12) NUMER NUMER(4) NUMER(8,3) DATE LONG Significado coluna deve conter valores char em 12 posies. coluna deve conter valores char em 12 posies. coluna deve conter valores numricos coluna deve conter valores numricos com 4 dgitos. coluna deve conter valores numricos com 8 dgitos e dgitos a direita a direita do ponto decimal. coluna deve conter valores de data coluna deve conter valores longos.

Criando uma Tabela (CREATE TABLE)


CREATE TABLE nome_tabela (nome_coluna tipo (tamanho) (null/not null), nome_coluna tipo (tamanho) (null/not null) , ...); CREATE TABLE DEPT (DEPTNO NUMBER(2) NOT NULL, DNAME CHAR(12), LOC CHAR(2));

As Opes NULL e NOT NULL


Opo NULL NOT NULL Descrio Essa opo permite valor nulo. Ela o padro, e deve ser omitida. Essa opo fora valores na apropriada coluna. Se qualquer coluna NOT NULL for adicionada sem um valor o ORACLE retornar uma mensagem de erro.

145

ORACLE RDBMS

Criando a Tabela EMP


Para criar a tabela EMP, faa: CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL, ENAME CHAR(10), JOB CHAR(10), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) NOT NULL); A seguinte mensagem mostrada: Table created. Para ver uma descrio da tabela EMP, faa: DESCRIBE EMP; Name ----------------------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO Null? --------------NOT NULL Type --------NUMBER(4) CHAR(10) CHAR(10) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NUMBER(2)

NOT NULL

Note os Seguintes pontos: EMPNO definida como NOT NULL, essa coluna unicamente identifica a linha DEPTNO definida como NOT NULL, o valor na coluna usado para ligar a tabela EMP com a DEPT. SAL e COM tem o tipo de dado NUMBER(7,2). Total 7 dgitos. 5 inteiros e dois decimais. O comando DESCRIBE pode ser usado para mostrar a estrutura de qualquer tabela no Dicionrio de Dados. O comando pode ser abreviado para DESC. Quando voc est criando tabelas tipo de colunas podem ser definidas como CHAR ou VARCHAR. Esse dois tipos de dados tem o mesmo efeito e pode ser usado ambos. Eles aparecem no Dicionrio de Dados como CHAR. Apesar de na verso 6 do ORACLE RDBMS, e CHAR e VARCHAR tem o mesmo sentido no futuro a ORACLE planeja para o VARCHAR como um campo varivel. CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR(10), JOB VARCHAR(10), MGR NUMBER(4), HIREDATE DATE, SAL NUMBER(7,2), COMM NUMBER(7,2), DEPTNO NUMBER(2) NOT NULL);

146

ORACLE RDBMS

Clausula CONSTRAINT
ORACLE V6 suporta a sintaxe para reservar a integridade sobre as informaes sobre checagem de integridade no Dicionrio de Dados. Uma reserva de integridade uma regra que fora um relacionamento entre as tabelas do Banco de Dados. Por exemplo, uma reserva de integridade que um empregado na tabela EMP no pode ser atribudo para um departamento que no existe na tabela DEPT. uma restrio da chave estrangeira (FOREIGN KEY). CONSTRAINTS podem ser definidas para uma tabela e colunas e so especificadas como parte dos comandos CREATE ou ALTER TABLE. A propsito das CONSTRAINTS um conjunto de restries de valores para validao. Toda a declarao INSERT, UPDATE e DELETE causam uma avaliao da(s) CONSTRAINTS. A CONSTRATINT deve ser satisfeita para ser efetivado o INSERT, UPDATE ou DELETE. Use CONSTRAINTS para impor uma ou mais das seguintes restries sobre uma coluna ou um grupo de colunas. requerer que uma coluna ou grupo de colunas contenham valores NOT NULL. especificar que o valor de uma coluna seja nico na tabela referida. especificar colunas como CHAVE PRIMRIA. estabelecer uma restrio de CHAVE ESTRANGEIRA. requerer que valor de uma coluna se conforme um valor pr-determinado. (CHECK). Existem dois tipos de restries(constraints), de tabelas e colunas. Elas so identificadas igualmente que a restrio de coluna refere-se a um nica coluna onde a de tabela pode referenciar-se para uma ou mais colunas. Definies de restries de tabelas so parte de um global definio de tabela: CREATE TABLE ASSIGNMENT (PROJECT NUMBER(4), EMPLOYEE NUMBER(4), PRIMARY KEY (PROJECT, EMPLOYEE) Restries de colunas so locais para a especificao da coluna: CREATE TABLE DEPT (DEPTNO NUMBER PRIMARY KEY ...)

147

ORACLE RDBMS

Exemplo de Restries
CREATE TABLE EMP (EMPNO NUMBER(4) NOT NULL PRIMARY KEY CONSTRAINT EMP_PRIM, ENAME VARCHAR(1) CHECK (ENAME = UPPER(ENAME)), JOB VARCHAR(10), MGR NUMBER(4), HIREDATE DATE CHECK (HIREDATE <= SYSDATE), NI_NUMBER VARCHAR(12), SAL NUMBER(7,2), DEPTNO NUMBER(2) NOT NULL FOREIGN KEY (DEPTNO) REFERENCES DEPT (DEPTNO) CONSTRAINT EMP_DEPT, FOREIGN KEY (MGR) REFERENCES EMP (EMPNO) CONSTRAINT EMP_MGR, UNIQUE KEY (NI_NUMBER) CONSTRAINT EMP_NI); Notas 1. EMPNO definido como uma chave primria, e deve ento ser definido como NOT NULL 2. A coluna DEPTNO possui uma clusula REFERENCES que indica que ela uma chave estrangeira da tabela DEPT. Note que para usar REFERENCES em uma restrio de tabela voc precisa ser o criador da tabela ou possuir privilgios sobre a tabela a qual a coluna foi referenciada. 3. CHECK especifica um restrio que deve ser satisfeita. Ento a coluna ENAME deve ser digita em maisculo antes de ser inserida na tabela. 4. HIREDATE deve ser maior ou igual a data de hoje para passar a restrio. 5. MGR identificada como um chave estrangeira na restrio de tabela e referenciada a coluna EMPNO. 6. NI_NUMBER identificada coma uma chave nica. Parmetro das Restries CONSTRAINT restrio_nome especifica o nome da restrio. Este parmetro opcional. Se voc omiti-lo o nome ser atribudo com um nome padro formado de SYS_Cnome, onde nome um nmero que unicamente identifica a restrio. NULL/NOT NULL UNIQUE especifica que a coluna deve ser ou no preenchida . O padro NULL. especifica que cada linha da tabela deve tem um valor distinto para a coluna. Cada coluna deve ser declarada como NOT NULL e coluna no deve ser chave primria. especifica que a coluna nica e identifica cada linha. A coluna deve ser declarada como NOT NULL e no deve ter uma restrio do tipo UNIQUE. A chave primria pode ser composta de vrias colunas. Se sua chave primria uma coluna. voc deve usar uma restrio de tabela ou coluna. Se for vrias colunas voc deve usar uma restrio de tabela. identifica as colunas como as chaves estrangeira das tabelas. Deve referenciar a uma chave primria de uma tabela. No pode referenciar uma Viso. Para referenciar-se a uma tabela voc deve ser seu criador ou ter privilgios sobre ela. CHECK especifica uma condio que uma coluna deve satisfazer para cada linha que existe na tabela. Pode unicamente

PRIMARY KEY

FOREIGN KEY (coluna,...) REFERENCES tabela(col,...)...

148

ORACLE RDBMS referenciar-se com colunas da mesma tabela. As restries tem a finalidade de facilitar a integridade de dados na tabela e entre tabelas. A restrio de integridade forada para todas as aplicaes ou ferramentas que acessem as tabelas. As mais aplicadas restries so as de NULL e NOT NULL.

Criando uma Tabela com linhas de Outra Tabela.


Existe uma segunda forma de declarao de CREATE TABLE na qual a tabela criada com linha derivadas de outra tabela: CREATE TABLE DEPT [(coluna (NULL/NOT NULL)...)] AS SELECT declarao A tabela ser criada com as colunas especificas e linhas retiradas sobre a declarao SELECT inseridas nela. Se todas as coluna na declarao SELECT tiverem nome isto no forem uma expresso, a especificao da coluna pode ser omitida. Para criar uma tabela DEPT30 com nmero, nome, cargo e salrio do empregado no departamento 30 faa: CREATE TABLE DEPT30 AS SELECT EMPNO,ENAME,JOB,SAL FROM EMP WHERE DEPTNO = 30; Table created. Para ver a descrio da DEPT30, faa: DESC DEPT30 Name ----------------------EMPNO ENAME JOB SAL Null? ---------------------NOT NULL Type ---------------------NUMBER(4) CHAR(10) CHAR(10) NUMBER(7,2)

Para criar uma tabela contendo nome, salrio e faixa do empregado, faa: CREATE TABLE EMP_SALS (NAEM, SALARY, GRADE) AS SELECT ENAME, SAL, GRADE FROM EMP, SALGRADE WHERE EMP.SAL BETWEEN LOSAL AND HISAL; Table created. DESC EMP_SALS; Name --------------------Null? ---------------------Type ------------------

149

ORACLE RDBMS

NAME SALARY GRADE Para mostra o contedo da tabela EMP_SALS, faa: SELECT * FROM EMP_SALS; NAME ---------------SMITH ADAMS JAMES WARD MARTIN MILLER ALLES TURNER JONES BLAKE CLARK SCOTT FORD KING SALARY ----------------800 1100 950 1250 1250 1300 1600 1500 2975 2850 2450 3000 3000 5000

CHAR(10) NUMBER(7,2) NUMBER

GRADE -----------------1 1 1 2 2 2 3 3 4 4 4 4 4 5

150

ORACLE RDBMS

Alterando uma Tabela


Use o comando ALTER TABLE para modificar uma definio de tabela. Use a palavra chave ADD para adicionar uma coluna ou restrio para uma tabela existente. ALTER TABLE nome ADD (coluna tipo/Restrio) Para adicionar a coluna com o nome da esposa do empregado, faa: ALTER TABLE EMP ADD (SPOUSES_NAME CHAR(10)); Table altered. Para ver como ficou a tabela faa: DESC EMP Name ----------------------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SPOUSES_NAME Null? --------------NOT NULL Type --------NUMBER(4) CHAR(10) CHAR(10) NUMBER(4) DATE NUMBER(7,2) NUMBER(7,2) NUMBER(2) CHAR(10)

NOT NULL

Para adicionar uma restrio para uma tabela existente, na qual especifica que o salrio mensal no deve exceder 5000 faa: ALTER TABLE EMP ADD (CHECK(SAL<=5000)); Use a palavra chave MODIFY para modificar a definio de uma coluna existente. ALTER TABLE nome MODIFY (coluna tipo (NULL)); Para modificar o tamanho de ENAME para 25 caracteres faa: ALTER TABLE EMP MODIFY (ENAME CHAR(25)); Table altered. DES EMP Name ----------------------EMPNO ENAME JOB MGR HIREDATE SAL Null? --------------NOT NULL Type --------NUMBER(4) CHAR(25) CHAR(10) NUMBER(4) DATE NUMBER(7,2)

151

ORACLE RDBMS

COMM DEPTNO SPOUSES_NAME

NOT NULL

NUMBER(7,2) NUMBER(2) CHAR(10)

Existem trs modificaes que voc no pode fazer: 1. Voc no pode modificar uma coluna que contm nulos para NOT NULL 2. Voc no pode adicionar uma coluna que NOT NULL. Adicione ela nula, preencha todas as linhas e modifique para NOT NULL. 3. Voc no pode diminuir o tamanho de uma coluna ou mudar o tipo do dado, a menos que ela no contenha dados. Para modificar uma restrio voc deve excluir ela e ento adicionar ela com a modificao. Use a palavra chave DROP para remover uma restrio de uma tabela. ALTER TABLE EMP DROP CONSTRAINT EMP_NI;

152

ORACLE RDBMS

Excluindo uma Tabela


Para excluir uma definio de uma tabela no ORACLE usa-se o comando DROP TABLE. DROP TABLE EMP; Excluindo uma tabela perde todos os dados dela e todos os ndices associados com ela: Todos os dados sero apagados Qualquer viso e Sinnimos permanecem, mas eles so invlidos Qualquer transao confirmada Somente o criador da tabela ou DBA pode exclu-la.

O Comando COMMENT
Use o comando COMMENT para inserir um comentrio no maior de 255 caracteres, sobre uma tabela ou coluna, no Dicionrio de Dados. Para adicionar um comentrio na tabela EMP faa: COMMENT ON TABLE EMP IS Informaes Empregados; Para adicionar um comentrio na coluna EMPNO da tabela EMP faa: COMMENT ON COLUMN EMP.EMPNO IS nico nmero do empregado; Para retirar o comentrio use o comando COMMENT sem o comentrio: COMMENT ON COLUMN EMP.EMPNO IS; Para ver o comentrio, selecione a coluna COMMENTS de uma dessas tabelas: ALL_COL_COMMENTS ou USER_COL_COMMENTS. O Dicionrio de Dados ser comentado depois dessa unidade.

O Comando RENAME
O comando RENAME usado pelo criador da TABELA, VISO e SINNIMO para alterar o nome de um objeto do Banco de Dados. Para renomear um objeto do Banco de Dados a sintaxe : RENAME velho TO novo Para renomear a tabela EMP para EMPLOYYE, faa: RENAME EMP TO EMPLOYYE importante notar que qualquer aplicao que se referir para o objeto renomeado ter que ser alterado.

153

ORACLE RDBMS

O Dicionrio de Dados ORACLE


O Dicionrio de Dados uma das mais importantes partes do ORACLE RDBMS. Ele consiste de um conjunto de tabelas e vises as quais provm da leitura referente ao Banco e Dados. O Dicionrio de Dados diz a voc: o nome dos usurios ORACLE. os direitos e privilgios que eles possuem. nomes: tabelas, vises, ndices, sinnimos, seqncias,...). restries aplicadas para uma tabela. informaes de auditoria, mostra como quem tem acesso ou pode alterar especificados objetos do Banco de Dados. O Dicionrio de Dados criado quando o Banco de Dados criado. Depois confirme o Banco de Dados vai se modificando o Dicionrio de Dados vai sendo alterado. Acessando o Dicionrio de Dados Usurios Para acessar os objetos do Dicionrio de Dados via a declarao SQL SELECT pode ser usada para pesquisar informaes no Dicionrio de Dados.

154

ORACLE RDBMS

RDBMS
Nenhum usurio pode alterar as linhas ou objeto do Dicionrio de Dados pois isso poderia comprometer a integridade do Banco de Dados. O RDBMS j faz todas as alteraes necessrias a partir dos comando SQL executados. Dicionrio de Dados Tabelas e Vises

Tabelas
A Base do Dicionrio de Dados ou tabelas subjacentes so os primeiros objetos para ser criados no Banco de Dados como eles devem estar presente para todos outros objetos para serem criados. Tabelas do Dicionrio de dados so automaticamente criadas pela declarao SQL CREATE DATABASE e so propriedade do usurio SYS. A Base das Tabelas so raramente acessadas diretamente por que as informaes no so de fcil entendimento.

Sinnimos
Vises do Dicionrio de Dados (Tabelas virtuais). contm informaes que possam ser de fcil entendimento para os usurios. Acesso pblico para o Dicionrio de Dados dado via vises as tabelas. As trs classes de vises so: USER_xxx objeto propriedade do usurio que pode acess-la. Por exemplo, vises com esse prefixo seguinte o usurio para mostrar as informaes sobre as tabelas criadas pelo usurio e privilgios dados pelo usurio. usurio pode usar os objetos os quais tem permisso de acesso, em adicionar objetos os quais lhe pertence. para usurios com privilgios de DBA pode acessar qualquer objeto no Banco de Dados.

ALL_xxx DBA_xxx

Algumas vises de Dicionrios de Dados no usam os prefixos acima. DICTIONARY DICT_COLUMNS CONSTRAINT_DEF CONSTRAINT_COLUMNS lista toas as tabelas do Dicionrio de Dados, vises, sinnimos para o usurio. mostra todas as colunas que podem ser acessada pelo usurio. lista todas as restries entradas para as tabelas que so acessadas pelo usurio. lista todas as colunas que possuem restries nomeadas pelo usurio.

A Viso DICTIONARY
DICTIONARY lista todos os objetos do Dicionrio de Dados acessado pelo usurio com uma breve descrio do objeto. A seguinte declarao SQL mostra os comentrios da tabela DICTIONARY: SELECT * FROM DICTIONARY;

155

ORACLE RDBMS

NOME TABELA ACCESSIBLE_COLUMNS ACCESSIBLE_TABLES ALL_CATALOG ALL_COL_COMMENTS ALL_COL_GRANTS_MADE ALL_COL_GRANTS_RECD ALL_CONSTRAINTS ALL_CONS_COLUMNS ALL_DB_LINKS ALL_DEF_AUDIT_OPTS ALL_INDEXES ALL_IND_COLUMNS ALL_OBJECTS ALL_SEQUENCES ALL_SYNONYMS ALL_TABLES ALL_TAB_COMMENTS ALL_TAB_GRANTS_MADE ALL_TAB_GRANTS_RECD ALL_USERS ALL_VIEWS AUDIT_ACTIONS COLUMN_PRIVILEGES

COMENTRIO Colunas de toadas as tabelas, vises e grupo Tabelas e Vises acessveis pelo usurio Todas tabelas, vises, sinnimos, seqncias acessveis pelo usurio Comentrios sobre colunas acessveis das tabelas e vises. permisses das colunas para qual o usurio criador ou proprietrio. permisses sobre colunas para uso pblico para os usurios. Restries sobre as tabelas acessveis restries sobre as colunas acessveis Banco de Dados Ligados acessados pelo usurio Auditoria opo para recentes objetos criados descries acessadas do ndices sobre as tabelas

colunas que possuem ndice das tabelas. Objetos pelo usurio. descries das seqncias todos os sinnimos descries de todas as tabelas comentrios das tabelas e vises permisses sobre os objetos permisses sobre objetos pblicos informaes sobre os usurios do Banco de Dados textos de vises

permisses sobre as colunas criadas pelo usurio.

156

ORACLE RDBMS CONSTRAINT_COLUMNS CONSTRAINT_DEFS DICTIONARY DICT_COLUMNS DUAL SYSAUDIT_TRAIL TABLE_PRIVILEGES USER_AUDIT_CONNECT USER_AUDIT_TRAIL USER_CATALOG USER_CLUSTERS USER_CLU_COLUMNS USER_COL_COMMENTS USER_COL_GRANTS USER_COL_GRANTS_MADE USER_COL_GRANTS_RECD USER_CONSTRAINTS USER_CONS_COLUMNS USER_CROSS_REFS USER_DB_LINKS USER_EXTENTS USER_FREE_SPACE USER_INDEXES Restries definidas nas colunas pelas tabelas acessadas Restries definidas nas tabelas acessadas descries das tabelas e vises Descries das colunas das Tabelas e Vises do Dicionrio de Dados. tabela virtual sinnimo para AUDIT_TRAIL permisses pelos criadores sobre os objetos. auditoria do caminho para o usurio(login) Auditoria dos caminhos relevantes ao usurio Tabelas, Vises, Sinnimos, acessveis pelo usurio. Seqncias

descries das autorizaes dos usurios Mapa das colunas das tabelas e conjuntos de colunas Comentrios sobre colunas dos tabelas e vises dos usurios Permisses sobre as colunas as quais o usurio criador. todas as autorizaes sobre as colunas e objetos que o usurio criador Autorizaes sobre as colunas as quais o usurio criador. restries definidas sobre o acesso das tabelas informaes sobre definas restries acessveis colunas em

referencias cruzadas para vises, sinnimos e restries do usurio Banco de Dados ligados pelo usurio extenses dos segmentos espao livre na espao da tabela acessvel pelo usurio descries dos ndices criados pelo usurio

157

ORACLE RDBMS USER_IND_COLUMNS USER_OBJECTS USER_SEGMENTS USER_SEQUENCES USER_SYNONYNS USER_TABLES USER_TAB_ESPACES USER_TAB_AUDIT_OPTS USER_TAB_COLUMNS USER_TAB_COMMENTS USER_TAB_GRANTS USER_TAB_GRANTS_MADE USER_TAB_GRANTS_RECD USER_TS_QUOTAS USER_USERS USER_VIEWS colunas que possuem ndices objetos criados pelo usurio Armazenamento alocados para segmentos do Banco de Dados. Descries das seqncias do usurio as sinnimos usados descries das tabelas do usurios descrio espao acessado Opes de auditoria para usurios e suas tabelas e vises Colunas das tabelas, vises e grupos de usurios comentrio das tabelas e vises criadas pelo usurio permisses sobre objetos para quais o usurio o criador ou possui permisso. todas as permisses sobre os objetos criados pelo usurio permisses sobre os objetos os quais o usurio permitido quota de espao para o usurio informaes sobre o corrente usurio textos das vises criadas pelo usurio todo os

158

ORACLE RDBMS Algumas das vises do Dicionrio de Dados tem nomes longos. Sinnimos pblicos tem o sentido de abreviaes, para ajudar o acesso demais comum usurio nas vises do Dicionrio de Dados. Algumas Vises mais Usadas As seguintes vises so as mais interessantes para a maioria dos usurios. Nome Viso Sinnimo Descrio DICTIONARY USER_OBJECTS USER_CATALOG DICT OBJ CAT Lista de todos os objetos do Banco de Dados Objetos criados pelo usurio Tabelas, vises, sinnimos, seqncias que podem ser acessadas pelo usurio Descrio usurio das tabelas do

USER_TABLES USER_TAB_COLUMNS USER_COL_COMMENTS USER_TAB_COMMENTS USER_SEQUENCES USER_SYNONYM USER_VIEWS USER_INDEXES ALL_OBJECTS ALL_TAB_COLUMNS

TABS COLS

Colunas das tabelas e vises do usurio Comentrio das colunas das tabelas e vises do usurio Comentrio sobre as tabelas e vises criadas pelo usurio

SEQ SYN

Descrio das seqncias criadas pelo usurio Sinnimos privados do usurio textos das vises criadas pelo usurio

IND

Descries dos ndices usados pelo usurio Objetos que podem acessados pelo usurio ser

Colunas para todas as tabelas e vises que podem ser acessadas pelo usurio

Para ver a estrutura da tabela USER_OBJECTS faa: DESC USER_OBJECTS Name ---------------------OBJECT_NAME OBJECT_ID OBJECT_TYPE CREATED MODIFIED Null? ---------------------Type -------------CHAR(30) NUMBER CHAR(13) DATE DATE

Uma descrio da Viso DICTIONARY seguinte

159

ORACLE RDBMS

DESC DICT Name --------------------TABLE_NAME COMMENTS Null? --------------------Type -------------CHAR(30) CHAR(255)

Note que o sinnimo abreviado DICT usado para referir-se a tabela DICTIONARY. Conhecendo a descrio da tabela ou viso voc pode construir uma declarao SELECT para mostrar informaes sobre um objeto. SELECT OBJECT_NAME, OBJECT_TYPE, CREATED, MODIFED FROM USER_OBJECTS WHERE OBJECT_NAME = 'EMP'; OBJECT_NAME ---------------EMP OBJECT_TYPE ---------------TABLE CREATED ---------------02-MAY-90 MODIFIED --------------01-JUL-90

160

ORACLE RDBMS

Exerccio 11 - Linguagem de definio de Dados


Este exerccio fala sobre criao de tabelas de Banco de Dados, alterao de definies de Tabelas, e tambm sobre pesquisas nas tabelas do Dicionrio de Dados. Oficina 1.Criar a seguinte tabela, voc deve abreviar o nome da tabela se requerer, contendo os nomes de colunas especificados. Nome da Tabela: PROJECTS Nome Coluna ----------------------------PROJID P_DESC P_START_DATE P_END_DATE BUDGET_AMOUNT MAX_NO_STAFF Tipo de Dado ----------------------------NUMBER CHARACTER DATE DATE NUMBER NUMBER Tamanho ----------------------------4 20 7,2 2 No Nula ----------------------------NOT NULL

Nome da Tabela: ASSIGNMENTS Nome Coluna Tipo de Dado ----------------------------- ----------------------------PROJID NUMBER EMPNO NUMBER A_START_DAT DATE A_END_DATE DATE BILL_RATE NUMBER ASSIGN_TYPE CHARACTER

Tamanho ----------------------------4 4 4,2 2

No Nula ----------------------------NOT NULL NOT NULL

2. Tendo a criao processada com sucesso dessas tabelas, adicionar outra coluna na tabela ASSIGNMENTS: Nome Coluna ----------------------------HOURS Tipo de Dado ----------------------------NUMBER Tamanho ----------------------------2 No Nula -----------------------------

3. Adicionar comentrios para as tabelas que voc tem criado. 4.Adcionar comentrios para coluna PROJID na tabela PROJECTS. 5. Mostrar as coluna especificadas para a tabela USER_TAB_COLUMNS. 6. Mostrar nome tabelas e comentrios para qualquer tabela que voc tenha criado. Voc precisa para pesquisar a USER_COL_COMMENTS ou USER_TAB_COMMENTS tabelas do Dicionrio de Dados. 7. Mostrar os nomes das tabelas e comentrios para qualquer tabela as quais voc tem acesso. Pesquisar a tabela ALL_TAB_COMMENTS. Linguagem de definio de Dados. 1. CREATE TABLE PROJECTS (PROJID NUMBER(4) NOT NULL, P_DES CHAR(20), P_START_DATE DATE, P_END_DATE DATE, BUFGET_AMOUNT NUMBER(7,2),

161

ORACLE RDBMS

MAX_NO_SATFF

NUMBER(2));

CREATE TABLE ASSIGNMENTS (PROJID NUMBER(4) NOT NULL, EMPNO NUMBER(4) NOT NULL, A_START_DATE DATE, A_END_DATE DATE, BILL_RATE NUMBER(4,2), ASSIGN_TYPE CHAR(2)); 2. ALTER TABLE ASSIGNMENTS ADD (HOURS NUMBER(2)); COMMENT ON TABLE ASSIGMENTS IS 'Unique Project details';

3.

COMMENT ON TABLE ASSIGNMENTS IS 'Assignments for any employee on a project': 4. 5. COMMENT ON COLUMN PROJECTS.PROJID IS 'Unique indentifier for a project': DESCRIBE USER_TAB_COLUMNS Null? ----------------------------NOT NULL NOT NULL NOT NULL Type ----------------------------CHAR(30) CHAR(30) CHAR(9) NUMBER NUMBER NUMBER CHAR(1) NUMBER NUMBER LONG

Name ----------------------------TABLE_NAME COLUMN_NAME DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE NULLABLE COLUMN_ID DEFAULT_LENGTH DATA_DEFAULT 6.

NOT NULL

SELECT A.TABLE_NAME, A.COLUMN_NAME, B.COMMENTS FROM USER_TAB_COLUMNS A, USER_TAB_COMMENTS B WHERE A.TABLE_NAME = B.TABLE_NAME;

162

ORACLE RDBMS

Linguagem de Manipulao dos Dados


Explicao dessa Unidade Essa Unidade explica como fazer modificaes para linhas na tabela, adicionar linhas ou apaga-las. A concepo de transao introduzida. Consistncia de leitura tambm falada.

INSERT Inserir Novas linhas em uma Tabela (INSERT).


O comando INSERT usada para adicionar linhas em uma tabela. A sintaxe do comando INSERT : INSERT INTO nome_tabela (coluna, coluna, ...) VALUES (valor,valor,...); Ele possibilita inserir novas linhas com valores em cada coluna. Ele recomenda que a colunas listadas sejam sempre especificadas. Se alista no especificada seu programa ter que ser modificado quando a definio da tabela for alterada. Para inserir um novo departamento, faa: INSERT INTO DEPT (DEPTNO,DNAME,LOC) VALUES (50,'MARKETING','SAN JOSE'); Note que esse comando adiciona unicamente uma linha de uma vez na tabela. Para encontrar um novo departamento omitindo o nome, a coluna listada deve ser especificada. INSERT INTO DEPT (DEPTNO,LOC) VALUES (50,'SAN JOSE'); Alternativamente se o nome de departamento desconhecido, um NULL pode ser especificado. INSERT INTO DEPT (DEPTNO,DNAME,LOC) VALUES (50,NULL,'SAN JOSE'); Valores ALFANUMRICOS e DATAS devem ser includos entre aspas simples (). Usando Variveis Substituveis para linhas inseridas. Como previamente mencionamos, INSERT uma linha por comando. Usando Variveis Substituveis ele pode ser reutilizado: INSERT INTO DEPT (DEPTNO,DNAME,LOC) VALUES (&D_NUMBER,'&D_NAME','&LOCATION'); Quando o comando executado, os valores so solicitados todas as vezes. Inserindo Datas e informaes de Horas. Quando inserimos um valor data, o formato DD-MON-YY regularmente usado. Com esse formato o sculo padro o 19. A data contm informaes de hora, a qual se no especificada o padro meia noite.(00:00:00). Se a data precisar ser entrada em outro sculo e especificar a hora requerido usar a funo TO_DATE: INSERT INTO EMP

163

ORACLE RDBMS

(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES(7658, 'MASON', 'ANALYST', 7566, TO_DATE('24/06/2084 9:30','DD/MM/YYYY HH:MI'), 3000, NULL, 20); Copiando linhas de Outra Tabela INSERT INTO tabela (coluna, coluna, ...) SELECT coluna, coluna, ... FROM tabela(s); Essa forma de INSERT permite a voc inserir vrias linhas em uma tabela onde os valores so derivados de contedo existente em outras tabelas no Banco de Dados. Para copiar todas as informaes sobre o departamento 10 na tabela D10HISTORY, faa: INSERT INTO D10HISTORY (EMPNO,ENAME,SAL,JOB,HIREDATE) SELECT EMPNO,ENAME,SAL,JOB,HIREDATE FROM EMP WHERE DEPTNO = 10; Note que a palavra chave VALUES no usada aqui.

UPDATE Alterando Linhas(UPDATE)


A declarao UPDATE permite voc modificar valores nas linhas em uma tabela: UPDATE tabela (sinnimo) SET coluna(,coluna,...) = (expresso, sub-pesquisa) (WHERE condio) Por exemplo. para alterar a linha do Scott faa: UPDATE EMP SET JOB='SALESMAN, HIREDATE=SYSDATE, SAL=SAL*1.1 WHERE ENAME = 'SCOTT'; 1 record updated. Se a clausula WHERE for omitida, todas as linhas da tabela sero alteradas. possvel usar sub-pesquisas aninhadas e correlatas na declarao UPDATE. Suponhamos que voc tenha uma nova tabela do comisses que deve ser distribuda em certos empregados. Por exemplo a tabela de comisso abaixo. EMPNO COMM -------------------7499 666 7654 758

164

ORACLE RDBMS As modificaes listadas na tabela COMMISSION pode ser aplicada na tabela EMP usando uma subpesquisa correlata e uma sub-pesquisa aninhada como mostramos abaixo. Exemplo 1: UPDATE EMP SET COMM = (SELECT COMM FROM COMMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION); 2 records updated. A tabela COMMISSION pode conter mais de uma linha para cada empregado abaixo:
EMPNO ----7499 7521 7521 7654 COMM ---------666.00 500.00 500.00 758.00

Voc quer trocar o valor da comisso da tabela EMP com o total das comisses para cada empregado lista na tabela COMMISSION. Para fazer isso, use o seguinte SQL: Exemplo 2: UPDATE EMP SET COMM = (SELECT SUM(COMM) FROM COMMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION); 3 records updated. A tabela EMP agora reflete as modificaes das comisses:
EMPNO ----7499 7521 7654 COMM ---------666.00 1,000.00 758.00

Outra possibilidade que voc queira adicionar o valor da comisso existente na tabela EMP com o valor da comisso da tabela COMMISSION. Exemplo 3 faz isso: Exemplo 3: UPDATE EMP SET COMM = (SELECT SUM(COMM) + EMP.COMM FROM COMMISSION C WHERE C.EMPNO = EMP.EMPNO) WHERE EMPNO IN (SELECT EMPNO FROM COMMISSION);

DELETE Excluindo Linhas de uma Tabela(DELETE)


O comando DELETE permite voc remover uma ou mais linhas de uma tabela. DELETE FROM tabela (WHERE condio); Para apagar todas as informaes referentes ao departamento 10 da tabela EMP faa: DELETE FROM EMP WHERE DEPTNO =10; Se a clausula WHERE for omitida todas linhas da tabela EMP sero excludas.

165

ORACLE RDBMS

COMMIT E ROLLBACK
TRANSAES ---------------------------------TRANSAES----------------------------INSERT COMMIT ou ROLLBACK At que as modificaes sejam confirmadas: voc pode ver ento na pesquisa outros usurios no podem ver voc deve descartar (ROLLBACK) voc deve ROLLBACK em um SAVEPOINT O comando AUTOCOMMIT facilita deve ser usado: SET AUTOCOMMIT ON OFF Processando Transaes O que uma Transao? Uma transao uma operao contra o Banco de Dados a qual compromete uma sries de modificaes de uma ou mais tabelas. Existem duas classes de Transaes. Transaes DML a qual pode consistir de qualquer nmero de declaraes DEML a qual o ORACLE trata como nica entidade ou lgica unidade de trabalho, e transaes DDL a qual pode unicamente consistir de uma declarao DDL. DELETE COMMIT INSERT COMMIT UPDATE UPDATE TEMPO

166

ORACLE RDBMS

ndice
CENTRO DE TREINAMENTO...................................................................................................................1 INTRODUO..............................................................................................................................................2 PREFCIO.....................................................................................................................................................3 UM SISTEMA GERENCIADOR DE BANCO DE DADOS.....................................................................5 EXPLICAO DESSA SESSO........................................................................................................................5 O QU UM BANCO DE DADOS?.................................................................................................................5 POR QUE UM BANCO DE DADOS NO COMPUTADOR ?........................................................................................6 O SISTEMA GERENCIADOR DE BANCO DE DADOS............................................................................................6 O ACESSO RELACIONAL..........................................................................................................................7 OPERADORES RELACIONAIS.........................................................................................................................8 UNION....................................................................................................................................................9 INTERSECTION..........................................................................................................................................9 DIFFERENCE (SQL - MINUS).....................................................................................................................9 PROPRIEDADES DO BANCO DE DADOS RELACIONAL.........................................................................................9 PROPRIEDADE DAS RELAES TABULARES ...................................................................................................10 PRODUTOS ORACLE................................................................................................................................11 INTRODUO AO SQL............................................................................................................................12 EXPLICAO DESSA UNIDADE....................................................................................................................12 PARA ACESSAR UM BANCO DE DADOS O SQL O CAMINHO MAIS FCIL...........................................................12 CARACTERSTICAS DO SQL......................................................................................................................12 SQL*PLUS....................................................................................................................................................13 PL/SQL..............................................................................................................................................13 O CONJUNTO DE COMANDOS SQL............................................................................................................14 ESCREVENDO COMANDOS SQL..........................................................................................................15 SELECT.............................................................................................................................................15 EXPRESSES ARITMTICAS.......................................................................................................................17 COLUNAS SINNIMAS...............................................................................................................................18 LITERAIS...............................................................................................................................................19 MANUSEANDO VALORES NULOS................................................................................................................19 PREVENINDO A SELEO DE LINHAS DUPLICADAS.........................................................................................20 A CLAUSULA DISTINCT.......................................................................................................................21 A CLAUSULA ORDER BY......................................................................................................................21 A CLAUSULA WHERE..........................................................................................................................24 OPERADORES SQL.................................................................................................................................25 O OPERADOR BETWEEN.....................................................................................................................25 O OPERADOR IN ...................................................................................................................................26 RESUMO DO SELECT............................................................................................................................31 SQL*PLUS COMANDOS........................................................................................................................32 DIVERSOS COMANDOS DO SQL*PLUS.........................................................................................................33 Exerccio 1 - Introduo ao SQL...........................................................................................................35 EXECUTANDO PESQUISAS PADRES COM VARIVEIS SUBSTITUVEIS..............................40 NICA VARIVEL SUBSTITUVEL................................................................................................................40 DUPLO & PARA VARIVEIS SUBSTITUVEIS...................................................................................................41

167

ORACLE RDBMS O COMANDO DEFINE...........................................................................................................................41 O COMANDO ACCEPT...........................................................................................................................43 RESUMO................................................................................................................................................44 Exerccio 2 - Executando Pesquisas Com Parmetros.........................................................................45 FUNES.....................................................................................................................................................46 FUNES ALFANUMRICAS.......................................................................................................................48 LOWER..................................................................................................................................................48 UPPER...................................................................................................................................................48 INITCAP.................................................................................................................................................48 LPAD e RPAD........................................................................................................................................49 SUBSTR..................................................................................................................................................49 INSTR.....................................................................................................................................................50 LTRIM e RTRIM....................................................................................................................................50 LENGTH.................................................................................................................................................51 TRANSLATE e REPLACE.....................................................................................................................52 FUNES NUMRICAS..............................................................................................................................53 ROUND..................................................................................................................................................53 TRUNC...................................................................................................................................................54 CEIL.......................................................................................................................................................54 FLOOR...................................................................................................................................................54 POWER..................................................................................................................................................55 SQRT......................................................................................................................................................55 SIGN.......................................................................................................................................................55 ABS.........................................................................................................................................................56 MOD.......................................................................................................................................................56 Exerccio 3 - Usando Funes..............................................................................................................57 MAIS FUNES DE LINHA NICA..............................................................................................................59 FUNES DE DATA.................................................................................................................................59 ARMAZENAMENTO DE DATAS NO ORACLE...................................................................................60 Sysdate....................................................................................................................................................60 MONSTHS_BEETWEEN.......................................................................................................................61 ADD_MONTHS......................................................................................................................................61 NEXT_DAY............................................................................................................................................61 LAST_DAY.............................................................................................................................................62 A funo ROUND pode ser aplicada para datas..................................................................................62 TRUNC...................................................................................................................................................62 FUNES DE CONVERSO.........................................................................................................................63 TO_CHAR..............................................................................................................................................63 TO_NUMER...........................................................................................................................................66 TO_DATE...............................................................................................................................................67 FUNES QUE ACEITAM VRIOS TIPOS DE ENTRADA DE DADOS......................................................................67 DECODE................................................................................................................................................67 NVL.........................................................................................................................................................69 GREATEST.............................................................................................................................................69 LEAST....................................................................................................................................................70 VSIZE.....................................................................................................................................................70 Exerccio 4 - Mais Funes...................................................................................................................72 FUNES DE GRUPO...............................................................................................................................75 GROUP BY........................................................................................................................................75 USANDO FUNES DE GRUPO:..................................................................................................................76 AVG........................................................................................................................................................76 MIN.........................................................................................................................................................76 COUNT...................................................................................................................................................76 A clausula GROUP BY..........................................................................................................................77
Excluindo linhas quando estiver Usando o GROUP BY..................................................................................77

168

ORACLE RDBMS

A clausula HAVING...............................................................................................................................79 A Ordem das clausulas na declarao SELECT...................................................................................81 Exerccio 5 - Funes de Grupo............................................................................................................82

Grupos dentro de Grupos..................................................................................................................................78 Funes de Grupo e Resultados Individuais.....................................................................................................78

EXTRAINDO DADOS DE MAIS DE UMA TABELA............................................................................85 LIGAES (JOINS)...................................................................................................................................85 Equi-Join................................................................................................................................................85 Usando Tabelas com Sinnimos............................................................................................................86 Nom-Equi-Join.......................................................................................................................................87 Exerccio 6 Simples Ligaes (Join).....................................................................................................89 OUTROS MTODOS DE LIGAO.......................................................................................................93 LIGAES EXTERNAS (OUTHER JOIN).........................................................................................................93 UNION...................................................................................................................................................95 INTERSECT...........................................................................................................................................95 MINUS....................................................................................................................................................95 Exerccio 7 - Outros Mtodos de Ligaes...........................................................................................97 SUB-PESQUISAS (SUBQUERIES).........................................................................................................100 Como so processadas as Sub-pesquisas Aninhadas?........................................................................101 COMPARANDO MAIS DE UM VALOR:...........................................................................................................102 Operadores ANY ou ALL.....................................................................................................................103 Clausula HAVING com Sub-pesquisas aninhadas..............................................................................104 SUB-PESQUISAS ANINHADAS....................................................................................................................105 Limites de Alinhamento.......................................................................................................................105 Diretriz.................................................................................................................................................105 Sub-pesquisas Correlatas....................................................................................................................106 A Pesquisa Interna...............................................................................................................................107 Operadores...........................................................................................................................................108 Por que Usar uma Sub-pesquisa Correlata?......................................................................................109 Exerccio 8 - Sub-pesquisas.................................................................................................................110
Operador EXISTS...........................................................................................................................................108

ESCREVENDO RELATRIOS: PARTE 1...........................................................................................115 COMANDOS..........................................................................................................................................116 SET.......................................................................................................................................................116 SHOW...................................................................................................................................................118 COLUMN.............................................................................................................................................118


ERROR MESSAGES......................................................................................................................................119

Outras Opes do COLUMN...............................................................................................................119 Os comandos TTITLE e BTITLE.........................................................................................................123 Exerccio 9 - Um bsico relatrio tabular..........................................................................................124 COMANDO ARQUIVO SQL*PLUS....................................................................................................124 Exerccio 9 - Relatrio Tabular..........................................................................................................125 ESCREVENDO RELATRIOS BSICOS............................................................................................126 ESCREVENDO RELATRIO: PARTE 2..............................................................................................127 Os comandos TTITLE e BTITLE.........................................................................................................127 A opo NEW_VALUE........................................................................................................................128 Opes de Quebra................................................................................................................................130 O Comando COMPUTE......................................................................................................................131 Exerccio 10 - Relatrios com Quebras..............................................................................................134 ESCREVENDO RELATRIOS COM QUEBRAS...............................................................................136

169

ORACLE RDBMS DESENHO E TERMOLOGIA DO BSICO BANCO DE DADOS RELACIONAL........................138 SIMPLES DIAGRAMA DE ENTIDADE E RELACIONAMENTO...............................................................................139 Como ler o Diagrama..........................................................................................................................139 O Diagrama de Tabelas.......................................................................................................................139 LINGUAGEM DE DEFINIO DE DADOS E DICIONRIOS DE DADOS..................................................................143 Estrutura de Dados ORACLE..............................................................................................................143 Criando uma Tabela............................................................................................................................143 Diretriz para Nomear Tabelas.............................................................................................................144 Criando uma Tabela (CREATE TABLE).............................................................................................145
As Opes NULL e NOT NULL....................................................................................................................145 Criando a Tabela EMP....................................................................................................................................146

Clausula CONSTRAINT.......................................................................................................................147 Criando uma Tabela com linhas de Outra Tabela..............................................................................149 Alterando uma Tabela.........................................................................................................................151 Excluindo uma Tabela.........................................................................................................................153 O Comando COMMENT......................................................................................................................153 O Comando RENAME.........................................................................................................................153 O Dicionrio de Dados ORACLE.......................................................................................................154
Exemplo de Restries...................................................................................................................................148

RDBMS........................................................................................................................................................155 TABELAS.............................................................................................................................................155 Sinnimos.............................................................................................................................................155 A Viso DICTIONARY.........................................................................................................................155 Exerccio 11 - Linguagem de definio de Dados..............................................................................161 LINGUAGEM DE MANIPULAO DOS DADOS.............................................................................163 INSERT............................................................................................................................................163 Inserir Novas linhas em uma Tabela (INSERT)..................................................................................163 UPDATE..........................................................................................................................................164 Alterando Linhas(UPDATE)................................................................................................................164 DELETE...........................................................................................................................................165 Excluindo Linhas de uma Tabela(DELETE).......................................................................................165 COMMIT E ROLLBACK.................................................................................................................166

170

Vous aimerez peut-être aussi