sexta-feira, 27 de março de 2026

ORACLE PL/SQL- Tipos de JOIN (Explicação Simples)

 ## Tipos de JOIN


Vou explicar usando duas tabelas como exemplo:

- **CLIENTES** (id, nome)

- **PEDIDOS** (id, cliente_id, valor)


### 1. **INNER JOIN** (ou só JOIN)

**Retorna apenas os registros que têm correspondência em AMBAS as tabelas.**

```sql

SELECT * FROM CLIENTES c

INNER JOIN PEDIDOS p ON c.id = p.cliente_id;

**Resultado:** Só clientes que fizeram pedidos. Clientes sem pedido NÃO aparecem.

Cliente com pedido   → aparece

Cliente sem pedido   → não aparece


### 2. **LEFT JOIN** (ou LEFT OUTER JOIN)

**Retorna TODOS os registros da tabela da ESQUERDA + correspondências da direita.**

```sql

SELECT * FROM CLIENTES c

LEFT JOIN PEDIDOS p ON c.id = p.cliente_id;

**Resultado:** Todos os clientes. Quem não tem pedido fica com NULL nos campos de pedido.

Cliente com pedido   → aparece com dados do pedido

Cliente sem pedido   → aparece com NULL nos campos do pedido


### 3. **RIGHT JOIN** (ou RIGHT OUTER JOIN)

**Retorna TODOS os registros da tabela da DIREITA + correspondências da esquerda.**

```sql

SELECT * FROM CLIENTES c

RIGHT JOIN PEDIDOS p ON c.id = p.cliente_id;

**Resultado:** Todos os pedidos. Pedidos sem cliente (raro) aparecem com NULL nos campos de cliente.

Pedido com cliente   → aparece com dados do cliente

Pedido sem cliente   → aparece com NULL nos campos do cliente


### 4. **FULL JOIN** (ou FULL OUTER JOIN)

**Retorna TODOS os registros de AMBAS as tabelas.**

```sql

SELECT * FROM CLIENTES c

FULL JOIN PEDIDOS p ON c.id = p.cliente_id;

**Resultado:** Tudo. Clientes sem pedido e pedidos sem cliente aparecem com NULLs.

Clientes com e sem pedido → todos aparecem

Pedidos com e sem cliente → todos aparecem


### 5. **CROSS JOIN**

**Produto cartesiano: cada linha da primeira combina com TODAS da segunda.**

```sql

SELECT * FROM CLIENTES

CROSS JOIN PEDIDOS;

**Resultado:** Se 10 clientes e 100 pedidos → 1.000 registros (cada cliente com cada pedido)


### 6. **SELF JOIN**

**JOIN da tabela com ela mesma.** Útil para relações hierárquicas.

```sql

SELECT e.nome AS empregado, g.nome AS gerente

FROM FUNCIONARIOS e

LEFT JOIN FUNCIONARIOS g ON e.gerente_id = g.id;


## Resumo Visual

| Tipo                    | Esquerda                                       | Direita |

| **INNER**       | ✅ só correspondentes                 | ✅ só correspondentes |

| **LEFT**          | ✅ todos                                      | ✅ só correspondentes |

| **RIGHT**       | ✅ só correspondentes                 | ✅ todos |

| **FULL**         | ✅ todos                                       | ✅ todos |


## Exemplo com diagrama mental

Tabela A          Tabela B

┌─────┐          ┌─────┐

│ 1           │          │ 2           │

│ 2           │          │ 3           │

│ 3           │          │ 4           │

│ 5           │          │             │

└─────┘          └─────┘


INNER JOIN: [2, 3]        (o que tem nos dois)

LEFT JOIN:  [1, 2, 3, 5]  (tudo de A)

RIGHT JOIN: [2, 3, 4]     (tudo de B)

FULL JOIN:  [1, 2, 3, 4, 5] (tudo de ambos)

