Вы находитесь на странице: 1из 69

1.

1
3.

Programao em Oracle8 PL/SQL

4. 5.

6. 7.

8.

9. 10. 11. 12. 13. 14. 15.

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.

Curso de Programao Oracle Prof Fvio Rezende 69

1.1

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 68

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

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 67

1.1

Programao em Oracle8 PL/SQL

A lista de erros de uma package obtida atravs do comando: SHOW ERRORS PACKAGE Nome_da_Package SHOW ERRORS PACKAGE BODY Nome_da_Package

15.3 Execuo de Estruturas Pblicas de uma Package:


Subprogramas podem ser executados em vrios ambientes: EXECUTE Nome_da_Package.Nome_procedures(Lista_de_Parmetros) SELECT Nome_da_Package.Nome_Funo(Lista_de_Parmetros) FROM DUAL. Recompilando Packages: ALTER PACKAGE nome_da_Package COMPILE PACKAGE --compila a especificao e o corpo ALTER PACKAGE nome_da_Package COMPILE PACKAGE ESPECIFICATION --a especificao ALTER PACKAGE nome_da_Package COMPILE PACKAGE BODY --compila o body

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.

16.1 Criao de triggers


So permitidas at 12 triggers para cada tabela, incluindo todas as combinaes possveis entre tempos, eventos de disparo e tipos de triguer. Tambm no so permitidas triggers com o mesmo tempo, evento de disparo e tipo para uma mesma tabela.

16.2 Triggers possveis para uma tabela:


BEFORE UPDATE Linha Curso de Programao Oracle Prof Fvio Rezende 66

1.1

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 65

1.1

Programao em Oracle8 PL/SQL

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.

14.4 Executando subprogramas atravs do SQL* Plus:


EXECUTE Nome_Procedure(Lista_de_parmetros) SELECT Nome_Funo(Lista_de_parmetros) FROM DUAL

14.5 Eliminando um subprograma:


DROP PROCEDURE / FUNCTION nome_do_Procedimento / nome_da_funo

14.6 Anlise das dependncias:


Um subprograma pode depender diretamente de tabelas, vises, seqncias e outros subprogramas. Pode ainda possuir dependncias indiretas de outros objetos. Por exemplo, se uma procedure A depender diretamente de uma function B, que depende diretamente de uma tabela C, ento a procedure A depender indiretamente da tabela C.

Curso de Programao Oracle Prof Fvio Rezende 64

1.1

Programao em Oracle8 PL/SQL

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

14 Subprogramas (Procedures e Functions)


So blocos PL/SQL, armazenados na base de dados e chamados sempre que necessrios. O nome de um subprograma pode ter, no mximo, 30 caracteres. No momento de sua criao pode ser includo o parmetro OR REPLACE, o qual substituir um subprograma j existente por uma nova verso. As vantagens dessa opo manter os privilgios existentes, criar mesmo que haja erro de sintaxe, marcar objetos dependentes para compilao. Para que um subprograma seja criado como Pblico utilizam-se os seguintes comandos: GRANT EXECUTE ON Nome_do_Subprograma TO PUBLIC; CREATE PUBLIC SYNONYM Nome_do_Subprograma FOR Sinnimo_Pblico_do_Subprograma; Informaes dos subprogramas so armazenadas na tabela USER_OBJECTS, a qual pode ser acessada pelo usurio para obter dados como nome, tipo, data de criao, data de compilao, etc. J o texto das procedures e functions encontram-se na tabela USER_SOURCE. Exemplo de como obter o cdigo de um subprograma: SELECT TEXT FROM USER_SOURCE WHERE NAME = Nome_do_subprograma em maisculo ORDER BY LINE; A lista de argumentos de um subprograma obtida atravs do comando DESCRIBE. Sintaxe: DESCRIBE nome_da_procedure / function Os erros de compilao podem ser obtidos de duas formas: Ex.1: SELECT LINE, POSITION, TEXT FROM USER_ERRORS WHERE NAME = Nome_subprograma em maisculo ORDER BY LINE Ou Ex.2: SHOW ERRORS PROCEDURE Nome_subprograma;

Curso de Programao Oracle Prof Fvio Rezende 63

1.1

Programao em Oracle8 PL/SQL

12.2 Excees Definidas pelo Usurio


Precisam ser declaradas e chamadas explicitamente pelo comando RAISE. Somente podem ser declaradas na rea de declaraes de um bloco PL/SQL, subprograma ou package. Sintaxe: Declare Nome_da_exceo EXCEPTION; Begin Relao_de_comandos If ........then RAISE Nome_da_exceo; End if; Relao_de_comandos Exception WHEN Nome_da_exceo THEN Relao_de_comandos End;

12.2.1 Utilizando OTHERS ou PRAGMA EXCEPTION_INIT


