quinta-feira, 12 de fevereiro de 2026

ORACLE PL/SQL - FETCH_LEITURA

 <<FETCH_LEITURA>> é um LABEL (rótulo) em PL/SQL.

Significado:


É um marcador/etiqueta que identifica um ponto específico no código

A sintaxe é: <<nome_do_label>>


Para que serve:


Documentação/Organização: Identificar visualmente seções do código

Referência em comandos GOTO: Permitir saltos para esse ponto (má prática)

Identificar loops: Dar nome a um loop específico para usar em EXIT ou CONTINUE


Neste código:

sqlLOOP  

    <<FETCH_LEITURA>>   

    V_DEB_LIDO  := V_DEB_LIDO + 1;

    FETCH c_IMO_LOCALID INTO ...

O label <<FETCH_LEITURA>> está apenas documentando onde começa a leitura do cursor. Não está sendo usado para nenhuma funcionalidade (não há GOTO, EXIT ou CONTINUE referenciando ele).

sexta-feira, 6 de fevereiro de 2026

FORMATAÇÃO DE DATAS C#


EXEMPLOS:


SELECT convert(datetime, 'Oct 23 2012 11:01AM', 100) -- mon dd yyyy hh:mmAM (or PM)

SELECT convert(datetime, 'Oct 23 2012 11:01AM') -- 2012-10-23 11:01:00.000

-- Without century (yy) string date conversion - convert string to datetime function

SELECT convert(datetime, 'Oct 23 12 11:01AM', 0) -- mon dd yy hh:mmAM (or PM)

SELECT convert(datetime, 'Oct 23 12 11:01AM') -- 2012-10-23 11:01:00.000

-- Convert string to datetime sql - convert string to date sql - sql dates format

-- T-SQL convert string to datetime - SQL Server convert string to date

SELECT convert(datetime, '10/23/2016', 101) -- mm/dd/yyyy

SELECT convert(datetime, '2016.10.23', 102) -- yyyy.mm.dd ANSI date with century

SELECT convert(datetime, '23/10/2016', 103) -- dd/mm/yyyy

SELECT convert(datetime, '23.10.2016', 104) -- dd.mm.yyyy

SELECT convert(datetime, '23-10-2016', 105) -- dd-mm-yyyy

-- mon types are nondeterministic conversions, dependent on language setting

SELECT convert(datetime, '23 OCT 2016', 106) -- dd mon yyyy

SELECT convert(datetime, 'Oct 23, 2016', 107) -- mon dd, yyyy

-- 2016-10-23 00:00:00.000

SELECT convert(datetime, '20:10:44', 108) -- hh:mm:ss

-- 1900-01-01 20:10:44.000

-- mon dd yyyy hh:mm:ss:mmmAM (or PM) - sql time format - SQL Server datetime format

SELECT convert(datetime, 'Oct 23 2016 11:02:44:013AM', 109) 

-- 2016-10-23 11:02:44.013

SELECT convert(datetime, '10-23-2016', 110) -- mm-dd-yyyy

SELECT convert(datetime, '2016/10/23', 111) -- yyyy/mm/dd

-- YYYYMMDD ISO date format works at any language setting - international standard

SELECT convert(datetime, '20161023')

SELECT convert(datetime, '20161023', 112) -- ISO yyyymmdd

-- 2016-10-23 00:00:00.000

SELECT convert(datetime, '23 Oct 2016 11:02:07:577', 113) -- dd mon yyyy hh:mm:ss:mmm

-- 2016-10-23 11:02:07.577

SELECT convert(datetime, '20:10:25:300', 114) -- hh:mm:ss:mmm(24h)

-- 1900-01-01 20:10:25.300

SELECT convert(datetime, '2016-10-23 20:44:11', 120) -- yyyy-mm-dd hh:mm:ss(24h)

-- 2016-10-23 20:44:11.000

SELECT convert(datetime, '2016-10-23 20:44:11.500', 121) -- yyyy-mm-dd hh:mm:ss.mmm

