Conceitos bsicos 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
Aplicao cliente para conexo com Oracle. Localizao:
Start Programs Banco de dados Oracle OraHome81 Application Development SQL Plus Usurio e senha so idnticos
Interface grfica do SQL Plus
Configuraes
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 Clusula 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 Comparao
Operador
= > >= < <= <>
Significado
Igual a Maior que Maior ou igual a Menor que Menor ou igual a Diferente de
Outros Operadores
Operador BETWEEN ...AND... IN(lista) LIKE IS NULL Significado Entre dois valores (inclusive)
Satisfaz uma lista de valores Satisfaz um padro de caracteres um valor nulo (null)
Operador BETWEEN
SQL> SELECT 2 FROM 3 WHERE enome, sal emp sal BETWEEN 1000 AND 1500; limite superior
ENOME SAL ---------- --------MARIA 1250 SERGIO 1500 MATHEUS 1250 PAULO 1100 LUCIANO 1300
limite inferior
Operador IN
SQL> SELECT 2 FROM 3 WHERE enum, enome, sal, ger emp ger IN (7902, 7566, 7788);
ENUM --------7902 7369 7788 7876
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 padres (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 Lgicos
Operador AND OR Significado Retorna TRUE se a condio de ambos os componentes for TRUE Retorna TRUE se a condio de um dos componentes for TRUE Retorna TRUE se a condio for FALSE (vise-versa)
NOT
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
Clusula 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.
No esquea 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 clusula 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 funo 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 admisso.
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 condio na clusula WHERE.
No esquea o COMMIT
Atualizando linhas em uma tabela
Linhas especficas podem ser modificadas utilizando a clusula WHERE.
SQL> UPDATE emp 2 SET depto_num = 20 3 WHERE enum = 7782; 1 row updated.
Todas as linhas da tabela so modificadas se a clusula WHERE for omitida.
SQL> UPDATE emp 2 SET depto_num = 20; 14 rows updated.
Eliminando Linhas de uma Tabela
Linhas especficas podem ser eliminadas utilizando a clusula WHERE.
SQL> DELETE FROM 2 WHERE 1 row deleted. depto depto_nome = 'DESENVOLVIMENTO';
Todas as linhas da tabela so eliminadas se a clusula WHERE for omitida.
SQL> DELETE FROM 4 rows deleted. depto;
Exibindo dados de mltiplas tabelas
Joins
Utilize uma juno para consultar dados de mais de uma tabela.
SELECT FROM WHERE [Link], [Link] table1, table2 table1.column1 = table2.column2;
Especifique a condio de juno na clusula WHERE. Informe o nome da tabela junto com o nome da coluna, se tabelas diferentes possurem colunas com os mesmos nomes.
Criando Alias para Tabelas
SQL> SELECT [Link], [Link], emp.depto_num, 2 depto.depto_num, depto.depto_loc 3 FROM emp, depto 4 WHERE emp.depto_num = depto.depto_num;
SQL> SELECT [Link], [Link], e.depto_num, 2 d.depto_num, d.depto_loc 3 FROM emp e, depto d 4 WHERE e.depto_num = d.depto_num;
Funes de Grupo (Agregao)
O que so Funes de Grupo?
Funes 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 salrio da tabela EMP
MAX(SAL) --------5000
Funes AVG e SUM
Utilize o AVG e SUM apenas para dados numricos
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
Funes 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
Funo COUNT
COUNT(*) retorna o nmero de linhas na tabela
SQL> SELECT 2 FROM 3 WHERE COUNT(*) --------6 COUNT(*) emp depto_num = 30;
Funo COUNT
COUNT(coluna) retorna o nmero de linhas no 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 mdia 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 Clusula 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 clusula GROUP BY.
A Clusula GROUP BY
Colunas utilizadas em funes de grupo no 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 Mltiplas 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 bsica 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 Dicionrio de Dados
Tabelas do usurio
SQL> SELECT 2 FROM * user_tables;
Objetos
SQL> SELECT 2 FROM DISTINCT object_type user_objects;
Tabelas, vises, sinnimos e seqncias
SQL> SELECT 2 FROM * user_catalog;
Descartando uma Tabela
Todos os dados e a estrutura da tabela so destrudos. Qualquer transao pendente encerrada. Todos os ndices so descartados.
SQL> DROP TABLE depto30; Table dropped.
Essa operao no pode ser desfeita.
Renomeando Objetos da Base
Tabelas, vises, sinnimos e seqncias
SQL> RENAME depto TO departamento; Table renamed.
Truncando uma Tabela
Remove todas as linhas da tabela liberando o espao ocupado
SQL> TRUNCATE TABLE departamento; Table truncated.
Essa operao no 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 , ento, 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 parnteses. As subqueries vem sempre direita do operador de comparao. No utiliza a clusula ORDER BY em subqueries. Uma subquery retorna uam tabela sobre a qual pode-se realizar qualquer uma das operaes vista anteriormente.
Melhorando a apresentao dos resultados no SQL*PLUS
Substituindo Variveis com o &
Utilize uma varivel 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 Variveis 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, Expresses e Textos em Tempo de Execuo
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 cabealhos e rodaps
TTI[TLE] [texto|OFF|ON]
Define o cabealho
SQL> TTITLE Relatrio de|Empregados'
Define o rodap
SQL> BTITLE 'Confidencial'
Exemplo de Relatrio
Sex Out 24 Relatrio de Empregados pg. 1
Cargo Empregado ----------------------- ----------------------CAIXA PAULO CAIXA RONALDO CAIXA LUCIANO CAIXA MANUEL GERENTE MARCOS GERENTE ANA GERENTE JOAO VENDEDOR CELSO VENDEDOR MARIA VENDEDOR SERGIO VENDEDOR MATHEUS
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
Confidencial
Stored Procedures
Stored Procedures
Procedimantos que permanecem armazenados no banco, de forma compilada. Servem para executar alguma computao 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; /
Execuo
EXECUTE AJUSTE(0.1, 21); O procedimento executado. Caso algum erro ocorra, ento 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 no retornam valores A partir de uma procedure pode-se chamar outras procedures Procedures so salvas em um arquivo .sql e compiladas no Oracle com o comando @caminho_completo do SQL Plus Caso ocorra algum erro de compilao a procedure no funciona corretamente Erros de compilao 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 condio de ativao for veradeira
Sintaxe
CREATE OR REPLACE TRIGGER NOME CONDICAO DE ATIVACAO BEGIN <CORPO> END; / A CONDICAO DE ATIVACAO pode ser montada a partir de expresses lgicas: 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 ((:[Link] < datainicial) or (:[Link] > 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 :[Link] < 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 - :[Link]), QUANTIDADE = (QUANTIDADE - :[Link]), VOLUME = (VOLUME - :[Link]) WHERE COLETA = :[Link]; ELSIF INSERTING THEN UPDATE XCOLETA SET PESO = (PESO + :[Link]), QUANTIDADE = (QUANTIDADE + :[Link]), VOLUME = (VOLUME + :[Link]) WHERE COLETA = :[Link]; ELSIF UPDATING THEN UPDATE XCOLETA SET PESO = (PESO + :[Link] - :[Link]), QUANTIDADE=(QUANTIDADE+ :[Link]- :[Link]), VOLUME = (VOLUME + :[Link] - :[Link]) WHERE COLETA = :[Link]; END IF; END; /
Triggers
Triggers so salvos em um arquivo .sql e compiladas no Oracle com o comando @caminho_completo do SQL Plus Caso ocorra algum erro de compilao o trigger no funciona corretamente Erros de compilao podem ser vistos com o comando show_errors do SQL Plus. Gatilhos podem ser utilizados para implementar regras de negcio