segunda-feira, 27 de fevereiro de 2012

Fazendo leitura de Campo LOB – Oracle

Segue:

select dbms_lob.substr( campo_clob, 4000, 1 ) from tabela;

 

[]s

quinta-feira, 23 de fevereiro de 2012

Introdução ao Business Intelligence:Arquitetura de Data WareHouse (DW) e Modelagem Dimensional

Construindo um Data WareHouse: Modelagem Dimensional

Tabela Fatos

Em resumo, são armazenados medidas, métricas, acontecimentos ou valores

Tabela Fatos – 3 tipos de medidas

· aditivas: são numéricas e são somadas com relação às dimensões existentes, por exemplo: quantidade, valor total dos itens.

· semi-aditivas: são numéricas, mas não podem ser somadas com relação a todas as dimensões, por exemplo: o estoque é totalizado ao longo da produto, porém ao longo das dimensões loja e data não existe o menor sentido está totalização.

· não-aditivas: dados não numéricos, por exemplo: carro1, carro2, carro3.

Tabela Fatos – Tipos de tabelas

Transaction Fact Table

Tipo de tabela de fatos em que a granularidade é uma linha para o menor nível de detalhe capturado por uma transação. Um registro numa TFT está presente somente se um evento de transação ocorre

Periodic Snapshot Fact Table

Um tipo de tabela de fatos que representa desempenho de negócio ao fim de cada período de tempo regular previsível. Snapshots diários e mensais são comuns.

Accumulating Snapshot Fact Table

Tipo de tabela de fato com datas múltiplas representando os principais pontos de controle de um processo ou pipeline relativamente de curta duração. Um

registro é inserido numa tabela de fatos instantâneos acumulados apenas uma vez,

quando o item que representa é inicialmente criado.

Tipos de Modelos Dimensionais

- O Modelo Estrela (Star Schema)

No modelo estrela todas as tabelas relacionam-se diretamente com a tabela de fatos, sendo assim as tabelas dimensionais devem conter todas as descrições que são necessária para definir uma classe, exemplo:

clip_image001

Este modelo é chamado de estrela porque a tabela de fatos fica ao centro cercada das tabelas dimensionais com o formato parecido de uma estrela. Mas o ponto forte a fixar é que as dimensões não são normalizadas.

- O Modelo Floco de Neve (Snow Flake)

No modelo Floco as tabelas dimensionais relacionam-se com a tabela de fatos, mas algumas dimensões relacionam-se apenas entre elas visando diminuir o espaço ocupado por estas tabelas. Exemplo:

clip_image002

Granularidade

Nível de detalhe da informação

Surrogate Key:

Número inteiro seqüencial. No caso das Datas, pode ser usado ou não. Em datas pode-se usar, por exemplo, o tipo date ou um numérico representando a data como YYYYMMDD, por exemplo. Utilizado para unir as dimensões às tabelas de Fatos.

Business Key

Pode ter vários atributos (chave composta) identifica o registro do sistema de origem e não se relaciona com a fato

Tabela Dimensão

descrições, características, localidade, detalhamento.

Tabela Dimensão – tipos de tabelas

  • Simples – Apenas descritiva
  • Hierárquica – Os atributos podem compor uma hierarquia

Slow-change dimension

Dificilmente sofre alterações no decorrer do tempo, exemplo estado civil

Junk Dimension

Uma dimensão abstrata com a decodificação de um grupo de flags e indicadores de baixa cardinalidade, portanto removendo os flags da tabela de fatos.

Degenerated Dimension

Uma chave de dimensão, como o número de uma transação, número de fatura, de tíquete, que não tenha nenhum atributo, portanto não se junta com uma tabela de dimensão.

Bridge Table

Uma tabela com uma chave multiparte capturando um relacionamento muitos-para muitos. Serve como uma ponte entre a tabela de fatos e a tabela de dimensão

de forma a permitir dimensões multivaloradas ou hierarquias

Centipede Fact Table