Um pragma renomeia um erro oracle para o compilador, permitindo escrever um tratamento especfico, sem que uma exception seja explicitamente chamada. Os pragmas so chamados em tempo de compilao e no afetam o significado do programa. Deve ser declarado na rea de declaraes de um bloco, subprograma ou package e precisa Ter o nome da exceo previamente declarado. Sintaxe: Declare Nome_da_exceo Exception; Pragma Exception_Init (nome_da_exceo, cdigo_erro); Begin Relao de comandos Exception When Nome_da_exceo then Relao_de_comandos End;

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)

Curso de Programao Oracle Prof Fvio Rezende 62

1.1

Programao em Oracle8 PL/SQL

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

12.1 Excees Predefinidas


Este tipo de exceo disparada implicitamente quando, no bloco PL/SQL, uma regra Oracle violada ou um limite de sistema excedido. Estas excees podem ser identificadas por um nome e um nmero. ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! CURSOR_ALREADY_OPEN (ORA-06511, SQLCODE -06511) ocorre quando se tenta abrir um cursor que j est aberto. DUP_VAL_ON_INDEX (ORA-00001, SQLCODE -00001) ocorre na tentativa de armazenar um valor duplicado em uma coluna de uma tabela que possui chave nica ou primria. INVALID_CURSOR (ORA-01001, SQLCODE -01001) ocorre quando se tenta executar uma operao ilegal com um cursor, como fechar um cursor que no esteja aberto. INVALID_NUMBER (ORA-01722, SQLCODE -01722) ocorre na tentativa de converter uma string em nmero, caso a string no represente um nmero vlido. LOGIN_DENIED (ORA-01017, SQLCODE -01017) ocorre na tentativa de conexo com o banco com um username/passvvord invalido. NO_DATA_FOUND (ORA-01403, SQLCODE -01403) ocorre quando um comando SELECT ... lNTO no retornar nenhuma linha. NOT LOGGED_ON (ORA-01012, SQLCODE -01012) ocorre na tentativa de acessar o banco de dados sem que se esteja conectado a ele. PROGRAM ERROR (ORA-06501, SQLCODE -06501) ocorre em caso de problemas internos do PL/SQL. ROWTYPE_MISMATCH (ORA-06504, SQLCODE -06504) ocorre se o retorno do cursor e a varivel PL/SQL para retorno de um cursor sejam de tipos incompatveis. STORAGE_ERROR (ORA-06500, SQLCODE -06500) ocorre se no houver memria suficiente para a execuo de um bloco PL/. TIMEOUT_ON_RESOURCE (ORA-00051, SQLCODE -00051) ocorre quando acontecer um timeout enquanto o Oracle estiver aguardando um recurso. TOO_MANY ROWS (ORA-01422, SQLCODE -01422) ocorre quando um comando SELECT... INTO retornar mais de uma linha. VALUE-ERROR (ORA-06502, SQLCODE -06502) ocorre quando houver um erro aritmtico, de converso, truncagem ou tamanho, como quando um valor numrico for selecionado para dentro de uma varivel caracter, ou o valor for maior do que o declarado para a varivel. ZERO-DIVIDE (ORA-01476, SQLCODE -01476) ocorre na tentativa de dividir qualquer nmero por zero. OTHERS permite tratar outros erros, com a ajuda das funes SQLCODE e SQLERRM, que retorna o nmero do erro Oracle e o texto da mensagem de erro, respectivamente.

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.

Curso de Programao Oracle Prof Fvio Rezende 61

1.1
Sintaxe: CURSOR nome_do_cursor IS SELECT .... FOR UPDATE OF campos_a_atualizar UPDATE ... WHERE CURRENT OF nome_do_cursor

Programao em Oracle8 PL/SQL

11.4 Cursores Implcitos:


Atributos de cursores que podem ser verificados com significado e retorno: ! SQL%FOUND retorna true se algum registro foi afetado ou se retornou algum registro; ! SQL%NOTFOUND retorna true se nenhum registro foi afetado. ! SQL%ROWCOUNT retorna numero de registros afetados ou a ltima quantidade de registros afetados(dever ser sempre 1) ! SQL%ISOPEN sempre retornar false

Curso de Programao Oracle Prof Fvio Rezende 60

1.1

Programao em Oracle8 PL/SQL

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;

11.2 O Comando For para abrir Cursores:


! ! ! ! ! Cria a varivel do tipo registro Abre o cursor Realiza a cpia das linhas (Fetch) Controle o final do cursor Fecha o mesmo

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;

11.3 Atualizao na tabela da linha atual do cursor:


Declara-se o cursor como For Update e a atualizao ser feita com base no indicador de linha corrente (CURRENT OF). O ROWID do registro ser carregado com os demais itens do cursor e no UPDATE, a comparao ser feita internamente, com o ROWID. Curso de Programao Oracle Prof Fvio Rezende 59

1.1

Programao em Oracle8 PL/SQL

FETCH nome_do_cursor INTO lista_de_variveis Ex.1: Declare Cursor Preferencia 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 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)

Curso de Programao Oracle Prof Fvio Rezende 58

1.1

