← Voltar ao hub MariaDB
MariaDB 22 de outubro de 2026 5 min de leitura

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.

MariaDB: modo Oracle (SQL_MODE=ORACLE) para migrar PL/SQL com menos dor

É 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

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).