```


## Dica prática

- **INNER JOIN**: quando só importam registros relacionados

- **LEFT JOIN**: quando não quer perder os registros da tabela principal (mais comum)

- **FULL JOIN**: quando precisa ver tudo de ambos os lados

- **RIGHT JOIN**: raro, dá pra substituir por LEFT trocando ordem das tabelas

ORACLE PL/SQL - Diferença entre NOT LIKE e <>

 ## Diferença entre NOT LIKE e <>


São operadores completamente diferentes com propósitos distintos:


### **LIKE / NOT LIKE**

- Usado para **comparação de padrões** com strings

- Permite uso de curingas: `%` (qualquer sequência) e `_` (um caractere)

- Funciona **apenas com dados do tipo texto** (VARCHAR2, CHAR, etc.)


```sql

-- Exemplos com NOT LIKE

WHERE nome NOT LIKE 'João%'     -- Não começa com "João"

WHERE nome NOT LIKE '%Silva%'   -- Não contém "Silva"

WHERE nome NOT LIKE '_____'     -- Não tem exatamente 5 caracteres

```


### **<> (ou !=)**

- Usado para **desigualdade exata**

- Compara valores completos

- Funciona com **qualquer tipo de dado** (números, datas, textos)


```sql

-- Exemplos com <>

WHERE id <> 10                  -- id diferente de 10

WHERE nome <> 'João'            -- nome exatamente diferente de 'João'

WHERE data <> SYSDATE           -- data diferente de hoje

```


## Principais diferenças:


CARACTERÍSTICAS             NOT LIKE                                   <> 

 **Propósito**                            Comparação de padrão                 Desigualdade exata

 **Curingas**                             Sim (%, _)                                     Não

 **Tipo de dado**                      Apenas texto                                   Qualquer tipo 

 **NULL**                                 Retorna NULL                               Retorna NULL

 **Performance**                       Geralmente mais lento |                 Geralmente mais rápido 


## Comportamento com NULL:

**Ambos retornam NULL quando comparados com NULL:**

```sql

-- Se campo é NULL:

WHERE campo NOT LIKE '%valor%'  -- NULL (não retorna)

WHERE campo <> 'valor'          -- NULL (não retorna)


-- Para incluir NULLs, é necessário tratar:

WHERE (campo IS NULL OR campo NOT LIKE '%valor%')

```


## Exemplo prático com seu caso:


```sql

-- NOT LIKE: exclui apenas padrões específicos

WHERE PAR_X_OPERADORPARC NOT LIKE 'PARCERIA - 05'  

-- Exclui: 'PARCERIA - 05', 'PARCERIA - 05 algo', 'XPARCERIA - 05X'


-- <>: exclui apenas o valor exato

WHERE PAR_X_OPERADORPARC <> 'PARCERIA - 05'

-- Exclui APENAS: 'PARCERIA - 05' (exato, sem espaços extras)


-- Se o campo tem espaços, <> falha:

-- 'PARCERIA - 05 ' (com espaço) NÃO será excluído com <>

-- Mas será excluído com NOT LIKE 'PARCERIA - 05' (depende do padrão)

```


## Para seu cenário específico:

Se o problema é espaços em branco, considere:

```sql

-- NOT LIKE com tratamento de espaços

AND TRIM(PAR_X_OPERADORPARC) NOT LIKE 'PARCERIA - 05'


-- Ou com <> tratando espaços

AND TRIM(PAR_X_OPERADORPARC) <> 'PARCERIA - 05'

