Como validar uma data usando PL/SQL?

Um bom exemplo de como validar uma data usando o tratamento de exceção (exception handler) e blocos aninhados (nested blocks) da linguagem PL/SQL.

DECLARE
     v_date VARCHAR2 (20) := '01-02-2009';
BEGIN
     DBMS_OUTPUT.put_line (TO_DATE (v_date, 'mm/dd/yyyy'));
EXCEPTION
     WHEN OTHERS THEN
        BEGIN
           DBMS_OUTPUT.put_line (TO_DATE (v_date, 'mm-dd-yyyy'));
        EXCEPTION
           WHEN OTHERS THEN
              BEGIN
                 DBMS_OUTPUT.put_line (TO_DATE (v_date, 'MON dd yyyy'));
              EXCEPTION
                 WHEN OTHERS THEN
                    BEGIN
                       DBMS_OUTPUT.put_line (TO_DATE (v_date, 'mm-dd-yy'));
                    EXCEPTION
                       WHEN OTHERS THEN
                          BEGIN
                             DBMS_OUTPUT.put_line (TO_DATE (v_date, 'mm/dd/yy'));
                          EXCEPTION
                             WHEN OTHERS THEN
                                BEGIN
                                   DBMS_OUTPUT.put_line (TO_DATE (v_date, 'dd-mm-yy'));
                                EXCEPTION
                                   WHEN OTHERS THEN
                                      BEGIN
                                         DBMS_OUTPUT.put_line (TO_DATE ( 2439856 + v_date, 'j' ));
                                      EXCEPTION
                                         WHEN OTHERS THEN
                                            DBMS_OUTPUT.put_line (TO_DATE (NULL));
                                      END;
                                END;
                          END;
                   END;
              END;
        END;
END;

Abrassss
-Rodrigo

Anúncios

Dica de Inglês – Connectors

Não sou especialista em língua inglesa e tão pouco quero ensinar alguém a falar inglês. No entanto, 6 anos trabalhando com times distribuídos ao redor do mundo me ensinaram algumas coisinhas que gostaria de compartilhar. Assim, inicio uma série de posts com dicas de inglês voltadas para o mundo corporativo.

Nesse primeiro post falarei sobre CONNECTORS. Connectores são, basicamente, palavras (conjunções) usadas para unir duas orações, estabelecendo entre eles uma relação de dependência ou de simples coordenação. Exemplo: portantologopoiscomomaseemboraporqueentretanto. Aqui vai uma lista muito útel de connectors que podem ser usados no dia-a-dia de vocês Continuar lendo

Auditoria de Backups

Olá pessoal, eu sou o Marcelo!

Diante da necessidade de fazer uma auditoria de Backups de mais de 300 instâncias de SQL Server para um cliente externo de grande porte, surgiram as três queries abaixo.

Todas foram encontradas após árdua pesquisa na internet (você não as encontrará nas primeiras páginas do Google). Há customizações em todas para se adequar às nossas necessidades, e você se acostumará com elas a medida que as usa.

São simples SELECTs, ou seja, sem criação de procedure no seu banco nem burocracia alguma. Devido a natureza digamos criativa que alguns clientes tem, só assim para se familiarizar com a estratégia de backups do mesmo (se houver, é claro).

Sobre compatibilidade: Apenas a última é compatível com SQL2000. Planejo converter todas para SQL2000 pois nosso cliente tem muitas instâncias nessa versão.

Aliás, nunca esqueça que são apenas queries: Se suspeitar de algo, entre na instância e faça seu próprio “double-check” manualmente.

AVISO de praxe: Use por própria conta e risco.

--SQL2005: Database misses at least one Tlog Backup after last Full Backup
SELECT D.name AS database_name,
D.recovery_model_desc,
BS2.last_data_backup_date "Last Full Backup Date",
'MISSING TLOG Backup Since Last Full'
FROM   sys.databases D
LEFT JOIN (SELECT BS.database_name,
Max(BS.backup_finish_date) AS last_log_backup_date
FROM   msdb.dbo.backupset BS
WHERE  BS.type = 'L'
GROUP  BY BS.database_name) BS1
ON D.name = BS1.database_name
LEFT JOIN (SELECT BS.database_name,
Max(BS.backup_finish_date) AS last_data_backup_date
FROM   msdb.dbo.backupset BS
WHERE  BS.type = 'D'
GROUP  BY BS.database_name) BS2
ON D.name = BS2.database_name
WHERE  D.recovery_model_desc <> 'SIMPLE'
AND BS1.last_log_backup_date IS NULL
OR BS1.last_log_backup_date < BS2.last_data_backup_date
ORDER  BY D.name;

 

--SQL2005: Checking when a database was last backed up. BE CAREFUL: If you never had Full/Diff/Tlog backups for a given database, it won’t show that information.
WITH CTE_Backup AS
(
SELECT  database_name,backup_start_date,type,physical_device_name, backup_size
         ,Row_Number() OVER(PARTITION BY database_name,BS.type
            ORDER BY backup_start_date DESC) AS RowNum
FROM    msdb..backupset BS
JOIN    msdb.dbo.backupmediafamily BMF
ON      BS.media_set_id=BMF.media_set_id
)
SELECT      D.name
               ,backup_start_date AS last_backup_time
               ,D.recovery_model_desc
               ,state_desc,
                  CASE WHEN CTE.type ='D' THEN 'Full database'
                  WHEN CTE.type ='I' THEN 'Differential database'
                  WHEN CTE.type ='L' THEN 'Log'
                  WHEN CTE.type ='F' THEN 'File or filegroup'
                  WHEN CTE.type ='G' THEN 'Differential file'
                  WHEN CTE.type ='P' THEN 'Partial'
                  WHEN CTE.type ='Q' THEN 'Differential partial'
                  ELSE 'Unknown' END AS backup_type
               ,backup_size/1024/1024 "SizeMB"
               ,physical_device_name
               ,(SELECT COUNT(*) FROM msdb..backupset cBS JOIN    msdb.dbo.backupmediafamily cBMF ON      cBS.media_set_id=cBMF.media_set_id
                        WHERE cBS.database_name = D.name AND cBS.type =  CTE.type AND cBS.backup_finish_date > Getdate() - 14) NumBkpsLast14Days
FROM        sys.databases D
LEFT JOIN   CTE_Backup CTE
ON          D.name = CTE.database_name
AND         RowNum = 1
   WHERE    D.Name not in ('tempdb')
ORDER BY    D.name,CTE.type

 

--SQL2000+: Detailed Backup History Report
DECLARE @maxdate DATETIME
SELECT  @maxdate = Getdate() - 14

  SELECT BS.database_name, BMF.physical_device_name, BS.type, BS.backup_size/1024/1024 "SizeMB", BS.backup_start_date, datename(dw,BS.backup_start_date) backup_start_weekday, BS.backup_finish_date
    FROM msdb..backupmediafamily BMF JOIN msdb..backupmediaset BMS ON BMF.media_set_id = BMS.media_set_id JOIN msdb.dbo.backupset BS ON BS.media_set_id = BMS.media_set_id
   WHERE BS.backup_finish_date > @maxdate
     AND BS.type IN ('L')  --Log
      --AND BS.type IN ('D')  --Full
      --AND BS.database_name = 'Hub'
      --AND BMF.physical_device_name  like 'D:\%'
ORDER BY BS.backup_finish_date desc

Marcelo Mallmann
Engenheiro de Computação (PUCRS) e Especialista em Adm. Empresas (FGV-RS)
Dell – Database Administration Sr. Analyst, MCITP SQL 2008