Programao em Oracle8 PL/SQL

LOOP Relao de comandos IF Condio_de_saida then EXIT END LOOP;

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 Comandos de Manipulao do cursor: 11.1.1 Open:


Cria numa rea de memria conhecida como Private SQL Area, uma tabela com um ponteiro apontando para o primeiro registro. Parmetros devem ser passados neste momento. Sintaxe: Open Preferencia ;

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:

Curso de Programao Oracle Prof Fvio Rezende 57

1.1

Programao em Oracle8 PL/SQL

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

Curso de Programao Oracle Prof Fvio Rezende 56

1.1

Programao em Oracle8 PL/SQL

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:

Curso de Programao Oracle Prof Fvio Rezende 55

1.1

Programao em Oracle8 PL/SQL

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 Codificao de Comando SQL Dentro de PL/SQL


Comandos como INSERT, DELETE, UPDATE e SELECT e as funes (manipulaes de strings, numricas, de datas e genricas), podem ser utilizados dentro de blocos PL/SQL. O comando SELECT receber, obrigatoriamente, a clusula INTO, pois o resultado do mesmo no poder ser visualizado no momento de sua execuo, e ser armazenado em variveis ou estruturas. O comando SELECT deve ser criado para que retorne somente uma linha selecionada. Caso nenhuma linha seja retornada ocorrer um erro do tipo "no_data_found" e se mais de uma linha for retomada ocorrer um erro do tipo "too_many_rows'. Ex.: Declare Nome Cliente.Nm_Cliente%Type; Codigo Cliente.Cd_Cliente%Type; Begin SELECT Nm_cliente, Cd_Cliente INTO Nome, Codigo FROM Cliente WHERE Cd_Cliente = &Cod; 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

Curso de Programao Oracle Prof Fvio Rezende 54

1.1

Programao em Oracle8 PL/SQL

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;

--Subtipo predefinido Subtype Character --Baseado em um tipo tabela Type NameTab

Is Char;

8.4

Atribuindo Valores s Variveis

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;

Total := Qtdd * Valor; Existe := (Conta < 1200);

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

Programao em Oracle8 PL/SQL

... 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.2.2.2.1 Atributos do tipo TABLE.


Atributo COUNT DELETE EXISTS FIRST LAST NEXT PRIOR Tipo Retornado NUMBER N/A BOOLEAN BINARY_INTEGER BINARY_INTEGER BINARY_INTEGER BINARY_INTEGER Descrio Retorna o nmero de linhas na tabela Deleta uma linha na tabela Retorna true se existe o ndice na tabela Retorna o ndice da primeira linha da tabela Retorna o ndice da ltima linha da tabela Retorna o ndice da prxima linha Retorna o ndice da linha anterior

8.2.2.3 Usando %ROWTYPE


Assim como o %TYPE, o %ROWTYPE far com que a varivel assuma a mesma estrutura de uma linha da tabela, ou seja, a varivela ser um tipo RECORD que ter todos os campos da tabela que aparece na declarao. Ex: DECLARE R_DEPT SCOTT.DEPT%ROWTYPE ; BEGIN ... R_DEPT.DEPTNO := 1; ... END; No exemplo acima R_DEPT declarada com o mesma estrutura da tabela DEPT do schema SCOTT. Logo abaixo, o campo DEPTNO do RECORD R_DEPT recebe o valor 1.

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

Programao em Oracle8 PL/SQL

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.

IS RECORD ( NUMBER(4), VARCHAR2(10), VARCHAR2(9));

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

Programao em Oracle8 PL/SQL

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.

8.2.1.1 Usando %TYPE


Na maioria dos casos os programas em PL/SQL ir manipular dados que esto armazenados em tabelas do Banco de Dados. Neste caso a varivel deve ser declarada com o mesmo tipo do campo da tabela. Ex: DECLARE V_DEPTNO SCOTT.DEPT.DEPTNO%TYPE ; V_EMPNO SCOTT.EMP.EMPNO%TYPE ; BEGIN ... No exemplo acima V_DEPTNO declarada com o mesmo tipo do campo DEPTNO da tabela DEPT do schema SCOTT. V_EMPNO declarada com o mesmo tipo do campo EMPNO da tabela EMP do schema SCOTT.

8.2.2 Tipos de Dados Composto(TABLES e RECORDS PL/SQL).


Ambas as composies so tipos definidos pelo usurio, para uslos, necessrio primeiro definir um tipo RECORD ou TABLE e depois declarar uma varivel com o tipo que foi definido.

Curso de Programao Oracle Prof Fvio Rezende 50

1.1
...... END;

Programao em Oracle8 PL/SQL

8.2

Tipos de Dados PL/SQL

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

Programao em Oracle8 PL/SQL

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

7.1.2 Select for Update


