MariaDB: modo Oracle (SQL_MODE=ORACLE) para migrar PL/SQL com menos dor
Com SQL_MODE=ORACLE, o MariaDB entende boa parte da sintaxe PL/SQL. Migrar procedures do Oracle fica bem menos doloroso, embora não seja automático.

É como um adaptador de tomada universal: o aparelho (seu código PL/SQL) continua o mesmo, só muda o que está do outro lado da parede.
Este artigo faz parte da série MariaDB além do MySQL: dez recursos que existem no MariaDB e não existem no MySQL Community. Exemplos escritos para MariaDB 11.4 LTS (e 11.7+ quando indicado), comparados com MySQL 8.4 LTS.
O que é o modo Oracle?
Desde a 10.3, o MariaDB aceita SET SQL_MODE='ORACLE'. Nesse modo, o interpretador de rotinas passa a entender a sintaxe PL/SQL e os tipos e funções mais comuns do Oracle. Fui instrutor oficial de Oracle durante anos e posso dizer: não é um Oracle, mas poupa semanas de reescrita.
Código PL/SQL ──▶ [ MariaDB com SQL_MODE=ORACLE ] ──▶ executa
├─ VARCHAR2, NUMBER, RAW
├─ DECLARE ... BEGIN ... EXCEPTION ... END
├─ %TYPE, %ROWTYPE, cursores explícitos
├─ CREATE PACKAGE / PACKAGE BODY
└─ sequences, NVL, DECODE, || para concatenar
Na prática
SET SQL_MODE = 'ORACLE';
CREATE TABLE clientes (id NUMBER(10) PRIMARY KEY, nome VARCHAR2(100), limite NUMBER(12,2));
DELIMITER //
CREATE OR REPLACE PROCEDURE aumenta_limite(p_id NUMBER, p_pct NUMBER) AS
v_limite clientes.limite%TYPE;
BEGIN
SELECT limite INTO v_limite FROM clientes WHERE id = p_id;
UPDATE clientes SET limite = v_limite * (1 + p_pct / 100) WHERE id = p_id;
EXCEPTION
WHEN NO_DATA_FOUND THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cliente inexistente';
END;
//
DELIMITER ;
CALL aumenta_limite(1, 10);
SELECT 'Olá, ' || nome FROM clientes; -- || concatena, como no Oracle
Pacotes
CREATE PACKAGE financeiro AS
FUNCTION juros(valor NUMBER, taxa NUMBER) RETURN NUMBER;
END;
CREATE PACKAGE BODY financeiro AS
FUNCTION juros(valor NUMBER, taxa NUMBER) RETURN NUMBER AS
BEGIN
RETURN valor * taxa / 100;
END;
END;
SELECT financeiro.juros(1000, 2);
O que não vem junto
- Não existe a biblioteca de pacotes do Oracle (DBMS_*, UTL_*).
- Recursos como RAC, Flashback e Data Guard têm outros equivalentes (Galera, System Versioning, replicação).
- Particularidades de NULL, datas e tipos ainda exigem testes. Trate como migração assistida, não como mágica.
E no MySQL?
O MySQL não tem modo de compatibilidade Oracle nem pacotes. Toda procedure PL/SQL precisa ser reescrita na sintaxe SQL/PSM do MySQL.
A série completa: MariaDB além do MySQL
- Tabelas temporais (System Versioning) para viajar no tempo dos dados
- Períodos de aplicação e WITHOUT OVERLAPS para reservas sem conflito
- SEQUENCE, o gerador de números que o AUTO_INCREMENT não consegue ser
- INSERT e DELETE ... RETURNING, uma ida ao banco em vez de duas
- Modo Oracle (SQL_MODE=ORACLE) para migrar PL/SQL com menos dor
- Multi-master síncrono que já vem na caixa
- Banco colunar para análise sem sair do SQL
- Sharding transparente com tabelas distribuídas
- Thread pool gratuito para milhares de conexões
- Busca vetorial com índice HNSW para IA e RAG
Ainda decidindo entre os dois? Leia MySQL ou MariaDB: qual é o melhor? e o guia definitivo de MySQL.
Quer dominar a base que os dois compartilham?
MariaDB nasceu do MySQL, e tudo o que é fundamento (modelagem, índices, transações, replicação, otimização) vale para os dois. É isso que eu ensino no livro Aprendendo MySQL: Prática, Teoria, Laboratórios, Desafios e Projetos: 292 páginas, 10 laboratórios guiados, 277 exercícios e 4 desafios com gabarito, e uma máquina virtual pronta para você quebrar (e consertar) à vontade.
Conheça o livro e leia a degustação gratuita.
Bora trocar ideia?
Se este artigo te ajudou (ou te fez discordar, que também vale), me siga no LinkedIn e no Instagram. Lá eu posto bastidores de banco de dados, história da computação e histórias de produção que ninguém conta em curso oficial.
Sobre o autor: Alexandre Almeida atua com bancos de dados há mais de 25 anos, foi instrutor oficial de MySQL e Oracle para mais de 1.000 alunos e escreveu Aprendendo MySQL: Prática, Teoria e Laboratórios.
Fontes: MariaDB Server Documentation (MariaDB Knowledge Base), notas de release do MariaDB Server, MySQL 8.4 Reference Manual. Imagem de capa: ilustração gerada por IA (adaptador de tomada universal conectando dois plugues diferentes).