Por Edson Almeida Junior Consulting Tecnologia & Sistemas Ltda www.consulting.com.br Março - 2006 Ultima Atualização 11/04/2006 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 2 Objetivo Este treinamento destina-se a treinando que querem conhecer a filosofia de banco de dados relacionais, e também a linguagem padrão do Oracle que é a SQL, seus comando principais. O Objetivo, ao término do curso, é de que os treinandos estejam aptos a começar o trabalho com o Oracle e suas ferramentas, quer no desenvolvimento de aplicações ou na administração do Oracle. Modelo Conceitual Conceitos Conjuntos – Conjuntos existem para permitir armazenar informações uma única vez. Os fatos serão dissociados e relacionados preservando o seu conteúdo. Ex.: Conjunto de alunos de uma turma, conjunto de pessoas de uma cidade. Modelo ERA – O Modelo ERA, ou Modelo de Entidades, Relacionamentos e Atributos, qualifica um item de informação como Entidade, Relacionamento ou Atributo. Entidade – É um objeto (ou “ente”) em que se tem interesse específico em acompanhar/monitorar sua existência/vida no sistema e/ou que existe de forma independente de outras informações, e/ou que se repete muito e possui grau de entidade e/ou que pertence a um conjunto finito e possui grau de entidade (estabilidade). Entidade Fraca – São entidades que não tem vida própria. Sua existência dependerá da existência de uma entidade principal. Exemplo.: Funcionário e Dependente estão unidos por dependência, ou seja, todo Dependente deve estar associado a um e somente um funcionário. Entidade-Tipo – É a coleção, ou conjunto, de todas as Entidades que têm a mesma natureza, as mesmas propriedades, e que possuem atributos do mesmo tipo. Exemplo: 7670/Rômulo e 7798/Manoel são alunos de um mesmo curso, então, são Entidades da Entidadetipo Aluno que o curso possui no seu modelo ERA. Matemática, Português e Física são Entidades da Entidade-tipo Disciplina. Relacionamento – É um fato que une duas ou mais entidades. Relacionamento-tipo – É a coleção, ou conjunto, de todos os relacionamentos que têm a mesma natureza, as mesmas propriedades, que possuem atributos do mesmo tipo e que unem Entidades das mesmas Entidades-tipo pelo mesmo fato. Exemplo: Todas as informações sobre as Disciplinas que os Alunos cursaram são do tipo Histórico; e sobre as que estão cursando são do tipo Matrícula (disciplinas em que os alunos estão matriculados). Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 3 Atributo – É uma propriedade da Entidade-tipo ou do Relacionamento-tipo. É análogo ao campo de um registro. Sua posição dentro do modelo é determinada de acordo com a dependência que existe na sua variação de conteúdo (Dependência funcional). Exemplo: 7670/Rômulo e 7798/Manoel são entidades da Entidade-tipo Aluno, logo, a Entidade-tipo Aluno estará representada pelos atributos matrícula e nome. Um atributo pode ser: simples, composto, multivalorado, global, identificador. Atributo Simples – É o atributo que guarda em si um único valor indivisível. Ex.: nome, preço, marca. Atributo composto – É o atributo resultado da soma de outros atributos. É constituído de subatributos. Ex.: endereço = rua + número + bairro + cep; data = dia + mês + ano Atributo Multivalorado – É o atributo que guarda em si repetidos valores. Pode assumir mais de um valor para cada ocorrência. Ex.: telefone, formação. Atributo identificador – É (são) o(s) atributo(s) que diferencia(m) uma ocorrência das demais dentro de um conjunto. Se nenhum dos atributos naturais serve como Identificador da ocorrência, um atributo identificador suplementar deve ser acrescentado. Ex.: código, matrícula. Existe uma analogia entre o atributo identificador de uma Entidade-tipo e a chave-primária do arquivo que esta Entidade-tipo vai gerar. O mesmo Não acontece com Relacionamento-tipo. Um atributo identificador nunca poderá estar vazio. Banco de Dados Relacional Um banco de dados relacional pode ser definido como um banco de dados que aparece ao usuário como uma coleção de tabelas. A característica mais fundamental num banco de dados relacional é a de que temos que identificar univocamente seus registros (que chamamos de linhas), ou seja, devemos definir um campo (ou mais de um) dentre os vários campos do registro, para ser o atributo identificador do mesmo (chave primária). O Oracle é um SGBD Relacional - Sistema de Gerenciamento de Banco de Dados Relacional (RDBMS - Relational Database Management System) e foi um dos primeiros sistemas de banco de dados a utilizar a Linguagem de Pesquisa Estruturada (SQL - Structured Query Language) como interface do usuário sendo, talvez, por este motivo, agora um dos principais sistemas de gerenciamento de banco de dados. Conceitos No estudo de banco de dados convém sabermos algumas definições importantes: Tabelas - São as unidades básicas de um SGBD Relacional. É formada por linhas e colunas, onde as linhas representam os registros e as colunas os campos da tabela. São muito conhecidas como Tabelas-Base. Exemplo: Tabela T_Funcionario Cod_Funcionario Cod_Departamento Nome_Funcionario - CHAR(06) - CHAR(05) - VARCHAR2(40) Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 4 Data_Nascimento -- DATE Colunas - Um nome de coluna é o nome que o usuário informará para representar os valores de dados que serão entrados sob cada coluna. Linhas - São os registros da tabela. Valores de dados - São os valores encontrados na interseção de uma coluna e uma linha. Chave primária - Uma ou mais de uma coluna que identifica uma linha, facilitando em muito o acesso aos dados. Visão ou Tabela Virtual(View) - É uma tabela formada por uma pesquisa em uma ou mais tabela-base. Ela não existe, mas parece ao usuário como se existisse. Toda tabela num banco de dados relacional tem que possuir uma Chave Primária. As tabelas poderão também ter chaves estrangeiras, que são campos que relacionam as tabelas do banco de dados, fazendo referência entre uma e outra tabela. SQL - Linguagem de Pesquisa Estruturada A SQL - Linguagem de Pesquisa Estruturada (Structured Query Language) devido as suas características tornou-se a linguagem padrão de sistemas gerenciadores de banco de dados relacionais. É a linguagem de comunicação de todas as ferramentas e/ou aplicações Oracle com o Oracle Server. SQL*Plus é a ferramenta Oracle (interface) que executa os comandos SQL. Podemos com a SQL*Plus: -Pesquisar, adicionar, remover, modificar os dados do BD; -Criar, modificar, remover as estruturas de dados; -Controlar o acesso aos dados. Definição SQL - onde a pronuncia é "ess-kiú-éll" ou "sequel" que é como a maioria das pessoas pronunciam - "Structured Query Language" (linguagem estruturada de pesquisa) , é composta por um grupo de facilidades para definição, manipulaçao e controle de dados em um banco de dados relacional. Como começou essa história de Banco de Dados Relacional e SQL? Em 1970 , E.F.Codd, nessa ocasião membro do Laboratório de pesquisa da IBM em San Jose, Califórnia, publicou um trabalho agora clássico, "A Relational Model of Data for Large Shared Data Banks" - um modelo relacional de dados para grandes bancos de dados compartilhados (Communications of the ACM, Vol.13, No. 6, junho de 1970), em que se estabeleceu um grupo de princípios abstratos sobre gerência de banco de dados: o assim chamado modelo relacional. Todo o campo da tecnologia de banco de dados relacional tem suas origens nesses trabalho. As idéias de Codd incentivaram experiências e pesquisas em universidades, laboratóriosde pesquisa industrial e estabelecimentos semelhantes, que resultaram em diversos produtos relacionais agora disponíveis no mercado. Um aspecto em particular da referida pesquisa era o projeto de implementação de protótipo de uma série de linguagens relacionais. Uma linguagem relacional é uma linguagem que efetua , em alguma forma sintática ou concreta, alguma ou todas as características do modelo relacional Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 5 abastrato. Diversas dessas linguagens foram criadas no início e no meio dos anos 70. Uma dessas linguagens em particular foi a chamada SEQUEL ("Structured English Query Language" - Linguagem de Pesquisa em inglês estruturado), definida por D.D. Chamberlin e outros (1974) no laboratório de Pesquisas da IBM em San Jose, Califórnia, e inicialmente implementada em um protótipo da IBM chamado SEQUEL-SRM (1974-75). Em parte como resultado da experiência com o SEQUEL-XRM, foi definida em 1976-77 uma versão revisada do SEQUEL, chamada SEQUEL/2. (O nome foi subsequentemente alterado para SQL por razões legais). Começou o trabalho em outro protótipo mais ambicioso da IBM, chamado System R. O System R., uma implementação de um grande subconjunto da linguagem SEQUEL/2 (ou SQL) , tornou-se operacional em 1977 e foi subsequentemente instalado em uma série de estabelecimentos, usuários, tanto internos à IBM quanto (sob um grupo de acordos comerciais de estudo) clientes selecionados da IBM. * Uma série de mudanças posteriores foram feitas à linguagem SQL durante a vida útil de projeto do System R, em parte como resposta a sugestões de ususários. Por exemplo, foi incluída uma função EXISTS para testar se um dado especificado existia no banco de Dados. Vamos a um exemplo prático: SELECT DEPTNO, DNAME FROM DEPT D WHERE EXISTS (SELECT 'X' FROM EMP E WHERE E.DEPTNO = D.DEPTNO); * Existe outra forma de fazer este query. Porém esta é a forma mais rápida de acesso ao Banco Em grande parte, graças ao sucesso do System R, tornou-se aparente ao final dos anos 70 que a IBM provavelmente desenvolveria um ou mais produtos baseados na tecnologia do System R especificamente, produtos que implementassem a linguagem SQL. Como resultado, outros vendedores também começaram a construir seus próprios produtos baseados no SQL. De fato, pelo menos um desses produtos, a saber o ORACLE, da Relational Software Inc. (que passou a se chamar Oracle Corporation), foi introduzido no mercado antes dos próprios produtos da IBM. Depois, em 1981, a IBM anunciou um produto SQL, chamado SQL/DS para o ambiente DOS/VSE. A seguir a IBM anunciou uma poutra versão do SQL/DS para o ambiente VM/CMS (1982), e outra para MVS chamada DB2, altamente compatível com o SQL/DS (1983). Nos anos seguintes , diversos outros vendedores também anunciaram produtos baseados no SQL. Esses produtos incluíam tanto produtos inteiramente novoscomo o DG/SQL (Data General Corporation, 1984) e SYBASE (Sybase Inc., 1986), quanto interfaces do SQL para produtos estabelecidos como o INGRES (Relational Technology INc. , 1981, 1985) e o IDM (Britton-Lee Inc., 1982). Há atualmente muitos produtos no mercado que dão suporte a algum dialetodo SQL, rodando em máquinas que cobrem toda a faixa desde microcomputadores até de grande porte. O SQL se tornou o padrão no mundo do banco de dados relacional. Padrão ANSI O SQL também se tornou o padrão oficial. Em 1982, o American National Standards Institute (ANSI) encarregou seu Comitê de Banco de Dados (chamado X3H2) de desenvolver uma proposta para uma linguagem relacional padrão. Funcionalidade Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 6 A função da linguagem SQL é dar suporte a definição , manipulação e controle dos dados em um banco de dados relacional. Um banco de dados relacional é simplesmente um banco de dados que é percebido pelo usuário como um grupo de tabelas onde tabela é uma coleção de linhas e colunas. A Linguagem SQL pode ser usada através de dois modos: SQL Interativa Onde os comandos SQL são digitados interativamente, ou seja, logo após a digitação do comando vemos sua execução. SQL Embutida Neste modo os comandos SQL ficam embutidos no programa-fonte de uma linguagem de programação. Tal linguagem é normalmente chamada linguagem hospedeira. Linguagens de programação como COBOL, C, PASCAL, PL/1, etc, admitem a SQL Embutida. A SQL divide-se em três grupos: - Linguagem de Definição de Dados (DDL) - Linguagem de Controle de Dados (DCL) - Linguagem de Manipulação de Dados (DML) Linguagem de Definição de Dados (DDL) Tem como objetivo definir, alterar e eliminar as tabelas usadas para armazenar os dados. CREATE, ALTER, DROP, RENAME, são comandos de definição de dados, dentre outros. Em SQL as tabelas possuem a função de armazenar os dados do Banco de Dados. O comando para criação de tabelas no SQL é o CREATE TABLE. Sintaxe (Básica): CREATE TABLE nome_da_tabela_base (nome_de_coluna tipo_de_dado (tamanho) [NOT NULL [UNIQUE] ], ... ) CONSTRAINT nome_da_constraint PRIMARY KEY (nome_de_coluna) TABLESPACE nome_tablespace; Onde: nome_da_tabela_base – É o nome que identifica a tabela. nome_de_coluna – É o nome identificador da coluna. Tipo_de_dado(tamanho) – É o tipo de dado da coluna. VARCHAR2, NUMBER, DATE. Os tipos básicos são: CHAR, NOT NULL – Pode ser especificado em qualquer coluna da tabela. Faz com que a coluna não admita nulos, isto é, qualquer tentativa de se introduzir um nulo em tal coluna será rejeitada. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 7 UNIQUE – Pode ser especificado para qualquer coluna ou combinação de coluna da tabela. Cada uma dessas colunas, ou cada coluna em uma combinação de colunas, também deve Ter a especificação de NOT NULL. Qualquer tentativa de se introduzir uma linha na tabela, contendo um valor igual à mesma coluna em alguma outra linha, será rejeitada. Se UNIQUE não for especificado para uma dada coluna (ou combinação), então essa coluna (ou combinação) pode conter valores duplicados. Nome_da_constraint – É o nome da chave primária, atributo identificador da tabela. nome_tablespace – É o nome do tablespace (Objeto lógico) que armazena os arquivos físicos do Oracle (datafiles). Os comandos CREATE TABLE para as tabelas seriam: a)Para a tabela ALUNO CREATE TABLE T_Aluno (MATRICULA VARCHAR2(06) NOT NULL, NOME_ALUNO VARCHAR2(40) NOT NULL) CONSTRAINT pk_aluno PRIMARY KEY(MATRICULA), TABLESPACE st_01; a)Para a tabela DISCIPLINA CREATE TABLE T_Disciplina (COD_DISCIPLINA VARCHAR2(04) NOT NULL, NOME_DISCIPLINA VARCHAR2(30) NOT NULL) CONSTRAINT pk_disciplina PRIMARY KEY(COD_DISCIPLINA), TABLESPACE st_01; C) Para a tabela CURSA CREATE TABLE T_Cursa (MATRICULA VARCHAR2(06) NOT NULL, COD_DISCIPLINA VARCHAR2(04) NOT NULL, NOTA1 NUMBER(3,1), NOTA2 NUMBER(3,1), NOTA3 NUMBER(3,1)) CONSTRAINT pk_cursa PRIMARY KEY(MATRICULA,COD_DISCIPLINA) TABLESPACE st_01; Obs.: O comando CREATE TABLE apenas cria a tabela, ou seja, apenas cria a estrutura da tabela. Elas precisam, num segundo passo, serem povoadas. Linguagem de Controle de Dados (DCL) A DCL (Data Control Language) contém elementos que serão úteis num sistema multiusuário, onde a privacidade das informações é importante, a segurança das tabelas, bem como o controle dos privilégios dos usuários do BD. Os comandos Grant, Revoke, Audit, No Audit, Lock são comandos da DCL. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 8 Exemplos: 1)GRANT SELECT, INSERT ON T_DEPARTAMENTO TO JOAO; Dá os privilégios de Select e Insert para o usuário João, na tabela T_Departamento. 1)REVOKE INSERT ON T_DEPARTAMENTO TO JOAO; Retira o privilégio de inserção de dados (Insert) do usuário João, na tabela T_Departamento. Linguagem de Manipulação de Dados (DML) Esta linguagem contém os componentes da linguagem e conceitos para a manipulação das informações armazenadas em tabelas. Os comandos SELECT, UPDATE, DELETE, INSERT, COMMIT, ROLLBACK, dentre outros, são comandos de manipulação de dados. Exemplos: INSERT INTO T_ALUNO VALUES (‘001’,’Joao da Silva’); Inserirá o registro de João da Silva na tabela T_Aluno. UPDATE T_SALARIO SET VAL_SALARIO_MINIMO = VAL_SALARIO_MINIMO * 1.2; Atualizará o salário mínimo, da tabela salário, em 20%. Iniciando uma Sessão SQL*Plus Executar o SQL*Plus e “logar-se”. C:\>SQLPLUS<Enter> Enter user name: manoel Enter password: ******* O “prompt” do SQL*Plus será exibido. SQL> Para sair (terminar uma sessão SQL*Plus), digitar “exit”. SQL>exit OBS.: Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 9 O SQL*Plus possui um help. Basta digitar “help” ou “help <comando>” no “prompt” do SQL*Plus. Ex.: HELP UPDATE Vendo a estrutura de uma tabela O comando DESCRIBE exibe a estrutura da tabela especificada, isto é, o nome, tipo, tamanho e se o campo é de preenchimento obrigatório ou não. EX.: DESCRIBE T_ALUNO Name MATRICULA NOME_ALUNO NULL NOT NULL NOT NULL Type VARCHAR2(06) VARCHAR2(40) TIPOS DE DADOS BÁSICOS CHAR O tipo CHAR armazena seqüência de caracteres de tamanho fixo que consistem de letras, números, caracteres especiais. O tamanho não pode ultrapassar 255 bytes. Em SQL Padrão, quando um dado possui um tamanho menor que o especificado para a coluna, espaços em branco são acrescentados à direita. O tamanho default é 1. (Não é aconselhável este tipo de dados apartir do Banco Oracle 8i). VARCHAR2 Armazena seqüências de caracteres de tamanho variável que consistem de letras, números, caracteres especiais. O tamanho máximo é de 4000. O tamanho default é 1. VARCHAR Idem ao VARCHAR2 NUMBER(T,D) Onde T significa o tamanho do campo e D a quantidade de casas decimais (se for o caso). DATE Tipo de dado usado para datas e horas (intervalo: 01 de janeiro de 4712 AC e 31 de dezembro de 4712 DC). LONG Idem ao VARCHAR2, mas com tamanho máximo de 2 Gigabytes. CLOB Tipo de Dado usado para armazenamento de caracteres de grandes objetos. O Tamanho máximo é de 4 Gb. BLOB Tipo de Dado usado para armazenamento binário de grandes objetos. O Tamanho máximo é de 4 Gb. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 10 BFILE Tipo de Dado que contém a localização de um arquivo binário armazenado fora do banco de dados. Tamanho máximo de 4Gb. * Existem outros tipos de dados, mas estes são variações dos tipos apresentados acima. SELECIONANDO DADOS: COMANDO SELECT O comando mais fundamental da linguagem SQL para manipulação dos dados é o SELECT. Com ele é que produzimos as “Queries”, ou seja ,as pesquisas no Banco de Dados. Sua sintaxe é: SELECT [DISTINCT] (quais colunas queremos) FROM (de qual(is) tabela(s) ) [WHERE (condição de pesquisa) ] [GROUP BY colunas [HAVING condição ] ] [ORDER BY colunas ] Exemplos de “Queries”: 1)SELECT * FROM ALUNO; Retorna todas as linhas e todas as colunas da tabela ALUNO. 1)SELECT MATRICULA, NOME_ALUNO FROM ALUNO; Idem à “Query” acima. 1)SELECT MATRICULA, NOME_ALUNO FROM ALUNO WHERE NOME_ALUNO = ‘JOAO DA SILVA’; Retorna os dados dos alunos que tenham nome igual a JOAO DA SILVA. 1)SELECT MATRICULA FROM CURSA WHERE ((NOTA1+NOTA2+NOTA3)/3) > 7 AND CD_DISCIPLINA = ‘PORT’; Retorna a matrícula de todos os alunos que obtiveram média acima de sete na disciplina PORT. 1)SELECT MATRICULA, CD_DISCIPLINA, NOTA1 FROM CURSA WHERE NOTA1 BETWEEN 5 AND 7; Retorna a relação de todas as matrículas, código da disciplina e nota1, cuja notas1 esteja contida entre 5 e 7, inclusive; 1)SELECT MATRICULA, CD DISCIPLINA FROM CURSA WHERE NOTA3 IS NULL; Retorna as matrículas e disciplinas que estão sem lançamento da nota3. 1)SELECT MATRICULA, NOME_ALUNO FROM ALUNO WHERE NOME_ALUNO LIKE ‘JOAO%’; Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 11 Retorna a matrícula e o nome dos alunos chamados JOAO (independente de seus sobrenomes); 1)SELECT * FROM CURSA WHERE CD_DISCIPLINA IN (‘MAT’,’PORT’); Retorna os dados dos alunos que cursam as disciplinas MAT e PORT. 1)SELECT DISTINCT NOME_ALUNO FROM ALUNO; Retorna o nome dos alunos da tabela Aluno, não exibindo os nomes duplicados. Denominamos Tabela_resultado o resultado de uma “Query”, isto é, a tabela resultante de um SELECT. OBS.: a)O predicado LIKE (exemplo 7) determina que a pesquisa será feita em todos os nomes que comecem com JOAO. O caractere % pode ser colocado também antes da palavra. EX.: ... LIKE ‘%MARIA%’. b)O CARACTERE * (exemplo 1) “pega” todas as colunas da tabela. EXPRESSÕES ARITMÉTICAS Uma expressão é a combinação de um ou mais valores, operadores, e funções os quais avaliam para um valor. Expressões Aritméticas podem conter nome de colunas, valores numéricos constantes e operadores aritméticos: Operadores + * / Descrições Adição Subtração Multiplicação Divisão SQL> SELECT 1+1 FROM DUAL; 1+1 ---------2 SQL> Select 12/4 Divisão from dual; DIVISÃO ---------3 Se a sua expressão aritmética conter mais de um operador a prioridade é *,/ primeiro, então +,segundo (deixe para direita se existir operadores com a mesma prioridade). No exemplo seguinte a multiplicação (250*12) é avaliada primeiro; então o valor do salário é adicionado no resultado da multiplicação (3000). Somente para linha do Smith: 800+3000=3800 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 12 select ename, sal + 250 * 12 from emp; ENAME ---------SMITH ALLEN WARD JONES SAL+250*12 ---------3800 4600 4250 5975 Parênteses podem ser usados para especificar a ordem na qual serão executados es operadores, se, por exemplo, a adição e requerida antes da multiplicação. select ename, (sal + 250) * 12 from emp; ENAME ---------SMITH ALLEN WARD JONES (SAL+250)*12 -----------12600 22200 18000 38700 FUNÇÕES AGREGADAS A característica marcante das Funções Agregadas é que produzem um único valor a partir de uma coluna inteira de dados. Portanto, enquanto qualquer outro tipo de expressão retorna um valor para cada linha, as funções agregadas retornam um valor que representa um agregado dos valores referentes às várias linhas. O atributo de uma função agregada normalmente é um nome de coluna ou uma expressão que tenha um nome de coluna como componente – por exemplo, salário * 1.25 . As funções MAX, MIN e COUNT aceitam caracteres e números, entretanto as funções AVG e SUM devem possuir como atributo coluna que seja do tipo numérico, pois elas operam aritmeticamente. Podemos utilizar as palavras-chave DISTINCT e ALL em funções agregadas tendo o seguinte efeito: -A palavra-chave ALL faz com que todos os valores, inclusive os repetidos, sejam aproveitados. -A palavra-chave DISTINCT faz com que os valore repetidos sejam ignorados. Em todas as funções o ALL é o deflua. Exemplos: 1)SELECT AVG(SALARIO) FROM EMPREGADO; 1)SELECT SUM(SALARIO) FROM EMPREGADO; Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 13 1)SELECT MAX(SALARIO) FROM EMPREGADO; 1)SELECT MAX(NOME) FROM EMPREGADO; 1)SELECT MIN(SALARIO) FROM EMPREGADO; 1)SELECT COUNT(NOME) FROM EMPREGADO; 1)SELECT COUNT(DISTINCT NOME) FROM EMPREGADO; ORDENANDO A TABELA RESULTADO A cláusula ORDER BY nos permite ordenar as linhas da tabela-resultado alfabética e numericamente, em ordem crescente ou decrescente. O default é a ordem crescente. Para fazer a classificação com base em uma expressão ou função, temos que representá-la com um número que identifique a sua posição na cláusula SELECT. Isto também é verdade para a cláusula GROUP BY. Exemplos: 1)SELECT NOME, TEL FROM FUNC ORDER BY NOME DESC; 1)SELECT COD_FUNC, NOME, BAIRRO FROM FUNC ORDER BY NOME, BAIRRO; 1)SELECT COD_FUNC, NOME, BAIRRO FROM FUNC ORDER BY BAIRRO, NOME; 1)SELECT NOME, SALARIO FROM FUNC ORDER BY 2 DESC; Obs: Normalmente os valores nulos de uma coluna são exibidos em primeiro lugar quando a mesma é classificada. REVERTENDO A ORDEM DEFAULT Usa-se o comando DESC após o nome da coluna especificada na cláusula order by. Exemplo: Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 14 SELECT DEPTNO, JOB, ENAME FROM EMP ORDER BY HIREDATE DESC; ORDENANDO POR VÁRIAS COLUNAS É possível ordenar por mais de uma coluna. De fato, o limite é o número de colunas na tabela. Para ordenar por duas colunas e mostrar a ordem reversa dos salários, entre: SELECT DEPTNO, JOB, ENAME FROM EMP ORDER BY DEPTNO, SAL DESC; A CLÁUSULA WHERE Corresponde ao operador de restrição da álgebra relacional. Ela é colocada após a cláusula FROM. Exemplo da sintaxe: SELECT columns FROM table WHERE condição de pesquisa A cláusula WHERE pode comparar valores em colunas, valores literais, expressões aritméticas ou funções. Sendo assim, a cláusula WHERE espera por 3 elementos, são eles: 1º) Um nome de coluna; 2º) Um operador de comparação; 3º) Um nome de coluna, constante ou lista de valores. Os operadores de comparação são usados na cláusula WHERE e podem ser divididos entre duas categorias, que são: LÓGICOS e SQL. Apresentamos abaixo os Operadores Lógicos, que testarão as seguintes condições: Operador = > >= < <= Significado igual a maior que maior ou igual que menor que menor ou igual que Utilizando caracteres string e datas na cláusula WHERE, torna-se necessário o uso de (‘’) plicas. Como exemplo1, para listar nomes, números, funções(jobs) e departamentos de todos os CLERKS, entre: SELECT EMPNO, ENAME, JOB, DEPTNO FROM EMP Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 15 WHERE JOB = ‘CLERK’; Como exemplo2, para encontrar todos os nomes de departamento com número maior que 20, entre: SELECT DNAME, DEPTNO FROM DEPT WHERE DEPTNO > 20; COMPARANDO COLUNAS NA MESMA LINHA Você pode comparar uma coluna a outra na mesma linha, assim como a uma constante. Como exemplo, suponha que você queira obter todos aqueles empregados cuja comissão é maior que os seus salários: SELECT ENAME, SAL, COMM FROM EMP WHERE COMM>SAL; Abaixo apresentaremos os Operadores SQL, os quais operam com todos os tipos de dados: Operadores Significado 1º) BETWEEN ... AND ... entre dois valores (inclusive); 2º) IN(LIST) verifica um argumento de pesquisa, numa lista de valores que satisfaçam a esta determinada condição; 3º) LIKE facilita a pesquisa dada uma parte da string; 4º) IS NULL é um valor nulo. 1º) O OPERADOR BETWEEN Testa condição de valores mediante um limite mínimo e máximo inclusive. Como exemplo, suponha que você queira obter todos os empregados, cujo salário está entre 1000 e 2000: SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000; 2°) O OPERADOR IN Testa valores numa lista específica. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 16 Como exemplo, para obter todos os empregados subordinados a um dos três gerentes destacados pelos números abaixo, entre: SELECT EMPNO, ENAME, SAL, MGR FROM EMP WHERE MGR IN (7902, 7566, 7788); Nota: É obrigatório o uso de (‘’) plicas para caracteres e datas especificados na lista. 3º) O OPERADOR LIKE Algumas vezes, pode ser que você não saiba exatamente o valor à pesquisar. Usando o operador LIKE será possível então, selecionar linhas mediante a uma parte da string que sirva para o argumento desejado. Temos o símbolo abaixo com sua designação: Símbolo % Significado Representa qualquer sequência de Zero ou mais caracteres. Como exemplo, para listar todos os empregados cujo nome se inicia com um S, entre: SELECT ENAME FROM EMP WHERE ENAME LIKE ‘S%’; 4º) O OPERADOR NULL É o operador específico para testar valores que são nulos. Como exemplo, para obter todos os empregados que não tenham gerentes, deve ser feito o teste para um valor nulo. SELECT ENAME, MGR FROM EMP WHERE MGR IS NULL; EXPRESSÕES DE NEGAÇÃO Os seguintes operadores são utilizados como teste de negação: Operador Descrição != não é igual a (VAX, UNIX, PC) <> não é igual a NOT COLNAME = não é igual a Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 17 NOT COLNAME > não é maior que Abrangendo-se também os operadores SQL: Operador NOT BETWEEN NOT IN Descrição não se encontra entre dois valores dados não se encontra numa lista de valores de dados NOT LIKE não é como a string IS NOT NULL não é um valor nulo Como exemplo1, para encontrar os empregados cujo Salário não está entre um determinado intervalo, entre: SELECT ENAME, SAL FROM EMP WHERE SAL NOT BETWEEN 1000 AND 2000; Como exemplo2, para encontrar aqueles empregados cujo nome da função (Job) não comece com a letra M, entre: SELECT ENAME, JOB FROM EMP WHERE JOB NOT LIKE ‘M%’; Como exemplo3, para encontrar todos os empregados que tenham um Gerente (MGR), entre: SELECT ENAME, MGR FROM EMP WHERE MGR IS NOT NULL; CONSULTANDO DADOS COM MÚLTIPLAS CONDIÇÕES Os operadores AND e OR podem ser usados para estabelecer expressões lógicas compostas. O operador AND em determinada expressão, é usado para que se atinja um resultado em que ambas as condições sejem verdadeiras; enquanto o operador OR espera que uma das condições sejem verdadeiras para que o resultado também seje verdadeiro. Como exemplo1, para encontrar todos os (CLERKS) que ganhem entre 1000 e 2000, entre: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB = ‘CLERK’; Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 18 Como exemplo2, para encontrar todos os empregados que sejam CLERK e/ou todos os empregados que ganhem entre 1000 e 2000, entre: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB = ‘CLERK’; Nota: Você pode combinar AND e OR na mesma expressão lógica. Quando AND e OR aparecerem na mesma cláusula WHERE, todos os AND’s serão executados primeiro e os OR’s em seguida sucessivamente; pois o AND tem maior precedência sobre o OR. Como exemplo3, o comando abaixo retornará todos os gerentes com salário > 1.500,00 ou todos que sejem vendedores. SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1.500,00 AND JOB = ‘MANAGER’ OR JOB = ‘SALESMAN’; Os parêntesis especificam a sequência em que os operadores serão executados. Como exemplo, selecionar todos os gerentes e vendedores com salário maior que 1.500,00, entre: SELECT EMPNO, ENAME, JOB, SAL, DEPTNO FROM EMP WHERE SAL > 1,500.00 AND (JOB = `MANAGER` OR JOB = `SALESMAN`); PRECEDÊNCIA DE OPERADORES Todos os operadores obedecem a uma forma hierárquica de precedência. Numa expressão, as operações são executadas em ordem de suas precedências, sempre da de maior precedência para a de menor. E quando de mesma precedência, serão executadas da esquerda para a direita. Estão assim na ordem abaixo: 1º Todos operadores de comparação e os operadores SQL têm igual precedência (=, !=, <, >, <=, >=, BETWEEN ... AND, IN, LIKE, IS NULL; 2º NOT ( reverte resultados de expressões lógicas); 3º AND; 4º OR. SUBQUERYS Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 19 Uma subquery é um comando select dentro de um outro comando select onde retorna uma ou mais linhas a fim de satisfazer uma clausula WHERE. No exemplo abaixo temos um select em s_emp onde procuramos trazer o last_name e o title, onde o title pesquisado seja o mesmo do " Smith", para isso é realizado uma subquery que nada mais é que um select, que neste caso retorna um valor somente para a comparação na where. SQL> select last_name, title 2 from s_emp 3 where title = 4 (select title 5 from s_emp 6 where last_name = 'Smith'); LAST_NAME TITLE ------------------------- ------------------------Maduro Stock Clerk Smith Stock Clerk Nozaki Stock Clerk Patel Stock Clerk Newman Stock Clerk Markarian Stock Clerk Chang Stock Clerk Patel Stock Clerk Dancs Stock Clerk Schwartz Stock Clerk 10 rows selected. Outro exemplo de subquery, que neste caso está comparando os valores da coluna SALARY com a média dos salários da tabela s_emp. A função AVG está trazendo a média dos salários. SQL> select last_name, title, salary 2 from s_emp 3 where salary< 4 (select avg(salary) 5 from s_emp); LAST_NAME TITLE SALARY ------------------------- ------------------------- --------Urguhart Warehouse Manager 1200 Menchu Warehouse Manager 1250 Biri Warehouse Manager 1100 Smith Stock Clerk 940 Nozaki Stock Clerk 1200 Patel Stock Clerk 795 Newman Stock Clerk 750 Markarian Stock Clerk 850 Chang Stock Clerk 800 Patel Stock Clerk 795 Dancs Stock Clerk 860 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 20 Schwartz Stock Clerk 1100 12 rows selected. Nos exemplos anteriores vemos que retornavam só um único valor para comparação na clausula where, neste caso agora há o retorno de mais de um valor para a comparação na clausula where, mas para que ocorra a comparação com mais de um valor temos que usar o IN em vez do "=" no exemplo abaixo ocorre um erro: SQL> select last_name, title 2 from s_emp 3 where dept_id = 4 (select id from s_dept 5 where name = 'finance or region_id = 2); select last_name, title * ERROR at line 1: ORA-01756: quoted string not properly terminated Agora usando o IN na clausula where poderá o dept_id ser comparado com as duas condições, o select trará os registros que na tabela s_dept que tenham o nome igual a 'Finace' ou que a region_id seja igual a 2. SQL> select last_name,first_name,title 2 from s_emp 3 where dept_id in 4 (select id 5 from s_dept 6 where name = 'Finance' or region_id =2); LAST_NAME FIRST_NAME TITLE ------------------------- ------------------------- ------------------------Quick-To-See Mark VP, Finance Menchu Roberta Warehouse Manager Giljum Henry Sales Representative Nozaki Akira Stock Clerk Patel Vikram Stock Clerk O uso do having em subquery Neste exemplo estamos querendo selecionar o dept_id e a média dos salários de s_emp, grupados pelo dept_id, com a condição de que a média dos salários de s_emp seja maior que a média dos salários do dept 32 para isso usamos o HAVING. Vamos ao Exemplo: SQL> select dept_id,avg(salary) 2 from s_emp 3 group by dept_id 4 having avg(salary)> 5 (select avg(salary) 6 from s_emp 7 where dept_id = 32); Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 21 DEPT_ID AVG(SALARY) --------- ----------33 1515 50 2025 Agora dentro do group by estamos usando o having e dentro da subquery selecionando o menor valor da média da tabela s_emp grupado por title SQL> 1 select title,avg(salary) 2 from s_emp 3 group by title 4 having avg(salary) = 5 (select min(avg(salary)) 6 from s_emp 7* group by title) TITLE AVG(SALARY) ------------------------- ----------Stock Clerk 949 SQL> select min(avg(salary)) 2 from s_emp 3 group by title; MIN(AVG(SALARY)) ---------------949 EDITANDO COMANDOS SQL Podemos editar comandos que foram digitados. Comando L[IST] A[PPEND] texto C[HANGE]/texto_anterior/texto_novo DEL I[NPUT] n n texto Descrição Lista o último comando SQL digitado. Acrescenta texto no fim da linha corrente Troca o texto_anterior para texto_novo Apaga a linha corrente Acrescenta uma ou mais linhas após a linha corrente; para sair no modo Input pressione Enter Faz com que a linha n passe a ser a linha corrente. Troca o texto da linha pelo texto. Executando Pesquisas Padrões com Variáveis Substituíveis Variáveis Substituíveis são usadas em declarações SQL e permitem valores serem identificados na execução. Explicação dessa Unidade Única Variável Substituível Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 22 Você pode usar variáveis substituíveis no arquivo comando ou nas declarações SELECT para representar valores que sejam entrados na hora da execução. Uma variável pode ser uma idéia de como uma valor pode ser armazenado temporariamente. Uma variável é representado por um único i comercial(&), e o valor é atribuído nela. A seguinte declaração apresenta ao usuário um número de departamento na execução: SELECT FROM WHERE EMPNO, ENAME, SAL EMP DEPTNO = &DEPARTMENT_NUMBER; Enter value for department_number : 10 EMPNO ENAME -------------7782 CLARK 7839 KING 7934 MILLER SAL ---------2,450.00 5,000.00 1,300.00 O exemplo acima usa a condição WHERE DEPTNO = 10. Com o único "e" comercial o usuário é solicitado toda vez que o comando é executado, porque a variável não é definida e consequentemente o valor digitado não é salvo. Um valor alfanumérico ou data precisa ser incluído entre aspas simples na entrada. Para evitar a entrada das aspas simples na execução, declara-se a variável entre aspas simples. Na declaração seguinte, as variáveis estão incluídas entre aspas simples, só que as aspas simples não são requeridas na execução: SELECT FROM WHERE ENAME, DEPTNO, SAL*12 EMP JOB = '&JOB_TITLE'; Enter value for job_title: MANGER ENAME DEPTNO SAL*12 ---------- ------ ---------JONES 20 35700 BLAKE 30 34200 CLARK 10 29400 O tamanho da variável é indefinido, o valor será entrado todo vez que for executado a declaração É possível entrar com um nome de coluna de um tabela na execução. No seguinte exemplo você entrará com um expressão aritmética. SELECT DEPTNO, &ARITHMETIC_EXPRESSION FROM EMP Enter value for arithmetic_expression: sal/12 DEPTNO SAL/12 ------ ------20 66.6667 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 23 30 30 20 30 30 10 20 10 30 20 30 20 10 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 Variáveis substituíveis Se uma variável é prefixada com um duplo "e" comercial(&&), SQL*Plus preenche o valor da variável com o primeiro valor fornecido na execução da declaração 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 não mais. Você pode usar o comando DEFINE para determinar se uma variável já está definida. Se a variável é definida, ela mostra o valor atribuído. SQL>DEFINE DEFINE DEPTNO_PLEASE = "10" (CHAR) O comando DEFINE é então usado para criar uma variável para o usuário. O Comando DEFINE Um valor pode ser atribuído para uma variável usando o comando DEF[INE] do SQL*Plus. O valor atribuído pode ser referenciado na declaração SELECT ou comando de arquivo pelo nome de variável predefinido de um (&). Despreenchida usando o comando UNDEF[INE]. No exemplo seguinte, uma variável tem seu conteúdo definido como uma expressão aritmética que calcula a remuneração. Na subsequente declaração, a variável REM é referenciada para um número de vezes. A variável é então despreenchida usando UNDEF(INE). DEFINE REM = "SAL*12+NVL(COMM,0)" SELECT ENAME, JOB, &REM Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 24 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(COMM,0) -----------------9600 11400 13200 15500 15600 16400 18000 19500 29400 34200 35700 36000 36000 60000 As Aspas duplas em volta da expressão são opcionais a menos que a expressão tenha espaços. Iniciando um Arquivo comando Contendo Variáveis Substituíveis. Suponhamos que você queira uma série de relatórios para listar os empregados com vários cargos por exemplo; um para Vendedores, um para escriturário, um para gerentes, etc. Você já sabe como usar variáveis substituíveis para obter esses diversos relatórios de uma única declaração SELECT. Porém, existe uma alternativa técnica que você pode usar , se você quiser armazenar a declaração SELECT em um arquivo e então usar o comando START para executá-lo. Essa técnica requer o uso de algumas variáveis substituíveis especiais. Existem nove dessas variáveis e seus nomes vão de um á nove. Para e usar essas variáveis no "e" comercial ‘&’ coloca-se um numeral (1-9) no comando SQL. Essas variáveis podem ser usados vários números ao mesmo tempo e em várias ordens. Cada vez que o comando é executado, cada ‘&1’ no comando é alterado pelo primeiro parâmetro depois de START arquivo, cada ‘&2’ é substituído pelo segundo parâmetro, e assim por diante. Para criar um arquivo comando com um parâmetro especificando o cargo para ser mostrado, faça: SELECT EMPNO, ENAME, SAL FROM EMP WHERE JOB = '&1'; SQL> SAVE JOB1 SQL retornará a mensagem Created File Job1 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 25 Agora execute o comando com o parâmetro ‘CLERK’. SQL*Plus substituirá a variável com o parâmetro. SQL> START JOB1 CLERK EMPNO ENAME SAL ----- ----- ----7369 SMITH 800 7876 ADAMS 1100 7900 JAMES 950 Note que você não pode usar essas variáveis 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 variável com valor, a qual é entrada na execução, armazenando nela. O ACCEPT é geralmente usado num arquivo comando. Esta variável então pode ser referenciada na declaração do SQL. Existem benefícios em usar o ACCEPT para definir Variáveis Substituíveis. •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) variable (NUMERICO/ALFANUMERICO) (PROMPT/NOPROMPT 'texto') Sintaxe Descrição NUMBER/CHAR determina o tipo de variável. Se o valor entrado for inválido uma mensagem será mostrada. PROMPT ‘texto’ mostra o texto se for especificado NOPROMPT faz o ACCEPT omitir uma linha aguardando a entrada HIDE esconde entrada para o usuário. No caso de senha Exemplos SQL> ACCEPT SALARY NUMBER PROMPT 'Salary figure : ' Salary figure : 30000 SQL> ACCEPT PASSWORD CHAR PROMPT 'Password : ' HIDE Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 26 Password : SQL> ACCEPT COMM NUMBER NOPROMPT 500 SQL> DEFINE DEFINE SALARY = 30000 (NUMBER) DEFINE PASSWORD = "FREEBIES" (CHAR) DEFINE COMM = 500 (NUMER) GUARDANDO COMANDOS EM ARQUIVOS Podemos arquivar os comandos SQL que digitamos interativamente, em arquivos para uso futuro. Basta utilizarmos um editor de textos qualquer. Devemos no entanto, salvar tal arquivo com uma extensão “.SQL”. Para executar o “script” criado digitar @ e o nome do arquivo, no “prompt do SQL*Plus. Exemplo: SQL>@lista_deptos.sql EXERCÍCIO 1)Logar-se no SQL*Plus 2)Criar a tabela abaixo: TABELA ALIMENTOS NOME DO CAMPO TIPO TAMANHO COD_ALIMENTO NUMÉRICO 04 NOME_ALIMENTO ALFANUMÉRICO 30 PREÇO NUMÉRICO 6,2 PROTEÍNAS NUMÉRICO 6,2 OBRIGATÓRIO S S N N 1)Inserir 3 (três) registros quaisquer na tabela Alimentos 2)Ver a estrutura da tabela 3)Exibir o alimento mais caro 4)Exibir o somatório dos preços dos alimentos (inseridos na questão 3). MANIPULANDO DADOS Conforme já vimos anteriormente os comando de manipulação dos dados do Oracle são: INSERT Adiciona novas linhas (registros) à tabela. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 27 DELETE UPDATE COMMIT ROLLBACK Remove/Deleta linhas da tabela. Altera/Modifica linhas. Ratifica transações efetuadas. Desfaz as transações (ainda não ratificadas por um COMMIT). Inserindo Dados Para incluirmos dados em uma tabela utilizamos o comando INSERT. Sua sintaxe é: INSERT INTO [USUARIO.]TABELA [ (COLUNA1 [, COLUNAN ] ...) ] {VALUES (VALOR [, VALOR] ...) | QUERY } Exemplos: 1)INSERT INTO CURSA VALUES (‘TEC001’,’APD1’,NULL,NULL,NULL); 1)INSERT INTO CURSA VALUES (‘TEC001’,’MAT1’,80,NULL,NULL); Obs.: a)Não é necessário especificar no comando INSERT os nomes das colunas caso você queira incluir a linha inteira, ou seja, todas as colunas (exemplo 1). b)Todo campo do tipo “NOT NULL” deve sempre ser preenchido. c)Campo do tipo não numérico devem ser delimitados com plics. Se você precisar incluir um apóstrofe no seu string de caracteres use dois apóstrofes seguidos, por exemplo: ‘JOHN’’S” para inserir JOHN’S. d)Podemos usar a expressão “NEXTVAL” para inserirmos o próximo valor para, por exemplo, uma chave primária. Ex.: INSERT INTO T_DEPARTAMENTO(COD_DEPTO, NOME_DEPTO) VALUES (T_DEPARTAMENTO_COD_DEPTO.NEXTVAL,’FINANCAS’); Para tal, o campo T_DEPARTAMENTO_COD_DEPTO deve Ter sido criado como um objeto do tipo ‘SEQUENCE’. INSERINDO COM UMA “QUERY” O comando INSERT pode utilizar uma “query” para incluir dados em uma tabela. Exemplos: 1)INSERT INTO FUNC_SUL SELECT * FROM FUNC WHERE BAIRRO IN (‘COPACABANA’,’IPANEMA’,’LEBLON’); 1)INSERT INTO FUNC_CHEFE SELECT * FROM FUNC WHERE SALARIO > 600; Obs.: Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 28 a)Para utilizar as “queries” acima, as tabelas FUNC_SUL e FUNC_CHEFE devem existir e possuir a mesma estrutura da tabela da “query”. b)Campos que são NOT NULL na tabela original também deverão ser preenchido na tabela onde os dados serão inseridos. ALTERANDO DADOS O Comando UPDATE atualiza linhas em uma tabela. Sintaxe: UPDATE nome_da_tabela SET coluna = valor [WHERE condição] Exemplos: 1)UPDATE T_SALARIO SET VAL_SALARIO = VAL_SALARIO * 1.5 WHERE VAL_SALARIO < 1000; Atualiza os salários menores que 1000, em 50%. 1)UPDATE T_FUNCIONARIO SET VAL_SALARIO = 1800, COD_DEPTO = 13 WHERE COD_FUNCIONARIO = 2392; Altera o salário do funcionário 2392, para R$ 1.800,00, transferindo-o para o departamento de número 13. EXCLUINDO DADOS DA TABELA Utilizamos o comando DELETE para removermos linhas de uma tabela ou visão. Se não houver uma cláusula WHERE todas as linhas da tabela ou visão serão eliminadas. Sintaxe: DELETE FROM {tabela | visão } [ WHERE condição ] Exemplos: 1)DELETE FROM FUNC WHERE NASC > ‘11-JAN-62’; 1)DELETE FROM DEPENDENTES WHERE NOME LIKE ‘MANOEL%’; CONTROLANDO TRANSAÇÕES O controle de transações lógicas no Oracle é feito através dos comando COMMIT e ROLLBACK. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 29 RATIFICANDO TRANSAÇÕES O trabalho no Banco de Dados, deve ser processado em agrupamentos lógicos, ou seja, o Banco de Dados deve receber alterações quaisquer mantendo-se coerente com o que o mesmo representa. Por exemplo, se um aumento na “quantidade de fitas alugadas” tiver sido entrado, o BD pode não estar coerente até que “Estoque_fitas_disponíveis” tenha sido diminuído deste valor. Com isto definimos então Transação como um grupo de mudanças que constitui um agrupamento lógico de entradas, isto é, a Transação é o conjunto de mudanças feitas no BD entre os comandos COMMIT. COMANDO COMMIT Ratifica a transação corrente fazendo todas as trocas no BD (grava fisicamente). Mudanças como INSERT, DELETE, UPDATE devem ser feitas em grupos como transações lógicas, e depois submetidas, através do comando COMMIT, ao Banco de Dados. Isto assegura a gerência e a integridade dos dados. Sintaxe: COMMIT Após uma falha do sistema, somente as mudanças com COMMIT serão salvas. Como os comandos INSERT, UPDATE e DELETE podem fazer com que muitas linhas diferentes sejam alteradas, deve-se Ter o cuidado de não se fazer muitas mudanças antes de um COMMIT. Pode ocorrer também que, após muitas mudanças (ainda não submetidas), aconteça uma falha no sistema, necessitando que tais mudanças sejam feitas novamente. Obs.: a)Existe também a opção AUTOCOMMIT que faz com que cada mudança seja submetida após a entrada. Só deve ser usada quando as mudanças que serão feitas não estão logicamente relacionadas. b)Comandos que causam um COMMIT automático: ALTER, AUDIT, CREATE, DISCONNECT, DROP, EXIT, GRANT, NOAUDIT, QUIT, REVOKE. Se você digitou outros comandos e ainda não os submeteu com um COMMIT, e entrar com um dos comandos acima, então todo o trabalho anterior será submetido. COMANDO ROLLBACK O comando ROLLBACK cancela mudanças completadas, mas não submetidas ao BD, deixando assim o BD como se tais mudanças nunca tivessem sido feitas. Sintaxe: ROLLBACK O ROLLBACK é executado quando ocorre uma falha no sistema (falta de energia, por exemplo). COMMIT INSERT DELETE Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 30 INSERT INSERT ROLLBACK UPDATE INSERT COMMIT COMANDO SAVEPOINT Dentro de uma transação extensa, podemos declarar pontos de salvamento (SAVEPOINT’s) intermediários dividindo o trabalho na Transação: INSERT... DELETE... UPDATE... SAVEPOINT PRIMEIRO INSERT... UPDATE... DELETE... SAVEPOINT SEGUNDO INSERT... UPDATE... DELETE... . . . Através dos SAVEPOINT’s que declaramos, podemos desfazer partes de uma transação, deixando outras partes intactas. Exemplo.: ROLLBACK TO SAVEPOINT SEGUNDO Esta instrução anula os efeitos de todas as instruções posteriores ao SAVEPOINT SEGUNDO. Sua transação libera também quaisquer bloqueios que as instruções desfeitas adquiriram, para que outras transações possam modificar os dados. Depois de um cancelamento até um SAVEPOINT, a transação ainda permanece ativa. Exercício Criar uma tabela de equipamentos com 3 campos: COD_EQUIPAMENTO, NOME_EQUIPAMENTO, MARCA. Ex.: a)INSERT INTO T_EQUIPAMENTO VALUES (‘080’,’TELEVISAO CORES’,’SHARP’); a)SAVEPOINT UM; b)INSERT INTO T_EQUIPAMENTO VALUES (‘081’,’MINI SYSTEM’,’AIWA’); Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 31 a)SAVEPOINT DOIS; b)INSERT INTO T_EQUIPAMENTO VALUES (‘082’,’WALKMAN’,’SONY’); a)SELECT * FROM T_EQUIPAMENTO; b)ROLLBACK TO SAVEPOINT UM; c)COMMIT; d)SELECT * FROM T_EQUIPAMENTO; CRIANDO TABELAS E VISÕES (VIEW’s) Conforme já vimos criamos tabelas em SQL com o comando CREATE TABLE. Ex.: CREATE TABLE T_ACESSORIO-ROUPA (COD_ACESSORIO NUMBER(03), NOME_ACESSORIO VARCHAR2(30), TAMANHO_ACESSORIO VARCHAR2(10), DATA_COMPRA DATE DEFAULT SYSDATE CONSTRAINT PK_T_ACESSORIO_ROUPA PRIMARY KEY (COD_ACESSORIO)); CRIANDO SEQUENCES DO ORACLE Este objeto é utilizado dentro do banco de dados para fazer uma especie de "auto-incremento", utilizando números sequenciais positivos ou negativos para uma coluna especifíca. Utilizaremos este objeto quando queremos uma coluna que organize os registro do banco, um exemplo, seria a utilização do Sequence para criação de colunas de Código ou Matrícula. Abaixo demonstrarei um exemplo de criação do Sequence determinando suas opções de uso: SQL> CREATE SEQUENCE CONSULTING 2 START WITH 1 3 INCREMENT BY 1 4 MAXVALUE 999 5 CYCLE 6 CACHE 10 ; Na 1º Linha estamos dizendo para o Oracle criar uma sequencia com o nome CONSULTING. Na 2º Linha será especificado o primeiro número da sequencia, no exemplo está 1. A 3º Linha vamos determinar o numero de incremento, no caso 1 em 1. Na 4º Linha será determinada o número máximo que a sequencia atingirá, exemplo 999 números. A 5º Linha indica que a geração dos números será após ter atingido o número máximo ou o número minimo para as sequencias decrescentes. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 32 E a 6º Linha irá especificar para o banco uma quantidade de números que será guardado na memoria para posteriormente fazer uma consulta rápida. Bom, agora deu para entender a criação de um objeto sequence dentro do banco, precisamos saber agora como utilizá-la, e para isso basta você incluir o sequence dentro do seu comando Insert, veja o exemplo : SQL> INSERT INTO TABELA (CODIGO, NOME, EMAIL, SITE) 2 VALUES ( CONSULTING.NextVal, 'Edson Junior', '[email protected]','www.consulting.com.br'); A linha acima foi incluída com sucesso, mas perceba que apareceu uma palavra-chave em NEGRITO após digitar o nome da sequence, essa palavra-chave é para obter o próximo número sequencial (NextVal), poderiamos utilizar outra palavra-chave a CurrVal que nos daria o valor atual da sequencia. Depois de termos criado a sequence para a tabela, falarei sobre alguns pontos bons e ruins na sua utilização no dia-dia. Pontos Bons - Ajuda na organização dos registros. - Podemos utilizar uma unica sequence para várias tabelas do banco de dados, economizando tempo e mão-de-obra. Pontos Ruins - Caso tenha uma perca de memoria ou uma falha do sistema, o objeto perderá toda numeração sequencial, ficando totalmente inutilizavel. - Caso você execute o comando DELETE na sua tabela, o número da sequencia que você deleto será pedido, então ficará um "burraco" na sua coluna, pois a sequence não é um auto-incremento que deixará sempre o registro com numeração correta. Depois de citar o empate tecnico entre os pontos bons e ruins, vamos pensar que você queira ter um controle sobre as Sequences que você criou no banco. Como fazer isso ? Seus problemas acabaram, pois o maravilhoso Oracle sabe como fazer isso bem facilmente, cada usuário tem seu schema onde é guardada todas as sequences, type, type_methods e etc.. e um simples comando você consegue ver as sequences que estão no seu Shema. SQL > DESC SYS.USER_SEQUENCES Ele retornará a descrição resumida da User_Sequence do SChema para você. VISÕES OU TABELAS VIRTUAIS (VIEW´s) Uma visão é uma tabela resultante de uma “query” à qual damos um nome. Depois que você tiver criado uma visão, isto é, dado um nome à tabela resultado de uma determinada “query”, poderá pesquisar os seus dados exatamente como faria com uma tabela qualquer. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 33 As visões têm várias funções, dentre elas Independência de dados, Segurança de acesso e facilidade de acesso. Com as visões podemos restringir o acesso aos dados especificando que colunas e/ou linhas um determinado usuário, aplicação ou grupo pode ver, assim como o que eles podem fazer (Incluir, Modificar, Excluir). Muitas vezes o acesso aos dados exigem “queries” complexas. Um usuário pode construir uma visão que contenha uma certa complexidade e disponibilizá-la para usuários finais e programadores, que farão “queries” mais simples sobre esta Visão. Você estará então, retirando a complexidade da navegação de uma aplicação ou de um usuário no acesso aos dados. Sintaxe: CREATE VIEW nome_visão (coluna1, coluna2,... colunaN) AS SELECT (cláusula Select); Exemplos: Vamos supor que muitos usuários e aplicações necessitem do nome do funcionário, nome dos seus dependentes e o endereço dos seus dependentes. O DBA poderia criar uma Visão que fornecesse esse conjunto de informações da seguinte forma: CRATE VIEW VISAO_01 (NOME_FUNC, NOME_DEP, ENDERECO) AS SELECT T1.NOME, T2.NOME, T1.END FROM FUNC T1, DEPENDENTES T2 WHERE T1.COD_FUNC = T2.COD_FUNC; Obs.: Após a execução do CREATE VIEW podemos acessar os dados dessa VISÃO da mesma forma que uma tabela. Por exemplo, poderíamos digitar a seguinte “query”: SELECT * FROM VISAO_01 ORDER BY 2,1; Existem algumas restrições no uso de View’s, que variam de implementação para implementação. Vejamos as principais, que são comuns a quase todos os banco de dados relacionais: 1)Não podemos colocar a cláusula UNION nem ORDER BY em um CREATE VIEW; 2)Não podemos atualizar uma coluna que seja derivada de uma função ou de uma expressão; 3):Não podemos atualizar uma visão que seja composta por mais de uma tabela (JOIN ou Junção); 4)Não podemos atualizar uma visão que contenha um GROUP BY; 5)Não podemos inserir dados em uma visão se ela for composta por mais de uma tabela ou se não contiver todas as coluna definidas como NOT NULL na tabela básica. VISÕES MATERIALIZADAS O que essas Views Materializadas (ou Snapshots) fazem de interessante? Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 34 Utilizamos elas para fazermos cálculos, armazenamentos de dados e dar agilidade na troca de informações entre um banco de dados ou entre tabelas. Este recurso é muito utilizado em ambientes de Data Warehouse, que trabalha com uma enorme quantidade de informações. Pois com elas conseguimos melhorar a performance do sistema e trazer diversos benefícios ao Oracle. As Views Materializadas são utilizadas para fazer atualizações, a própria Oracle garante que as atualizações são feitas com sucesso numa tabela destinatária após terem sido efetivadas nas tabelas originais. Isso nos dá mais tranqüilidade na administração e no desenvolvimento. Agora vamos ver um exemplo de como se faz uma Views Materializadas, olhe abaixo: SQL > CREATE MATERIALIZED VIEW CONSULTING 2 BUILD IMMEDIATE 3 REFRESH FAST 4 ENABLE QUERY REWRITE 5 AS (SELECT QUALQUER - Pórem com Restrições.) 6/ Linha 1 - ( CREATE MATERIALIZED VIEW CONSULTING) Aqui estamos começando a criar nossa View Materializada, veja que depois da palavra VIEW devemos definir um nome para ela, no nosso exemplo utilizei meu nickname, CONSULTING. Para as versões anteriores ao 9i, criávamos sendo Snapshots, exemplo, CREATE SNAPSHOT NOME, então mudou em relação a versão 9i. OBS: a versão 10g mantém o padrão da versão 9i. Linha 2 - ( BUILD IMMEDIATE ) Nesse ponto estamos dizendo que a View Materializada deverá utilizar os dados imediatamente na query rewrite (Seu SELECT), desde modo os dados serão processados com mais agilidade. Existe também outro método, chamado build dedferred que significa que a view não terá nenhum tipo de dados a ser utilizada automaticamente, esse modo seria um processamento manual das informações, que será depois atualizado pelo Refresh, resumindo, que com essa opção o comando SELECT não será executado imediatamente. Linha 3 - ( REFRESH FAST ) Esse método é para dizer que as modificações serão utilizadas somente pela View Materializada, para utilizar este recurso com segurança, sugiro criar uma View Materializada Log, para ter controle sobre as modificações que estão sendo feitas, explicarei isso na próxima coluna. Linha 4 - ( ENABLE QUERY REWRITE ) Essa linha de comando é o que indica que o SELECT presente dentro da View Materializada será reescrita e atualizada para os novos valores passados pela VIEW. A query rewrite pode ter três níveis de integridade que vai desde o modo ENFORCED até o STALE_TOLERATED, que indicará ao banco de dados que tipo de confiança ele poderá ter nos dados. Sobre as integridades, falaremos na próxima coluna também, pois e um pouco mais delicado. Linha 5 - ( AS SELECT ) Aqui será colocado seu SELECT, onde poderá fazer alguns cálculos ou visualizações de informações para outras tabelas, como no exemplo de SELECT que irei passar. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 35 SELECT SUM(mulheres) FROM mundo WHERE nome='Cristiane' Então o que acontecerá? Estou pegando algumas informações que será atualizada no banco de dados, esse meu SELECT ele está bem simples, porém os SELECTS que devemos utilizar dentro das Views Materializadas devem seguir um padrão delas, como, por exemplo, não utilizar cláusulas como UNION, UNION ALL, INTERSECT e MINUS. Se utilizar alguma dessas cláusulas a view não irá atualizar os dados, assim como tem que seguir alguns outros critérios. CRIANDO RESTRIÇÕES (CONSTRAINT’s) Na criação de tabelas podemos definir algumas restrições (constraint’s), visando manter a integridade/consistência do banco de dados. São elas: CONSTRAINT NOT NULL preenchimento obrigatório). UNIQUE PRIMARY KEY FOREIGN KEY CHECK OBJETIVO Não permitir campos nulos (usada para campos de Especifica que o campo não poderá conter valores duplicados. Especifica-se esta Constraint para os atributos identificadores das tabelas (chaves primárias) Para definição de chaves estrangeiras (foreign key), estabelecendo relacionamentos entre tabelas do BD. Valida o preenchimento de uma coluna da tabela. ADICIONANDO, MODIFICANDO COLUNA DE UMA TABELA Para adicionar ou modificar colunas em uma tabela usamos o comando ALTER TABLE. Adicionar Sintaxe: ALTER TABLE nome_da_tabela ADD (nome_da_coluna tipo [ , nome_da coluna tipo] ... ) Exemplo: ALTER TABLE T_ACESSORIO_ROUPA ADD (PRECO_ACESSORIO NUMBER(6,2)); Modificar Sintaxe: ALTER TABLE nome_da_tabela MODIFY (nome_da_coluna tipo [ , nome_da coluna tipo] ...) Exemplos: 1)ALTER TABLE T_ACESSORIO MODIFY (NOME_ACESSORIO NOT NULL); Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 36 1)2) ALTER TABLE T_ACESSORIO MODIFY (TAMANHO_ACESSORIO VARCHAR2(15)); Podemos também adicionar e remover restrições (Constraint’s) das tabelas. Exemplos: a)ALTER TABLE T_EMP ADD CONSTRAINT T_EMP_COD_GERENTE_FK FOREIGN KEY (COD_GERENTE) REFERENCES T_EMP(COD_EMP); a)ALTER TABLE T_EMP DROP CONSTRAINT T_EMP_COD_GERENTE_FK; Obs.: A tabela do dicionário de dados Oracle, denominada USER_CONSTRAINTS contém as restrições (Constraint’s) do Banco de Dados. Exemplos: 1)DESCRIBE USER_CONSTRAINTS 1)SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME = ‘T_ACESSORIO_ROUPA’; REMOVENDO COLUNA DE UMA TABELA Para remover colunas em uma tabela usamos o comando ALTER TABLE DROP Column Sintaxe: ALTER TABLE NOTA DROP COLUMN Nome_da_Coluna DELETANDO TABELAS OU VISÕES(VIEW’s) Usamos o comando DROP TABLE | VIEW para deletarmos tabelas/visões. Sintaxe: DROP {TABLE | VIEW } nome_da_tabela|visão; Exemplo: DROP TABLE T_ALUNO; EXERCÍCIO III Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 37 1)Crie a tabela T_ACESSORIO_ROUPA 2)Altere a tabela, incluindo uma coluna à mesma 3)Modifique a tabela, alterando a coluna criada acima 4)Crie uma visão da tabela T_ACESSORIO_ROUPA 5)Delete a visão criada acima CRIANDO ÍNDICES O objetivo da criação de índices é agilizar a recuperação de dados, ou seja, acelerar a procura dos dados na tabela. Quando criamos índices para uma tabela, especificando uma coluna, tal tabela é classificada de tal forma que, sempre que for mencionada uma query, o sistema usará o índice para Ter acesso direto aos dados desejados, ao invés de vasculhar a coluna toda. Um índice é um objeto do Banco de dados como uma tabela ou visão. Criamos um índice com a declaração CREATE INDEX, e ele é automaticamente atualizado quando a coluna (ou colunas) a ele associada(s) sofre(m) alguma alteração. Quando colocamos num índice várias colunas chamamos este de índice composto ou concatenado. A manipulação de índices é uma tarefa administrativa, cabendo sua execução ao DBA do sistema, portanto para criar e eliminar índices no Oracle o usuário deve ser o DBA, ou seja, deve possuir o privilégio DBA. Sintaxe: CREATE [UNIQUE] INDEX <nome_índice> ON nome_da_tabela (coluna1 [ ASC | DESC ] [ coluna2 [ ASC | DESC ] ] ... ); Usamos a palavra-chave UNIQUE para criar um índice para a chave-primária da tabela, pois com UNIQUE valores duplicados na tabela não serão mais aceitos. Exemplos: 1)CREATE UNIQUE INDEX IND_COD_F ON FUNC(COD_FUNC); 1)CREATE INDEX NOM_BAIR ON FUNC (NOME, BAIRRO); Obs.: a)Convém criarmos índices para colunas que, dentre outras características: -São usadas com freqüência em cláusulas WHERE ou em Junções (JOIN’s); -Todos os valores da coluna são únicos (UNIQUE); -Contém intervalo grande. a)Não convém criarmos índices: -Se a tabela é pequena, -A tabela é alterada com freqüência. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 38 a)A tabela do dicionário de dados denominada USER_INDEXES possui as informações sobre os índices do BD. ELIMINANDO ÍNDICES Qualquer índice de uma tabela é eliminado automaticamente quando a tabela é eliminada. Para eliminarmos somente o índice usamos o comando DROP. Sintaxe: DROP INDEX NOM_BAIR; A tabela ou visão onde foi criado o índice não é afetada pela sua eliminação. PRIVILÉGIOS Nem todos os usuários do Oracle podem acessar todas as tabelas do Banco de Dados. Para conceder ou revogar privilégios de acesso/manipulação aos usuários o DBA utiliza os comando GRANT e REVOKE. Podemos conceder/revogar diversos tipos de privilégios, dependendo do usuário. Se um usuário final irá somente consultar Tabelas, Visões O DBA concederá somente privilégios de consulta (SELECT). Entretanto para um desenvolvedor o DBA deverá dar, além de privilégios de consulta, outros privilégios (por exemplo, privilégios de Criação/Alteração de tabelas, visões, etc.) Um privilégio de sistema é um privilégio poderoso que, se concedido ao usuário, dará ao mesmo o direito de executar uma operação em nível de banco de dados. Cabe portanto ao DBA a tarefa de definir quais usuários do Banco terão tais privilégios (poderão ser outros administradores e/ou desenvolvedores de aplicações). Exemplo: Um usuário com privilégio SELECT ANY TABLE pode consultar qualquer tabela do banco. Um usuário com o privilégio ALTER DATABASE pode alterar a estrutura física do banco, incluindo novos arquivos. Um privilégio de objetos do BD administra uma operação do banco de dados sobre um objeto específico do BD (uma tabela, uma visão, ...). Exemplo: Um usuário com privilégio de SELECT na tabela SALÁRIOS, pode consultar a mesma. Um outro usuário com privilégio de UPDATE, na tabela SALARIOS, poderá alterar a mesma (ação que não poderá ser realizada pelo usuário com privilégio de SELECT apenas). Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 39 COMANDO GRANT Concede privilégios aos usuários Oracle cadastrados. Sintaxe: GRANT <privilégio> to { usuário | role | public } [ WITH ADMIN OPTION ]; Exemplos: 1) GRANT CREATE SESSION, CREATE TABLE TO JOAO; 2) GRANT SELECT ANY TABLE TO manoel; 1)GRANT SELECT, INSERT, UPDATE, DELETE ON T_Salario TO joaquim; COMANDO REVOKE O comando REVOKE retira (revoga) o privilégio concedido através do GRANT. Sintaxe: REVOKE {privilégio | role } FROM {usuário | role | PUBLIC }; Exemplos: 1)REVOKE SELECT ANY TABLE FROM manoel; 2)REVOKE UPDATE FROM joaquim; AGRUPANDO PRIVILÉGIOS: “ROLE” Tendo em vista que o Oracle possui uma infinidade de privilégios e que a quantidade e diversidade de perfis de usuários em um banco de dados também é grande, a administração dos privilégios de todos eles (usuários) seria um tarefa no mínimo bastante trabalhosa. Visando dirimir este problema existe o objeto Oracle denominado ROLE. Em uma ROLE podemos agrupar diversos privilégios e conceder aos usuários, não mais os privilégios e sim as ROLES. Exemplo: 1)CREATE ROLE admin_salarios; 1)GRANT SELECT, INSERT, UPDATE,DELETE ON T_SALARIOS TO admin_salarios; 1)GRANT SELECT,INSERT, UPDATE, DELETE ON T_COMISSOES TO admin_salarios; Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 40 1)GRANT admin_salarios to USUARIO_A, USUARIO_B, USUARIO_C, ... No exemplo acima, os usuários A, B e C receberam os privilégios da ROLE admin_salarios (que Seleciona, Insere, Altera e Elimina dados das Tabelas T_SALARIOS e T_COMISSOES). Obs.: O Comando REVOKE (revoga privilégios) também é utilizado com ROLES. Exemplo: 1)REVOKE UPDATE ON T_COMISSOES FROM admin_salarios; 2)REVOKE USUARIO_B FROM admin_salarios; ACESSANDO O SISTEMA OPERACIONAL Para utilizar um comando do sistema operacional sem sair do SQL*Plus basta digitar o comando HOST. Exemplo: HOST <comando_do_sistema_operacional> ou $ <comando_do_sistema_operacional> Obs.: -Para “ir” para o sistema operacional sem tirar o SQL*Plus da memória basta digitar o sinal de “!” no prompt do SQL*Plus. FUNÇÕES Funções fazem a pesquisa de bloco mais potente, e são usadas para manipular valores. Nessa Unidade falaremos de funções numéricas e alfanuméricas. Funções de Data, funções de Conversão, e funções as quais operam sobre tipos de dados. Introdução a Funções Funções são usadas para manipular dados. Elas aceitam um ou mais argumentos e retorna um valor. Um argumento é uma constante, refece-se a variável ou coluna. O formato para uma função é a seguinte: função_nome (arumento1,argument2,...) Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 41 Funções podem ser usadas para: •Cálculos sobre datas •modificar valores de itens individuais •manipular saída para grupos de linhas •alterar formatos de datas para mostrá-los Existem diferentes tipos de funções: •ALFANUMÉRICAS •NUMÉRICAS •DATA •CONVERSÃO •FUNÇÕES QUE ACEITAM VÁRIOS TIPOS DE DADOS •GRUPO Algumas funções operam unicamente sobre linhas simples; outras manipulam grupo de linhas. A mais comuns funções usadas estão nesse manual. Funções de Linha Única •age sobre cada linha retornada na pesquisa •retorna um resultado por linha •espera um ou mais argumento do usuário •pode ser aninhada •podem ser usadas com variáveis do usuário, colunas, expressões podem ser usadas por exemplo nas : clausulas SELECT, WHERE, ORDER BY. Explicação da notação Notação Significado Col qualquer nome de coluna do Banco de Dados Value qualquer valor literal (alfanumérico/data/numérico) n representa um número ‘string’ representa a linha de caracter Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 42 chars representa o número de caracteres especificados date representa uma coluna data ou valor de data FUNÇÕES ALFANUMÉRICAS E NUMÉRICAS Funções Alfanuméricas Funções Alfanuméricas aceitam dados alfanuméricos e podem retornar alfanumérico ou valores numéricos. A função seguinte influência na construção de valores alfanuméricos. LOWER LOWER(col/value) fornece valores alfanuméricos os quais estão em letra maiúscula ou minúscula e retornam em letra minúscula Para mostrar o nome dos departamentos em letra minúscula e a constante SQL COURSE, faça: SELECT LOWER(DNAME), LOWER('SQL COURSE') FROM DEPT; LOWER(DNSAME) LOWER(SQL COURSE) ------------- ------------------reseatch sql course sales sql course operations sql course accounting sql course UPPER UPPER(col/value) fornece caracteres alfanuméricos, os quais estão em letra maiúscula ou minúscula e retornar em letra maiúscula. No exemplo seguinte, a função UPPER força o usuário entrar em letra maiúscula. SELECT ENAME FROM EMP WHERE ENAME = UPPER('&ENAME'); Enter value for ename : smith ENAME ---------SMITH INITCAP INITCAP(col/value) força a primeira letra da Palavras ser em maiúscula e o resto minúscula INITCAP(DANAME) INITCAO(LOC) --------------- -----------Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 43 Accounting New York Research Dallas Sales Chicago Operations Boston SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT; LPAD e RPAD As funções LPAD e RPAD enchem valores alfanuméricos para tamanhos especificados. LPAD(col/value,n,’caracter’) preenche a coluna ou valor literal da esquerda para o total tamanho de n posições. Os principais espaços estão preenchidos com o ‘caracter’. Se o caracter for omitido o valor padrão é espaços. 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 posições. Os espaços a direita são 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 padrão. SUBSTR A função seguinte assume os caracteres na linha estando numerados da esquerda para a direita começando com 1. SUBSTR(col/value,pos,n) Retorna um linha de n caracteres da coluna ou valor literal, iniciando na posição número pos. Se n é omitido Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 44 a linha é extraída da posição pos até o fim. O próximo exemplo mostra o seguinte “sublinha”; •quatro caracteres do literal ORACLE iniciando na segunda posição. •conteúdo do Dname iniciando no segundo caracter. •cinco caracteres do DNAME iniciando na terceira posição. SELECT SUBSTR('ORACLE',2,4), SUBSTR(DNAME,2), SUBSTR(DNAME,3,5) FROM DEPT; SUBSTR('ORACLE',2,4) SUBSTR(DNAME,2) SUBSTR(DNAME,3,5) -------------------- ---------------------- ----------------------RACL ESEARCH SEAC RACL ALES LES RACL PERATIONS ERATI RACL CCOUNTING COUNT Note que os valores estão alinhados para a esquerda. Isso porque SQL*Plus sempre mostra dados alfanuméricos alinhados para a esquerda por padrão. INSTR INSTR(col/value,’caracter’) INSTR(col/value,’caracter’,pos,n) encontra a primeira ocorrência do ‘caracter’. encontra a posição do caracter do tamanho do ‘caracter’ na coluna ou valor literal iniciando na posição número 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 específicos caracteres de um linha. LTRIM(col/value,’caractere(s)’) removem da esquerda principalmente ocorrências Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 45 de caracteres (ou combinação de caracteres específicos). Se o caracter não é especificado cortará os brancos da esquerda SELECT DNAME, LTRIM(DNAME,'A'), LTRIM,'AS'), LTRIM(DNAME,'ASOP') FROM DEPT; DNAME LTRIM(DNAME,'A') LTRIM(DNAME,'AS') LTRIM(DNAME,'ASO P') ----------------------------------------------------------------RESEARCH RESEARCH RESEARCH RESEARCH SALES SALES LES LES OPERATIONS OPERATIONS OPERATIONS ERATIONS ACCOUNTING CCOUNTING CCOUTING CCOUTING Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 46 RTRIM(col/value,’caractere(s)’) remove da direita ocorrência de caracter(s) (ou combinações de caracteres específicos). Se os caracteres não forem especificados serão removidos os brancos. SELECT DNAME, RTRIM(DNAME,'G'), RTRIM,'GHS'), RTRIM(DNAME,'N') FROM DEPT; DNAME RTRM(DNAME,'G') RTRIM(DNAME,'GHS') ---------------RESEARCH SALES OPERATIONS ACCOUNTING ---------------RESEARCH SALES OPERATIONS ACCOUNTING -----------------RESEARC SALE OPERATION ACCOUTIN RTRIM(DNAME ,'N') ------------------RESEARCH SALES OPERATIONS ACCOUTING RTRIM pode ser usada para ajudar na remoção 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 função retorna a fonética representação 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 número 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 função INSTR, LENGTH retorna um valor numérico. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 47 TRANSLATE e REPLACE As funções TRANSLATE e REPLACE são usadas para substituir caracteres. TRANSLATE(col/value,from,to) transforma caracteres de para. Mais de um caracter pode ser combinado. Todas as ocorrências from são substituídas com a correspondente caracter no to. Se o correspondente to não 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 ocorrência da linha de alteração. 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 REPLACE(JOB,'SALESMAN','SALESPERSON') REPLACE(ENAME,'CO','PX') ----------- ------------------------------------- ------------- -----------------------ANALYST ANALYST SCOTT SPXTT SALESMAN SALESPERSON TURNER TURNER SALESMAN SALESPERSON ALLEN ALLEN MANAGER MANAGER CLARK CLARK ENAME A Função REPLACE é um complemento da função TRANSLATE que substitui caracteres um a um e o REPLACE substitui um linha por outra. Aninhamento de Funções Funções de linhas únicas podem ser aninhadas para várias finalidades. Se funções são aninhadas, elas são avaliadas de dentro para fora. Isto é por exemplo: X(D(A(B(C(caracter))))) ordem lógica de execução “C,B,A,D e X.” Suponhamos que você queira encontrar o número de vezes que um determinado caracter ocorre em uma linha. Como você faria isso? Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 48 Você pode aninhar as funções LENGTH e TRANSLATE para realizar um requisitado resultado. O exemplo seguinte permite contar o número de Ss em uma linha SELECT DNAME, LENGTH(DNAME), LENGTH(DNAME) - LENGTH(TRANSLATE(DNAME,'AS','A')) FROM DEPT; DNAME LENGHT(DNAME) LENGTH(TRANSLATE(DNAME,'AS','A')) ---------- ------------- ----------------------------------------------RESEARCH 8 1 SALES 5 2 OPERATIONS 10 1 ACCOUNTING 10 0 Aqui estão os passos para realizar esse resultado 1.Usa-se o LENGTH para identificar o número de LENGTH(DNAME)- caracteres da linha. 2.Então usa a função TRANSLATE para fazer todas as ocorrências 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 não corresponde a nenhum caracter para ser alterado. Como S não 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 número de ocorrências do caracter S na linha. Funções Numéricas As funções aceitam entrada de números e retornam valores numéricos. ROUND ROUND(col/value,n) arredonda um coluna, expressão ou valor para n casas decimais. Se n é omitido não tem casas decimais. Se n for negativo, os números para esquerda do decimal são arredondados. SELECT ROUND(45.923,1), ROUND(45.923), ROUND(45.323,1), ROUND(45.323,-1), ROUND(SAL/32,2) FROM EMP Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 49 WHERE DEPTNO = 10; ROUND(45.923,1) ROUND(45.923) ROUND(45.323,1) ROUND(45.323,-1) ROUND(SAL/32,2) --------------45.9 45.9 45.9 ------------46 46 46 --------------45.3 45.3 45.3 ---------------40 40 40 --------------76.56 156.25 40.63 TRUNC TRUNC(col/value.n) SELECT trunca a coluna, expressão ou valor para n casas decimais, ou se n é omitido não têm casas decimais. Se n é negativo os números para esquerda das casas decimais são truncados para zero. 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) TRUNC(45.923) TRUNC(45.323,1) TRUNC(45.323,-1) TRUNC(SAL/32,2) --------------45.9 45.9 45.9 ------------45 45 45 --------------45.3 45.3 45.3 ---------------40 40 40 --------------76.56 156.25 40.62 CEIL CEIL(col/value) encontra o menor valor maior que ou igual para a coluna, expressão 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 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 50 FLOOR FLOOR(col/value) encontra o maior valor menor que ou igual para a coluna, expressão 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 POWER POWER(col/value,n) FLOOR(101.76) ------------101 101 101 FLOOR(-11.1) ------------12 -12 -12 eleva uma coluna, expressão ou valor por uma potência, n pode ser negativo mas deve ser um número, se não 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 SQRT SQRT(col/value) POWER(SAL,2) --------------6002500 25000000 1690000 POWER(SAL,3) --------------14706125000 125000000000 2197000000 POWER(50,5) --------------312500000 312500000 312500000 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, expressão 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; Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 51 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 Freqüentemente a função 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 salário é maior que sua comissão. SELECT ENAME, SAL, COMM FROM EMP WHERE SIGN(SAL-COMM) = 1; ENAME ------------ALLEN WARD TURNER SAL ---------------1600 1250 1500 ABS ABS(col/value) COMM -------------300 500 0 encontra o valor absoluto de um coluna, expressão 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 COMM-SAL ------------1300 -750 150 ABS(COMM-SAL) -----------1300 750 150 .00 -1500 1500 ABS(-35) -----------35 35 35 35 35 35 MOD MOD(val1,val2) encontra o resto da divisão 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 COMM --------------- MOD(SAL,COMM) --------------- 300.00 500.00 1,400.00 100 250 1250 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br MOD(100,40) --------------20 20 20 20 20 52 1,500.00 .00 1500 20 Exercício - Usando Funções Esses exercícios convém o uso de funções não somente para o SELECT mas no WHERE e ORDER BY. Se colunas sinônimas são usadas no resultado, use então na clausula SELECT da sua declaração SQL. Oficina 1. Liste os nomes e salários incrementados de 15% dos empregados e também 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 saída. EMPLOYEE_AND_JOB -------------------SMITH CLERK ALLEN SALESMAN WARD SALESMAN JONES MANAGER MARTIN SALESMAN BLAKE MANAGER CLARK MANAGER SCOTT ANALYST KING PRESIDENT TURNER SALESMAN ADAMS CLERK JAMES CLERK FORD ANALYST MILLER 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 dígitos de seu número e o código soundex do seu nome. NAME CODE Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 53 ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER ----------CL36S530 SA49A450 SA52W630 MA56J520 SA65M635 MA69B420 MA78C462 AN78S300 PR83K520 SA84T656 CL87A352 CL90J520 AN90F630 CL93M460 4. Fazer uma ferramenta intensiva de pesquisa para listar os empregados com o cargo que o usuário entrar. Enter value for job : clerk EMPNO ENAME JOB ----7369 7876 7900 7934 ---------SMITH ADAMS JAMES MILLER ---------CLERK CLERK CLERK CLERK MG R ----7902 7788 7698 7782 HIREDATE SAL --------13-JUN-83 04-JUN-84 23-JUL-84 21-NOV-83 ---------800.00 1,100.00 950.00 1,300.00 COMM ---------- DEPT NO -----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 ocorrência de L no nome do empregado, e substituí-la por X. ENAME ---------SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER FIRST_OCCURENCE_OF_L ------------------SMITH AXLEN WARD JONES MARTIN BXAKE CXARK SCOTT KING TURNER Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 54 ADAMS JAMES FORD MILLER ADAMS JAMES FORD MIXLER Funções Numéricas e Alfanuméricas 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; 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 Funções de Linha Única Explicação dessa Unidade Nessa Unidade nós cobriremos funções de Data, de conversão e funções que aceitam vários tipos de entrada de dados. Funções de Data Funções de data operam sobre datas do ORACLE. Todas as funções de datas retornam valores de tipo data exceto MONTHS_BETWEEN o qual retorna um valor numérico. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 55 Armazenamento de Datas no ORACLE Armazenamento de Datas internamente no ORACLE formato numérico, representação: •Século •Ano •Mês •Dia •Horas •Minutos •Segundos O padrão de data mostrados nas pesquisas é DD-MON-YY. Sysdate Sysdate é uma coluna que retorna a data e horário 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 usuários. Ela contém 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 Aritméticos Devido o fato das datas serem armazenadas como número, é possível fazer cálculos com datas usando operadores aritméticos tal como adição e subtração. Você pode adicionar e subtrair números constantes e bem como data de data. As operações que você pode realizar são: data + número Adicionando um número de dias em uma data, produzindo uma nova data data - número subtraindo um número de dias de uma data, produzindo uma nova data data - data subtraindo uma data de outra, produzindo um número de dias data+número/24 adicionando um número de horas em uma data produzindo um nova data SELECT HIREDATE, HIREDATE+7, HIREDATE-7, SYSDATE - HIREDATE FROM EMP WHERE HIREDATE LIKE '%JUN%'; HIREDATE HIREDATE+7 HIREDATE-7 ---------------13-JUN-83 11-JUN-84 04-JUN-84 ---------------20-JUN-83 18-JUN-84 11-JUN-84 ---------------06-JUN-83 04-JUN-84 28-MAY-84 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br SYSDATEHIREDATE ---------------1982.70628 1618.70628 1625.70628 56 04-JUN-84 11-JUN-84 28-MAY-84 1625.70628 Subtraindo SYSDATE de HIREDATE coluna da tabela EMP retorna o números de dias que o empregado está admitido. MONSTHS_BEETWEEN MONTHS_BETWEEN(data1,data2) encontra o número de meses entre data 1 e data2. O resultado pode ser positivo ou negativo. Se a data 1 for posterior a data2, então 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,HIR EDATE) -------------------------------65.0873622 63 60.5067171 59.3454267 59.3454267 59.8292977 MONTHS_BETWEEN('01-JAN-84','05-NOV88') ---------------------------------------58.429332 -58.429332 -58.429332 -58.429332 -58.429332 -58.429332 A parte não inteira do resultado representa um parcela do mês. ADD_MONTHS ADD_MONTHS(data,n) adiciona n números 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 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 57 NEXT_DAY NEXT_DAY(data1,’caracter’) data do próximo dia especificado da semana(caracter) seguinte data.1. Caracter deve ser um número representado um dia, ou o dia semana descrito em inglês. SELECT HIREDATE, NEXT_DAY(HIREDATE,'FRIDAY'), NEXT_DAY(HIREDATE,6) FROM EMP WHERE DEPTNO = 20; HIREDATE ----------------14-MAY-84 09-JUL-84 21-NOV-83 NEXT_DAY(HIREDATE,'FRIDAY') NEXT_DAY(HIREDATE, 6) ---------------------------------------------18-MAY-84 18-MAY-84 13-JUL-84 13-JUL-84 25-NOV-83 25-NOV-83 LAST_DAY LAST_DAY(data) encontra a data do ultimo dia do mês 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 função ROUND pode ser aplicada para datas. ROUND(data) retorna a data com o horário em 12:00(meio-dia) Isso usamos quando comparamos datas que tenham diferentes horários. ROUND(data,’MONTH’) retorna o primeiro dia do mês da data, Se a data estiver na primeira metade do mês; se não retorna o primeiro do mês seguinte. ROUND(data,’YEAR’) retorna o primeiro dia do ano da data se data estiver na primeira metade do ano; se não retorna o primeiro do ano seguinte. SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') FROM DUAL; Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 58 SYSDATE ---------------------04-DEC-89 ROUND(SYSDATE,'MONTH') ---------------------01-DEC-89 TRUNC TRUNC(data,’caracter’) ROUND(SYSDATE,'YEAR') ---------------------01-JAN-90 encontra a data do primeiro dia do mês 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 horário do dia. O horário contido no dia é removido por padrão. Funções de Conversão SQL possui um número de funções para controlar os tipos de conversão de dados. Essas funções de conversões converte um valor de um tipo de dado para outro. TO_CHAR(número,data,’formato’) converte números alfanuméricos e datas para formatos TO_NUMER(caracter) converte alfanuméricos os quais possuem números para numéricos. TO_DATE(‘caracter’,’formato’) converte um alfanumérico representando uma data, para um valor de data de acordo com o formato especificado. Se o formato é omitido o formato padrão é ‘DD=MON-YY’. TO_CHAR A função TO_CHAR é freqüentemente usada para modificar um formato de data padrão para um formato alternativo para mostrar. TO_CHAR(data,’máscara’) especifica que a data está sendo convertida para um novo formato na saída. Para converter a data corrente do formato padrão (DD-MON-YY) para uma nova máscara. SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') FROM DUAL; TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') --------------------------------------TUESDAY , 05TH SEPTEMBER 1989 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 59 Note que: •A ‘máscara’ a qual deve estar entre aspas simples, pode ser incluída em vários formatos listados anteriormente. A coluna e ‘máscara’ deve ser separadas por uma vírgula. •DAY e MONTH na saída são espaçados automaticamente com brancos no tamanho de 9 caracteres Para remover um espaço 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 também ser usado para extrair o horário de um único dia, e mostrá-lo no especificado formato. Para mostrar o formato de um dia: SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; TO_CHAR(SYSDATE,'HH:MI:SS') --------------------------------------08:16:24 A função TO_CHAR é também usada para converter um valor do tipo numérico para um valor do tipo alfanumérico. TO_CHAR(numer,’número máscara’) 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 máscaras são opcionais. Se a ‘máscara’ é omitida, a data é convertida para um alfanumérico valor ORACLE que é padrão DD-MON-YY. Se o ‘máscara’ não é especificada, o número é convertido para alfanumérico. Então note que o formato modelo não afetam o valor interno que representam o valor das colunas. Eles somente afetam como a coluna é mostrada quando retirada com uma declaração SELECT. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 60 Formatos de Data Máscara Significado SCC ou CC Século, prefixo ‘S’ “BC”data com ‘-’ YYYY ou SYYYY Ano, prefixo ‘S’ “BC” data com ‘-’ YYY ou YY ou Y Último 3, 2 ou 1 digito(s) do ano Y,YYY Ano com vírgula nessa posição SYEAR ou YEAR Ano, soletrado na saída ‘S’ prefixo “BC” data com ‘-’ BC ou AD BC/AD período B.C. ou A.D. BC/AD indicador com períodos Q Um quarto do Ano MM Mês MONTH nome do mês, espaçamento com brancos do tamanho de 9 caracteres MON nome do mês, 3 letras abreviadas WW ou W Semana do ano ou mês DDD ou DD ou D dia do ano, mês ou semana DAY nome do dia, espaçado com brancos com 9 caracteres de tamanho DY nome do dia, 3 letras abreviadas J data Juliana, o número de dias desde 31 dezembro 4713 antes de Cristo AM ou PM Indicador meridiano A.M. ou P.M. indicador meridiano com períodos HH ou HH12 horas do dia (1-12) HH24 horas do dia (0-23) MI minuto SS segundos SSSSS segundos passado meia-noite(0-86399) /.,etc. pontuação é reproduzida no resultado Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 61 “...” cotas de linhas são representadas no resultado. Os prefixos abaixo devem ser adicionados em frente aos códigos. Fm (mode de enchimento) Prefixo para MONTH ou DAY suprime os espaçamentos em brancos, partindo um tamanho de uma variável, FM suprimirá zeros para o formato ddth. Não significa que em outros códigos uma segunda ocorrência for FM torne brancos os espaços de novo. Os sufixos abaixo devem ser adicionados em frente dos códigos: TH número ordinal(“DDTH” para “4TH”) SP soletrando saída do número(“DDSP” para “FOUR”) SPTH ou thsp soletra o número ordinal na saída(“DDSPTH”para “FOURTH”) Nota: Os códigos são ferramentas sensitivas e afetaram a amostragem dos elementos da data: DAY MONDAY Day Monday Month July Ddth 14th DdTh 14Th Formatos Numéricos Os elementos do formato numérico modelo são: Máscara Significado Exemplo 9 posição numérica (número de 9s determinam a 999999 largura mostrada) 1234 0 mostra zeros 0999999 001234 $ mostra sinal de dólar $999999 $1234 . ponto decimal na posição especificada 999999.99 1234.00 , vírgula na posição especificada 999,999 1,234 MI sinal de menos à direita(valores negativos) 999999MI 1234- PR parênteses para números negativos 999999PR <1234> EEEE notação científica(formato de conter quatro Es 99.999EEEE unicamente) 1.234E+ 03 V multiplica pela décima potência 10n(n = número 9s 9999V99 depois da V 123400 B mostra valores zero em branco, não zero 1234.00 Nota: Consulting Tecnologia & Sistemas Ltda www.consulting.com.br B9999.99 62 A lista de formatos numéricos listas acima na tabela podem ser usados no comando Column do SQL*Plus (Ver Unidade 10). TO_NUMBER No seguinte exemplo a função TO_NUMBER é usada para transformar um número armazenado como um alfanumérico para um tipo numérico: 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 TO_DATE Para mostrar todos os empregados admitidos em 4 de junho de 1984 (não formato padrão), nós podemos usar a função 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 conteúdo é convertido para data e comparado com o valor de HIREDATE. A função TO_DATE é freqüentemente usada para suprir o valor ORACLE em um outro valor que o do padrão, Por exemplo, quando você insere um data, o ORACLE espera ser passado o valor no formato padrão DD-MON-YY. Se você não quer usar o formato padrão, você deve usar a função TO_DATE e apropriar o alternativo formato Por exemplo: Para entrar um linha na tabela EMP com a data não no formato padrão: INSERT INTO EMP (EMPNO, DEPTNO,HIREDATE) Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 63 VALUES(7777,20,TO_DATE('19/08/90','DD/MM/YY')); Funções que Aceitam Vários Tipos de Entrada de Dados DECODE DECODE é a mais potente função do SQL. Ele facilita pesquisas condicionais fazendo o trabalho de ‘ferramentas’ ou comandos ‘se-então-se não’. Sintaxe: DECODE(col/expressão, procurado1,resultado1,...,padrão) Col/expressão é comparado com cada um dos valores procurado e retorna o resultado se a col/expressão é igual ao valor procurado. Se não for encontrada nenhum dos valores procurados, a função DECODE retorna o valor padrão. Se o valor padrão for omitido ele retornará um valor nulo. Argumentos DECODE deve ter no mínimo 4 parâmetros ou argumentos. •COL/EXPRESSÃO - a nome da coluna ou expressão a ser avaliado. •PROCURADO1 - o primeiro valor para ser testado •RESULTADO1- o valor para ser retornado se o procurado1 for encontrado. •PROCURADO1 e RESULTADO1 podem ser repetidos quantas vezes forem necessários.(PROCURADO2,RESULTADO2, PROCURADO3,RESULTADO3,...) •PADRÃO - o valor a ser retornado se nenhum procurado for encontrado. Nota: •col/expressão pode ser vários tipos de dados. •PROCURADO deve ser um dado do tipo coluna ou expressão •O valor retornado é forçado 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 serão padrão alterados para UNDEFINED. SELECT ENAME, JOB, DECODE(JOB,'CLERK','WORKER', Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 64 '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 gratificação percentual dependendo do grau do salário: SELECT GRADE, DECODE(GRADE,'1','15%', '2','10%' '3','8%', '5%') BONUS FROM SALGRADE; GRADE BONUS --------- ----1 15% 2 10% 3 8% 4 5% 5 5% Esse exemplo ilustra como a função decode, o valor retornado é forçado a ter um tipo de dado no terceiro argumento. Nós permitimos o usuário especificar a ordem na qual a informação empregado é mostrada por entrada de um valor na hora da execução select * from emp order by decode(&orderby, 1,sal, 2,ename sal); Enter value for orderby: 2 Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 65 ERROR at line 2: ORA-1722: invalid number Note que esse comando causa um erro porque o tipo de dado de ename (alfanumérico) diferente que o do sal (numérico) o qual é o terceiro argumento. No exemplo abaixo, nós queremos retornar o salário 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 são convertidos para um valor antes da comparação. 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 Nota: Na função 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 são convertidos antes da comparação. SELECT LEAST(1000,2000), LEAST(SAL,COMM) Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 66 FROM EMP WHERE DEPTNO = 30; LEAST(1000,2000), ----------------------1000 1000 1000 1000 1000 LEAST(1000,2000), ----------------------300 500 1250 0 Nota: Na função LEAST quando na lista de valores existe um valor nulo ele é considerado como o menor. VSIZE VSIZE(col/valor) retorna o número 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 Funções Relembrando que funções podem ser aninhadas em vários níveis, e que o interior do aninhamento é avaliado primeiro, trabalhamos com a última função externa. Ela é então seguida de um trilha de abertura e fechamento de parênteses, que deve ser o número de cada uma. As funções abaixo tem sido aninhadas e são 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 alfanumérica com a função TO_CHAR. 2. A função NVL troca um MGR nulo por uma linha de caracteres ‘UNMANAGEABLE’. Consulting Tecnologia & Sistemas Ltda www.consulting.com.br 67 Funções aninhadas podem então 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 função ADD_MONTHS adiciona dois meses para o corrente mês (dezembro). 2. A função NEXT_DAY encontra a Quinta-feira dois meses de SYSDATE. 3. A função TO_CHAR converte a coluna data para um tipo de alfanumérico na ordem para mostrar um não formato padrão de data ‘Day dd Month YYYY’. Continuidade do Aprendizado Todas as dúvidas poderão ser enviadas para Edson Almeida Junior [email protected] MSN: [email protected] Ou Maximiliano Henriques [email protected] MSN: [email protected] Dica: É importante que todos façam sua inscrição no Fórum Oracle Tools http://br.groups.yahoo.com/group/oracle_tools/ Para Entrar no grupo envie uma mensagem para: [email protected] Para Sair do grupo envie uma mensagem para: [email protected] Consulting Tecnologia & Sistemas Ltda www.consulting.com.br