-- 2016-10-23 20:44:11.500

-- Style 126 is ISO 8601 format: international standard - works with any language setting

SELECT convert(datetime, '2008-10-23T18:52:47.513', 126) -- yyyy-mm-ddThh:mm:ss(.mmm)

-- 2008-10-23 18:52:47.513

SELECT convert(datetime, N'23 شوال 1429 6:52:47:513PM', 130) -- Islamic/Hijri date

SELECT convert(datetime, '23/10/1429 6:52:47:513PM', 131) -- Islamic/Hijri date

-- Convert DDMMYYYY format to datetime - sql server to date / datetime

SELECT convert(datetime, STUFF(STUFF('31012016',3,0,'-'),6,0,'-'), 105) 

-- 2016-01-31 00:00:00.000

-- SQL Server T-SQL string to datetime conversion without century - some exceptions

-- nondeterministic means language setting dependent such as Mar/Mär/mars/márc

SELECT convert(datetime, 'Oct 23 16 11:02:44AM') -- Default

SELECT convert(datetime, '10/23/16', 1) -- mm/dd/yy U.S.

SELECT convert(datetime, '16.10.23', 2) -- yy.mm.dd ANSI

SELECT convert(datetime, '23/10/16', 3) -- dd/mm/yy UK/FR

SELECT convert(datetime, '23.10.16', 4) -- dd.mm.yy German

SELECT convert(datetime, '23-10-16', 5) -- dd-mm-yy Italian

SELECT convert(datetime, '23 OCT 16', 6) -- dd mon yy non-det.

SELECT convert(datetime, 'Oct 23, 16', 7) -- mon dd, yy non-det.

SELECT convert(datetime, '20:10:44', 8) -- hh:mm:ss

SELECT convert(datetime, 'Oct 23 16 11:02:44:013AM', 9) -- Default with msec

SELECT convert(datetime, '10-23-16', 10) -- mm-dd-yy U.S.

SELECT convert(datetime, '16/10/23', 11) -- yy/mm/dd Japan

SELECT convert(datetime, '161023', 12) -- yymmdd ISO

SELECT convert(datetime, '23 Oct 16 11:02:07:577', 13) -- dd mon yy hh:mm:ss:mmm EU dflt

SELECT convert(datetime, '20:10:25:300', 14) -- hh:mm:ss:mmm(24h)

SELECT convert(datetime, '2016-10-23 20:44:11',20) -- yyyy-mm-dd hh:mm:ss(24h) ODBC can.

SELECT convert(datetime, '2016-10-23 20:44:11.500', 21)-- yyyy-mm-dd hh:mm:ss.mmm ODBC

 

Espero que seja útil. E até a próxima dica.

segunda-feira, 24 de novembro de 2025

ORACLE - Pular os 50 primeiros registros

Para pular os 50 primeiros registros em Oracle PL/SQL, você pode usar a cláusula `OFFSET` junto com `FETCH` (disponível a partir do Oracle 12c).  


Aqui está um exemplo prático:


sql

SELECT *

FROM minha_tabela

ORDER BY id

OFFSET 50 ROWS FETCH NEXT 100 ROWS ONLY;

```


Explicação:

- `ORDER BY id` → é **obrigatório** para garantir a ordem dos registros.

- `OFFSET 50 ROWS` → ignora os primeiros 50 registros.

- `FETCH NEXT 100 ROWS ONLY` → retorna os próximos 100 registros (pode ajustar conforme necessário).


### Se estiver em versão anterior ao Oracle 12c (sem suporte a `OFFSET`):

Você pode usar uma subquery com `ROWNUM`:


sql

SELECT *

FROM (

    SELECT t.*, ROWNUM r

    FROM (

        SELECT * FROM minha_tabela ORDER BY id

    ) t

    WHERE ROWNUM <= 150

)

WHERE r > 50;

```


- Aqui, a subquery interna ordena os dados.

- O filtro `ROWNUM <= 150` garante que só pegue até o registro 150.

- O filtro externo `r > 50` remove os primeiros 50.


