# Da MySQL a Oracle PL/SQL: 13 dialetti, keyword case e minify

> Formatter SQL online in 13 dialetti: MySQL, Postgres, SQLite, T-SQL, BigQuery, Snowflake, Trino, Oracle. Indentazione, keyword case, minify.

Strumento gratuito nel browser (nessun upload): https://www.mauriziofonte.it/strumenti/sql-formatter

Formatta query SQL in **13 dialetti** diversi: MySQL, MariaDB, PostgreSQL, SQLite, MS SQL Server (T-SQL), BigQuery, Snowflake, Redshift, Spark SQL, Trino/Presto, DB2, Oracle PL/SQL e standard SQL. Indentazione configurabile, keyword case (UPPERCASE classico, lowercase moderno o preserve), modalità minify per inserire la query in stringa di codice o in un log su singola riga.

## Come usare il formatter

1. **Scegli il dialetto** - Default MySQL. Per altri DB usare il dialetto specifico: PostgreSQL gestisce ARRAY, JSON, RETURNING; MS SQL T-SQL gestisce TOP, OUTPUT, CROSS APPLY; BigQuery gestisce MERGE, EXCEPT clause specifiche. Il formatter rispetta la grammatica del dialetto scelto.
2. **Configura case keywords** - lowercase: SELECT, FROM, WHERE -> select, from, where (default convention moderna). UPPERCASE: stile classico anni 90, ancora preferito da molti DBA. preserve: mantiene il case originale.
3. **Indentazione** - 2 spaces (default JS/Node convention), 4 spaces (Python/Java/SQL classico), Tab (vim/.editorconfig). Output sempre normalizzato a una scelta consistente.
4. **Minify** - Per query da inserire in stringa di codice o log: minify rimuove commenti (-- e /* */), collapsa whitespace a singolo spazio, trim. Output in single line.

## Multi-dialect serio e privacy operativa

**Grammatiche dedicate per dialetto.** Molti formatter online si limitano a un parser ANSI SQL standard che non riflette la realtà operativa: le stored procedure PL/SQL hanno `BEGIN/EXCEPTION/END` che lo standard non conosce, BigQuery usa `STRUCT`, `ARRAY_AGG`, `EXCEPT` con parsing rule custom, T-SQL aggiunge `TOP`, `OUTPUT`, `CROSS APPLY` e i delimiter MySQL stored proc cambiano la grammatica del batch. Il formatter qui usa una grammatica dedicata per ciascuno dei 13 dialetti supportati, inclusi i riservati specifici e i construct non-standard.

**Privacy operativa.** Le query SQL sono spesso confidenziali: contengono nomi di tabelle interne, schema di business, talvolta valori reali in clausole `WHERE` (email di clienti, identificatori interni). Caricarle su un sito web per ottenerne il pretty-print è un anti-pattern documentato per chi gestisce database di produzione. Qui la formattazione avviene direttamente nel browser: la query non transita per backend di terze parti.

**Riconoscimento dei placeholder.** Le query parametrizzate vengono trattate come token opachi e mantenute così come sono nell'output: funziona per `?` (MySQL, SQLite), `$1` (PostgreSQL), `:name` (Oracle, MySQL bind), `@name` (T-SQL). Utile per copiare la query da un log applicativo, formattarla per leggibilità e rieseguirla senza dover sostituire i parametri prima.

## Glossario

- **Dialetto SQL**: Variante di SQL specifica di un DBMS. Standard ANSI SQL è la base, ma ogni vendor ha estensioni proprie (T-SQL Microsoft, PL/SQL Oracle, PL/pgSQL Postgres, ecc.). Il formatter qui copre 13 dialetti.
- **Keyword case**: Convenzione di capitalizzazione delle parole riservate SQL: UPPERCASE classico (SELECT, WHERE), lowercase moderno (select, where), preserve (mantieni input).
- **T-SQL**: Transact-SQL, dialetto SQL di Microsoft SQL Server e Sybase. Estensioni: TOP n, OUTPUT clause, CROSS APPLY, variabili @nome, batch GO, BEGIN TRY/CATCH.
- **PL/SQL**: Procedural Language SQL di Oracle. Aggiunge a SQL: BEGIN/EXCEPTION/END, cursor esplicito, RECORD type, packages, triggers, trasloccazioni atomiche estese.

## Domande frequenti

### Il formatter è compatibile con il mio dialetto specifico (es. CockroachDB, ClickHouse)?

I 13 dialetti coperti sono i più comuni. CockroachDB è compatibile sintatticamente con PostgreSQL, quindi usa quel dialetto. ClickHouse ha sintassi sua specifica (FORMAT, MATERIALIZED VIEW custom): per ora usa standard SQL e correggi a mano se serve. Se serve un dialetto specifico, sql-formatter è open source e nuovi dialetti vengono aggiunti regolarmente.

### Stored procedure complete con CREATE PROCEDURE, BEGIN, EXCEPTION sono supportate?

Si per i dialetti che le hanno (T-SQL, PL/SQL, MySQL stored proc). Il formatter riconosce BEGIN/END nesting, IF/ELSE, EXCEPTION/WHEN handlers. Per script multi-statement con DELIMITER (MySQL custom delimiter), il delimitatore alternativo viene riconosciuto.

### Posso formattare migliaia di query in batch?

Una alla volta dall'interfaccia. Per workflow batch i tool della stessa famiglia esistono come pacchetto npm (`sql-formatter`) e come CLI (`npx sql-formatter`): in 5 righe di Node.js leggi un file di query e le riformatti in loop, integrabile in pre-commit hook o pipeline CI.

### Mantiene i commenti (-- e /* */)?

Si, in modalità format. Sia inline (--...) che block (/*... */) vengono preservati e re-indented insieme al codice. In modalità minify vengono rimossi (è lo scopo). Per preservarli in minify, il formatter open source ha opzione `denseOperators` ma non è esposta nell'UI corrente.

### Funziona offline?

Sì. Tutto il parser e il rendering sono caricati col primo load della pagina; in seguito il formatter funziona anche senza connessione, ad esempio in scenari di lavoro su rete intermittente o air-gapped.

### Le query parametrizzate (?, $1, :name) come vengono trattate?

Come token opachi: il formatter le riconosce come placeholder e le mantiene così come sono nell'output formattato. Funziona per ? (mysql/sqlite), $1 (postgres), :name (oracle/mysql), @name (T-SQL).

### Posso usare il tool per validare la sintassi SQL?

Indirettamente: se il formatter throws errore di parsing, la query è sintatticamente invalida nel dialetto scelto. Però il formatter non è un linter: errori semantici (riferimenti a colonne inesistenti, type mismatch) richiedono il DB reale che li valida via EXPLAIN o EXECUTE.

---
Uno strumento di Maurizio Fonte, senior backend engineer. Tutti gli strumenti: https://www.mauriziofonte.it/strumenti/
