Obtendo data e hora atual no DB2

Para os que estão acostumados com o MySql esse é um problema que seria facilmente resolvido utilizando a função Now(), porem no DB2 essa função não existe.

No DB2 devemos utilizar current timestamp para indicar a data e hora atual (isso mesmo, separado). Exemplo de utilização:

INSERT INTO DB.TABELA
(DATA_ALTER, OWNER_ALTER, NOME, EMAIL)
VALUES
( current timestamp, 'contato@acmcorrea.com.br',
 'Nome da pessoa', 'Email da pessoa')

Exibir ” ‘ ” (aspas simples) em concatenação no DB2

Esse é um problema que pode levar muitos a loucura, principalmente por outros bancos de dados aceitarem o carácter \ para indicar a inserção de um carácter especial (ex: ‘\”).

Felizmente existe uma solução um tanto quanto simples para esse caso, que seria inserir uma sequencia de 4 aspas simples:

'<strong>'</strong>''

Sendo que a primeira e a quarta aspas se tornam os delimitadores, e uma das duas apas do meio é eliminada. Vamos ver um exemplo:

SELECT ('''' || CODIGO || ' - ' || NOME || '''' || ' : '
|| '''' || NOME || '''' ) AS INFO
FROM DB.TBL_TIMES

Nos retorna:

INFO
---------------------------------------------------
'0 - Unix' : 'Unix'
'3 - Inte' : 'Intel'
'5 - Banco de Dados' : 'Banco de Dados'

Contornando problemas com LIMIT e OFFSET no DB2

Quem esta acostumado a utilizar em suas SQL Queries os comandos LIMIT e OFFSET, vai ter dificuldades na hora de trabalhar com o IBM DB2, pois ele (por padrão) não aceita esses comandos.

LIMIT e OFFSET permitem trazer apenas uma parte das linhas geradas pela consulta, sendo que são muito utilizados para montar scripts de paginação.

SELECT <var>lista_seleção</var>
    FROM <var>expressão_tabela</var>
    [LIMIT { <var>número</var> | ALL }] [OFFSET <var>número</var>]

Quando o limite é fornecido, não mais que esta quantidade de linhas será retornada (mas possivelmente menos, se a consulta produzir menos linhas). LIMIT ALL é o mesmo que omitir a cláusula LIMIT.

OFFSET informa para saltar uma quantidade de linhas antes de começar a retornar as linhas para o cliente. OFFSET 0 é o mesmo que omitir a cláusula OFFSET. Se tanto OFFSET quando LIMIT forem especificados, então são saltadas OFFSET linhas antes de começar a contar as LIMIT linhas que serão retornadas.

Agora que conhecemos os comandos, e o que fazem, vamos para a utilização no IBM DB2, com a solução de contorno:

Para apenas limitar a quantidade de linhas que a consulta irá resultar, podemos utilizar o comando FETCH FIRST n ROWS ONLY.
Exemplo: 

SELECT LASTNAME, FIRSTNAME, EMPNO, SALARY
  FROM DB.EMP
  ORDER BY SALARY DESC
  FETCH FIRST 20 ROWS ONLY;

Nesse exemplo teremos as 20 primeiras linhas que a query retornar (limita em apenas 20 linhas o resultado). Isso soluciona o problema da utilização do LIMIT n.

Agora para o caso de utilizar LIMIT 10, 2 ou LIMIT 2 OFFSET 10, que retornaria apenas 10 linhas começando no registro 3 (pulando os dois primeiros), teremos que fazer um workaround, utilizando a função ROW_NUMBER() e o BETWEEN (na clausura WHERE).

SELECT *
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY NOME ASC) AS ROWNUMBER,
NAME, LASTNAME
FROM DB.TABLE_NAME
) AS TMP
WHERE ROWNUMBER BETWEEN 2 AND 10

Dessa forma conseguiremos simular o mesmo resultado que seria obtido pelo LIMIT e OFFSET.