Bloqueia antecipadamente as linhas que sero alteradas ou excludas at o fim da trasao. Sintaxe: SELECT... FOR UPDATE OF nome_da_coluna1 [,nome_da_colunaN] [NOWAIT] Ex.: SELECT COD, TIPO_BLOQ FROM BLOQUEIO WHERE COD = 1 FOR UPDATE OF COD; O uso do Select for Update no permitido caso o comando select tenha as clusulas DISTINCT, GROUP BY, UNION, INTERSECT ou MINUS e funes de grupo(Count, AVG, Sum, Max, etc)

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

Programao em Oracle8 PL/SQL

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

Recuperando informaes sobre ndices:

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.

7.1.1 Lock table sobrepe o lock implcito


Sintaxe: LOCK TABLE [nome_da_tabela] IN ROW SHARE / ROW EXCLUSIVE/ SHARE UPDATE / SHARE / SHARE ROW EXCLUSIVE / EXCLUSIVE MODE [NOWAIT] Nome_da_tabela indica qual tabela sofrer o bloqueio. ROW SHARE nenhum outro usurio poder bloquear exclusivamente a tabela. ROW EXCLUSIVE permite acesso simultneo tabela, bloqueando linhas individuais. SHARE UPDATE Somente bloqueia linhas simples, permitindo a continuidade na consulta de dados. SHARE os outros usurios podem consultar os dados mas no podem alter-los.

Curso de Programao Oracle Prof Fvio Rezende 47

1.1

Programao em Oracle8 PL/SQL

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

Alterando uma seqncia

Sintaxe: ALTER SEQUENCE nome_da_sequencia Opo Ex.: ALTER SEQUENCE SEQ INCREMENT BY 2;

5.2

Eliminando uma seqncia

Sintaxe: DROP SEQUENCE nome_da_sequencia Ex.: DROP SEQUENCE SEQ;

Curso de Programao Oracle Prof Fvio Rezende 46

1.1
Ex.: CREATE TABLE SALGRADE_TTEMP AS SELECT GRADE, LOSAL FROM SALGRADE_TEMP;

Programao em Oracle8 PL/SQL

4.1.5 Rename
Sintaxe: RENAME nome_antigo_da_tabela TO nome_novo_da_tabela Ex.: RENAME SALGRADE_TTEMP TO SALGRADE_T;

Curso de Programao Oracle Prof Fvio Rezende 45

1.1

Programao em Oracle8 PL/SQL

4.1

Comandos de Manipulao de Dados (DML)

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

WHERE LOSAL < 1000;

4.1.4 Create Table.......As Select


Sintaxe: CREATE TABLE nome_da_tabela (nome_da_coluna [restries] [, nome_da_coluna [restries]] [, restries]) AS SELECT.....

Curso de Programao Oracle Prof Fvio Rezende 44

1.1

Programao em Oracle8 PL/SQL

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

4 Recuperando valores da base de dados


Voc pode atribuir resultados de querys para variveis, porm tomando cuidado para que a query sempre retorne apenas uma linha. Ex.: SELECT NOTAFISCAL , DATA INTO V_NOTAFISCAL , V_DATA WHERE NUMERO_VENDA = 2334;

O comando acima atribui os valores dos campos NOTAFISCAL e DATA para as variveis previamente definidas V_NOTAFISCAL e V_DATA respectivamente.

Curso de Programao Oracle Prof Fvio Rezende 43

1.1
MILLER 10 CLERK

Programao em Oracle8 PL/SQL

perguntado uma vez e no mais.

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.

Curso de Programao Oracle Prof Fvio Rezende 42

1.1

Programao em Oracle8 PL/SQL

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

Duplo & para Variveis substituveis

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

Programao em Oracle8 PL/SQL

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

2.7.6 A Ordem das clausulas na declarao SELECT.


SELECT FROM WHERE GROUP BY HAVING ORDER BY coluna(s) tabela(s) condio linha coluna(s) condio de grupo de linhas coluna(s);

3 Executando Pesquisas Padres com Variveis Substituveis


3.1 nica Varivel Substituvel
Voc pode usar variveis substituveis para representar valores, em tempo de execuo. Uma varivel pode ser uma idia de como um valor pode ser armazenado temporariamente. Uma varivel representada por um nico "e" comercial(&), e o valor atribudo na mesma. A seguinte declarao apresenta ao usurio um nmero de departamento na execuo: SELECT EMPNO, ENAME, SAL FROM EMP WHERE DEPTNO = &DEP_NR; Enter value for DEP_NR : 10 EMPNO 7782 7839 7934 ENAME CLARK KING MILLER SAL 2450 5000 1300

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.

Curso de Programao Oracle Prof Fvio Rezende 40

1.1

Programao em Oracle8 PL/SQL

2.7.4.2 Funes de Grupo e Resultados Individuais


A seguinte declarao SQL retorna o mximo salrio para cada grupo: SELECT MAX(SAL), JOB FROM EMP GROUP BY JOB; MAX(SAL) 3000 1300 2975 5000 1600 OCUP ANALYST CLERK MANAGER PRESIDENT SALESMAN

2.7.5 A clausula HAVING