Uma tabela de fatos com muitas dimensões (mais do que 20) levando a uma esquema que lembra uma centopéia. Centopéias tipicamente resultam

quando projetistas tentam representar relacionamentos hierárquicos com uma

proliferação de dimensões separadas ao invés de aninhá-las numa única dimensão.

Quatro passos para criar um modelo dimensional

  1. Selecionar o processo de negócio que será modelado
  2. Definir grau de granularidade
  3. Definir as dimensões para cada linha do fato
  4. Identificar os fatos numéricos para cada linha do fato

[]s

quarta-feira, 15 de fevereiro de 2012

Retornando o valor do IDENTITY – Sql Server

O Identity funciona como a Sequence no Oracle, uma vez indicado para a coluna de uma tabela que ela é identity ao inserir registros nessa tabela automaticamente iniciara o funcionamento da sequence.

Vamos aos exemplos:

Primeiro criaremos a tabela TbNotaFiscal onde o campo de código da nota fiscal será identity:

Create table TbNotaFiscal (
CdNotaFiscal int not null identity,
VrTotal numeric(10,4) null)

go

Agora vamos incluir uma nota fiscal:

insert into TbNotaFiscal  (VrTotal) values (10.20)
go

1 record(s) affected

Perceba que no insert acima não foi passado o código da Nota Fiscal, o mesmo foi gerado automaticamente:

Select * from TbNotaFiscal

CdNotaFiscal     VrTotal   
-----------------         ----------
1                         10,2
    

Agora como podemos indentificar a posição atual da sequence ou último valor corrente. No Oracle podemos facilmente identicar através de consulta na sessão( select Nome_Sequence.currval from dual) mas e no Sql Server?

Temos 3 maneiras de indentificar qual foi o último identity adicionado na tabela, vamos exemplificar:

@@IDENTITY

Sua função é retornar o ultimo identity inserido em qualquer tabela do bloco em execução.

insert into TbNotaFiscal values (50)
go
Select @@identity
go
select * from TbNotaFiscal
go

1 record(s) affected

column1   
----------
2          Após ter inserido o registro mostra qual o último identity

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 16/ms]

CdNotaFiscal     VrTotal   
---------------         ----------
1                     10,2      
2                     50
        

2 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

Ainda no exemplo @@Identity, e se a tabela TbNotaFiscal tivesse uma trigger que insere em uma tabela de Log o nome do usuário que criou essa Nota Fiscal. Se essa tabela de Log também possuir um campo indentity, qual seria o valor retornado para @@Identity? Vamos lá.

Primeiro criaremos a tabela de Log:

Create Table TbNotaFiscalLog (
CdNotaFiscal int not null identity,
VrTotal numeric(10,4) null,
NmUsuario varchar(100) null)

Agora vamos criar a Trigger:

CREATE TRIGGER trg_NotaFiscalLog
ON TbNotaFiscal
AFTER INSERT
AS
    INSERT INTO TbNotaFiscalLog (VrTotal, NmUsuario)
    SELECT VrTotal, USER_NAME()
    FROM INSERTED

Vamos agora inserir um registro na tabela de Nota Fiscal e ver qual o valor retornado em @@Identity:

insert into TbNotaFiscal values (100)
go
Select @@identity
go
Select * from TbNotaFiscal
go

1 record(s) affected

1 record(s) affected

column1   
----------
1          Veja que o valor retornado foi o da tabela TbNotaFiscalLog -  executado pela trigger

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

CdNotaFiscal     VrTotal   
---------------          ----------
1                      10,2      
2                      50        
3                     100       

3 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

 

SCOPE_IDENTITY()

Retorna o último identity do bloco atual que esta em evidência, ou seja, utilizando nosso mesmo exemplo ao inserir um registro na tabela TbNotaFiscal não seria mais apresentado o identity gerado no insert da trigger e sim do bloco atual e execução. Exemplos:

insert into TbNotaFiscal values (200)
go
Select scope_identity()
go
Select * from TbNotaFiscal
go

