Segue:
select dbms_lob.substr( campo_clob, 4000, 1 ) from tabela;
[]s
Segue:
select dbms_lob.substr( campo_clob, 4000, 1 ) from tabela;
[]s
Construindo um Data WareHouse: Modelagem Dimensional
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.
- 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:
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:
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
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
[]s
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
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
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
select substr('Fabio Martinez',instr('Fabio Martinez',' ',-1)+1) ultima from dual;
| ULTIMA |
| Martinez |
[]s
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