Use a clausula HAVING se voc quiser especificar qual grupo ser mostrado. Para mostrar a mdia salarial para todos os departamentos que tiverem mais de trs empregados, faa: SELECT DEPTNO, AVG(SAL) FROM EMP GROUP BY DEPTNO HAVING COUNT(1) > 3; DEPTNO 20 30 AVG(SAL) 2175 1566.6667

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

Curso de Programao Oracle Prof Fvio Rezende 39

1.1

Programao em Oracle8 PL/SQL

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

2.7.4 A clusula GROUP BY


Pode ser usada para dividir as linhas de uma tabela em um grupo menor. Funes de grupo devem ser usadas para resumir informaes por cada grupo. Para calcular a mdia salarial de cada grupo de cargo, faa: SELECT JOB, AVG(SAL) FROM EMP GROUP BY JOB; JOB ANALYST CLERK MANAGER PRESIDENT SALESMAN AVG(SAL) 3000 1037.5 2758.33333 5000 1400

2.7.4.1 Grupos dentro de Grupos


Podemos ento usar a clausula GROUP BY para prover resultados para grupos dentro de grupos. Para mostrar a media salarial mensal faturado por cada cargo dentro de um departamento, faa: SELECT DEPTNO, JOB, AVG(SAL) FROM EMP GROUP BY DEPTNO, JOB; DEPTNO 10 10 10 20 20 20 30 30 30 JOB CLERK MANAGER PRESIDENT ANALYST CLERK MANAGER CLERK MANAGER SALESMAN AVG(SAL) 1300 2450 5000 3000 950 2975 950 2850 1400

Curso de Programao Oracle Prof Fvio Rezende 38

1.1

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 37

1.1

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 36

1.1

Programao em Oracle8 PL/SQL

2.6

Funes que Aceitam Vrios Tipos de Entrada de Dados

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

Curso de Programao Oracle Prof Fvio Rezende 35

1.1

Programao em Oracle8 PL/SQL

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

8, 1981','Month dd, yyyy');

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'));

Curso de Programao Oracle Prof Fvio Rezende 34

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

Programao em Oracle8 PL/SQL

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

Curso de Programao Oracle Prof Fvio Rezende 33

1.1

Programao em Oracle8 PL/SQL

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

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 31

1.1

Programao em Oracle8 PL/SQL

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)

NEXT_DAY(HIREDATE,5) 18/12/80 09/04/81 23/04/87 28/05/87 10/12/81

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

Curso de Programao Oracle Prof Fvio Rezende 30

1.1

Programao em Oracle8 PL/SQL

HIREDATE 17/12/80 03/12/81 03/12/81

HIREDATE +7 24/12/80 10/12/81 10/12/81

HIREDATE -7 10/12/80 26/11/81 26/11/81

SYSDATE- HIREDATE 7289,7189 6938,7189 6938,7189

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.

SELECT FROM WHERE

MONTHS_BETWEEN(SYSDATE,HIREDATE), MONTHS_BETWEEN('01-01-84','05-11-88') EMP MONTHS_BETWEEN(SYSDATE, HIREDATE)> 59;


MONTHS_BETWEEN('01-JAN-84','05-NOV-88') -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903 -58,12903

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

A parte no inteira do resultado representa uma parcela do ms.

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.

Curso de Programao Oracle Prof Fvio Rezende 29

1.1

Programao em Oracle8 PL/SQL

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.

2.4.2 Usando Operadores Aritmticos


Devido ao fato das datas serem armazenadas como nmero, possvel fazer clculos com elas usando operadores aritmticos tal como adio e subtrao. Voc pode adicionar e subtrair nmeros bem como data. As operaes que voc pode realizar so: data + nmero Adicionando um nmero de dias em uma data, produzindo uma nova data data nmero subtraindo um nmero de dias de uma data, produzindo uma nova data data data subtraindo uma data de outra, produzindo um nmero de dias data+nmero/24 adicionando um nmero de horas em uma data produzindo um nova data Exemplo: SELECT HIREDATE, HIREDATE +7, HIREDATE -7, SYSDATE - HIREDATE FROM EMP WHERE HIREDATE LIKE '%12%';

Curso de Programao Oracle Prof Fvio Rezende 28

1.1

Programao em Oracle8 PL/SQL

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

COM 300 500 0

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

Programao em Oracle8 PL/SQL

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(SAL) 3000 5000 5000

FLOOR(99.9) 99 99 99

FLOOR(101.76) 101 101 101

FLOOR(-11.1) -12 -12 -12

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

Curso de Programao Oracle Prof Fvio Rezende 26

1.1

Programao em Oracle8 PL/SQL

CLERK ANALYST CLERK

CLERK ANALYST CLERK

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

As funes aceitam entrada de nmeros e retornam valores numricos.

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

ROUND(45.923,1) 45.9 45.9 45.9

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

TRUNC(45.923,1) 45.9 45.9 45.9

Curso de Programao Oracle Prof Fvio Rezende 25