1 record(s) affected

1 record(s) affected

column1   
----------
4         Veja que agora o valor apresentado foi o da tabela TbNotaFiscal e não mais o gerado na trigger pela tabela de Log

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

CdNotaFiscal     VrTotal   
---------------           ----------
1                       10,2      
2                       50        
3                      100       
4                      200
       

4 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

 

IDENT_CURRENT()

Permite passar como parametro o nome da tabela retornando o último valor de indentity para a ela. Exemplo:

insert into TbNotaFiscal values (300)
go
Select ident_current('TbNotaFiscal')
go
select ident_current('TbNotaFiscalLog')
go
Select * from TbNotaFiscal
go
select * from TbNotaFiscalLog
go

1 record(s) affected

1 record(s) affected

column1   
----------
5          Identity da tabela TbNotaFiscal

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

column1   
----------
3          Identity da tabela TbNotaFiscalLog

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

CdNotaFiscal     VrTotal   
---------------          ----------
1                      10,2      
2                      50        
3                     100       
4                     200       
5                     300       

5 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

CdNotaFiscal     VrTotal     NmUsuario   
---------------           ----------      ------------
1                       100           TESTE       
2                       200           TESTE   
3                       300           TESTE
    

3 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]

É isso ai….

[]s

terça-feira, 14 de fevereiro de 2012

Diferença entre NOLOCK e WITH (NOLOCK)

 

A hint “nolock” utilizadas em consulta, permite que seja realizado a leitura suja das informações, ou seja, permite a leitura de dados de uma transação que ainda não foi efetuado Commit/Rollback.

O ‘WITH’ logo depois o nome da tabela é recomendada, mas opcional:

CORRETO

SELECT * FROM TBNOTAFISCAL WITH (NOLOCK)   

CORRETO

SELECT * FROM TBNOTAFISCAL (NOLOCK)  

A partir do SQL Server 2005, a sintaxe do NOLOCK passou a exigir o uso do ‘WITH’ quando se é utilizado multiplos hins na consulta, no exemplo a seguir é utilizado o hint NOLOCK junto com um hint que força a utilização de um indice.

ERRADO

SELECT * FROM TBNOTAFISCAL (INDEX=INDNF, NOLOCK) 

Incorrect syntax near 'INDEX'. If this is intended as a part of a table hint, A WITH keyword and parenthesis are now required. See SQL Server Books Online for proper syntax.

CORRETO

SELECT * FROM TBNOTAFISCAL WITH (INDEX=INDNF, NOLOCK) 

ERRADO

SELECT * FROM TBNOTAFISCAL NOLOCK

No exemplo acimo não será utilizado o hint NOLOCK e sim criado um alias para a tabela

Segue um Video com exemplos de utilização do NOLOCK

segunda-feira, 13 de fevereiro de 2012

Consulta retorna CPF formatado - Oracle

Segue consulta para retornar CPF no formato padrão:

select regexp_replace('29820131855', '^(\d{3})(\d{3})(\d{3})(\d{2})$', '\1.\2.\3-\4') CPF from dual

CPF

298.201.318-55

[]s

quinta-feira, 9 de fevereiro de 2012

Retorna última string do texto - Oracle

 

select substr('Fabio Martinez',instr('Fabio Martinez',' ',-1)+1) ultima from dual;

ULTIMA

Martinez

      

[]s

quarta-feira, 8 de fevereiro de 2012

Habilitando 1 sessão por usuário

Como fazer para que um usuário possa abrir apenas 1 sessão por vez?

É o seguinte se o usuário Scott conectar no banco, enquanto este usuário estiver conectado outra pessoa não poderá conectar com o usuário Scott,  ou seja, o usuário Scott (Ativo) só poderá ter 1 sessão aberta no banco de dados. Para isso devemos configurar o seguinte parametro:

 

ALTER SYSTEM SET SESSIONS_PER_USER = 1;

 

[]s