Funções do Oracle Funções de valores simples: Devolve o valor absoluto de (n). o valor inteiro imediatamente superior ou igual a "n". FLOOT(n) = Devolve o valor inteiro imediatamente inferior ou igual a "n". MOD (m, n)= Devolve o resto resultante de dividir "m" entre "n". NVL (valor, expressão)= Substitui um valor nulo por outro valor. POWER (m, exponente)= Calcula a potência de um número. ROUND (numero [, m])= Arredonda números com o número de dígitos de precisão indicados. SIGN (valor)= Indica o signo do "valor". SQRT(n)= Devolve a raiz quadrada de "n". TRUNC (numero, [m])= Trunca números para que tenham uma certa quantidade de dígitos de precisão. VAIRANCE (valor)= Devolve a média de um conjunto de valores. ABS(n)= CEIL(n)=Obtém Funções de grupos de valores: Calcula o valor médio de "n" ignorando os valores nulos. Conta o número de vezes que a expressão avalia algum dado com valor não nulo "*" conta todas as filas selecionadas. MAX (expressão)= Calcula o máximo. MIN (expressão)= Calcula o mínimo. SUM (expressão)= Obtém a soma dos valores da expressão. GREATEST (valor1, valor2…)= Obtém o maior valor da lista. LEAST (valor1, valor2…)= Obtém o menor valor da lista. AVG(n)= COUNT (* | Expressão)= Funções que devolvem valores de caracteres: Devolve o caractere cujo valor em binário é equivalente a "n". Devolve "cad1" concatenada com "cad2". LOWER (cad)= Devolve a cadeia "cad" em minúsculas. UPPER (cad)= Devolve a cadeia "cad" em maiúsculas. INITCAP (cad)= Converte a cadeia "cad" a tipo título. LPAD (cad1, n[,cad2])= Adiciona caracteres à esquerda da cadeia até que tenha uma certa longitude. RPAD (cad1, n[,cad2])= Adiciona caracteres à direita até que tenha uma certa longitude. LTRIM (cad [,set])= Suprime um conjunto de caracteres à esquerda da cadeia. RTRIM (cad [,set])= Suprime um conjunto de caracteres à direita da cadeia. REPLACE (cad, cadeia_busca [, cadeia_substitucao])= Substitui um caractere ou caracteres de uma cadeia com caracteres. SUBSTR (cad, m [,n])= Obtém parte de uma cadeia. TRANSLATE (cad1, cad2, cad3)= Converte caracteres de uma cadeia em caracteres diferentes, segundo um substituição marcado pelo usuário. CHR(n) = CONCAT (cad1, cad2)= Funções que devolvem valores numéricos: Devolve o valor ASCII da primeira letra da cadeia "cad". Permite uma busca de um conjunto de caracteres em uma cadeia, mas suprime nenhum caractere depois. LENGTH (cad)= Devolve o número de caracteres de cad. ASCII(cad)= INSTR (cad1, cad2 [, comeco [,m]])= Funções para o manejo de datas: SYSDATE= Devolve a data do sistema. Devolve a data "data" incrementada em "n" meses. ADD_MONTHS (data, n)= 1 Devolve a data do último dia do mês que contém "data". Devolve a diferença em meses entre as datas "data1" e "data2". NEXT_DAY (data, cad)= Devolve a data do primeiro dia da semana indicado por "cad" depois da data indic "data". LASTDAY (data)= MONTHS_BETWEEN (data1, data2)= Funções de conversão: Transforma um tipo DATE ou NUMBER em uma cadeia de caracteres. Transforma um tipo NUMBER ou CHAR em DATE. TO_NUMBER= Transforma uma cadeia de caracteres em NUMBER. TO_CHAR= TO_DATE= Trabalhando com Data no Oracle A Oracle oferece através da linguagem PL/SQL muitos recursos para utilização e tratamento de datas. Este tipo de importantíssimo na modelagem de um banco de dados. A maioria dos sistemas de informação precisa de atributos manipulação de históricos ou até mesmo para registros cadastrais, e por isso merece cuidado muito especial, tanto quanto na consulta e exibição. O armazenamento e a consulta de datas necessita às vezes de recursos que o próprio SGBD oferece. Estes recurs funções que contém parâmetros de formatação permitindo a manipulação do conteúdo da data, a extração de valor consulta da data e hora atual configurada no servidor de banco de dados. Este artigo tem o objetivo de mostrar as principais funções e formatos de data que o SBGD Oracle tem para oferece uma abordagem rápida de como o Oracle armazena uma data, e em seguida o artigo irá descrever o uso das princi de datas. Formato de Data no SGBD Oracle O Oracle armazena datas em um formato numérico, representando o século, ano, mês, dia, horas, minutos e segun formato padrão de entrada e consulta para qualquer campo do tipo data é DD-MON-YY, ou seja, dia, mês e ano, se mês aparece abreviado. As datas válidas no Oracle estão entre 1 de Janeiro de 4712 A.C. e 31 de Dezembro de 99 Executando Operações Aritméticas Como já foi mencionado na seção anterior, o Oracle armazena datas em formato numérico. Desta forma fica fácil de possível trabalhar operações aritméticas com datas. É permitido executar cálculos usando operadores como de adi subtração. A tabela 1 mostra algumas operações que podem ser executadas e seus resultados. Operação DATA + NÚMERO DATA – NÚMERO DATA – DATA DATA + (NÚMERO/24) Resultado DATA DATA NÚMERO DE DIAS DATA Descrição da Operação Soma o número de dias para a DATA Subtrai o número de dias de uma DATA Subtrai uma DATA da outra. Adiciona um número de horas na DATA Tabela 1 – Operações Aritméticas com datas. Formatos de Data permitidos pelo Oracle Algumas funções do Oracle usam formatos para exibição e entrada de datas. As funções TO_CHAR() e TO_DA exemplo, usam estes formatos. Abaixo segue a tabela 2 mostrando alguns destes formatos. Formato YYY ou YY Y,YYY Q MM DD DAY Descrição Últimos três ou dois dígitos do ano Ano com vírgula na posição indicada Trimestre do Ano Mês, valor de dois dígitos Dia do Mês Nome do dia da semana 2 HH24 MI SS Formato de hora Formato de minutos Formato de segundos. Tabela 2 – Formatos de data permitidos pelo Oracle. Função SYSDATE SYSDATE é uma função de data que retorna a data e hora atual registrada no servidor de banco de dados. A funç pode ser usada da mesma forma que qualquer outro nome de coluna existente no banco de dados. É possível exib selecionando apenas a coluna contendo a função SYSDATE através de uma tabela interna do Oracle chamad Nota: A tabela DUAL pode ser acessada por todos os usuários do banco de dados. A tabela DUAL contém apenas uma linha. Esta tabela é útil quando se deseja consultar valores, como por exemplo, o valor de uma constante, pse expressão que não é originada de uma tabela com dados do usuário. A listagem 1 mostra dois exemplos do uso da Listagem 1. Exemplos do uso da tabela DUAL. SELECT SYSDATE FROM DUAL; SELECT TO_DATE('01/01/2005 00:01:00', 'DD/MM/YYYY HH24:MI:SS') + (6/24) FROM DUAL; Função TO_DATE() Sintaxe: TO_DATE(DATA_1, FORMATO) Converte uma string de caractere para um formato de data. Função MONTHS_BETWEEN() Sintaxe: MONTHS_BETWEEN(DATA_1, DATA_2) Calcula o número de meses entre duas datas. O resultado pode ser positivo ou negativo. Por exemplo, se a DATA que a DATA_2, então o resultado será positivo. Exemplo: SELECT MONTHS_BETWEEN(TO_DATE('01/12/2004 00:00:00','DD/MM/YYYY HH24:MI:SS') , TO_DATE('01/01/2001 00:00:00','DD/MM/YYYY HH24:MI:SS')) FROM DUAL; Função ADD_MONTHS() Sintaxe: ADD_MONTHS_BETWEEN(DATA, N) Adiciona um número N de meses de calendário à DATA atribuída na função. O valor atribuído a N não pode ser ne ser inteiro. Exemplo: SELECT ADD_MONTHS(TO_DATE('01/12/2004 00:00:00','DD/MM/YYYY HH24:MI:SS'), 5) FROM DUA Função LAST_DAY() Sintaxe: LAST_DAY(DATA) Retorna a data do último dia do mês que está contido no valor atribuído no parâmetro DATA. Exemplo: SELECT LAST_DAY(TO_DATE('01/02/2005 00:00:00','DD/MM/YYYY HH24:MI:SS')) FROM DUAL; Exibindo uma Data em um Formato Específico Como foi dito anteriormente o formato padrão de exibição de datas no Oracle é DD-MON-YY. Caso seja necessá 3 exibição deste formato o Oracle oferece a função TO_CHAR, que permite formatar a data de várias form Para utilizar a função TO_CHAR é necessário seguir algumas diretrizes. São elas: 1. Obedecer a seguinte sintaxe: TO_CHAR(DATA, ‘FORMATO’) 2. O formato deve estar entre apóstrofos e fazer distinção entre maiúsculas e minúsculas. 3. Deve haver separação por vírgulas entre o parâmetro DATA e o parâmetro FORMATO. 4. Os nomes de dias e meses na saída são preenchidos automaticamente por espaços Exemplo: SELECT TO_CHAR(SYSDATE, ‘DD/MM/YYYY HH24’) FROM DUAL; 4 Triggers Gatilho ou trigger é um recurso de programação executado sempre que o evento associado ocorrer. É muito utilizada para ajudar a manter a consistência dos dados ou para propagar alterações em um determinado dado de uma tabela para outras. Um bom exemplo é um gatilho criado para controle de quem alterou a tabela, nesse caso, quando a alteração for efetuada, o gatilho é "disparado" e grava em uma tabela de histórico de alteração, o usuário e data/hora da alteração. Exemplo: (MS-SQL Server) CREATE TRIGGER nome_do_gatilho ON dono.Nome_da_tabela FOR INSERT (ou UPDATE ou DELETE) AS Codigo para execucao CONCEITOS: O que são TRIGGERS; Usos e aplicabilidade dos TRIGGERS; Considerações e boas práticas em relação aos TRIGGERS; Quando e como usá-los; Primeiramente, vamos abordar o conceito central de TRIGGERS: Um trigger é um tipo especial de procedimento armazenado, que é executado sempre que há uma tentativa de modificar os dados de uma tabela que é protegida por ele. - Associados a uma tabela Os TRIGGERS são definidos em uma tabela específica, que é denominada tabela de TRIGGERS; - Chamados Automaticamente Quando há uma tentativa de inserir, atualizar ou excluir os dados em uma tabela, e um TRIGGER tiver sido definido na tabela para essa ação específica, ele será executado automaticamente, não podendo nunca ser ignorado. - Não podem ser chamados diretamente 5 Ao contrário dos procedimentos armazenados do sistema, os disparadores não podem ser chamados diretamente e não passam nem aceitam parâmetros. - É parte de uma transação O TRIGGER e a instrução que o aciona são tratados como uma única transação, que poderá ser revertida em qualquer ponto do procedimento, caso você queria usar “ROLLBACK”, conceitos que veremos mais a frente. Orientações básicas quando estiver usando TRIGGER. - As definições de TRIGGERS podem conter uma instrução “ROLLBACK TRANSACTION”, mesmo que não exista uma instrução explícita de “BEGIN TRANSACTION”; - Se uma instrução “ROLLBACK TRANSACTION” for encontrada, então toda a transação (o TRIGGER e a instrução que o disparou) será revertida ou desfeita. Se uma instrução no script do TRIGGER seguir uma instrução “ROLLBACK TRANSACTION”, a instrução será executada, então, isso nos obriga a ter uma condição IF contendo uma cláusula RETURN para impedir o processamento de outras instruções. - Não é uma boa prática utilizar “ROLLBACK TRANSACTION” dentro de seus TRIGGERS, pois isso gerará um retrabalho, afetando muito no desempenho de seu banco de dados, pois toda a consistência deverá ser feita quando uma transação falhar, lembrando que tanto a instrução quanto o TRIGGER formam uma única transação. O mais indicado é validar as informações fora das transações com TRIGGER para então efetuar, evitando que a transação seja desfeita. - Para que um TRIGGER seja disparado, o usuário o qual entrou com as instruções, deverá ter permissão de acessar tanto a entidade e consequentemente ao TRIGGER. Usos e aplicabilidade dos TRIGGERS Impor uma integridade de dados mais complexa do que uma restrição CHECK; Definir mensagens de erro personalizadas; Manter dados desnormalizados; Comparar a consistência dos dados – posterior e anterior – de uma instrução UPDATE; Os TRIGGERS são usados com enorme eficiência para impor e manter integridade referencial de baixo nível, e não para retornar resultados de consultas. A principal vantagem é que eles podem conter uma lógica de processamento complexa. Você pode usar TRIGGERS para atualizações e exclusões em cascata através de tabelas relacionadas em um banco de dados, impor integridades mais complexas do que uma restrição CHECK, definir mensagens de erro personalizadas, manter dados desnormalizados e fazer comparações dos momentos anteriores e posteriores a uma transação. Quando queremos efetuar transações em cascata, por exemplo, um TRIGGER de exclusão na tabela PRODUTO do banco de dados Northwind pode excluir os registros correspondentes em outras tabelas que possuem registros com os mesmos valores de PRODUCTID excluídos para que não haja quebra na integridade, como a dito popular “pai pode não ter filhos, mas filhos sem um pai é raro”. 6 Você pode utilizar os TRIGGERS para impor integridade referencial da seguinte maneira: Executando uma ação ou atualizações e exclusões em cascata: A integridade referencial pode ser definida através do uso das restrições FOREIGN KEY e REFERENCE, com a instrução CREATE TABLE. Os TRIGGERS fazem bem o trabalho de checagem de violações e garantem que haja coerência de acordo com a sua regra de negócios. Se você exclui um cliente, de certo, você terá que excluir também todo o seu histórico de movimentações. Não seria boa coisa se somente uma parte desta transação acontecesse. Criando disparadores de vários registros: Quando mais de um registro é atualizado, inserido ou excluído, você deve implementar um TRIGGER para manipular vários registros. CRIANDO TRIGGERS As TRIGGERS são criadas utilizando a instrução CREATE TRIGGER que especifica a tabela onde ela atuará, para que tipo de ação ele irá disparar suas ações seguido pela instrução de conferência para disparo da ação. As triggers podem ser do Tipo: - Insert -delete -Update e podem ocorrer antes ou depois dos eventos que as dispararam. Como elas são disparadas em tempo de execução e podem variar do momento que estão sendo disparadas, elas trabalham com as variáveis : :new e :old 7 Stored Procedure Procedimento armazenado ou Stored Procedure é uma coleção de comandos em SQL para dispensamento de Banco de dados. Encapsula tarefas repetitivas, aceita parâmetros de entrada e retorna um valor de status (para indicar aceitação ou falha na execução). O procedimento armazenado pode reduzir o tráfego na rede, melhorar a performance, criar mecanismos de segurança, etc. Exemplo: (MS-SQL Server) Create procedure busca @nomedebusca varchar (50) as select nome1, nome2 from nome_da_tabela where nome = @nomedebusca Fala pessoal, na coluna de hoje vou falar um pouco sobre Stored Procedures, um recurso valioso para o desenvolvimento de aplicações e performance. Stored Procedures nada mais são do que um conjunto de instruções Transact-SQL que são executadas dentro do banco de dados. É como escrever um programa dentro do próprio banco de dados para executar tudo lá dentro. Dentro das Stored Procedures devemos utilizar comandos Transact-SQL que não deixam nada a desejar a comandos de uma liguagem de programação qualquer, como Visual Basic ou Delphi. O Transact-SQL possui instruções de comparação (if), loops (while) operadores, variáveis, funcões, etc. Vamos ver um exemplo: CREATE PROCEDURE TESTE AS BEGIN SELECT ‘O FAMOSO HELLO WORLD!’ END Perceba que os comandos de início e término de bloco, BEGIN e END respectivamente, são obrigatórios no início e fim do comando. Bom , podemos receber parâmetros , e utilizarmos eles em instruções SQL que serão executadas dentro da Stored Procedure: CREATE PROCEDURE TESTE @PAR1 INT AS BEGIN UPDATE TABELA1 SET CAMPO1 = ‘NOVO_VALOR’ WHERE CAMPO2 = @PAR1 END 8 Percebam que no exemplo acima , não utilizamos parênteses , pois Stored Procedures são um pouco diferentes de funções. Como uma Stored Procedure fica armazenada no banco de dados , ela ja é pre-compilada e o SQL Server a executa mais rapidamente. Um exemplo de execução desta Stored Procedure , no Query Analyzer : /* Chama a Stored Procedure TESTE passando 10 como primeiro parâmetro */ EXECUTE TESTE 10 Outra vantagem das Stored Procedures é que um programa chamador , seja ele uma página ASP ou um programa em VB, Delphi, Java, etc, só precisa chamar o nome da Stored Procedure, que pode conter diversos comandos Transact-SQL embutidos dentro dela, evitanto assim um tráfego de rede maior, resultando em resposta mais rápida. Uma Stored Procedure pode ainda retornar valores para a aplicação. Aqui temos um detalhe: o SQL Server permite o retorno de dados em forma de uma tabela após a execução ou um valor de retorno normal. Exemplo: CREATE PROCEDURE TESTE @PAR1 INT AS BEGIN SELECT @PAR1*@PAR1 AS QUADRADO END No exemplo acima a aplicação chamadora (cliente) pode capturar o retorno da Stored Procedure através do campo chamado QUADRADO, que contém somente um valor de retorno: o parâmetro elevado ao quadrado. Agora no próximo exemplo: CREATE PROCEDURE TESTE @PAR1 INT AS BEGIN SELECT CAMPO1 , CAMPO2 FROM TABELA1 WHERE CAMPO3 = @PAR1 END Retorna para o cliente uma tabela contendo dois campos , CAMPO1 e CAMPO2, e podem ser capturados pela aplicação chamadora como se fossem uma tabela. O uso de Stored Procedure é encorajado, mais deve-se utilizar este recurso com cuidado pois se utilizado em excesso o SQL Server pode ser sobrecarregado, mas ao mesmo tempo podemos obter um ganho de performance considerável, dependendo do caso. Minhas ‘regrinhas’ para o uso de Stored Procedures: * Não faça Stored Procedures que somente fazem um Select ou Update ou Delete. Para isso envie a instrução diretamente. * Use sempre transações, para poder ‘voltar’ os dados em caso de problemas * Retorne somente o necessário, evitanto tráfego na rede desnecessário. * Use uma nomeclatura coerente para as Stored Procedures e as variáveis dentro dela * SEMPRE idente seu código ao entrar em uma estrutura de bloco. * Comente o máximo possível do seu código através do -- ou do /* e */ 9