```

**Resumo:** Use `NOT LIKE` quando precisa de busca por padrão com curingas. Use `<>` para comparar valores exatos e em campos não-texto.

terça-feira, 24 de fevereiro de 2026

Visual Studio - Remover o WeatherForecast

 Se você está lendo este post, é porque você ao executar sua API, se deparou com WeatherForecast. Este é apenas um template de exemplo. São apenas dois passos para remover este template.


1 — Deletar os arquivos de exemplo

No Solution Explorer, delete:

WeatherForecast.cs (na raiz do projeto)

Controllers/WeatherForecastController.cs

Clique com botão direito em cada um → Excluir


2 — Verificar o Program.cs

Confirme que não há nenhuma referência ao WeatherForecast no seu Program.cs. O seu atual já está limpo, então não deve ter nada para remover.


Espero ter ajudado e até a próxima


segunda-feira, 23 de fevereiro de 2026

CRIAR UMA API RESTful NO VISUAL STUDIO 2022

Opção Recomendada: ASP.NET Core Web API (API Web do ASP.NET Core)


A forma mais direta é criar um projeto já configurado para API REST. Veja o passo a passo:

1. Abra o Visual Studio 2022

2. Clique em "Criar um novo projeto"

3. Pesquise por "ASP.NET Core Web API"

4. Escolha o template e clique em Avançar

5. Configure o nome e local do projeto

6. Na próxima tela, selecione: 

    o .NET 8 (LTS mais recente)

    o Marque "Use controllers" se quiser o padrão MVC, ou deixe desmarcado para usar Minimal APIs

    o Marque "Enable OpenAPI support" para ter o Swagger já configurado


Esse template já vem com tudo pronto: controller de exemplo, Swagger, configurações de CORS, etc.


Projeto Vazio com C# — Vale a pena?

Tecnicamente é possível, mas não recomendo para quem está começando ou quer agilidade. Você teria que configurar manualmente o middleware, injeção de dependência, roteamento, etc. Dá mais trabalho sem nenhum ganho real.


O que você ganha com o template Web API

Com o projeto gerado, você já tem uma estrutura como:

Controllers/ → onde ficam seus endpoints

Program.cs → configuração da aplicação

appsettings.json → configurações como connection string

Swagger disponível em /swagger ao rodar o projeto


Dica importante

Se for uma API mais simples ou moderna, o Visual Studio 2022 também oferece o template de Minimal API, que é mais enxuto e sem controllers, tudo em Program.cs. Para projetos maiores e em equipe, prefira a abordagem com Controllers.

Quer que eu te ajude com os próximos passos, como criar um CRUD completo ou conectar a um banco de dados?


ASP.NET CORE API WEB (Native AOT)

O Native AOT compila o projeto diretamente para código nativo, o que traz inicialização mais rápida e menor uso de memória. Porém tem limitações importantes:

Não suporta reflection (o que quebra muitas libs populares como Entity Framework, AutoMapper, Newtonsoft.Json, etc.)

Mais restrito e complexo de configurar

Indicado para cenários muito específicos de alta performance, como microsserviços em containers


Resumindo API Web do ASP.NET  x Core Native AOT


API Web do ASP.NET    

             

Facilidade                                 ✅ Alta

Compatibilidade com libs         ✅ Total

Performance de startup             Normal

Recomendado para iniciantes   ✅ Sim


Core Native AOT


Facilidade                                  ❌ Complexo

Compatibilidade com libs         ⚠️ Limitada

Performance de startup              Muito alta

Recomendado para iniciantes   ❌ Não


Facilidade ✅ Alta ❌ Complexo

Compatibilidade com libs ✅ Total ⚠️ Limitada

Performance de startup Normal Muito alta

Recomendado para iniciantes ✅ Sim ❌ Não


terça-feira, 17 de fevereiro de 2026

ANDROID STUDIO - OBTER SHA1 UTILIZANDO POWERSHELL

No Android Studio, abra o Terminal. Para acessar o Terminal (View > Tool Windows > Terminal).

Em seguida digite: & "C:\Program Files\Android\Android Studio\jbr\bin\keytool.exe" -list -v -alias androiddebugkey -keystore "$env:USERPROFILE\.android\debug.keystore" -storepass android -keypass android


O certificado SHA1 será exibido.


Espero ter ajudado e até a próxima.

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.