Arquivos

Archive for the ‘DB2 / Banco de dados’ Category

Criando um Event Monitor no DB2

Muitas vezes precisamos logar os eventos que acontecem em nosso banco de dados DB2, normalmente, para monitorar desempenho, queries mais utilizadas, etc.

Criar um Event Monitor é uma das soluções mais simples e rapidas para monitoração. O procedimento abaixo mostra como criar um simples, que vai logar os eventos de seu banco:

– conecte no seu banco: db2 connect to banco user fulano using senha

– Criar o monitor de eventos
db2 “CREATE EVENT MONITOR monjmm FOR STATEMENTS WRITE TO FILE ‘c:\tmp'” — verificar se o destino c:\tmp existe e é possivel escrever no mesmo
 
– liga o monitor de eventos
db2 SET EVENT MONITOR monjmm STATE = 1
 
– Use o banco!
 
– Desligue o monitor de eventos
db2 SET EVENT MONITOR monjmm STATE = 0
 
– torne o output legivel
db2evmon -path c:\tmp > c:\tmp\filtered.out — Tem que dar permissao de leitura para os arquivos criados
 
– veja os eventos abrindo o arquivo com o bloco de notas
notepad c:\tmp\filtered.out
 
– deletar o monitor
db2 DROP EVENT MONITOR monjmm

Enjoy!

Descobrindo a versão do DB2 via SQL

Várias vezes precisamos descobrir a versão do DB2, e só estamos conectados na instancia. Com a query abaixo, seu problemas acabaram-se:

SELECT service_level, fixpack_num FROM TABLE (sysproc.env_get_inst_info()) as INSTANCEINFO

Descobrindo colunas/tabelas envolvidas em erros no DB2

Quem nunca teve que fazer um insert em uma tabela e deu algum erro no insert e não sabia de que campo se tratava?
Geralmente ele retornaria algo parecido com isso:

Error: DB2 SQL error: SQLCODE: -530, SQLSTATE: 23503, SQLERRMC: DB2PRD.THIST_OPER_VARVL.SQL140701170852720
SQLState: 23503
ErrorCode: -530

Ele retorna falando do ID da Chave, com a query abaixo, você consegue ver de que tabela/campos se trata:

SELECT * FROM SYSCAT.KEYCOLUSE WHERE CONSTNAME = ‘SQL140701170852720′

Enjoy

Select com IF / CASE no SQL Server

Sempre tenho tal necessidade, segue um exemplo para posterior consulta:

SELECT COLUMN_NAME as Nome, DATA_TYPE as Tipo,
CASE
WHEN Character_Maximum_length is null and DATA_TYPE = ‘int’
THEN 10
WHEN Character_Maximum_length is null and DATA_TYPE = ‘decimal’
THEN 20
ELSE Character_Maximum_length
END as Tamanho,
Is_Nullable as NULLS
FROM [INFORMATION_SCHEMA].[COLUMNS]

Formatando campos no DB2

É comum a necessidade de formatarmos campos em selects. Um exemplo boçal é o CNPJ. É muito menos custoso formatar na sua query do que na sua aplicação (java por exemplo)… Então, segue um exemplo de como formatar um CNPJ.

Supondo que seu campo CNPJ tenha o nome CCNPJEMPR, e o conteúdo do mesmo seja:

086547761002422

E você queira retornar assim:

086.547.761/0024-22

Basta utilizar na sua query:

SELECT
SUBSTR(CAST(RIGHT(CONCAT('000000000',CAST(empresa.CCNPJEMPR AS VARCHAR(15))),15) AS VARCHAR(15)),1,3) || '.' ||
SUBSTR(CAST(RIGHT(CONCAT('000000000',CAST(empresa.CCNPJEMPR AS VARCHAR(15))),15) AS VARCHAR(15)),4,3) || '.' ||
SUBSTR(CAST(RIGHT(CONCAT('000000000',CAST(empresa.CCNPJEMPR AS VARCHAR(15))),15) AS VARCHAR(15)),6,3) || '/' ||
SUBSTR(CAST(RIGHT(CONCAT('000000000',CAST(empresa.CCNPJEMPR AS VARCHAR(15))),15) AS VARCHAR(15)),9,4) || '-' ||
SUBSTR(CAST(RIGHT(CONCAT('000000000',CAST(empresa.CCNPJEMPR AS VARCHAR(15))),15) AS VARCHAR(15)),14,2) AS CNPJ_FORMATADO
FROM
CLIENTES;

A função SUBSTR irá pegar os “pedaços” do campo, repare na primeira linha, que especifico 1,3, isso quer dizer, que ela deve pegar 3 caracteres a partir da primeira posição do campo, no exemplo 086.
Onde especifico 9,4, quero dizer que devo pegar 4 caracteres a partir da posição 9, no exemplo: 0024

Por fim, utilizo CAST, RIGHT e CONCATS para formatar o campo, e em casos que tenha 0 (ZEROS) a esquerda, que os mesmos sejam considerados.

Enjoy!

Checando as Stored Procedures que foram alteradas no DB2