1.1
NOME ----------FORD SOUNDEX(NOME) -------------F630

Programao em Oracle8 PL/SQL

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

Note que a funo INSTR, LENGTH retornam um valor numrico.

2.1.9 TRANSLATE e REPLACE


As funes TRANSLATE e REPLACE so usadas para substituir caracteres. Faz a substituio de um ou mais caracteres TRANSLATE(col/value,from,to) por outros. Exemplo: SELECT ENAME, TRANSLATE(ENAME,'C','P'), JOB, TRANSLATE(JOB,'AR','IT') FROM EMP WHERE DEPTNO = 10; ENAME TRANSLATE(ENAME,'C','P' JOB TRANSLATE(JOB,'AR','IT') MINIGET MANAGER PLARK CLARK PTESIDENT PRESIDENT KING KING CLETK CLERK MILLER MILLER REPLACE(col/value,linha,linha_alterada) Retorna o valor da coluna com toda a ocorrncia da linha de alterao. Se a linha alterada for omitida todo a linha especificada ser removida.

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

Programao em Oracle8 PL/SQL

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

2.1.6 LTRIM e RTRIM


Removem especficos caracteres de um linha. LTRIM(col/value,caractere(s)) Se o caracter no especificado cortar os brancos da esquerda. Exemplo: SELECT DNAME, LTRIM(DNAME,'A'), LTRIM(DNAME,'AS'), LTRIM(DNAME,'ASOP') FROM DEPT; DNAME ACCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME,'A') CCOUNTING RESEARCH SALES OPERATIONS LTRIM(DNAME,'AS') CCOUNTING RESEARCH LES OPERATIONS LTRIM(DNAME,'ASOP') CCOUNTING RESEARCH LES ERATIONS

RTRIM(col/value,caractere(s))

Se os caracteres no forem especificados sero removidos os brancos.

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.

SELECT ENAME, SOUNDEX(ENAME) FROM EMP WHERE SOUNDEX(ENAME) = SOUNDEX('FRED');

Curso de Programao Oracle Prof Fvio Rezende 23

1.1

Programao em Oracle8 PL/SQL

2.1.4 LPAD e RPAD


LPAD(col/value,n,caracter) Preenche a coluna ou valor literal da esquerda para o total tamanho de n posies. Os principais espaos esto preenchidos com o caracter. Se o caracter for omitido o valor padro espaos.

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

A segunda coluna alinhada para a direita com brancos por padro.

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.

Curso de Programao Oracle Prof Fvio Rezende 22

1.1

Programao em Oracle8 PL/SQL

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

Curso de Programao Oracle Prof Fvio Rezende 21

1.1

Programao em Oracle8 PL/SQL

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

SAL COMM 2975 2850 2450 1300

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.

Curso de Programao Oracle Prof Fvio Rezende 20

1.1

Programao em Oracle8 PL/SQL

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.

Curso de Programao Oracle Prof Fvio Rezende 19

1.1

Programao em Oracle8 PL/SQL

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.16 Pesquisando Dados com Mltiplas Condies


Os operadores AND e OR devem ser usados para fazer composies de expresses lgicas. O predicado AND espera que ambas as condies sejam verdadeiras, enquanto que o predicado OR espera que uma das condies seja verdadeira. Nos seguintes exemplos as condies so as mesmas, o predicado diferente. Veja como o resultado dramaticamente alterado. Para encontrar todos os escriturrios que ganhem entre 1000 e 2000, faa: SELECT EMPNO, ENAME, JOB, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000 AND JOB = 'CLERK'; COD ----- 7876 7934 ENAME --------ADAMS MILLER JOB ---------CLERK CLERK SAL ---------1,100.00 1,300.00

Curso de Programao Oracle Prof Fvio Rezende 18

1.1

Programao em Oracle8 PL/SQL

1.14.4 Operador IS NULL


Para encontrar unicamente todos os empregados que no tenham gerente, voc testar um valor nulo: SELECT ENAME, MGR FROM EMP WHERE MGR IS NULL; ENAME ---------KING MGR -----

1.15 Expresses Negativas


Os operadores seguintes so testes de negao: <> NOT BETWEEN NOT IN NOT LIKE IS NOT NULL diferente (todos sistemas operacionais) tudo que estiver fora da faixa tudo que no esteja na lista tudo que no contenha a linha de caracteres tudo que no for nulo

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

Curso de Programao Oracle Prof Fvio Rezende 17

1.1

Programao em Oracle8 PL/SQL

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.

1.14.3 O Operador LIKE


Algumas vezes voc precisa procurar valores que no conhece exatamente. Usando o operador LIKE possvel selecionar linhas combinando parmetros alfanumricos. Dois smbolos podem ser usados para construir uma linha de procura. Smbolo: % Vrias seqncia de zero ou mais caracteres _ um nmero desejado de caracteres Para listar todos os empregados os quais o nome comea com a letra S, faa: SELECT ENAME FROM EMP WHERE ENAME LIKE 'S%';

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.

