Sie sind auf Seite 1von 79

Conceitos básicos de SQL e

ORACLE SQL* PLUS


O Comando SELECT

SELECT [DISTINCT] {*, column [alias],...}


FROM 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? Type


----------------- -------- ------------
DEPTO_NUM NOT NULL NUMBER(2)
DEPTO_NOM VARCHAR2(14)
DEPTO_LOC 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 CARGO DEPTO_NUM


---------- --------- ---------
RONALDO CAIXA 30
MANUEL CAIXA 20
PAULO CAIXA 20
LUCIANO 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 Entre dois valores (inclusive)


...AND...

IN(lista) Satisfaz uma lista de valores

LIKE Satisfaz um padrão de caracteres

IS NULL É um valor nulo (null)


Operador BETWEEN
SQL> SELECT enome, sal
2 FROM emp
3 WHERE sal BETWEEN 1000 AND 1500;

ENOME SAL
limite limite
---------- ---------
MARIA 1250 inferior superior
SERGIO 1500
MATHEUS 1250
PAULO 1100
LUCIANO 1300
Operador IN
SQL> SELECT enum, enome, sal, ger
2 FROM emp
3 WHERE ger IN (7902, 7566, 7788);

ENUM ENOME SAL GER


--------- ---------- --------- ---------
7902 JOSE 3000 7566
7369 MANUEL 800 7902
7788 FABIO 3000 7566
7876 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 enome


2 FROM emp
3 WHERE enome LIKE ‘M%';
Operador IS NULL
– Testando valores nulos (null)

SQL> SELECT enome, ger


2 FROM emp
3 WHERE 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 CARGO
---------- ---------
CARLOS PRESIDENTE
MARIA VENDEDOR
CELSO VENDEDOR
SERGIO VENDEDOR
MATHEUS VENDEDOR
Cláusula ORDER BY

SQL> SELECT enome, cargo, depto_num, dtinicio


2 FROM emp
3 ORDER BY dtinicio DESC;

ENOME CARGO DEPTO_NUM DTINICIO


---------- --------- --------- ---------
PAULO CAIXA 20 12-JAN-83
FABIO ANALISTA 20 09-DEC-82
LUCIANO CAIXA 10 23-JAN-82
RONALDO CAIXA 30 03-DEC-81
JOSE ANALISTA 20 03-DEC-81
CARLOS PRESIDENTE 10 17-NOV-81
MARIA VENDEDOR 30 28-SEP-81
...
14 rows selected.
Manipulando dados
O Comando INSERT
– Adicione linhas a uma tabela utilizando
o comando INSERT.
INSERT INTO table [(column [, column...])]
VALUES (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');
– created.
1 row

– 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 depto (depto_num, depto_nome )
2 VALUES (60, ‘REC HUMANOS');
1 row created.

– Explicitamente: especifique o valor


NULL.
SQL> INSERT INTO depto
2 VALUES (70, ‘JURIDICO', NULL);
1 row created.
Inserindo Data e Hora do Sistema
– A função SYSDATE informa a data e a
hora corrente.

SQL> INSERT INTO emp (enum, enome, cargo,


2 ger, dtinicio, sal, comis,
3 depto_num)
4 VALUES (7196, ‘ANTONIO', ‘VENDEDOR',
5 7782, SYSDATE, 2000, NULL,
6 10);
1 row created.
Inserindo Datas
– Adicionando um novo empregado.
SQL> INSERT INTO emp
2 VALUES (2296,'ROMANO',‘VENDEDOR',7782,
3 TO_DATE(‘03-02-1997','DD-MM-YYYY'),
4 1300, NULL, 10);
1 row created.

– 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 table
SET column = value [, column = value]
[WHERE 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 depto
2 WHERE depto_nome = 'DESENVOLVIMENTO';
1 row deleted.

– Todas as linhas da tabela são eliminadas


se a cláusula WHERE for omitida.
SQL> DELETE FROM depto;
4 rows deleted.
Exibindo dados de múltiplas
tabelas
Joins
– Utilize uma junção para consultar dados de
mais de uma tabela.
SELECT table1.column, table2.column
FROM table1, table2
WHERE 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 “o maior salário MAX(SAL)
20 3000 da tabela EMP” ---------
20 2975 5000
30 1600
30 2850
30 1250
30 950
30 1500
30 1250
Tipos de Funções de Grupo
– AVG (média)
– COUNT (contagem)
– MAX (máximo)
– MIN (mínimo)
– STDDEV
– SUM (soma)
– VARIANCE (variação)
Utilizando Funções de Grupo

SELECT column, group_function(column)


FROM table
[WHERE condition]
[ORDER BY column];
Funções AVG e SUM
– Utilize o AVG e SUM apenas para dados
numéricos
SQL> SELECT AVG(sal), MAX(sal),
2 MIN(sal), SUM(sal)
3 FROM emp
4 WHERE 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 MIN(dtinicio), MAX(dtinicio)
2 FROM 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 COUNT(*)


2 FROM emp
3 WHERE depto_num = 30;

COUNT(*)
---------
6
Função COUNT
– COUNT(coluna) retorna o número de
linhas não nulas da tabela

SQL> SELECT COUNT(comis)


2 FROM emp
3 WHERE depto_num = 30;

COUNT(COMIS)
------------
4
Criando Grupos de Dados
EMP
DEPTO_NUM SAL
--------- ---------
10 2450
10 5000 2916.6667
10 1300
20 800 DEPTO_NUM
20 1100 “média salarialAVG(SAL)
20 3000 2175 por
---------
20 3000 departamento”
20 2975 ---------
30 1600 10
30 2850
30 1250 1566.6667 2916.6667
30 950 20
30 1500 2175
30 1250
30
1566.6667
Criando Grupos de Dados:
A Cláusula GROUP BY
SELECT column, group_function(column)
FROM table
[WHERE condition]
[GROUP BY group_by_expression]
[ORDER BY 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? Type


--------------------------- -------- ---------
DEPTO_NUM NOT NULL NUMBER(2)
DEPTO_NOME VARCHAR2(14)
DEPTO_LOC VARCHAR2(13)
Consultando o Dicionário de Dados
– Tabelas do usuário
SQL> SELECT *
2 FROM user_tables;

– Objetos
SQL> SELECT DISTINCT object_type
2 FROM 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 select_list
FROM table
WHERE expr operator
(SELECT select_list
FROM 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 enum, enome, sal, depto_num


2 FROM emp
3 WHERE 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> SELECT enum, enome, cargo, &nome_coluna
2 FROM emp
3 WHERE &condicao
4 ORDER BY &ordenar_por;

Enter value for nome_coluna: sal


Enter value for condicao: sal>=3000
Enter value for ordenar_por: enome

ENUM ENOME CARGO SAL


--------- ---------- --------- ---------
7902 JOSE ANALISTA 3000
7839 CARLOS PRESIDENTE 5000
7788 FABIO 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. 1
Relatório de
Empregados

Cargo Empregado Salario


----------------------- ----------------------- -----------------
CAIXA PAULO R$1,100.00
CAIXA RONALDO R$950.00
CAIXA LUCIANO R$1,300.00
CAIXA MANUEL R$800.00
GERENTE MARCOS R$2,850.00
GERENTE ANA R$2,450.00
GERENTE JOAO R$2,975.00
VENDEDOR CELSO R$1,600.00
VENDEDOR MARIA R$1,250.00
VENDEDOR SERGIO R$1,500.00
VENDEDOR MATHEUS R$1,250.00

Confidencial
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') into datainicial
FROM llma_contratos
WHERE cod_con = :new.cod_con;

--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

Das könnte Ihnen auch gefallen