quinta-feira, 30 de outubro de 2025

ORACLE - TOP(N) é uma sintaxe específica do SQL Server (T-SQL).

 1. A Forma Moderna (Oracle 12c e superior): FETCH

Esta é a maneira mais limpa, moderna e recomendada. É a sintaxe padrão do SQL ANSI para limitar linhas.


Para obter o equivalente exato de SELECT TOP 7 ... do SQL Server, você usaria FETCH FIRST 7 ROWS ONLY.


Exemplo:


SQL


SELECT

    nome_da_coluna,

    outra_coluna

FROM

    sua_tabela

ORDER BY

    coluna_de_ordenacao DESC  -- Importante para o "top" ter sentido

FETCH FIRST 7 ROWS ONLY;

2. A Forma Clássica (Oracle 11g e anteriores): ROWNUM

Antes da versão 12c, a única maneira de limitar linhas era usando a pseudo-coluna ROWNUM. No entanto, ela tem uma particularidade importante.


ROWNUM é atribuído antes da cláusula ORDER BY. Se você quiser as 7 primeiras linhas após a ordenação (que é o que o TOP geralmente faz), você precisa usar uma subconsulta.


Exemplo (a forma correta com ORDER BY):


SQL


SELECT *

FROM (

    SELECT

        nome_da_coluna,

        outra_coluna

    FROM

        sua_tabela

    ORDER BY

        coluna_de_ordenacao DESC

)

WHERE ROWNUM <= 7;

Por que a subconsulta é necessária? Se você fizesse isto (forma incorreta):


SQL


-- !! Cuidado: Isto NÃO é o TOP 7 !!

SELECT

    nome_da_coluna,

    outra_coluna

FROM

    sua_tabela

WHERE

    ROWNUM <= 7

ORDER BY

    coluna_de_ordenacao DESC;

O Oracle pegaria as primeiras 7 linhas que ele encontrar (em ordem aleatória de armazenamento), e depois as ordenaria. Você não obteria o "top 7" real.


Bônus: Equivalente ao TOP 7 WITH TIES

Se você precisar do equivalente ao TOP 7 WITH TIES do SQL Server (que inclui todas as linhas que empatam com a 7ª posição), a sintaxe FETCH do Oracle 12c+ também suporta isso:


SQL


SELECT

    nome_da_coluna,

    outra_coluna

FROM

    sua_tabela

ORDER BY

    coluna_de_ordenacao DESC

FETCH FIRST 7 ROWS WITH TIES;

Resumo:


Se você usa Oracle 12c ou mais recente: Use FETCH FIRST 7 ROWS ONLY.


Se você usa Oracle 11g ou mais antigo: Use a subconsulta com WHERE ROWNUM <= 7.

terça-feira, 26 de agosto de 2025

DMSII

 DMSII é a sigla para **Data Management System II**, um sistema de gerenciamento de banco de dados (SGBD) que foi desenvolvido pela Burroughs Corporation em 1972. Ele é um dos SGBDs mais antigos, e historicamente competiu com sistemas como o IMS da IBM.

O DMSII foi originalmente baseado no **modelo de rede** para organização de dados, que era um dos modelos mais populares antes do surgimento e popularização dos bancos de dados relacionais. Em um banco de dados de rede, os dados são estruturados como um grafo, permitindo que cada "registro filho" tenha vários "registros pai", o que pode ser mais complexo do que o modelo hierárquico, mas mais flexível.

Atualmente, o DMSII ainda é usado em alguns sistemas de grande porte (mainframes) da **Unisys** (empresa que surgiu da fusão da Burroughs e Sperry). Ele é parte integrante da arquitetura **ClearPath MCP** da Unisys, que é usada em várias aplicações críticas de negócios que precisam de alta disponibilidade e desempenho.

Em resumo, o DMSII é um SGBD "legado" com uma longa história, conhecido por sua robustez e uso em ambientes de mainframe, mesmo que a maioria dos bancos de dados modernos usem o modelo relacional ou NoSQL.