Curso de Programao Oracle Prof Fvio Rezende 16

1.1

Programao em Oracle8 PL/SQL

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.14 Operadores SQL


Existem quatro operadores SQL que operam com todos os tipos de dados: BETWEEN ... AND ... IN(Lista) LIKE IS NULL Entre dois valores (inclusive) Compara uma lista de valores Compara um parmetro alfanumrico um valor nulo

1.14.1 O Operador BETWEEN


Testa um faixa de valores inclusive. Exemplo: SELECT ENAME, SAL FROM EMP WHERE SAL BETWEEN 1000 AND 2000; ENAME SAL 1600 ALLEN 1250 WARD 1250 MARTIN 1500 TURNER 1100 ADAMS

Curso de Programao Oracle Prof Fvio Rezende 15

1.1

Programao em Oracle8 PL/SQL

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.13 A Clausula WHERE


A clausula WHERE corresponde aos Operadores de Restries da lgebra Relacional. Sintaxe: SELECT coluna(s) FROM tabela(s) WHERE certa condio a ser encontrada A clausula WHERE pode comparar valores em uma coluna, valores literais, expresses aritmticas ou funes. Operadores de comparao so usados na clausula WHERE e podem ser divididos em duas categorias: Lgicos e SQL. Operadores Lgicos Esses operadores testam as seguintes condies: = igual a > maior que >= maior e igual a < menor que <= menor e igual a Alfanumricos e Datas na clausula WHERE devem estar entre aspas simples.

Curso de Programao Oracle Prof Fvio Rezende 14

1.1

Programao em Oracle8 PL/SQL

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

1.12 A clausula ORDER BY


A clausula ORDER BY pode ser usada para ordenar as linhas. Se usado, o ORDER BY deve ser a ltima clausula da declarao SELECT. Para ordenar pelo NOME, faa: Exemplo: SELECT ENAME, JOB, SAL*12, DEPTNO FROM EMP ORDER BY ENAME;

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

Curso de Programao Oracle Prof Fvio Rezende 13

1.1

Programao em Oracle8 PL/SQL

ENAME SMITH ALLEN WARD JONES MARTIN BLAKE CLARK SCOTT KING TURNER ADAMS JAMES FORD MILLER

GANHO_ANUAL 19500 15500 16400

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.11 Prevenindo a Seleo de Linhas Duplicadas Clusula Distinct


Para eliminar valores duplicados no resultado, inclumos o DISTINCT Exemplo sem a clausula distinct: SELECT DEPTNO FROM EMP; DEPTNO 20 30 30 20 30 30 10 20 10 30 20 30 20 10 Para eliminar os valores Duplicados: SELECT DISTINCT DEPTNO FROM EMP; DEPTNO 10 20 30

Curso de Programao Oracle Prof Fvio Rezende 12

1.1

Programao em Oracle8 PL/SQL

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.10 Manuseando Valores Nulos


Um valor nulo um valor indisponvel e desconhecido. O valor nulo no zero. Zero um nmero. Se algum valor de uma coluna em uma expresso for nulo, o resultado ser nulo. Exemplo: SELECT ENAME, SAL*12+COMM GANHO_ANUAL FROM EMP;

Curso de Programao Oracle Prof Fvio Rezende 11

1.1

Programao em Oracle8 PL/SQL

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.8 Operador de Concatenao


O Operador de Concatenao (||) permite que as colunas sejam juntadas com outras colunas, expresses aritmticas ou valores constantes para criar uma expresso alfanumrica. Para combinar COD e NOME e obter o sinnimo EMPREGADO, observe o exemplo abaixo: Exemplo: SELECT FROM

EMPNO||ENAME EMPREGADO EMP;

Curso de Programao Oracle Prof Fvio Rezende 10

1.1

Programao em Oracle8 PL/SQL

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;

Curso de Programao Oracle Prof Fvio Rezende 9

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

Programao em Oracle8 PL/SQL

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

COMM 300 500 1400

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

Exemplo: SELECT FROM ENAME SMITH ALLEN

ENAME, SAL*12, COM EMP; SAL*12 9600 19200 COMM 300 Curso de Programao Oracle Prof Fvio Rezende 8

1.1

Programao em Oracle8 PL/SQL

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

Sintaxe de um bloco PL/SQL:


rea de declarao de variveis

DECLARE Procedure Procedure BEGIN Procedure SQL Procedure SQL END

Comandos

1.4

Alguns Comandos SQL:


Esse o comando mais comum, usado para retirar dados de uma Tabela So os comandos usados para o preenchimento de novas linhas, modificando linhas existentes e removendo linhas no desejadas das tabelas. So usados dinamicamente para configurar, modificar e remover vrias estruturas de dados como: tabelas, vises, ndices.

SELECT INSERT UPDATE DELETE CREATE ALTER DROP GRANT REVOKE

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;

Curso de Programao Oracle Prof Fvio Rezende 7

1.1