É muito comum a necessidade de checarmos se alguma Stored Procedure foi alterada no DB2. Isso pode ser facilmente feito utilizandoa tabela syscat.routines, veja os campos da mesma em:

db2 describe table syscat.routines

Para selecionar o nome das procedures que foram alteradas HOJE, por exemplo, utilize a seguinte sql:

db2 “select routinename from syscat.routines where DATE(CREATE_TIME)=DATE(CURRENT TIMESTAMP) order by routinename”

Enjoy!

Obtendo o corpo de uma Stored Procedure no DB2

É comum obtermos erros do DB2 em nossa aplicação JAVA retornando algo do tipo:

Caused by:
com.ibm.db2.jcc.am.oo: DB2 SQL Error: SQLCODE=-407, SQLSTATE=23502, SQLERRMC=TBSPACEID=2, TABLEID=2304, COLNO=6, DRIVER=3.58.82

Em alguns casos, não temos muitos dados sobre a tabela, campo, etc… então é necessário investigar, para isso, algumas queryes podem nos ajudar, segue:

- Para ver o nome da tabela baseado no Table Id:

db2 “SELECT TABNAME FROM SYSCAT.TABLES WHERE TABLEID=2304″

- Para ver o campo ao qual se refere o erro:

SELECT * FROM SYSCAT.COLUMNS WHERE TABNAME=’TVALDCCONDCVARVL’ AND COLNO=6

- E finalmente, se quiser ver o corpo da procedure, num caso no qual não tenha um cliente que possibilite instalado e só tem acesso via command line (para MACHOS):

db2 “select text from syscat.routines where routinename=’PUPDCONDCREGRA'” > PUPDCONDCREGRA.sql

No caso acima, usei o nome PUPDCONDCREGRA, substitua para o nome de sua proc.

Enjoy!

Criar Stored Procedure dinâmica no DB2

Eu tive a necessidade de escrever uma Stored Procedure dinâmica no DB2 que receberia uma instrução SQL, a executaria e me retornaria um ResultSet.

A mesma seria utilizada em uma tela de busca “genérica” no sistema, para, em tempo de homologação, permitir ao analista efetuar queries, uma vez que o banco de homologação só aceita a chamada de procs, é impossivel efetuar selects diretamente no mesmo.

Enfim, segue o corpo da Procedure, observando que JULIANO é o meu schema:

CREATE PROCEDURE JULIANO1.PSELEMPRRTINGRES (
       IN PAR_CAMPO1        VARCHAR (10000) — este é o parametro que passo para a proc
)
        SPECIFIC JULIANO1.PSELEMPRRTINGRES
        DYNAMIC RESULT SETS 1

P1:BEGIN

     DECLARE strSqlDn                        varchar(10000);
     DECLARE stm_procedimento                     STATEMENT;
     DECLARE cursorDn CURSOR WITH RETURN FOR stm_procedimento;

     SET strSqlDn = PAR_CAMPO1;

     PREPARE stm_procedimento FROM strSqlDn;
     OPEN cursorDn;

END P1

Para invocar a proc, basta chamar:

call JULIANO1.PSELEMPRRTINGRES(‘select * from clientes’);

No Java, eu invoco a Proc normalmente, jogando o resultado para um result set, faço um parse para desenhar a tabela no JSP e voa-lá!

Enjoy!

DB2: Criar um banco em uma pasta diferente no Windows

Eventualmente pode ser necessário criar um banco DB2 em uma pasta diferente da pasta na qual o DB2 foi instalado no Windows.

Se você tentar o comando, como por exemplo:

CREATE DATABASE julianom AUTOMATIC STORAGE YES  ON ‘E:\julianom’ DBPATH ON ‘E:\julianom’  ….

E o comando falhar dizendo que a pasta de destino não existe, execute os seguintes comandos:

db2set DB2_CREATE_DB_ON_PATH=YES
db2stop
db2start

A variável que setamos com o db2set permite a criação de bancos em pastas diferentes.

Enjoy.

CategoriasDB2 / Banco de dados Tags:,

db2diag.log – Alterando o nível de detalhamento do Log do DB2

O banco de dados DB2 armazena por padrão os seus logs no arquivo db2diag.log, encontrado no caminho /sqllib/db2dump. No windows é:

Windows XP and Windows 2003:
C:\Documents and Settings\All Users\Application Data\IBM\DB2\<DB2 copy name>\DB2

Windows Vista e posteriores:
C:\ProgramData\IBM\DB2\<db2 copy name>\DB2

Muitas vezes as pessoas querem que o banco detalhe mais ou menos as informações neste arquivo. Para alterarmos o nível de detalhamento, temos que alterar a variável do dbm diaglevel. Os valores possíveis são:

0 – Não loga NADA
1 – Somente erros severos
2 – Todos os erros
3 – Erros e avisos (warnings)
4 – Loga tudo (erros, avisos e informações)

Após definido o valor desejado, para alterar a variável, o comando é:

db2 update dbm cfg using DIAGLEVEL X

Onde X é o level desejado.

Para consultar o valor atual de suas configurações, o comando é:

db2 GET DATABASE MANAGER CONFIGURATION

Enjoy!

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 151 outros seguidores