Академический Документы
Профессиональный Документы
Культура Документы
1
3.
4. 5.
6. 7.
8.
CGC e Razo Social de todos os fornecedores sendo que a Razo Social deve aparecer apenas com a primeira letra de cada palavra em maisculo. Para cada fornecedor, o nr_pedido, data no formato DD/MM/YYYY e o status (PENDENTE,CANCELADO,FECHADO) para os seguintes valores retornados: P, C,F respectivamente. Ordenado por Razo Social e data do pedido. Resolva a questo 3 sendo que os fornecedores que nunca receberam nenhum pedido, deve aparecer. CGC e Razo Social de todos os fornecedores, para cada fornecedor o nr_pedido, data e status, para cada pedido, nome do produto, quantidade e preo pago por cada produto. Ordenado por Razo Social, data do pedido, e nome do produto. CGC e Razo Social de todos os fornecedores, para cada fornecedor o nr_pedido, data ,quantidade de tens e valor total de cada pedido. Ordenado por Razo Social, data do pedido. CGC e Razo Social de todos os fornecedores, para cada fornecedor o nr_pedido, data ,quantidade de tens e valor total de cada pedido. Sendo que os fornecedores que nunca forneceram nada, devem constar como nmero de tens e valor total iguais a zero. CGC e Razo Social de todos os fornecedores , para cada fornecedor, a quantidade total de pedidos, e o valor total j pedido. Caso o valor total seja maior que 5000, ele deve ser classificado como BOM FORNECEDOR, caso contrrio FORNECEDOR FRACO. Ordenado por Razo Social e CGC. Resolva a questo 8 s que aparecendo os fornecedores que nunca forneceram nada com os totais iguais a 0. CGC e Razo Social de todos os fornecedores , para cada fornecedor, a quantidade total de pedidos, e o valor total j pedido, apenas para fornecedores com total j pedido maior que 5000. CGC e Razo Social de todos os fornecedores, para cada fornecedor os pedidos com status C ou P. Ordenado por Razo Social.(Utilizar a funo IN). CGC e Razo Social de todos os fornecedores, que nunca receberam nenhum pedido. Ordenado por Razo Social. Faa uma query para verifica se existe alguma gndola em produtos, que no existe na tabela gndolas. CPF e nome de todos os clientes que nunca compraram nada. Ordenado por nome. Para cada produto, a quantidade total j comprada menos a quantidade total j vendida. Ordenado pelo nome do produto. Lembrando que se um produto nunca foi vendido, ele deve constar como saldo igual ao que foi comprado.
1.1
17 Exerccios
Os exerccios deste curso sero baseados no modelo abaixo.
17.1 SQL
Codifique em SQL a soluo para os seguintes problemas. 1. 2. CGC e Razo Social de todos os fornecedores ordenados por Razo Soacial. CGC e Razo Social de todos os fornecedores sendo que a Razo Social deve aparecer apenas com a primeira letra de cada palavra em maisculo.Ordenado por Razo Social.
1.1
BEFORE UPDATE comando BEFORE DELETE linha BEFORE DELETE comando BEFORE INSERT linha BEFORE INSERT comando AFTER UPDATE linha AFTER UPDATE comando AFTER DELETE linha AFTER DELETE comando AFTER INSERT linha AFTER INSERT comando
No se permite no corpo de uma trigger o uso de comandos COMMIT e ROLLBACK. Tambm no podem ser alteradas chaves primrias, nicas ou estrangeiras.
O comando DROP TRIGGER serve para elimin-la. Podem ainda se habilitadas e desabilitadas: ALTER TRIGGER nome_da_trigger ENABLE ALTER TRIGGUER nome_da_trigger DISABLE ALTER TABLE nome_da_tabela ENABLE ALL_TRIGGERS (habilita todas de uma tabela) ALTER TABBLE nome_da_tabela DISABLE ALL_TRIGGERS (desabilita todas de uma tabela). As informaes sobre triggers so encontradas na tabela USER_TRIGGERS.
1.1
A lista de erros de uma package obtida atravs do comando: SHOW ERRORS PACKAGE Nome_da_Package SHOW ERRORS PACKAGE BODY Nome_da_Package
16 Triggers
So disparados implicitamente quando ocorrem eventos (INSERT, UPDATE, DELETE) em uma tabela. O Trigger deve estar obrigatoriamente associado a uma tabela. Sintaxe: CREATE OR REPLACE TRIGGER nome_da_trigger {BEFORE / AFTER} DELETE OR INSERT OR UPDATE OF (nome_coluna1, nome_tabela REFERENCING [OLD as antigo] [NEW as novo] FOR EACH ROW WHEN condio DECLARE Variveis, constantes, etc. BEGIN ..... END ;
nome_coluna2,
....)
ON
Os tempos de uma trigger podem ser: ! BEFORE disparada antes do evento ! AFTER disparada depois do evento A trigguer pode ser disparada pelos eventos INSERT, UPDATE e DELETE. No uso do UPADATE, as colunas devem ser especificadas aps a palavra OF. Uma trigger pode ainda ser do tipo COMANDO, que manipula dados dentro de uma tabela e executa uma nica vez; ou do tipo LINHA, que manipula linhas de uma tabela e pode ser executada uma ou mais vezes.
1.1
Quando um objeto com o qual o subprograma possui uma relao de dependncia for modificado, o status do subprograma na tabela USER_OBJECT ficar como INVALID. Recompilando um subprograma que esteja como o status INVALID: ALTER PROCEDURES / FUNCTION nome_da_procedure / nome_da_function COMPILE Relaes de dependncia dos objetos podem ser encontradas na tabela USER_DEPENDENCIES. Exemplo de como verificar os objetos que dependem de um outro objeto: SELECT NAME, TYPE FROM USER_DEPENDENCIES WHERE REFERENCED_NAME = Nome_Objeto_que_se_quer_alterar;
15 Packages
So objetos equivalentes a bibliotecas que guardam Procedures, Functions, definies de cursores, variveis e constantes, definies de excees.
15.1 Especificao
Na rea de especificao so feitas as declaraes pblicas (variveis, constantes, cursores, excees e subprogramas que estaro disponveis para uso externo package. Sintaxe: CREATE OR REPLACE PACKAGE Nome_da_package IS Para procedures e functions s os cabealhos (interface) PROCEDURE Nome_da_Procedure (Lista_de_Parmetros); FUNCTION Nome_da_Function (lista_de_Parmetros Declarao de variveis, constantes, excees e cursores pblicos END Nome_da_Package;
15.2 Body
No corpo so feitas as declaraes privadas, que estaro disponveis internamente package Sintaxe: CREATE OR REPLACE PACKAGE BODY Nome_da_Package IS Declarao de variveis, constantes, excees e cursores privados PROCEDURE Nome_da_Procedure (Lista_de_Parmetros) IS BEGIN END; FUNCTION Nome_da_Function (Lista_de_Parmetros) RETURN tipo BEGIN RETURN END; END;
Para eliminar uma Package, utiliza-se DROP PACKAGE e DROP PACKAGE BODY.
1.1
14.1 Parmetros
Podem ser de entrada, sada ou entrada/Sada: ! IN (padro) - passa um valor do ambiente chamador para o subprograma e este valor no pode ser alterado dentro do subprograma. ! OUT- passa um valor do subprograma para o ambiente chamador. ! IN OUT- passa um valor do ambiente chamador para o suprograma; este valor pode ser alterado dentro do subprograma e retornado com o valor atualizado para o ambiente chamador.
14.2 Procedures
CREATE OR REPLACE PROCEDURE Nome_Proc [(Argumento[{IN | OUT | IN OUT}] tipo, ....... Argumento [{IN | OUT | IN OUT}] tipo] {IS | AS} Corpo_procedimento Onde, nome_procedimento como se chama o procedimento, argumento o nome de um parmetro de procedimento, tipo o tipo do parmetro associado e corpo_procedimento um bloco de PL/SQL que constitui o cdigo do procedimento.
14.3 Functions:
Retornam resultado ou valor. Podem ser utilizadas em atribuies a variveis ou como argumento em comando Select. CREATE OR REPLACE FUNCTION Nome_funo [(Argumento[{IN | OUT | IN OUT}] tipo, ....... Argumento [{IN | OUT | IN OUT}] tipo] RETURN tipo_retorno {IS | AS} Corpo_funo Tipo_retorno o tipo do valor que a funo devolve.
1.1
13 DBMS_output.put_line()
Coloca uma linha no buffer, e mostra na tela. SQL> set serveroutput on; SQL> exec dbms_output.put_line(sysdate); 10-MAR-01
1.1
12.2.2 Raise_Application_Error
uma procedure que permite a emisso de mensagens de erro, definidas pelo usurio. Os erros podem ser relatados e evita-se o retorno de excees no tratadas. Sintaxe: RAISE_APPLICATION_ERROR (cdigo_erro, texto)
1.1
12 Tratamento de Excees
As excees podem ser predefinidas ou definidas pelo usurio. Sintaxe: EXCEPTION WHEN nome_da_exceo THEN Relao_de_comandos WHEN nome_da_exceo THEN Relao_de_comandos
Variveis que possuam restrio de limites (inferior e superior) pela definio de tipo ou subtipo dispararo restrio de VALUE-ERROR caso estes limites sejam ultrapassados.
1.1
Sintaxe: CURSOR nome_do_cursor IS SELECT .... FOR UPDATE OF campos_a_atualizar UPDATE ... WHERE CURRENT OF nome_do_cursor
1.1
Nome_do_cursor%ISOPEN - retorna TRUE caso o cursor esteja aberto e FALSE, caso contrrio.
11.1.3 Close
Libera a rea de memria utilizada pelo cursor. Sintaxe: CLOSE nome_do_cursor Ex.: CLOSE Preferencia; Exemplo Completo: Declare Cursor Preferencia (Cliente Number) IS Select Distinct I.Cd_Produto, Rpad(P.Nm_Produto, 30) Nome From Item_Nota_Fiscal I, Nota_Fiscal N. Produto P Where N.Cd_Cllente = Cliente And N.Nr_Nota = I.Nr_Nota And I.Cd_Produto = P.Cd_Produto; Reg_Pref Preferencia %Rowtype; Begin Open Preferencia (1); Loop Fetch Preferencia Into Reg_Pref; Exit When Preferencia%Notfound; Dbms_output.Put_line (Produto: ||Reg_Pref.Nome); End Loop; Close Preferncia; End;
Para sair do lao, o cursor deve ser fechado explicitamente com o comando close. Sintaxe: FOR Nome_da_variavel_tipo_registro IN Nome_do_cursor (Lista_de_parametros) LOOP Relao_de_comandos END LOOP;
1.1
FETCH nome_do_cursor INTO lista_de_variveis Ex.1: Declare Cursor Preferencia IS Select Distinct
From Item_Nota_Fiscal I, Nota_Fiscal N, Produto P Where N.Cd Cllente = cliente N.Nr_Nota = I.Nr_Nota I.Cd_Produto = P.Cd_Produto; Codigo Produto.Cd_Produto%Type; Nome Produto.Nm_Produto%Type; Begin ... Fetch Preferencia Into Codigo, Nome; Dbms_Output.Put_Line ('Produto: ||Nome); ........ End; Ex. 2: Declare Cursor Preferencia (Cliente Number) IS Select Distinct I.Cd_Produto, Rpad(P.Nm_Produto, 30) Nome From Item_Nota_Fiscal I, Nota_Fiscal N, Produto P Where N.Cd_Cliente = Cliente And N.Nr_Nota = I.Nr_Nota And I.Cd_Produto = P.Cd_Produto; Reg_Pref Preferencia %RowType; Begin ..... Fetch Preferencia Into Reg_Pref; Dbms_Output.Put_Line ('Produto: '|| Reg_Pref.Nome); ..... End; Para cada cursor, quatro atributos podem ser verificados a cada execuo do comando FETCH:. Nome_do_cursor%FOUND - retorna TRUE caso o FETCH consiga retornar alguma linha e FALSE, caso contrrio. Se nenhum FETCH tiver sido executado ser retornado NULL. Nome_do_cursor%NOTFOUND - retorna FALSE caso o FETCH consiga retornar alguma linha e TRUE, caso contrrio. Se nenhum FETCH tiver sido executado ser retornado NULL. Nome_do_cursor%ROWCOUNT - retorna o nmero de linhas j processadas pelo cursor. Se nenhum FETCH tiver sido executado ser retornado 0 (zero)
1.1
11 Cursores:
! ! ! Guarda resultados de uma seleo em memria, permitindo a manipulao deste resultado de uma maneira procedural; deve ser declarado na rea de declaraes; o nome no pode ser igual ao da tabela; para dar um nome a uma coluna da seleo basta colocar o nome do alias logo aps a definio da coluna.
Sintaxe: CURSOR nome_do_cursor IS SELECT ... [FOR UPDATE OF colunas] Em que Relao_de_parmetros pode Ter o seguinte formato: Nome_do_parmetro tipo_de_dado {:= / DEFAULT} valor_inicial. Obs.: O tamanho do parmetro no pode ser declarado, somente seu tipo. Ex.: CURSOR Preferencia IS SELECT DISTINCT I.Cd_Produto, NM_Produto Nome FROM Item_Nota_Fiscal I, Nota_Fiscal N, Produto P WHERE N.Cd_Cliente = cliente AND N.Nr_Nota = I.Nr_Nota AND I.Cd_Produto = P.Cd_Produto;
11.1.2 Fetch
Transfere as linhas armazenadas no cursor, para variveis, alm de posicionar o ponteiro no prximo registro do cursor. A lista de variveis que aparece na sintaxe do comando FETCH deve ter o mesmo nmero de variveis, na mesma seqncia e com tipos correspondentes s colunas selecionadas no comando SELECT da declarao do cursor. Sintaxe:
1.1
IF expreo_booleana1 THEN Sequencia_de_comandos1; [ELSIF expreo_booleana2 THEN Sequencia_de_comandos2;] [ELSE Sequencia_de_comandos3;] END IF;
Ex: IF V_SALARIO < 100 THEN V_FUCIONARIO := COITADO; V_PRIVILEGIOS := 0; ELSIF V_SALARIO = 100 THEN V_FUNCIONARIO := ESTA MELHORANDO; V_PRIVILEGIOS := 0; ELSE V_PRIVILEGIO := 1; END IF;
10.2 WHILE-LOOP
Sintaxe: WHILE condio LOOP Sequencia_de_comandos1; END LOOP; Ex.: WHILE V_CONTADOR < 50 LOOP V_CONTADOR := V_CONTADOR +1; END LOOP ;
10.3 FOR-LOOP
Sintaxe: FOR varivel_contador IN [REVERSE] valor_inicial..valor_final LOOP Sequencia_de_comandos1; END LOOP; Ex: FOR V_CONTADOR IN 1..50 LOOP V_TESTE := V_CONTADOR; END LOOP;
10.4 LOOP
Sintaxe
1.1
COMMIT: ROLLBACK; SAVEPOINT Nome_do_Ponto; ROLLBACK TO Nome-do-Ponto; Ex.: Declare Nr_Nova_Nota Nota_Fiscal.Nr_Nota%Type; Begin -- insere dados nas tabelas Empresa e Filial Insert into Empresa (Cd_Empresa, Nm_Empresa) Values (3, 'Empresa teste 3'); Insert into Filial (Cd_Empresa, Cd_Filial, Nm_Filial) Values (3, 1, 'Filial I - BC'); SavepointLocal; -- insere dados nas tabelas Estado e municpio Insert into Estado (Cd_Pais, Sg_EStado, Nm_Estado) Values (1, 'SP', 'So Paulo'); (Cd_Pais, Sg_Estado, cd_Municipio, Insert into municipio Nm_municipio) Values (1, SP, 10, 'Sorocaba'); Savepoint Pessoa; -- Insere dados na tabela Cliente Insert into Cliente (Cd_Cliente,Nm_Cliente,Ds-Endereco,Cd-Municipio,Sg_Estado,Nr_Cep, NR_DDD,Nr_Fone,le_Sexo,Ie_Fisica_juridica,Cd_Estado_Civil,Cd_Pais, Ie_Situacao) Values (50,'Fulano da Silva','Estrada Geral de Ida e Vinda', 10, 'Sp', '890103301, 047, 2312331, 'M', 'S',1, 1,'A'); Savepoint Notas; -- Insere dados nas tabelas Nota_Fiscal e Item_Nota_Fiscal Select Nvl (Max (Nr_Nota) , 0) + 1 Into Nr_Nova_Nota From Nota_Fiscal; Insert into Nota_Fiscal (Nr_Nota, Cd_Cliente, Dt_Emissao, le_Tipo_Nota) Values (Nr_Nova_Nota, 50, sysdate, C); Insert into Item_Nota_Fiscal (Nr_Nota, Nr_ltem, Cd_Produto, Qt_Produto, VI_Unitario) Values (Nr_Nova_Nota, 1 , 1, 15, 3.25); Rollback to Pessoa; Commit; End,
10 Estruturas de Controle
10.1 IF THEN ELSE
Sintaxe:
1.1
Declare VI_Custo Varchar2; NVI_Custo Number; Begin --Esto disponveis Vl_Custo de tipo varchar2, NVI Csto e Nm Produto. End; --Esto disponveis VI-Custo de tipo number e Nm Produto. End;
9.1
Tratamento de Transaes
Comandos de terminao das transaes: CONNECT/DISCONNECT Comandos DDL (que gere alteraes no dicionrio de dados Encerramento explcito por meio dos comandos COMMIT/ ROLLBACK. Savepoints: COMMIT - finaliza a transao efetivando as atualizaes no banco, de forma que os demais usurios (sesses) consigam acessar essas alteraes. ROLLBACK - finaliza a transao desfazendo todas as alteraes feitas no banco durante a transao. ROLLBACK TO - desfaz as alteraes realizadas no banco a partir da primeira instruo aps o ponto especificado. Ou seja, permite desfazer apenas parte de uma transao. 0 ponto a partir do qual ser desfeita a transao deve ter sido especificado com o comando SAVEPOINT. SAVEPOINT - permite a especificao de um ponto de processamento dentro de uma transao. Sintaxe
1.1
Is TABLE OF Varchar2(10) INDEX BY BINARY INTEGER; Subtype EnameTab IS NameTab; --Baseado em um tipo registro Type TpTime Is RECORD (minuto Integer, hora Integer); Subtype Momento Is TpTime; --Baseado em uma coluna Subtype TpCodigo is Cliente.CdCliente%Type; --Baseado no registro de um cursor Cursor Cur-Pais is Select * From Pais; Subtype Rec-Pais is Cur_Pais%Rowtype; --Utilizando subtipos criados NmClienteAux Nome, ContAux Contador; Begin Null; End;
Is Char;
8.4
Pode-se utilizar o operador (:=), ou a partir de um comando SELECT atribuir valores com o uso da clusula INTO. Neste caso o comando deve retornar apenas uma linha. Ex: Select Into From Where Qt_Produto, VI_Unitario Qtdd, Valor Item_Nota_Fiscal nr_nota = 1;
8.5
Escopo de Variveis
Quando uma varivel definida dentro de um bloco, ela no reconhecida fora do bloco, ou seja, ela local para este bloco e global para os sub-blocos. Como um bloco somente pode incluir variveis locais e globais, blocos isolados no podero referenciar variveis declaradas em outros blocos. Se uma varivel global for declarada em um sub-bloco, a declarao local prevalecer, Ex.: Declare Nm Produto Produto.Nm_Produto%Type; VI_Custo Number; Begin --Esto disponveis VI_Custo de tipo number e Nm_Produto. Curso de Programao Oracle Prof Fvio Rezende 53
1.1
... END; No exemplo acima so definido dois tipos T_NAME e T_DATE como sendo do tipo TABLE. As variveis V_NAME e V_DATE so declaradas como T_NAME e T_DATE respectivamente. Ao longo do bloco V_NAME de ndice 1 recebe JONNAS e V_DATE de ndice 1 recebe a data atual do sistema.
8.3
Subtype
Podem ser definidos pelo usurio e servem para colocar restries opcionais aos tipos j existentes. Um subtipo deve ser antes baseado em um tipo j existente: Sintaxe: SUBTYPE nome_do_subtipo IS nome_do_tipo_base; Ex.: DECLARE --Baseado no Tipo escalar(Date) ou subtipo (Natural) padro Subtype EmpDate Is Date; Subtype Contador Is Natural; --Baseado no tipo varchar2 e restrio de tamanho mximo (50) AuxNome AuxNome Varchar2(50); Subtype Nome Is Aux_nome%Type; Curso de Programao Oracle Prof Fvio Rezende 52
1.1
8.2.2.1 RECORDS
Sintaxe: TYPE record_type IS RECORD ( Campo1 type1 [NOT NULL] [:=exp1], Campo1 type2 [NOT NULL] [:=exp2], ... Campo1 type3 [NOT NULL] [:=exp3]) Ex: DECLARE TYPE T_EMP EMPNO ENAME JOB R_EMP T_EMP; BEGIN ... R_EMP.EMPNO := 1; ... END; No exemplo acima T_EMP declarado como um tipo RECORD com os campos EMPNO, ENAME, JOB. Depois R_EMP declarado como o tipo T_EMP.
8.2.2.2 TABLE
Tables so similares a vetores, porm implementado de uma maneira diferente pelo Oracle. Sintaxe TYPE tabletype IS TABLE OF type INDEX BY BINARY_INTEGER Onde: TYPE : indica a declarao de um tipo definido pelo usurio. Tabletype : o nome do tipo que est sendo criado. IS TABLE OF : significa que o tipo ser do tipo TABLE. Type : Indica que ser um tipo TABLE deste tipo. Podendo ser um tipo RECORD. INDEX BY BINARY_INTEGER : faz parte da sintaxe. Futuramente pode ser indexado por outros tipos, porm na verso atual apenas por BINARY_INTEGER. Ex: DECLARE TYPE T_NAME IS TABLE OF SCOTT.EMP.ENAME%TYPE INDEX BY BINARY_INTEGER; TYPE T_DATE IS TABLE OF DATE INDEX BY BINARY_INTEGER; V_NAME T_NAME; V_DATE T_DATE; BEGIN ... V_NAME(1) := JONNAS; V_DATE(1) := SYSDATE; Curso de Programao Oracle Prof Fvio Rezende 51
1.1
DATE Date - data e hora (formato-padro: DD-MON-YY, 26-APR-74). ROWID Rowid - utilizado para armazenar valores de Rowid, selecionados de linhas de tabelas. Este tipo normalmente empregado quando se quer eliminar ou alterar um registro, o qual tenha sido previamente selecionado, visto que Rowid uma forma rpida de acessar uma linha em uma tabela. Formato do Rowid: OOOOOOFFFBBBBBBSSS. Onde OOOOOO- identifica o objeto, FFF-identifica o Data File, BBBBBB- identifica o bloco dentro do Data file e o SSS identifica a linha dentro do bloco. RAW Raw - armazena valores hexadecimais com tamanho varivel (mximo de 2K). Normalmente, este tipo de campo utilizado para armazenamento de imagens. Long Raw - armazena valores hexadecimais com tamanho varivel (mximo de 2G). Tambm utilizado para armazenamento de imagens. BOOLEAN Boolean - permite armazenar os valores TRUE, FALSE ou NULL. No momento de utilizar este tipo de variveis em atribuies, pode-se atribuir um dos valores permitidos explicitamente ou uma condio(>, <, =, <>, ...) cujo valor de veracidade ser atribudo varivel.
1.1
...... END;
8.2
Existem basicamente duas categorias de tipos de dados PL/SQL, que so escalar, composto.
8.2.1 Escalar
Tipos escalares podem ser divididos em seis famlias: Number, character, date, raw, rowid, boolean. NUMBER Number - numrico com tamanho mximo de 38 caracteres. Na especificao de tipos de dados numricos com casas decimais, primeiro informado o nmero total de dgitos, que inclui as casas decimais, cujo nmero de dgitos estar separado do primeiro por uma virgula. Number (4) - no mximo 4 caracteres numricos. Number (12,2) - no mximo 12 nmeros (10 inteiros e 2 decimais). Number (-3,8) - 0 inteiros e 8 decimais, em que somente as 3 ltimas podem ter valor. Este tipo de variavel possui alguns subtipos derivados: Decimal - subtipo idntico ao tipo Number. Dec, DoublePrecision, Integer, Int, Numeric, Real e Smalllnt - so subtipos do tipo Number que apresentam, como diferena deste, apenas diferentes faixas de valores permitidos. Float - permite armazenar valores de at 126 dgitos binrios. PLS_Integer - armazena valores numricos, positivos e negativos, entre -2147483647 e 2147483647. Este tipo de varivel requer menor espao de armazenamento do que uma varivel do tipo Number e permite melhor desempenho em clculos do que os tipos Binaryinteger ou Number. Binary-Integer - armazena valores numricos, positivos e negativos, entre -2147483647 e 2147483647. Este tipo de varivel requer menor espao de armazenamento do que uma varivel do tipo Number e possui quatro subtipos derivados desta: Natural - pode armazenar valores entre 0 e 2147483647. NaturaIN - armazena valores entre 0 e 2147483647 e no pode receber valores nulos. Positive - pode armazenar valores entre 1 e 2147483647. PositiveN armazena valores entre I e 2147483647 e no pode receber valores nulos. CHARACTER Char - alfanumrico de tamanho fixo, mximo de 255 caracteres. Character - subtipo idntico ao tipo Char. Varchar2 - alfanumrico de tamanho mximo de 2.000 caracteres. A principal diferena deste tipo para o tipo Char que com o tipo Varchar2 o numero de caracteres que no for utilizado no ocupa espao no banco de dados. Varchar e String - subtipos idnticos ao tipo Varchar2, mas so utilizados apenas para manter compatibilidade com verses diferentes ou anteriores do SQL. Long - alfanumrico com tamanho mximo de 2G. (O tamanho no pode ser informado.) S pode existir um por tabela e no pode ser utilizado na clusula WHERE de consultas. Curso de Programao Oracle Prof Fvio Rezende 49
1.1
SHARE ROW EXCLUSIVE nenhum outro usurio poder bloquear a tabela. Diferentemente dos outros bloqueios tipo SHARE, somente um usurio por vez poder fazer o COMMIT na tabela. EXCLUSIVE s o usurio gerador do bloqueio poder fazer alteraes. NOWAIT libera o processo, caso no for possvel efetuar o bloqueio. Ex.: LOCK TABLE BLOQUEIO In Exclusive Mode; O LOCK termina com o fim da transao (COMMIT/ROLLBACK).
8 Declaraes
8.1 Declaraes de Variveis
Variveis so declaradas na seo de declarao de variveis. Em geral a sintaxe para a declarao de variveis : Sintaxe : Nome_variavel type [CONSTANT] [NOT NULL] [:=value] Onde: Nome_varivel : o nome da varivel. Type : o tipo que a varivel ir assumir. CONSTANT : se utilizado, a varivel precisa ser inicializada com um valor, e este valor no pode ser alterado ao longo do programa. NOT NULL : significa que a varivel no poder assumir NULL ao longo do programa. Quando utilizada a varivel deve ser inicializada com um valor. Value : um valor para inicializar a varivel. Ex: DECLARE Const_Temp CONSTANT NUMBER(5) := 15 ; V_SEQ NUMBER(5) ; BEGIN Curso de Programao Oracle Prof Fvio Rezende 48
1.1
6 ndices
So estruturas que permitem a recuperao rpida de dados. Sintaxe: CREATE [UNIQUE] INDEX nome_do_indice ON nome_da_tabela (nome_da_coluna ASC/DESC[,nome_da_coluna ASC/DESC]...]} Ex.: CREATE INDEX FONE ON CLIENTE (nr_fone); Os ndices no podem ser alterados. necessrio exclu-los e cria-los novamente. Para excluir um ndice utiliza-se o comando DROP INDEX.
6.1
Algumas informaes sobre os ndices(INDEX_NAME, TABLE_OWNER, TABEL_NAME) so armazenadas numa tabela de controle chamada USER_INDEXES e podem ser recuperados a partir do seguinte comando: Sintaxe: SELECT * FROM USER_INDEXES WHERE TABLE_NAME = nome_da_tabela; O nome da tabela alm de estar entre aspas simples deve ser digitado em letras maisculas. Tambm podem ser recuperadas informaes sobre colunas(INDEX_NAME, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, COLUMS_LENGTH). Estas informaes ficam armazenadas na tabela de controle USER_IND_COLUMNS.
7 Controle de Concorrncia
O uso da funo lock mantm a consistncia do banco de dados no caso de acesso simultneo.
7.1
-
Tipos de Lock
Lock implcito gerado internamente pelo banco. Lock explcito criado via comando SQL e pode ser gerado a partir dos comandos Lock table e Select for update.
1.1
5 Seqncias
So estruturas criadas no banco de dados que retornam valores diferentes a cada acesso. Por default este valor cresce seqencialmente.
Sintaxe: CREATE SEQUENCE nome_da_sequencia [STAR WITH valor_inicial] (default1) [INCREMENT BY incremento] (default1) [MAXVALUE valor_maximo_da_sequencia/NOMAXVALUE] [MINIVALUE valor_minimo_da_sequencia/NOMINVALUE] [CYCLE/NOCYCLE] (se for cclica, quando atingir o mximo volta ao incio) Ex.: CREATE SEQUENCE SEQ START WITH 6; Para pegar o valor corrente da seqncia, utiliza-se o valor CURRVAL e para pegar o prximo valor, utiliza-se NEXTVAL. Somente se inicia uma seqncia com o primeiro NEXTVAL referente a ela. Sintaxe: SELECT nome_da_sequencia.CURRVAL from Dual; SELECT nome_da_sequencia.NEXTVAL from Dual; Ex.: SELECT SEQ.NEXTVAL from Dual; 6 SELECT SEQ.CURRVAL from Dual; 6 SELECT SEQ.NEXTVAL from Dual; 7
5.1
Sintaxe: ALTER SEQUENCE nome_da_sequencia Opo Ex.: ALTER SEQUENCE SEQ INCREMENT BY 2;
5.2
1.1
Ex.: CREATE TABLE SALGRADE_TTEMP AS SELECT GRADE, LOSAL FROM SALGRADE_TEMP;
4.1.5 Rename
Sintaxe: RENAME nome_antigo_da_tabela TO nome_novo_da_tabela Ex.: RENAME SALGRADE_TTEMP TO SALGRADE_T;
1.1
4.1
4.1.1 Insert
Sintaxe: INSERT INTO nome_tabela(campo1,campo2...) VALUES (valor1,valor2...); Ex: INSERT INTO SALGRADE(GRADE,LOSAL,HISAL) VALUES(6, 1500, 3000); Sintaxe: INSERT INTO nome_tabela(campo1,campo2...) SELECT campo1, campo2 FROM nome_tabela2;
Ex: create table SALGRADE_TEMP (GRADE NUMBER, LOSAL NUMBER, HISAL NUMBER); INSERT INTO SALGRADE_TEMP(GRADE,LOSAL,HISAL) SELECT GRADE,LOSAL,HISAL FROM SALGRADE;
4.1.2 Update
Sintaxe: UPDATE nome_tabela SET campo1 = valor1 [,campo2 = valor2...] [WHERE condio] Ex: UPDATE SALGRADE_TEMP SET HISAL = 2000 WHERE LOSAL < 2000;
4.1.3 Delete
Sintaxe: DELETE FROM nome_tabela [WHERE condio] Ex: DELETE FROM SALGRADE_TEMP
1.1
Exemplos SQL> ACCEPT SALARY NUMBER PROMPT 'Salary figure : ' Salary figure : 30000 SQL> ACCEPT PASSWORD CHAR PROMPT 'Password : ' HIDE Password : SQL> ACCEPT COM NUMBER NOPROMPT 500 SQL> DEFINE DEFINE SALARY DEFINE PASSWORD DEFINE COM = = = 30000 (NUMBER) "FREEBIES" (CHAR) 500 (NUMER)
Como fazer variveis permanecerem definidas? At que voc as redefina UNDEF(INE) ou at voc sair do SQL*Plus. Duas outras maneiras para definir uma varivel: SQL> ACCEPT varivel (tipo) (PROMPT 'texto') (HIDE) SQL> COLUMN nome coluna NEW_VALUE varivel
O comando acima atribui os valores dos campos NOTAFISCAL e DATA para as variveis previamente definidas V_NOTAFISCAL e V_DATA respectivamente.
1.1
MILLER 10 CLERK
3.3
O Comando DEFINE
Um valor pode ser atribudo para uma varivel usando o comando DEF[INE] do SQL*Plus. O valor atribudo pode ser referenciado na declarao SELECT ou pelo nome de varivel predefinido de um (&). Sintaxe: SQL>DEFINE var = valor No exemplo seguinte, uma varivel tem seu contedo definido como uma expresso aritmtica que calcula a remunerao. Na subsequente declarao, a varivel REM referenciada para um nmero de vezes. A varivel ento esvaziada usando UNDEF(INE): DEFINE REM = "SAL*12+NVL(COMM,0)"; SELECT ENAME, JOB, &REM FROM EMP ORDER BY &REM; UNDEFINE REM
NOME ---------SMITH JAMES ADAMS WARD MILLER MARTIN TURNER ALLEN OCUP ---------CLERK CLERK CLERK SALESMAN CLERK SALESMAN SALESMAN SALESMAN SAL*12+NVL(COM,0) -----------------9600 11400 13200 15500 15600 16400 18000 19500
As Aspas duplas em volta da expresso so opcionais a menos que a expresso tenha espaos.
3.4
O comando ACCEPT
O comando ACCEPT permite criar uma varivel. O ACCEPT geralmente usado num arquivo comando. Esta varivel ento pode ser referenciada na declarao do SQL. Existem benefcios em usar o ACCEPT para definir Variveis Substituveis. Dados tipo Data podem ser checados. A mensagem de entrada de dados pode ser mais explicativa Valores da resposta podem ser escondidos A sintaxe do comando : ACC(EPT)variable(NUMERICO/ALFANUMERICO)(PROMPT/NOPROMPT 'texto') (HIDE) Sintaxe NUMBER/CHAR PROMPT texto NOPROMPT HIDE Descrio determina o tipo de varivel. Se o valor entrado for invlido uma mensagem ser mostrada. mostra o texto se for especificado faz o ACCEPT omitir uma linha aguardando a entrada esconde entrada para o usurio, por exemplo, no caso de senha.
1.1
Valores alfanumricos ou datas, precisam ser includos entre aspas simples na entrada. Para evitar a entrada das aspas simples na execuo, declara-se a varivel entre aspas simples. Na declarao seguinte, as variveis esto includas entre aspas simples, s que as aspas simples no so requeridas na execuo: SELECT ENAME, DEPTNO, SAL*12 FROM EMP WHERE JOB = '&JOB'; Enter value for OCUP: MANAGER ENAME DEPTNO SAL*12 JONES 20 35700 BLAKE 30 34200 CLARK 10 29400 O tamanho da varivel indefinido e o valor ser pedido toda vez que for executada a declarao. ainda possvel entrar com um nome de coluna de um tabela na execuo. No seguinte exemplo voc entrar com um expresso aritmtica: SELECT DEPTNO, &ARITHMETIC_EXPRESSION FROM EMP; Enter value for arithmetic_expression: sal/12 DEPTNO 20 30 30 20 30 30 10 20 10 30 20 30 20 10 &ARITHMETIC_EXPRESSION 66,666667 133,33333 104,16667 247,91667 104,16667 237,5 204,16667 250 416,66667 125 91,666667 79,166667 250 108,33333
3.2
Se uma varivel prefixada com um duplo "e" comercial(&&), o SQL*Plus preenche o valor da varivel com o primeiro valor fornecido na execuo da declarao SQL. Exemplo: SELECT ENAME, DEPTNO, JOB FROM EMP WHERE DEPTNO = &&SETOR_PLEASE; Enter value for SETOR_please: 10 ENAME CLARK KING DEPTNO JOB 10 MANAGER 10 PRESIDENT Curso de Programao Oracle Prof Fvio Rezende 41
1.1
Voc pode unicamente usar WHERE para restringir linhas individuais. Para restringir colunas de grupos usa-se a clausula HAVING: SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING AVG(SAL) > 2000; SETOR 10 20 AVG(SAL) 2916.66667 2175
O exemplo acima usa a condio WHERE SETOR = 10 Com o nico "e" comercial o usurio solicitado toda vez que o comando executado porque a varivel no definida e consequentemente o valor digitado no salvo.
1.1
Para mostrar s os cargos, onde o mximo salrio maior ou igual a $3000, faa: SELECT JOB, MAX(SAL) FROM EMP HAVING MAX(SAL)>=3000 GROUP BY JOB; OCUP ANALYST PRESIDENT MAX(SAL) 3000 5000
A clausula HAVING deve preceder uma clausula GROUP BY e recomendado que seja colocada primeiro, pois mais lgico. A clausula WHERE no pode ser usada para restringir itens de grupo. A seguinte declarao da clausula WHERE errada. SELECT DEPTNO, AVG(SAL) FROM EMP WHERE AVG(SAL) > 2000 GROUP BY DEPTNO; ERROR at line 3: ORA-0934: set function is not allowed here
1.1
Para encontrar o mnimo salrio ganho por um escriturrio, faa: SELECT MIN(SAL) FROM EMP WHERE JOB = 'CLERK'; MIN(SAL) --------800
2.7.3 COUNT
Para encontrar o nmero de empregados do departamento 20, faa: SELECT COUNT(*) FROM EMP WHERE DEPTNO = 20; COUNT(*) -------5
1.1
2.6.5 VSIZE
VSIZE(col/valor) retorna o nmero de bytes interno do ORACLE representando um col/valor. SELECT DEPTNO, VSIZE(DEPTNO), VSIZE(HIREDATE), VSIZE(SAL), VSIZE(ENAME) FROM EMP WHERE DEPTNO = 10; SETOR 10 10 10 VSIZE(SETOR) 2 2 2 VSIZE(DATA) 7 7 7 VSIZE(SAL) 3 2 2 VSIZE(NOME) 5 4 6
2.7
Funes de Grupo
Funes de grupo operam sobre conjuntos de linhas. Elas retornam resultados baseados sobre um grupo de linhas, antes que um resultado por linha tenha retornado como uma funo de linha nica. Como padro todas as linhas de um tabela so trilhadas como um grupo. A clausula GROUP BY da declarao do SELECT usada para agrupar as linhas em menores grupos. As funes de grupos so listadas abaixo: Valor Retornado Funo AVG([DINSTINCT/ALL]n) Valor mdio de n, ignorando os valores nulos. COUNT([DINSTINCT/ALL]expr*) Contador * conta todas as linhas selecionadas, incluindo duplicadas e linhas nulas MAX([DISTINCT/ALL]expr) valor mximo da expresso MIN([DISTINCT/ALL]expr) valor mnimo da expresso STDDEV([DISTINCT/ALL]n) Desvio padro de n, ignorando valores nulos. SUM([DISTINCT/ALL]n) Valor soma de n, ignorando valores nulos. VARIANCE([DISTINCT/ALL],n) variao de n, ignorando valores nulos. Todas as funes acima operam sobre um nmero de linhas (por exemplo, uma tabela inteira) e so portanto funes de GRUPO. DISTINCT faz uma funo de grupo considerar valores no duplicados; ALL considera todos os valores. Todas as funes de grupo exceto o COUNT(*) ignoram os valores nulos.
2.7.1 AVG
Para calcular a mdia salarial dos empregados, faa: SELECT AVG(SAL) FROM EMP; AVG(SAL) ---------2073,2143 Note que as linhas da tabela EMP so trilhadas num nico grupo.
2.7.2 MIN
Uma funo de grupo pode ser usada para subconjunto de linhas de uma tabela usando a clausula WHERE.
1.1
Esse exemplo ilustra que com a funo DECODE, o valor retornado forado a ter um tipo de dado no terceiro argumento.
2.6.2 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(COM,0) 29400 60000 15600 NVL(COM,1000) 1000 1000 1000 SAL*12+NVL(COM,1000) 30400 61000 16600
2.6.3 GREATEST
GREATEST(col/valor1,col/valor2,...) retorna o maior da lista de valores. Todos os col/valores so convertidos para um valor antes da comparao.
SELECT SAL, COMM, GREATEST(1000,2000), GREATEST(SAL,COMM) FROM EMP WHERE DEPTNO = 30; SAL COMM GREATEST(1000,2000) GREATEST(SAL,COMM) 1600 300 2000 1600 1250 500 2000 1250 1400 1400 2000 1250 2000 2850 2000 1500 1500 0 2000 950 Na funo GREATEST quando na lista de valores existe um valor nulo ele considerado como o maior.
2.6.4 LEAST
LEAST(col/valor1,col/valor2,...) retorna o menor valor de um lista de valores. Todos os valores so convertidos antes da comparao.
SELECT SAL, COMM, LEAST(1000,2000), LEAST(SAL,COMM) FROM EMP WHERE DEPTNO = 30; SAL 1600 1250 1250 2850 1500 950 COMM 300 500 1400 0 LEAST(1000,2000) 1000 1000 1000 1000 1000 1000 LEAST(SAL,COMM) 300 500 1250 0
Na funo LEAST quando na lista de valores existe um valor nulo ele considerado como o menor.
1.1
2.6
2.6.1 DECODE
DECODE a mais potente funo do SQL. Ele facilita pesquisas condicionais fazendo o trabalho de ferramentas ou comandos IF-THEN-ELSE. Sintaxe: DECODE(col/expresso, procurado1,resultado1, procurado2,resultado2...,padro) Col/expresso comparado com cada um dos valores procurados e retorna o resultado se a col/expresso igual ao valor procurado. Se no for encontrado nenhum dos valores procurados, a funo DECODE retorna o valor padro. Se o valor padro for omitido ele retornar um valor nulo. O seguinte exemplo decodifica os cargos dos tipos MANAGER e CLERK unicamente. Os outros cargos sero padro, alterados para UNDEFINED: SELECT ENAME, JOB, DECODE(JOB,'CLERK','WORKER', 'MANAGER','BOSS') FROM EMP; ENAME JOB DECODE WORKER CLERK SMITH SALESMAN ALLEN SALESMAN WARD BOSS MANAGER JONES SALESMAN MARTIN MANAGER BOSS BLAKE MANAGER BOSS CLARK ANALYST SCOTT PRESIDENT KING SALESMAN TURNER CLERK WORKER ADAMS CLERK WORKER JAMES ANALYST FORD CLERK WORKER MILLER Para mostrar a gratificao percentual dependendo do grau do salrio: SELECT GRADE, DECODE(GRADE,'1','15%', '2','10%', '3','8%', '4,5%') BONUS FROM SALGRADE; GRADE BONUS FROM SALGRADE 15% 1 10% 2 8% 3 5% 4 5
1.1
2.5.3 TO_DATE
Para mostrar todos os empregados admitidos em 4 de junho de 1984 (no formato padro), ns podemos usar a funo TO_DATE: SELECT EMPNO, ENAME, HIREDATE FROM EMP WHERE HIREDATE = TO_DATE ('September
EMPNO ENAME HIREDATE -------------- --------7844 TURNER 08-SEP-81 O contedo convertido para data e comparado com o valor de DATA. Para entrar um linha na tabela EMP com a data no no formato padro: INSERT INTO EMP (EMPNO, DEPTNO,HIREDATE) VALUES (7777,20,TO_DATE('19/08/90 00:00:00','DD/MM/YY HH:MI:SS'));
1.1
WW ou W DDD ou DD ou D DAY DY J AM ou PM A.M. ou P.M. HH ou HH12 HH24 MI SS SSSSS /.,etc. ...
Semana do ano ou ms dia do ano, ms ou semana nome do dia, espaado com brancos com 9 caracteres de tamanho nome do dia, 3 letras abreviadas data Juliana, o nmero de dias desde 31 dezembro 4713 antes de Cristo Indicador meridiano indicador meridiano com perodos horas do dia (1-12) horas do dia (0-23) minuto segundos segundos passado meia-noite(0-86399) pontuao reproduzida no resultado cotas de linhas so representadas no resultado.
Os sufixos abaixo devem ser adicionados em frente dos cdigos: TH Ex.: SELECT TO_CHAR(SYSDATE,'DAY, DDTH MONTH YYYY') FROM DUAL; SEXTA-FEIRA , 01ST DEZEMBRO 2000 SP Ex.: SELECT TO_CHAR(SYSDATE,'DAY, DDSP MONTH YYYY') FROM DUAL; SEXTA-FEIRA , ONE DEZEMBRO 2000 SPTH ou thsp Ex.: SELECT TO_CHAR(SYSDATE,'DAY, DDSPTH MONTH YYYY') FROM DUAL; SEXTA-FEIRA , FIRST DEZEMBRO 2000 DAY Day Month Ddth DdTh MONDAY Monday July 14th 14Th
2.5.2 TO_NUMBER
No seguinte exemplo a funo TO_NUMBER usada para transformar um nmero armazenado como um alfanumrico para um tipo numrico: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL > TO_NUMBER('1500'); EMPNO 7499 7566 7698 7782 7788 7839 7902 ENAME ALLEN JONES BLAKE CLARK SCOTT KING FORD JOB SALESMAN MANAGER MANAGER MANAGER ANALYST PRESIDENT ANALYST SAL 1600 2975 2850 2450 3000 5000 3000
1.1
Formatos Numricos Mscara Significado 9 0 $ . , MI PR EEEE V B posio numrica (nmero de 9s determinam a largura mostrada) mostra zeros mostra sinal de dlar ponto decimal na posio especificada vrgula na posio especificada sinal de menos direita(valores negativos) parnteses para nmeros negativos notao cientfica(formato de conter quatro Es unicamente) multiplica pela dcima potncia 10n(n = nmero 9s depois da V mostra valores zero em branco, no zero
Exemplo 999999 0999999 $999999 999999.99 999,999 999999MI 999999PR 99.999EEEE 9999V99 B9999.99 1234 001234 $1234 1234.00 1,234 1234<1234> 1.234E+03 123400 1234.00
SELECT SAL, TO_CHAR(SAL,'$9,999') FROM EMP; SAL TO_CHAR(SAL,'$9,999') $800 800 $1,600 1600 $1,250 1250 $2,975 2975 $1,250 1250 $2,850 2850 $2,450 2450 $3,000 3000 $5,000 5000 $1,500 1500 $1,100 1100 $950 950 $3,000 3000 $1,300 1300 Os formatos das mscaras so opcionais. Se a mscara omitida, a data convertida para um alfanumrico que padro DD-MON-YY. Se a mscara no especificada, o nmero convertido para alfanumrico. Formatos de Data Mscara SCC ou CC YYYY ou SYYYY YYY ou YY ou Y Y,YYY SYEAR ou YEAR BC ou AD B.C. ou A.D. Q MM MONTH MON
Significado Sculo, prefixo S BCdata com - Ano, prefixo S BC data com - ltimo 3, 2 ou 1 digito(s) do ano Ano com vrgula nessa posio Ano, soletrado na sada S prefixo BC data com - BC/AD perodo BC/AD indicador com perodos Um quarto do Ano Ms nome do ms, espaamento com brancos do tamanho de 9 caracteres nome do ms, 3 letras abreviadas Curso de Programao Oracle Prof Fvio Rezende 32
1.1
TRUNC usado se voc quiser remover o horrio do dia. O horrio contido no dia removido por default.
2.5
Funes de Converso
SQL possui um nmero de funes para controlar os tipos de converso de dados. Essas funes convertem um valor de um tipo de dado para outro. TO_CHAR(nmero,data,formato) converte nmeros e datas para formatos alfanumricos TO_NUMBER(caracter) converte alfanumricos para numricos. TO_DATE(caracter,formato) converte um alfanumrico representando uma data, para um valor de data de acordo com o formato especificado. Se o formato omitido o formato padro DD-MON-YY.
2.5.1 TO_CHAR
TO_CHAR(data,mscara) Especifica que a data est sendo convertida para um novo formato na sada. Para converter a data corrente do formato padro (DD-MON-YY) para uma nova mscara: SELECT TO_CHAR(SYSDATE,'DAY, DD MONTH YYYY') FROM DUAL; TO_CHAR(SYSDATE,'DAY, DD MONTH YYYY') --------------------------------------SEXTA-FEIRA , 01 DEZEMBRO 2000 Note que: A mscara deve estar entre aspas simples e pode ser includa em vrios formatos. A coluna e mscara devem ser separadas por uma vrgula. DAY e MONTH na sada so espaados automaticamente com brancos no tamanho de 9 caracteres TO_CHAR pode tambm ser usado para extrair o horrio de um nico dia, e mostr-lo no formato especificado. SELECT TO_CHAR(SYSDATE,'HH:MI:SS') FROM DUAL; TO_CHAR(SYSDATE,'HH:MI:SS') --------------------------------------08:16:24 A funo TO_CHAR tambm usada para converter um valor do tipo numrico para um valor do tipo alfanumrico.
1.1
SELECT HIREDATE, TO_CHAR(HIREDATE,DAY), FROM EMP WHERE DEPTNO = 20; HIREDATE 17/12/80 02/04/81 19/04/87 23/05/87 03/12/81 TO_CHAR(HIREDATE,DAY) QUARTA-FEIRA QUINTA-FEIRA DOMINGO SBADO QUINTA-FEIRA
NEXT_DAY(HIREDATE,5)
2.4.6 LAST_DAY
LAST_DAY(data) encontra a data do ultimo dia do ms da data especificada SELECT SYSDATE, LAST_DAY(SYSDATE), HIREDATE, LAST_DAY(HIREDATE), LAST_DAY('15-02-88') FROM EMP WHERE DEPTNO = 20; SYSDATE 01/12/00 01/12/00 01/12/00 01/12/00 01/12/00 LAST_DAY(SYSDATE) 31/12/00 31/12/00 31/12/00 31/12/00 31/12/00 HIREDATE 17/12/80 02/04/81 19/04/87 23/05/87 03/12/81 LAST_DAY(HIREDATE) 31/12/80 30/04/81 30/04/87 31/05/87 31/12/81 LAST_DAY(15-02-88) 29/02/88 29/02/88 29/02/88 29/02/88 29/02/88
2.4.7 ROUND
A funo ROUND pode ser aplicada para datas. ROUND(data) ROUND(data,MONTH) ROUND(data,YEAR) retorna a data com o horrio em 12:00(meio-dia) Usamos isso quando comparamos datas que tenham diferentes horrios. retorna o primeiro dia do ms da data, se a data estiver na primeira metade do ms; se no retorna o primeiro do ms seguinte. retorna o primeiro dia do ano da data se data estiver na primeira metade do ano; se no retorna o primeiro do ano seguinte.
SELECT SYSDATE, ROUND(SYSDATE,'MONTH'), ROUND(SYSDATE,'YEAR') FROM DUAL; SYSDATE 04-DEC-89 ROUND(SYSDATE,'MONTH') 01-DEC-89 ROUND(SYSDATE,'YEAR') 01-JAN-90
2.4.8 TRUNC
TRUNC(data,caracter) encontra a data do primeiro dia do ms quando 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
1.1
2.4.3 MONTHS_BEETWEEN
MONTHS_BETWEEN(data1,data2) encontra o nmero de meses entre data 1 e data2. O resultado pode ser positivo ou negativo. Se a data 1 for posterior a data2, ento o resultado ser positivo, se a data 1 for menor que a data 2 o resultado ser negativo.
MONTHS_BETWEEN(SYSDATE,DATA) 239,50724 237,41047 237,34595 235,99111 230,1524 235 233,76531 163,44273 228,50724 230,79756 162,31369 227,95885 227,95885 226,31369
2.4.4 ADD_MONTHS
ADD_MONTHS(data,n) adiciona n nmeros de meses na data; n deve ser inteiro e pode ser negativo.
SELECT HIREDATE, ADD_MONTHS(HIREDATE,3), ADD_MONTHS(HIREDATE,-3) FROM EMP WHERE DEPTNO = 20; HIREDATE 17/12/80 02/04/81 19/04/87 23/05/87 03/12/81 ADD_MONTHS( HIREDATE,3) 17/03/81 02/07/81 19/07/87 23/08/87 03/03/82 ADD_MOSTHS(HIREDATE,-3) 17/09/80 02/01/81 19/01/87 23/02/87 03/09/81
2.4.5 NEXT_DAY
NEXT_DAY(data1,caracter) data do prximo dia especificado da semana. Caracter deve ser um nmero representado um dia, ou o dia da semana descrito em ingls.
1.1
2.4
Funes de Data
Funes de data operam sobre datas do ORACLE. Todas as funes de datas retornam valores de tipo data exceto MONTHS_BETWEEN o qual retorna um valor numrico. Armazenamento de Datas no ORACLE Sculo Ano Ms Dia Horas Minutos Segundos O padro de data mostrados nas pesquisas DD-MON-YY.
2.4.1 Sysdate
Sysdate uma coluna que retorna a data e horrio corrente. Voc pode usar o SYSDATE como uma outra coluna qualquer. Por exemplo, voc pode mostrar data corrente selecionando o sysdate de uma tabela simulada chamada DUAL. A tabela DUAL uma tabela do sistema e deve ser permitido acess-la para todos os usurios. Ela contm uma coluna DUMMY e uma linha com o valor X. A tabela DUAL usada quando voc quer retornar apenas uma linha. Para mostrar a data corrente: SELECT SYSDATE FROM DUAL; SYSDATE -------01/12/00 Voc poderia facilmente selecionar o sysdate da tabela EMP, mas seriam retornados tantos sysdate quanto o nmero de linhas na tabela EMP.
1.1
2.3.7 SIGN
SIGM(col/value) retorna -1 se a coluna, expresso ou valor for negativo ou zero e 1 se for positivo.
SELECT SAL-COMM, SIGN(SAL-COMM), COMM-SAL, SIGN(COMM-SAL) FROM EMP WHERE DEPTNO = 30; SAL-COM SIGN(SAL-COM) COM-SAL SIGN(SAL-COM) 1300 1 -1300 -1 750 1 -750 -1 -150 -1 150 1 1500 1 -1500 -1 Freqentemente a funo SIGN usada para testar se um valor menor, maior ou igual a um segundo valor. O seguinte exemplo apresenta todos os empregados os quais o salrio maior que sua comisso: SELECT ENAME, SAL, COMM FROM EMP WHERE SIGN(SAL-COMM) = 1; NOME SAL ALLEN 1600 WARD 1250 TURNER 1500
2.3.8 ABS
ABS(col/value) encontra o valor absoluto de um coluna, expresso ou valor. SELECT SAL, COMM, COMM-SAL, ABS(COMM-SAL), ABS(-35) FROM EMP WHERE DEPTNO = 30; SAL COM COM-SAL ABS(COM-SAL) ABS(-35) 35 1300 -1300 300 1600 35 750 -750 500 1250 35 150 150 1400 1250 35 2850 35 1500 -1500 0 1500 35 950
2.3.9 MOD
MOD(val1,val2) encontra o resto da diviso val1 por val2 SELECT SAL, COMM, MOD(SAL,COMM), MOD(100,40) FROM EMP WHERE DEPTNO = 30 ORDER BY COMM; SAL COM MOD(SAL,COM) MOD(100,40) 20 1500 0 1500 20 100 300 1600 20 250 500 1250 20 1250 1400 1250 20 2850 20 950 Curso de Programao Oracle Prof Fvio Rezende 27
1.1
2.3.3 CEIL
CEIL(col/value) Arredonda acima. Exemplo: SELECT CEIL(SAL), CEIL(99.9), CEIL(101.76), CEIL(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000; CEIL(SAL) CEIL(99.9) CEIL(101.76) CEIL(-11.1) 3000 100 102 -11 5000 100 102 -11 3000 100 102 -11
2.3.4 FLOOR
FLOOR(col/value) Arredonda para baixo. SELECT FLOOR(SAL), FLOOR(99.9), FLOOR(101.76), FLOOR(-11.1) FROM EMP WHERE SAL BETWEEN 3000 AND 5000;
FLOOR(99.9) 99 99 99
2.3.5 POWER
POWER(col/value,n) eleva uma coluna, expresso ou valor para uma potncia; n pode ser negativo mas deve ser um nmero, se no um erro ser retornado
SELECT SAL, POWER(SAL,2), POWER(SAL,3), POWER(50,5) FROM EMP WHERE DEPTNO = 10; SAL POWER(SAL,2) POWER(SAL,3) POWER(50,5) 312500000 1,471E+10 6002500 2450 312500000 1,250E+11 25000000 5000 312500000 2,197E+09 1690000 1300
2.3.6 SQRT
SQRT(col/value) encontra a raiz quadrada da coluna ou valor. Se a coluna ou valor for menor que zero ser retornado nulo.
SELECT SAL, SQRT(SAL), SQRT(40), SQRT(COMM) FROM EMP WHERE COMM > 0; SAL SQRT(SAL) SQRT(40) SQRT(COMM) 1600 40 6,3245553 17,320508 1250 35,355339 6,3245553 22,36068 1250 35,355339 6,3245553 37,416574
1.1
A Funo REPLACE um complemento da funo TRANSLATE que substitui caracteres um a um e o REPLACE substitui um linha por outra.
2.2
Aninhamento de Funes
Funes de linhas nicas podem ser aninhadas para vrias finalidades. Se funes so aninhadas, elas so avaliadas de dentro para fora. Exemplo: X(D(A(B(C(caracter))))) ordem lgica de execuo C,B,A,D e X.
2.3
Funes Numricas
2.3.1 ROUND
ROUND(col/value,n) arredonda uma coluna, expresso ou valor para n casas decimais. Se n for negativo, os nmeros para esquerda do decimal so arredondados.
SELECT
FROM WHERE
ROUND(45.923,1), ROUND(45.923), ROUND(45.323,1), ROUND(45.323,-1), ROUND(SAL/32,2) EMP DEPTNO = 10; ROUND(45.923) 46 46 46 ROUND(45.323,1) 45.3 45.3 45.3 ROUND(45.323,-1) 50 50 50 ROUND(SAL/32,2) 76.56 156.25 40.63
2.3.2 TRUNC
TRUNC(col/value.n) trunca a coluna, expresso ou valor para n casas decimais. Se n negativo os nmeros para esquerda das casas decimais so truncados para zero.
SELECT
FROM WHERE
TRUNC(45.923,1), TRUNC(45.923), TRUNC(45.323,1), TRUNC(45.323,-1), TRUNC(SAL/32,2) EMP DEPTNO = 10; TRUNC(45.923) 45 45 45 TRUNC(45.323,1) 45.3 45.3 45.3 TRUNC(45.323,-1) 40 40 40 TRUNC(SAL/32,2) 76.56 156.25 40.62
1.1
NOME ----------FORD SOUNDEX(NOME) -------------F630
2.1.8 LENGTH
LENGTH(col/value) retorna o nmero de caracteres na coluna ou valor literal. SELECT LENGTH(CURSO SQL), LENGTH(DEPTNO), LENGTH(DNAME) FROM DEPT;
LENGTH(CURSO SQL) 9 9 9 9
LENGTH(DEPTNO) 2 2 2 2
LENGTH(DNAME) 10 8 5 10
SELECT JOB, REPLACE(JOB,'SALESMAN','SALESPERSON') FROM EMP; JOB, REPLACE(JOB,'SALESMAN','SALESPERSON') CLERK CLERK SALESPERSON SALESMAN SALESPERSON SALESMAN MANAGER MANAGER SALESPERSON SALESMAN MANAGER MANAGER MANAGER MANAGER ANALYST ANALYST PRESIDENT PRESIDENT SALESPERSON SALESMAN CLERK CLERK Curso de Programao Oracle Prof Fvio Rezende 24
1.1
2.1.5 INSTR
INSTR(col/value,caracter) INSTR(col/value,caracter,pos,n) encontra a primeira ocorrncia do caracter. encontra a posio do caracter na coluna ou valor literal iniciando na posio que se encontra dentro de uma repetio desta varivel ou literal.
SELECT DNAME, INSTR(DNAME,'A'), INSTR(DNAME,'ES'), INSTR(DNAME,'C',1,2) FROM DEPT; DNAME ACCOUNTING RESEARCH SALES OPERATIONS INSTR(DNAME,'A') 1 5 2 5 INSTR(DNAME,'ES') 0 2 4 0 INSTR(DNAME,'C',1,2) 3 0 0 0
RTRIM(col/value,caractere(s))
SELECT DNAME, RTRIM(DNAME,'G'), RTRIM(DNAME,'GHS'), RTRIM(DNAME,'N') FROM DEPT; DNAME RTRM(DNAME,'G') RTRIM(DNAME,'GHS') RTRIM(DNAME,'N') ACCOUNTING ACCOUNTIN ACCOUNTIN ACCOUNTING RESEARCH RESEARCH RESEARC RESEARCH SALES SALES SALE SALES OPERATIONS OPERATIONS OPERATION OPERATIONS
2.1.7 SOUNDEX
SOUNDEX(col/value) retorna uma linha de caracteres representando o som da palavra para uma coluna ou um valor literal. Esta funo retorna a fontica representao de uma palavra.
1.1
SELECT LPAD(DNAME,20,'*'), LPAD(DNAME,20), LPAD(DEPTNO,20,'.') FROM DEPT; LPAD(DNSMR,20,'*') LPAD(DNAME,20 ) *************RESEACH RESEACH ***************SALES SALES **********OPERATIONS OPERATIONS ***********ACCOUTING ACCOUNTING LPAD(DEPTNO,20,'.') ..................20 ..................30 ..................40 ..................10
RPAD(col/value,n,caracter)
preenche a coluna ou valor literal da direita para o total tamanho de n posies. Os espaos a direita so preenchidos com o caracter. Se o caracter for omitido o preenchimento fica em branco.
Exemplo: SELECT RPAD(DNAME,20,'*'), RPAD(DNAME,20), RPAD(DEPTNO,20,'.') FROM DEPT; RPAD(DNAME,20,'*') ACCOUTING*********** RESEACH************* SALES*************** OPERATIONS********** RPAD(DNAME,20) ACCOUNTING RESEACH SALES OPERATIONS RPAD(DEPTNO,20,'.') 10.................. 20.................. 30.................. 40..................
2.1.4 SUBSTR
SUBSTR(col/value,pos,n) Retorna uma linha de n caracteres da coluna ou valor literal, iniciando na posio nmero pos. Se n omitido a linha extrada da posio pos at o fim.
Exemplo: 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) COUNT CCOUNTING RACL SEARC ESEARCH RACL LES ALES RACL ERATI PERATIONS RACL Note que os valores esto alinhados para a esquerda. Isso porque SQL*Plus sempre mostra dados alfanumricos alinhados para a esquerda por default.
1.1
2.1
Funes Alfanumricas
Funes Alfanumricas aceitam dados alfanumricos e podem retornar valores alfanumricos ou numricos. A funo seguinte influencia na construo de valores alfanumricos.
2.1.1 LOWER
LOWER(col/value) fornece valores alfanumricos os quais esto em letra maiscula ou minscula e retornam em letra minscula
Para mostrar o nome dos departamentos em letra minscula e a constante CURSO_SQL, faa: SELECT LOWER(DEPTNO), LOWER('CURSO_SQL') FROM DEPT; LOWER(DEPTNO) LOWER('CURSO_SQL') 10 curso_sql 20 curso_sql 30 curso_sql 40 curso_sql
2.1.2 UPPER
UPPER(col/value) fornece caracteres alfanumricos, os quais esto em letra maiscula ou minscula e retorna em letra maiscula.
No exemplo seguinte, a funo UPPER fora o usurio entrar em letra maiscula. SELECT ENAME FROM EMP WHERE ENAME = UPPER('&NOME'); Enter value for NOME : smith ENAME ---------SMITH
2.1.3 INITCAP
INITCAP(col/value) fora a primeira letra da palavras ser em maiscula e o resto minscula Exemplo: SELECT INITCAP(DNAME), INITCAP(LOC) FROM DEPT; INITCAP(DNAME) INITCAP(LOC) New York Accounting Dallas Research Chicago Sales Boston Operations
1.1
Suponha que voc queira encontrar todos os gerentes, em vrios departamentos, e todos os escriturrios no departamento 10 unicamente: SELECT * FROM EMP WHERE JOB = 'MANAGER' OR (JOB = 'CLERK' AND DEPTNO = 10); EMPNO ENAME JOB MGR HIREDATE 7566 JONES MANAGER 7839 02/04/81 7698 BLAKE MANAGER 7839 01/05/81 7782 CLARK MANAGER 7839 09/06/81 7934 MILLER CLERK 7782 23/01/82
DEPTNO 20 30 10 10
O parnteses acima no necessrio, por que o AND precedente ao OR, mas ele esclarece o significado da expresso.
2 Funes
As Funes so usadas para manipular dados. Elas aceitam um ou mais argumentos e retornam um valor. Um argumento uma constante, refere-se varivel, expresso ou coluna. Sintaxe: funo_nome (agrumento1,argument2,...) Funes podem ser usadas para: Clculos sobre datas modificar valores de itens individuais manipular sada para grupos de linhas alterar formatos de datas para mostr-los Existem diferentes tipos de funes: ALFANUMRICAS NUMRICAS DATA CONVERSO FUNES QUE ACEITAM VRIOS TIPOS DE DADOS GRUPO
Algumas funes operam unicamente sobre linhas simples; outras manipulam grupos de linhas. Funes de Linha nica: agem sobre cada linha retornada na pesquisa retornam um resultado por linha esperam um ou mais argumento do usurio podem ser aninhadas podem ser usadas com variveis do usurio, colunas, expresses; podem ser usadas, por exemplo, nas clusulas SELECT, WHERE, ORDER BY.
1.1
Para encontrar todos os empregados que so escriturrios ou todos que ganhem entre 1000 e 2000 faa: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 OR JOB = 'CLERK'; EMPNO 7369 7499 7521 7654 7844 7876 7900 7934 ENAME SMITH ALLEN WARD MARTIN TURNER ADAMS JAMES MILLER JOB CLERK SALESMAN SALESMAN SALESMAN SALESMAN CLERK CLERK CLERK SAL 800 1600 1250 1250 1500 1100 950 1300
Voc pode combinar AND e OR na mesma expresso lgica. Quando AND e OR aparecerem na mesma clausula WHERE, o AND realizado primeiro depois o OR. Se AND no interfere sobre o OR a seguinte declarao SQL retornar todos os gerentes com salrio acima de 1500 e todos os vendedores: SELECT FROM WHERE AND OR EMPNO 7499 7521 7566 7654 7698 7782 7844 EMPNO, ENAME, JOB, SAL, DEPTNO EMP SAL > 1500 JOB = 'MANAGER' JOB = 'SALESMAN'; ENAME JOB SALESMAN ALLEN SALESMAN WARD MANAGER JONES MARTIN SALESMAN MANAGER BLAKE MANAGER CLARK TURNER SALESMAN SAL 1600 1250 2975 1250 2850 2450 1500 DEPTNO 30 30 20 30 30 10 30
Todos os operadores so organizados em uma hierarquia. Numa Expresso, as operaes so feitas na ordem de sua precedncia, do maior para o menor. Onde os operadores de igual precedentes so usados prximo a outro, eles so feitos da esquerda para direita. 1- Todos os comparativos e Operadores SQL tem igual precedente: =, !=, <, >, <=, >=, BETWEEN ... AND ..., IN, LIKE, IS NULL. 2- NOT (para inverter o resultado das expresses lgicas: WHERE NOT (SAL>2000)) 3- AND 4- OR Sempre que voc estiver em dvida sobre qual dos dois operadores ser feito primeiro quando a expresso avaliada, use parnteses aumentar a legibilidade.
1.1
FORD MILLER
ANALYST CLERK
Para encontrar todos os empregados que tenham um gerente, faa: SELECT ENAME, MGR FROM EMP WHERE MGR IS NOT NULL; ENAME SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT TURNER ADAMS JAMES FORD MILLER MGR 7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782
Nota: Se um valor nulo usado em uma comparao, ento o operador de comparao deve ser IS ou IS NOT NULL. Se esses operadores no forem usados e valores nulos forem comparados, o resultado ser sempre FALSO. Por exemplo, COMM <> NULL ser sempre FALSO. O resultado ser falso porque um valor nulo no pode ser igual ou no igual a qualquer outro valor.
1.1
Para encontrar empregados que tenham o salrio fora da faixa, faa: SELECT ENAME, SAL FROM EMP WHERE SAL NOT BETWEEN 1000 AND 2000; ENAME SMITH JONES BLAKE CLARK SCOTT KING JAMES FORD SAL 800 2975 2850 2450 3000 5000 950 3000
Para encontrar os empregados os quais o cargo no comece com a letra M, faa: SELECT ENAME, JOB FROM EMP WHERE JOB NOT LIKE 'M%'; ENAME SMITH ALLEN WARD MARTIN SCOTT KING TURNER ADAMS JAMES JOB CLERK SALESMAN SALESMAN SALESMAN ANALYST PRESIDEN SALESMAN CLERK CLERK
1.1
MILLER
1300
1.14.2 O Operador IN
Testa os valores especificados em uma lista. Para encontrar empregados que tenham um dos trs nmeros de MAT, faa: SELECT EMPNO, ENAME, SAL, MGR FROM EMP WHERE MGR IN (7902,7566,7788) EMPNO ENAME SAL MGR 7902 800 SMITH 7369 7566 SCOTT 3000 7788 7788 ADAMS 1100 7876 7566 3000 FORD 7902 Podemos usar o comando select dentro da clusula in.
ENAME ---------SMITH SCOTT Eles podem ser usados para encontrar um determinado nmero de caracteres. Por exemplo para listar todos empregados que tenham exatamente quatro caracteres de tamanho do nome: SELECT ENAME FROM EMP WHERE ENAME LIKE '____'; ENAME ---------WARD KING FORD O % e o _ podem ser usados em vrias combinaes com literais alfanumricos.
1.1
Para listar os nomes, nmeros, emprego e departamentos de todos os escriturrios(CLERK): SELECT ENAME, EMPNO, JOB, DEPTNO FROM EMP WHERE JOB = 'CLERK'; ENAME EMPNO JOB DEPTNO SMITH 7369 CLERK 20 ADAMS 7876 CLERK 20 JAMES 7900 CLERK 30 MILLER 7934 CLERK 10 Para encontrar todos os nomes de departamentos com nmero maior que 20, faa: SELECT DEPTNO, DNAME FROM DEPT WHERE DEPTNO > 20; DEPTNO DNAME 30 SALES 40 OPERATIONS Comparando uma coluna com outra coluna na mesma linha: Exemplo: SELECT FROM WHERE COMM ENAME ---------MARTIN
ENAME, SAL, COMM EMP > SAL; SAL COMM --------- --------1250 1400
1.1
Ordenao descendente Para inverter essa ordem, use o comando DESC(Decrescente) depois do nome das colunas da clausula ORDER BY. Exemplo: SELECT ENAME, JOB, HIREDATE DATA DESC FROM EMP ORDER BY HIREDATE DESC; ENAME ADAMS SCOTT MILLER JAMES FORD KING MARTIN TURNER CLARK BLAKE JONES WARD ALLEN SMITH JOB CLERK ANALYST CLERK CLERK ANALYST PRESIDENT SALESMAN SALESMAN MANAGER MANAGER MANAGER SALESMAN SALESMAN CLERK DATA 23/05/87 19/04/87 23/01/82 03/12/81 03/12/81 17/11/81 28/09/81 08/09/81 09/06/81 01/05/81 02/04/81 22/02/81 20/02/81 17/12/80
Ordenao por vrias colunas. possvel na clausula ORDER BY usar mais de uma coluna. O limite de colunas o nmero de colunas da tabela. Se algumas ou todas so invertidas especifique DESC depois de alguma ou cada uma das colunas. A clausula ORDER BY usada na pesquisa. O comando no altera a ordem dos dados que esto armazenados no Banco de Dados ORACLE.
1.1
Vrias colunas podem ser especificadas depois do DISTINCT Exemplo: SELECT DISTINCT DEPTNO, JOB FROM EMP; DEPTNO JOB --------------10 CLERK 10 MANAGER 10 PRESIDENT 20 ANALYST 20 CLERK 20 MANAGER 30 CLERK 30 MANAGER 30 SALESMAN
ENAME ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD
JOB CLERK SALESMAN MANAGER MANAGER ANALYST CLERK MANAGER PRESIDENT SALESMAN CLERK ANALYST CLERK SALESMAN SALESMAN
SAL*12 13200 19200 34200 29400 36000 11400 35700 60000 15000 15600 36000 9600 18000 15000
DEPTNO 20 30 30 10 20 30 20 10 30 10 20 20 30 30
1.1
ENAME SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER
18000
Na ordem para realizar o resultado para todos os empregados, necessrio converter os valores nulos para numricos. Ns usamos a funo NVL para converter valores nulos para no nulos. NVL conta com dois argumentos: 1- uma expresso 2- um valor que ser retornado caso o valor do primeiro argumento for nulo. Note que voc pode usar a funo NVL para converter qualquer tipo de valor nulo. NVL(COLUNA_DATA_NULA,30-OCT-74) NVL(COLUNA_NUMRICA_NULA,21) NVL(COLUNA_ALFANUMRICA_NULA,QUALQUER VALOR)
1.1
EMPREGADO 7369SMITH 7499ALLEN 7521WARD 7566JONES 7654MARTIN 7698BLAKE 7782CLARK 7788SCOTT 7839KING 7844TURNER 7876ADAMS 7900JAMES 7902FORD 7934MILLER
1.9 Literais
Literais so um ou mais caracteres, expresses ou nmeros, includos na lista do SELECT. Um literal na lista do SELECT ter uma sada para cada linha retornada. Literais de livre formatos de textos podem ser includos no resultado da pesquisa e so tratados como uma coluna na lista do SELECT. Datas e caracteres alfanumricos devem ser colocados entre aspas simples(); nmeros no precisam de aspas simples. As declaraes seguintes contm literais selecionados com concatenao e colunas sinnimas. Exemplo: SELECT EMPNO||'-'||ENAME EMPREGADO, 'WORKS IN DEPARTMENT', DEPTNO FROM EMP; EMPREGADO 7369-SMITH 7499-ALLEN 7521-WARD 7566-JONES 7654-MARTIN 7698-BLAKE 7782-CLARK 7788-SCOTT 7839-KING 7844-TURNER 7876-ADAMS 7900-JAMES 7902-FORD 7934-MILLER 'WORKS IN DEPARTMENT' WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT WORKS IN DEPARTMENT DEPTNO 20 30 30 20 30 30 10 20 10 30 20 30 20 10
1.1
ENAME SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER
(sal + 250) * 12 12600 22200 18000 38700 18000 37200 32400 39000 63000 21000 16200 14400 39000 18600
1.7
Colunas Sinnimas
Quando mostramos o resultado de uma pesquisa, o SQL*Plus normalmente usa-se o nome das colunas selecionadas como cabealho. Voc pode modificar o cabealho de uma coluna usando sinnimos(alias). Exemplo: SELECT SAL*12 GANHO_ANUAL, COMM FROM EMP; GANHO_ANUAL COMM 9600 300 19200 500 15000 35700 1400 15000 34200 29400 36000 60000 18000 0 13200 11400 36000 15600
1.1
WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER
15000 35700 15000 34200 29400 36000 60000 18000 13200 11400 36000 15600
500 1400
A prioridade *,/, ento +,-. No exemplo seguinte a multiplicao (250*12) avaliada primeiro; ento o valor do salrio adicionado no resultado da multiplicao (3000). Exemplo: Select NOME, sal + 250 * 12 from emp; ENAME SAL+250*12 3800 SMITH 4600 ALLEN 4250 WARD 5975 JONES 4250 MARTIN 5850 BLAKE 5450 CLARK 6000 SCOTT 8000 KING 4500 TURNER 4100 ADAMS 3950 JAMES 6000 FORD 4300 MILLER Parnteses podem ser usados para especificar a ordem na qual sero executados es operadores, se, por exemplo, a adio e requerida antes da multiplicao. Exemplo: Select NOME, (sal + 250) * 12 from emp;
1.1
Resultado da pesquisa: EMPNO ENAME SMITH 7369 ALLEN 7499 WARD 7521 JONES 7566 MARTIN 7654 BLAKE 7698 CLARK 7782 SCOTT 7788 KING 7839 TURNER 7844 ADAMS 7876 JAMES 7900 FORD 7902 MILLER 7934
MGR 7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782
Exemplo 2: SELECT * EMPNO 7369 7499 7521 7566 7654 7698 7782 7788 7839 7844 7876 7900 7902 7934
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 PRESIDEN SALESMAN CLERK CLERK ANALYST CLERK
MGR 7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782
HIREDATE 17/12/80 20/02/81 22/02/81 02/04/81 28/09/81 01/05/81 09/06/81 19/04/87 17/11/81 08/09/81 23/05/87 03/12/81 03/12/81 23/01/82
MGR SAL 7902 7698 7698 7839 7698 7839 7839 7566 7698 7788 7698 7566 7782
DEPTNO 20 30 30 20 30 30 10 20 10 30 20 30 20 10
1.6
Expresses Aritmticas
Expresses Aritmticas podem conter nome de colunas, valores numricos, constantes e operadores aritmticos: Operadores Descries + Adio Subtrao * Multiplicao / Diviso
ENAME, SAL*12, COM EMP; SAL*12 9600 19200 COMM 300 Curso de Programao Oracle Prof Fvio Rezende 8
1.1
1.2
PL/SQL
uma linguagem de programao sofisticada que permite processar cdigos diretamente no servidor, tornando o acesso rpido e eficiente. Procedimentos compatveis: declarao de variveis. tarefas (X := Y + Z) controles condicionais (IF, THEN, ELSE, ELSIF, GOTO) Loop (FOR, WHILE, EXIT, WHEN) manuseio de excees (exception)
1.3
Comandos
1.4
Usados para dar ou remover privilgios e direitos de acesso de um usurio ou grupo de usurios ao Banco de Dados ORACLE e s estruturas dentro dele.
1.5
SELECT
SELECT * (asterisco seleciona todos os campos) FROM EMP(nome da tabela) Exemplo 1: SELECT SELECT EMPNO, ENAME,MGR FROM EMP;
1.1
Comando / EXEC
Descrio Executa o texto que est no buffer. Executa um simples comando SQL como por exemplo uma stored procedure.
1.1
1 Introduo ao SQL
Comandos SQL realizam tarefas como: pesquisar dados inserir, alterar e apagar linhas em uma tabela criar, modificar e apagar objetos do Banco de Dados controlar acesso para Banco de Dados e objetos do Banco de Dados garantir a consistncia do banco de dados
1.1
SQL*Plus
SQL*Plus uma interface na qual os comandos SQL podem ser entendidos e executados. Comandos SQL*Plus so feitos no prompt do SQL>, eles no entram no buffer. Comando SAVE arquivo GET arquivo START arquivo Descrio permite o corrente contexto do SQL buffer ser salvo em um arquivo chama texto previamente salvo executa um comando previamente salvo em um arquivo. Comandos de arquivo so discutidos na Unidade 10 usa editor padro em ordem para edio do arquivo salvo. escreve todos os comandos subsequentes de sada no arquivo nomeado. O arquivo SPOOL estendido por .LIS (LST em algum sistemas) OFF fecha o arquivo SPOOL e OUT fecha o arquivo SPOOL e emite o arquivo para impressora. mostra a estrutura de uma tabela. invoca o interno sistema de ajuda ORACLE invoca um comando do sistema operacional. mesma funo acima Invoca outro usurio ORACLE sai SQL*Plus mostra o texto quando executa o comando arquivo. mostra o texto que est no buffer. Curso de Programao Oracle Prof Fvio Rezende 5
SPO(OL) OFF/OUT
DESC(RIBE) tabela HELP $O/S comando HOST comando CONN(ECT) usurio/senha EXIT PROMPT texto ;
1.1
13 14
15
Packages .....................................................................................................................65
15.1 Especificao .....................................................................................................................65 15.2 Body....................................................................................................................................65 15.3 Execuo de Estruturas Pblicas de uma Package:.......................................................66
16
Triggers ......................................................................................................................66
17
Exerccios ...................................................................................................................68
17.1 SQL.....................................................................................................................................68
1.1
5.2
6 7
ndices............................................................................................................................47
6.1 Recuperando informaes sobre ndices: .......................................................................47
Controle de Concorrncia.............................................................................................47
7.1 Tipos de Lock ....................................................................................................................47
Lock table sobrepe o lock implcito .................................................................................... 47 Select for Update....................................................................................................................... 48 7.1.1 7.1.2
Declaraes....................................................................................................................48
8.1 8.2 Declaraes de Variveis ..................................................................................................48 Tipos de Dados PL/SQL ...................................................................................................49
8.2.1 Escalar....................................................................................................................................... 49 8.2.1.1 Usando %TYPE .................................................................................................................... 50 8.2.2 Tipos de Dados Composto(TABLES e RECORDS PL/SQL). ................................................. 50 8.2.2.1 RECORDS ............................................................................................................................ 51 8.2.2.2 TABLE.................................................................................................................................. 51 8.2.2.3 Usando %ROWTYPE........................................................................................................... 52
9 10
Estruturas de Controle...............................................................................................55
10.1 IF THEN ELSE ...........................................................................................................55 10.2 WHILE-LOOP ..................................................................................................................56 10.3 FOR-LOOP .......................................................................................................................56 10.4 LOOP .................................................................................................................................56
11.2 O Comando For para abrir Cursores: ............................................................................59 11.3 Atualizao na tabela da linha atual do cursor:.............................................................59 11.4 Cursores Implcitos:..........................................................................................................60
12
1.1
2.3.7 2.3.8 2.3.9
SIGN ......................................................................................................................................... 27 ABS........................................................................................................................................... 27 MOD ......................................................................................................................................... 27 Sysdate ...................................................................................................................................... 28 Usando Operadores Aritmticos ............................................................................................... 28 MONTHS_BEETWEEN .......................................................................................................... 29 ADD_MONTHS ....................................................................................................................... 29 NEXT_DAY ............................................................................................................................. 29 LAST_DAY.............................................................................................................................. 30 ROUND .................................................................................................................................... 30 TRUNC..................................................................................................................................... 30 TO_CHAR ................................................................................................................................ 31 TO_NUMBER .......................................................................................................................... 33 TO_DATE ................................................................................................................................ 34 DECODE .................................................................................................................................. 35 NVL .......................................................................................................................................... 36 GREATEST .............................................................................................................................. 36 LEAST ...................................................................................................................................... 36 VSIZE ....................................................................................................................................... 37
2.4
2.5
2.6
2.7
2.7.1 AVG.......................................................................................................................................... 37 2.7.2 MIN........................................................................................................................................... 37 2.7.3 COUNT..................................................................................................................................... 38 2.7.4 A clusula GROUP BY............................................................................................................. 38 2.7.4.1 Grupos dentro de Grupos ...................................................................................................... 38 2.7.4.2 Funes de Grupo e Resultados Individuais ......................................................................... 39 2.7.5 A clausula HAVING................................................................................................................. 39 2.7.6 A Ordem das clausulas na declarao SELECT. ...................................................................... 40
Seqncias .....................................................................................................................46
5.1 Alterando uma seqncia .................................................................................................46
1.1
Introduo ao SQL..........................................................................................................5
1.1 1.2 1.3 1.4 1.5 1.6 1.7 SQL*Plus .............................................................................................................................5 PL/SQL ................................................................................................................................7 Sintaxe de um bloco PL/SQL:............................................................................................7 Alguns Comandos SQL: .....................................................................................................7 SELECT...............................................................................................................................7 Expresses Aritmticas.......................................................................................................8 Colunas Sinnimas............................................................................................................10
1.8 Operador de Concatenao...................................................................................................10 1.9 Literais ....................................................................................................................................11 1.10 Manuseando Valores Nulos..............................................................................................11 1.11 Prevenindo a Seleo de Linhas Duplicadas Clusula Distinct .................................12 1.12 A clausula ORDER BY.....................................................................................................13 1.13 A Clausula WHERE .........................................................................................................14 1.14 Operadores SQL ...............................................................................................................15
1.14.1 1.14.2 1.14.3 1.14.4 O Operador BETWEEN............................................................................................................ 15 O Operador IN .......................................................................................................................... 16 O Operador LIKE ..................................................................................................................... 16 Operador IS NULL ................................................................................................................... 17
1.15 Expresses Negativas ........................................................................................................17 1.16 Pesquisando Dados com Mltiplas Condies................................................................18
Funes..........................................................................................................................20
2.1 Funes Alfanumricas.....................................................................................................21
2.1.1 LOWER .................................................................................................................................... 21 2.1.2 UPPER ...................................................................................................................................... 21 2.1.3 INITCAP................................................................................................................................... 21 2.1.4 LPAD e RPAD................................................................................................................................. 22 2.1.4 SUBSTR ................................................................................................................................... 22 2.1.5 INSTR....................................................................................................................................... 23 2.1.6 LTRIM e RTRIM...................................................................................................................... 23 2.1.7 SOUNDEX ............................................................................................................................... 23 2.1.8 LENGTH .................................................................................................................................. 24 2.1.9 TRANSLATE e REPLACE...................................................................................................... 24
2.2 2.3