Programao em Oracle8 PL/SQL

Comando / EXEC

Descrio Executa o texto que est no buffer. Executa um simples comando SQL como por exemplo uma stored procedure.

Curso de Programao Oracle Prof Fvio Rezende 6

1.1

Programao em Oracle8 PL/SQL

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

ED arquivo SPOOL arquivo

SPO(OL) OFF/OUT

DESC(RIBE) tabela HELP $O/S comando HOST comando CONN(ECT) usurio/senha EXIT PROMPT texto ;

1.1

Programao em Oracle8 PL/SQL

12.2 Excees Definidas pelo Usurio .....................................................................................62


12.2.1 12.2.2 Utilizando OTHERS ou PRAGMA EXCEPTION_INIT ......................................................... 62 Raise_Application_Error .......................................................................................................... 62

13 14

DBMS_output.put_line() ...........................................................................................63 Subprogramas (Procedures e Functions) .................................................................63

Coloca uma linha no buffer, e mostra na tela. .....................................................................63


14.1 Parmetros.........................................................................................................................64 14.2 Procedures .........................................................................................................................64 14.3 Functions: ..........................................................................................................................64 14.4 Executando subprogramas atravs do SQL* Plus:........................................................64 14.5 Eliminando um subprograma:.........................................................................................64 14.6 Anlise das dependncias: ................................................................................................64

15

Packages .....................................................................................................................65

15.1 Especificao .....................................................................................................................65 15.2 Body....................................................................................................................................65 15.3 Execuo de Estruturas Pblicas de uma Package:.......................................................66

16

Triggers ......................................................................................................................66

16.1 Criao de triggers............................................................................................................66 16.2 Triggers possveis para uma tabela:................................................................................66

17

Exerccios ...................................................................................................................68

17.1 SQL.....................................................................................................................................68

Curso de Programao Oracle Prof Fvio Rezende 4

1.1

Programao em Oracle8 PL/SQL

5.2

Eliminando uma seqncia ..............................................................................................46

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

8.3 8.4 8.5

Subtype...............................................................................................................................52 Atribuindo Valores s Variveis......................................................................................53 Escopo de Variveis ..........................................................................................................53

9 10

Codificao de Comando SQL Dentro de PL/SQL......................................................54


9.1 Tratamento de Transaes ...............................................................................................54

Estruturas de Controle...............................................................................................55

10.1 IF THEN ELSE ...........................................................................................................55 10.2 WHILE-LOOP ..................................................................................................................56 10.3 FOR-LOOP .......................................................................................................................56 10.4 LOOP .................................................................................................................................56

LOOP.....................................................................................................................................57 11 Cursores: ....................................................................................................................57


11.1.1 11.1.2 11.1.3 Open:......................................................................................................................................... 57 Fetch.......................................................................................................................................... 57 Close ......................................................................................................................................... 59

11.1 Comandos de Manipulao do cursor: ...........................................................................57

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

Tratamento de Excees ............................................................................................61

12.1 Excees Predefinidas.......................................................................................................61

Curso de Programao Oracle Prof Fvio Rezende 3

1.1
2.3.7 2.3.8 2.3.9

Programao em Oracle8 PL/SQL

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

Funes de Data ................................................................................................................28

2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.4.8

2.5

Funes de Converso ......................................................................................................31

2.5.1 2.5.2 2.5.3

2.6

Funes que Aceitam Vrios Tipos de Entrada de Dados.............................................35

2.6.1 2.6.2 2.6.3 2.6.4 2.6.5

2.7

Funes de Grupo .............................................................................................................37

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

Executando Pesquisas Padres com Variveis Substituveis ......................................40


3.1 3.2 3.3 3.4 nica Varivel Substituvel..............................................................................................40 Duplo & para Variveis substituveis..............................................................................41 O Comando DEFINE........................................................................................................42 O comando ACCEPT........................................................................................................42

Recuperando valores da base de dados ........................................................................43


4.1 Comandos de Manipulao de Dados (DML) ................................................................44
Insert ......................................................................................................................................... 44 Update....................................................................................................................................... 44 Delete ........................................................................................................................................ 44 Create Table.......As Select ........................................................................................................ 44 Rename ..................................................................................................................................... 45 4.1.1 4.1.2 4.1.3 4.1.4 4.1.5

Seqncias .....................................................................................................................46
5.1 Alterando uma seqncia .................................................................................................46

Curso de Programao Oracle Prof Fvio Rezende 2

1.1

Programao em Oracle8 PL/SQL

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

Aninhamento de Funes .................................................................................................25 Funes Numricas ........................................................................................................... 25


ROUND .................................................................................................................................... 25 TRUNC..................................................................................................................................... 25 CEIL.......................................................................................................................................... 26 FLOOR ..................................................................................................................................... 26 POWER .................................................................................................................................... 26 SQRT ........................................................................................................................................ 26 Curso de Programao Oracle Prof Fvio Rezende 1

2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.3.6

Вам также может понравиться