Links úteis:

Concatenação de valores no Banco de Dados

Muitas vezes nos deparamos com situações onde precisamos concatenar valores em nossas SQL queries, e hoje irei ensinar como realizar essa atividade nos DB’s MySQL e IBM DB2.

Possuímos duas formas de realizar essa atividade, utilizando a função CONCAT() (presente em ambos os DB’s) e através do carácter “pipe”.

CONCAT();
No MySQL a função CONCAT() retorna a string resultante da concatenação dos argumentos, sendo que o DB aceita um ou mais argumentos. Se todos os argumentos são strings não-binários, o resultado é uma string não binários. Se os argumentos incluirem quaisquer strings binárias, o resultado é uma string binária. Um argumento numérico é convertido na sua forma equivalente binário string;
Exemplo:

mysql&gt; SELECT CONCAT('My', 'S', 'QL');
-&gt; 'MySQL'

Já no IBM DB2 a função retorna a concatenação de dois argumentos de cadeia sendo que os dois argumentos devem ser de tipos compatíveis (tabela de compatibilidade). O resultado da função é uma string cujo comprimento é igual à soma dos comprimentos dos dois argumentos.
Exemplo: 

CONCAT(string-expression-1,string-expression-2)

DB2&gt; SELECT CONCAT('IBM ','DB2') FROM TBL_TESTE;
-&gt;'IBM DB2'

Carácter “pipe” ||

Em ambos os DB’s você utilizar uma sequencia de dois caracteres | (pipe) para obter a concatenação dos valores:

DB&gt;SELECT 'Artigo' ||' - '||'primeiro '|| db_campo || ' fim';
-&gt; 'Artigo - primeiro <strong>valor do db_campo</strong> fim'

Com o ‘||’ é possível concatenar diversos valores de uma vez só (mesmo no IBM DB2).

Links úteis:

Configurando o PHP para exibir (ou não) erros na pagina

Para evitar que usuários recebam informações referentes a erros em nossa aplicação, os  administradores do ambiente mantêm o php.ini configurado para inibir a exibição de erros. Porem durante a fase de desenvolvimento/teste, nos realizamos diversos testes e debugs onde é essencial o feedback da aplicação (exibindo mensagens caso haja algum erro).

Nesse post irei demonstrar como podemos habilitar / desabilitar a exibição dessas mensagens de erro através do php.ini ou direto no código de sua aplicação.

Configurando pelo php.ini

Dentro do arquivo php.ini você deverá procurar a chave display_errors, que por padrão estará assim:

display_errors = Off

Para habilitar a exibição das mensagens de erro é só trocar o parâmetro da chave de Offpara On, e fazer o restart do serviço web do servidor (apache, IIS, …).

Configurando pelo código

Acredito que essa seja a melhor opção, já que você pode especificar quais paginas irão exibir as mensagens de erro, evitando problemas no caso de existir mais de uma aplicação rodando no servidor.

Para tanto iremos utilizar as funções ini_set e error_reporting, habilitando a exibição dos erros e gerando uma log com todos eles. Insira o código abaixo nas páginas em que deseja habilitar essas ações:

ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', dirname(__FILE__) . '/error_log.txt');
error_reporting(E_ALL);

Observação: Eu aconselho adicionar esse código em uma pagina que esteja incluída em todas as demais paginas do seu site, pois assim você só terá que fazer a alteração uma vez e caso precise desabilitar não terá que entrar pagina por pagina.

Links úteis:

Nota

Oá, esse é o meu primeiro post, e gostaria de falar um pouco sobre o que pretendo publicar nesse site.

Sou formado em analise de sistemas pela PUC Campinas, e trabalho em uma multi nacional de TI, onde atuo na área de projetos, qualidade, desenvolvimento de software e administração de sistemas (atualmente como Project Tech Leader).
A ideia do site é manter um canal de comunicação aberto  para compartilhar soluções / conhecimento, além de divulgar o meu trabalho.

Att,