Conceitos básicos de SQL e ORACLE SQL* PLUS O Comando SELECT SELECT FROM [DISTINCT] {*, column [alias],...} table; – SELECT identifica as colunas – FROM identifica as tabelas Selecionando linhas SQL> SELECT * 2 FROM depto; SQL> SELECT depto_num, depto_loc 2 FROM depto; SQL> SELECT enome, sal, sal+300 2 FROM emp; SQL> SELECT enome, sal, 12*sal+100 2 FROM emp; Definindo Alias para Colunas SQL> SELECT enome AS nome, sal AS salario 2 FROM emp; NOME SALARIO ------------- --------... SQL> SELECT enome "Nome", 2 sal*12 “Salario Anual" 3 FROM emp; Nome Salario Anual ------------- ------------... Eliminando Linhas Duplicadas – DISTINCT SQL> SELECT DISTINCT depto_num 2 FROM emp; DEPTO_NUM --------10 20 30 SQL*Plus SQL Plus Aplicação cliente para conexão com Oracle. Localização: – Start Programs Banco de dados Oracle OraHome81 Application Development SQL Plus – Usuário e senha são idênticos Interface gráfica do SQL Plus Configurações Opcoes ambiente – Linesize – modifica a quantidade de caracteres por linha. Escolher personalizado. Escolhar ativar. Especificar 1000 caracteres. Aumentar largura do buffer para 1000. Listando a Estrutura de Tabelas SQL> DESCRIBE depto Name Null? ----------------- -------DEPTO_NUM NOT NULL DEPTO_NOM DEPTO_LOC Type -----------NUMBER(2) VARCHAR2(14) VARCHAR2(13) Executando um script no SQL Plus @caminho_completo Restringindo consultas e ordenando resultados Utilizando a Cláusula WHERE SQL> SELECT enome, cargo, depto_num 2 FROM emp 3 WHERE cargo='CAIXA'; ENOME ---------RONALDO MANUEL PAULO LUCIANO CARGO DEPTO_NUM --------- --------CAIXA 30 CAIXA 20 CAIXA 20 CAIXA 10 Operadores de Comparação Operador Significado = Igual a > Maior que >= Maior ou igual a < Menor que <= Menor ou igual a <> Diferente de Outros Operadores Operador Significado BETWEEN ...AND... Entre dois valores (inclusive) IN(lista) Satisfaz uma lista de valores LIKE Satisfaz um padrão de caracteres IS NULL É um valor nulo (null) Operador BETWEEN SQL> SELECT 2 FROM 3 WHERE enome, sal emp sal BETWEEN 1000 AND 1500; ENOME SAL ---------- --------MARIA 1250 SERGIO 1500 MATHEUS 1250 PAULO 1100 LUCIANO 1300 limite inferior limite superior Operador IN SQL> SELECT 2 FROM 3 WHERE ENUM --------7902 7369 7788 7876 enum, enome, sal, ger emp ger IN (7902, 7566, 7788); ENOME SAL GER ---------- --------- --------JOSE 3000 7566 MANUEL 800 7902 FABIO 3000 7566 PAULO 1100 7788 Operador LIKE – Utilize o operador LIKE para realizar pesquisas por padrões (wildcards). • % substitui zero ou mais caracteres • _ substitui um único caracter SQL> SELECT 2 FROM 3 WHERE enome emp enome LIKE ‘M%'; Operador IS NULL – Testando valores nulos (null) SQL> SELECT 2 FROM 3 WHERE enome, ger emp ger IS NULL; ENOME GER ---------- --------CARLOS Operadores Lógicos Operador Significado AND Retorna TRUE se a condição de ambos os componentes for TRUE OR Retorna TRUE se a condição de um dos componentes for TRUE NOT Retorna TRUE se a condição for FALSE (vise-versa) Operador NOT SQL> SELECT enome, cargo 2 FROM emp 3 WHERE cargo NOT IN('CAIXA','GERENTE','ANALISTA'); ENOME ---------CARLOS MARIA CELSO SERGIO MATHEUS CARGO --------PRESIDENTE VENDEDOR VENDEDOR VENDEDOR VENDEDOR Cláusula ORDER BY SQL> SELECT enome, cargo, depto_num, dtinicio 2 FROM emp 3 ORDER BY dtinicio DESC; ENOME CARGO DEPTO_NUM ---------- --------- --------PAULO CAIXA 20 FABIO ANALISTA 20 LUCIANO CAIXA 10 RONALDO CAIXA 30 JOSE ANALISTA 20 CARLOS PRESIDENTE 10 MARIA VENDEDOR 30 ... 14 rows selected. DTINICIO --------12-JAN-83 09-DEC-82 23-JAN-82 03-DEC-81 03-DEC-81 17-NOV-81 28-SEP-81 Manipulando dados O Comando INSERT – Adicione linhas a uma tabela utilizando o comando INSERT. INSERT INTO VALUES table [(column [, column...])] (value [, value...]); – O comando INSERT insere apenas uma linha por vez. Não esqueça o COMMIT Inserindo Novas Linhas – Insira uma nova linha informando os valores para cada coluna da tabela. – Liste os valores na mesma ordem das colunas na tabela. – Opcionalmente, liste as colunas na cláusula do INSERT. SQL> INSERT INTO depto (depto_num, depto_nome, depto_loc) 2 VALUES (50, 'DESENVOLVIMENO', ‘RECIFE'); 1 –row created. – Strings e datas devem ser informando entre aspas simples. Inserindo Linhas com Nulls – Implicitamente: omita o nome da coluna da lista de colunas. SQL> INSERT INTO 2 VALUES 1 row created. depto (depto_num, depto_nome ) (60, ‘REC HUMANOS'); – Explicitamente: especifique o valor NULL. SQL> INSERT INTO 2 VALUES 1 row created. depto (70, ‘JURIDICO', NULL); Inserindo Data e Hora do Sistema – A função SYSDATE informa a data e a hora corrente. SQL> INSERT INTO 2 3 4 VALUES 5 6 1 row created. emp (enum, enome, cargo, ger, dtinicio, sal, comis, depto_num) (7196, ‘ANTONIO', ‘VENDEDOR', 7782, SYSDATE, 2000, NULL, 10); Inserindo Datas – Adicionando um novo empregado. SQL> INSERT INTO 2 VALUES 3 4 1 row created. emp (2296,'ROMANO',‘VENDEDOR',7782, TO_DATE(‘03-02-1997','DD-MM-YYYY'), 1300, NULL, 10); – Verificando a data de admissão. ENUM ENOME CARGO GER DTINICIO SAL COMIS DEPTO_NUM ---- ------- -------- ---- --------- ---- ----- --------2296 ROMANO VENDEDOR 7782 03-FEB-97 1300 10 O Comando UPDATE – Modificando linhas existentes com o comando UPDATE. UPDATE SET [WHERE table column = value [, column = value] condition]; – Modifique mais de uma linha por vez especificando uma condição na cláusula WHERE. Não esqueça o COMMIT Atualizando linhas em uma tabela – Linhas específicas podem ser modificadas utilizando a cláusula WHERE. SQL> UPDATE emp 2 SET depto_num = 20 3 WHERE enum = 7782; 1 row updated. – Todas as linhas da tabela são modificadas se a cláusula WHERE for omitida. SQL> UPDATE emp 2 SET depto_num = 20; 14 rows updated. Eliminando Linhas de uma Tabela – Linhas específicas podem ser eliminadas utilizando a cláusula WHERE. SQL> DELETE FROM 2 WHERE 1 row deleted. depto depto_nome = 'DESENVOLVIMENTO'; – Todas as linhas da tabela são eliminadas se a cláusula WHERE for omitida. SQL> DELETE FROM 4 rows deleted. depto; Exibindo dados de múltiplas tabelas Joins – Utilize uma junção para consultar dados de mais de uma tabela. SELECT FROM WHERE table1.column, table2.column table1, table2 table1.column1 = table2.column2; – Especifique a condição de junção na cláusula WHERE. – Informe o nome da tabela junto com o nome da coluna, se tabelas diferentes possuírem colunas com os mesmos nomes. Criando Alias para Tabelas SQL> SELECT emp.enum, emp.enome, emp.depto_num, 2 depto.depto_num, depto.depto_loc 3 FROM emp, depto 4 WHERE emp.depto_num = depto.depto_num; SQL> SELECT e.enum, e.enome, e.depto_num, 2 d.depto_num, d.depto_loc 3 FROM emp e, depto d 4 WHERE e.depto_num = d.depto_num; Funções de Grupo (Agregação) O que são Funções de Grupo? – Funções de grupo operam em conjuntos de linhas, produzindo um resultado por grupo. EMP DEPTO_NUM SAL --------- --------10 2450 10 5000 10 1300 20 800 20 1100 20 3000 20 3000 20 2975 30 1600 30 2850 30 1250 30 950 30 1500 30 1250 “o maior salário da tabela EMP” MAX(SAL) --------5000 Funções AVG e SUM – Utilize o AVG e SUM apenas para dados numéricos SQL> SELECT 2 3 FROM 4 WHERE AVG(sal), MAX(sal), MIN(sal), SUM(sal) emp cargo LIKE ‘VEND%'; AVG(SAL) MAX(SAL) MIN(SAL) SUM(SAL) -------- --------- --------- --------1400 1600 1250 5600 Funções MIN e MAX – Utilize MIN e MAX para qualquer tipo de dado SQL> SELECT 2 FROM MIN(dtinicio), MAX(dtinicio) emp; MIN(DTINI MAX(DTINI --------- --------17-DEZ-80 12-JAN-83 Função COUNT – COUNT(*) retorna o número de linhas na tabela SQL> SELECT 2 FROM 3 WHERE COUNT(*) --------6 COUNT(*) emp depto_num = 30; Função COUNT – COUNT(coluna) retorna o número de linhas não nulas da tabela SQL> SELECT 2 FROM 3 WHERE COUNT(COMIS) -----------4 COUNT(comis) emp depto_num = 30; Criando Grupos de Dados EMP DEPTO_NUM SAL --------- --------10 2450 10 5000 2916.6667 10 1300 DEPTO_NUM AVG(SAL) 20 800 20 1100 “média salarial --------- --------20 3000 2175 por 10 2916.6667 20 3000 departamento” 20 2175 20 2975 30 1600 30 1566.6667 30 2850 30 1250 1566.6667 30 950 30 1500 30 1250 Criando Grupos de Dados: A Cláusula GROUP BY SELECT FROM [WHERE [GROUP BY [ORDER BY column, group_function(column) table condition] group_by_expression] column]; –Divida as linhas de uma tabela em pequenos grupos usando a cláusula GROUP BY. A Cláusula GROUP BY –Colunas utilizadas em funções de grupo não precisam estar listadas no GROUP BY. SQL> SELECT AVG(sal) 2 FROM emp 3 GROUP BY depto_num; AVG(SAL) --------2916.6667 2175 1566.6667 Utilizando GROUP BY em Múltiplas Colunas SQL> SELECT depto_num, cargo, sum(sal) 2 FROM emp 3 GROUP BY depto_num, cargo; DEPTO_NUM CARGO SUM(SAL) --------- --------- --------10 CAIXA 1300 10 GERENTE 2450 10 PRESIDENTE 5000 20 ANALISTA 6000 20 CAIXA 1900 ... 9 rows selected. Criando e Manipulando Tabelas Tabela – Unidade básica de armazenamento da base de dados, formada por colunas e linhas (tuplas) Criando Tabelas – Criando a tabela depto. SQL> CREATE TABLE depto 2 (depto_num NUMBER(2), 3 depto_nom VARCHAR2(14), 4 depto_loc VARCHAR2(13)); Table created. – Listando a estrutura da tabela criada. SQL> DESCRIBE depto Name Null? --------------------------- -------DEPTO_NUM NOT NULL DEPTO_NOME DEPTO_LOC Type --------NUMBER(2) VARCHAR2(14) VARCHAR2(13) Consultando o Dicionário de Dados – Tabelas do usuário SQL> SELECT 2 FROM * user_tables; – Objetos SQL> SELECT 2 FROM DISTINCT object_type user_objects; – Tabelas, visões, sinônimos e seqüências SQL> SELECT 2 FROM * user_catalog; Descartando uma Tabela – Todos os dados e a estrutura da tabela são destruídos. – Qualquer transação pendente é encerrada. – Todos os índices são descartados. SQL> DROP TABLE depto30; Table dropped. Essa operação não pode ser desfeita. Renomeando Objetos da Base – Tabelas, visões, sinônimos e seqüências SQL> RENAME depto TO departamento; Table renamed. Truncando uma Tabela – Remove todas as linhas da tabela liberando o espaço ocupado SQL> TRUNCATE TABLE departamento; Table truncated. Essa operação não pode ser desfeita Subqueries Subqueries SELECT FROM WHERE select_list table expr operator (SELECT FROM select_list table); –A subquery (inner query) geralmente é executada antes da consulta principal. –O resultado da subquery é, então, avaliado pelo da query principal (outer query). Utilizando uma Subquery SQL> SELECT enome 2 FROM emp 2975 3 WHERE sal > 4 (SELECT sal 5 FROM emp 6 WHERE enum=7566); ENOME ---------CARLOS JOSE FABIO Regras para Subqueries –Utilize subqueries entre parênteses. –As subqueries vêem sempre à direita do operador de comparação. –Não utiliza a cláusula ORDER BY em subqueries. –Uma subquery retorna uam tabela sobre a qual pode-se realizar qualquer uma das operações vista anteriormente. Melhorando a apresentação dos resultados no SQL*PLUS Substituindo Variáveis com o & –Utilize uma variável prefixada com um & para ler um valor de entrada. SQL> SELECT 2 FROM 3 WHERE enum, enome, sal, depto_num emp enum = &num_empregado; Enter value for num_empregado: 7369 ENUM ENOME SAL DEPTO_NUM --------- ---------- --------- --------7369 MANUEL 800 20 Substituindo Variáveis com o & –Utilize aspas simples para datas e strings. SQL> SELECT enome, depto_num, sal*12 2 FROM emp 3 WHERE cargo = '&cargo'; Enter value for cargo: ANALISTA ENOME DEPTO_NUM SAL*12 ---------- --------- --------FABIO 20 36000 JOSE 20 36000 Especificando Nomes de Colunas, Expressões e Textos em Tempo de Execução SQL> 2 3 4 SELECT FROM WHERE ORDER BY enum, enome, cargo, &nome_coluna emp &condicao &ordenar_por; Enter value for nome_coluna: sal Enter value for condicao: sal>=3000 Enter value for ordenar_por: enome ENUM --------7902 7839 7788 ENOME ---------JOSE CARLOS FABIO CARGO SAL --------- --------ANALISTA 3000 PRESIDENTE 5000 ANALISTA 3000 Utilizando o Comando TTITLE e o BTITLE –Exibe cabeçalhos e rodapés TTI[TLE] [texto|OFF|ON] –Define o cabeçalho SQL> TTITLE ‘Relatório de|Empregados' –Define o rodapé SQL> BTITLE 'Confidencial' Exemplo de Relatório Sex Out 24 pág. Relatório de Empregados Cargo Empregado ----------------------- ----------------------CAIXA PAULO CAIXA RONALDO CAIXA LUCIANO CAIXA MANUEL GERENTE MARCOS GERENTE ANA GERENTE JOAO VENDEDOR CELSO VENDEDOR MARIA VENDEDOR SERGIO VENDEDOR MATHEUS Confidencial Salario ----------------R$1,100.00 R$950.00 R$1,300.00 R$800.00 R$2,850.00 R$2,450.00 R$2,975.00 R$1,600.00 R$1,250.00 R$1,500.00 R$1,250.00 1 Stored Procedures Stored Procedures Procedimantos que permanecem armazenados no banco, de forma compilada. Servem para executar alguma computação quando invocados Sintaxe CREATE OR REPLACE PROCEDURE NOME ( NOME TIPO[,NOME TIPO] ) IS BEGIN [DECLARE] <CORPO> COMMIT; EXCEPTION WHEN OTHERS THEN <CORPO> END NOME; / Sintaxe (exemplo) CREATE OR REPLACE PROCEDURE AJUSTE (VALOR REAL, CAD INTEGER) IS BEGIN UPDATE acf_EMPREGADO SET salario=salario + salario*VALOR WHERE cadastro=CAD; COMMIT; EXCEPTION WHEN OTHERS THEN INSERT INTO acf_ERROS values(SYSDATE,'Erro na execucao de ajuste'); END AJUSTE; / Execução EXECUTE AJUSTE(0.1, 21); O procedimento é executado. Caso algum erro ocorra, então a tabela de erros será atualizada. Exemplo CREATE OR REPLACE PROCEDURE Lista_Func (codDepto llma_funcionarios.depto_func%TYPE) IS BEGIN DECLARE --cursor para guardar os funcionarios CURSOR c_diario_func is SELECT llma_funcionarios.cod_func, llma_funcionarios.nome_func, FROM llma_funcionarios WHERE depto_func = codDepto; --declaracao das variaveis do cursor v_cod_func llma_funcionarios.cod_func%TYPE; v_nome_func llma_funcionarios.nome_func%TYPE; Exemplo (cont) --inicio da procedure BEGIN open c_diario_func; dbms_output.put_line('** Lista do Diario dos Funcionarios **'); loop fetch c_diario_func into v_cod_func, v_nome_func; dbms_output.put_line('Codigo do Funcionario : ' || v_cod_func); dbms_output.put_line('Nome Funcionario : ' || v_nome_func); dbms_output.put_line(''); dbms_output.put_line('---------------------------------'); dbms_output.put_line(''); exit when c_diario_func%NOTFOUND; end loop; close c_diario_func; END; --excecoes exception when no_data_found then dbms_output.put_line('Nenhuma registro foi encontrado'); when others then dbms_output.put_line('Erro desconhecido: ' || to_char(sqlcode)); END Lista_Func; / Procedures Prodecures não retornam valores A partir de uma procedure pode-se chamar outras procedures Procedures são salvas em um arquivo .sql e compiladas no Oracle com o comando @caminho_completo do SQL Plus Caso ocorra algum erro de compilação a procedure não funciona corretamente Erros de compilação podem ser vistos com o comando show_errors do SQL Plus. Triggers Triggers Procedimantos especiais guardados no banco de forma compilada Acionados automaticamente pelo banco quando sua condição de ativação for veradeira Sintaxe CREATE OR REPLACE TRIGGER NOME CONDICAO DE ATIVACAO BEGIN <CORPO> END; / A CONDICAO DE ATIVACAO pode ser montada a partir de expressões lógicas: BEFORE DELETE ON NOME_TABELA ou AFTER DELETE OR INSERT OR UPDATE ON NOME_TABELA Sintaxe (exemplo) CREATE OR REPLACE TRIGGER LOG_FUNCIONARIO BEFORE DELETE OR INSERT OR UPDATE ON acf_EMPREGADO BEGIN INSERT INTO acf_LOG_funcionario VALUES(SYSDATE,'Tabela modificada'); END; / Sintaxe (exemplo) CREATE OR REPLACE TRIGGER t_verifica_data_contratos BEFORE insert on llma_diario for each row DECLARE datainicial llma_contratos.dataini%TYPE; BEGIN SELECT to_char(dataini,'dd/mm/yyyy') FROM llma_contratos WHERE cod_con = :new.cod_con; into datainicial --faz a condicao se a data ta no periodo IF ((:new.datahoraini < datainicial) or (:new.datahoraini > datafinal)) then raise_application_error(-20500, 'Data Inicio tem que esta no periodo de: '|| to_char(datainicial,'dd/mm/yyyy') || ' a ' || to_char(datafinal,'dd/mm/yyyy')); END IF; END; / Sintaxe (exemplo) CREATE or REPLACE TRIGGER TG_DataColetaInvalida BEFORE INSERT ON xcoleta FOR EACH ROW BEGIN IF :NEW.data < sysdate THEN RAISE_APPLICATION_ERROR ('-20000', 'Data já passou'); END IF; END; / Sintaxe (exemplo) CREATE or REPLACE TRIGGER TG_AlteraItemColeta AFTER insert or update or delete on xitemcoleta FOR EACH ROW BEGIN IF DELETING THEN UPDATE XCOLETA SET PESO = (PESO - :OLD.PESO), QUANTIDADE = (QUANTIDADE - :OLD.QUANTIDADE), VOLUME = (VOLUME - :OLD.VOLUME) WHERE COLETA = :OLD.COLETA; ELSIF INSERTING THEN UPDATE XCOLETA SET PESO = (PESO + :NEW.PESO), QUANTIDADE = (QUANTIDADE + :NEW.QUANTIDADE), VOLUME = (VOLUME + :NEW.VOLUME) WHERE COLETA = :NEW.COLETA; ELSIF UPDATING THEN UPDATE XCOLETA SET PESO = (PESO + :NEW.PESO - :OLD.PESO), QUANTIDADE=(QUANTIDADE+ :NEW.QUANTIDADE- :OLD.QUANTIDADE), VOLUME = (VOLUME + :NEW.VOLUME - :OLD.VOLUME) WHERE COLETA = :OLD.COLETA; END IF; END; / Triggers Triggers são salvos em um arquivo .sql e compiladas no Oracle com o comando @caminho_completo do SQL Plus Caso ocorra algum erro de compilação o trigger não funciona corretamente Erros de compilação podem ser vistos com o comando show_errors do SQL Plus. Gatilhos podem ser utilizados para implementar regras de negócio