No mundo dos bancos de dados existem várias linguagens que expandem o SQL tradicional e deixam você escrever lógica de negócio direto dentro do SGBD. Cada uma é feita pra sua plataforma, mas no fim das contas todas resolvem o mesmo problema — automatizar, simplificar e agilizar o trampo com dados. Entre essas linguagens estão: PL/pgSQL pro PostgreSQL, PL/SQL pro Oracle e T-SQL pro SQL Server. Cada uma tem suas manhas, vantagens e detalhes, e é disso que vamos falar agora.
PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language) — é uma linguagem procedural integrada no PostgreSQL. O objetivo principal dela é turbinar o SQL, dando pra galera recursos de variáveis, loops, estruturas de controle e bloco de tratamento de erro. Isso faz dela uma ferramenta poderosa pra implementar lógica de negócio pesada direto no banco.
PL/SQL (Procedural Language/SQL) — é a linguagem procedural embutida no Oracle. Ela oferece recursos parecidos pra manipular dados e criar procedures, funções e pacotes. O PL/SQL é considerado bem maduro por causa de décadas de evolução e uma baita ecossistema de ferramentas.
T-SQL (Transact-SQL) — é a linguagem criada pela Microsoft pro SQL Server. É uma extensão do SQL padrão, incluindo suporte a variáveis, estruturas de controle e outros elementos de programação procedural. O T-SQL tem suas particularidades em transações, cursores e manipulação de JSON.
Semelhanças entre PL/pgSQL, PL/SQL e T-SQL
De cara, todas essas linguagens parecem bem parecidas. E não é à toa, já que o objetivo delas é o mesmo — ajudar o dev a implementar lógica de negócio dentro do banco. Bora ver os principais pontos em comum:
Sintaxe de blocos
As três linguagens têm um formato estruturado pra escrever código procedural. Os principais elementos:
- Declaração de variáveis.
- Bloco principal de execução (
BEGIN ... END). - Suporte a tratamento de exceções.
Variáveis
Você pode declarar e usar variáveis em qualquer uma dessas linguagens. Exemplo de declaração de variável em PL/pgSQL:
DECLARE id_do_aluno INT; BEGIN id_do_aluno := 10; END;Dá pra fazer igual no PL/SQL e no T-SQL também.
Estruturas de controle
Todas suportam
IF...THEN,CASE,LOOP,FOR,WHILE, o que permite escrever algoritmos mais complexos.Funções e procedures
Dá pra criar e chamar funções e procedures customizadas, que podem retornar tanto valores únicos quanto tabelas.
Diferenças entre PL/pgSQL, PL/SQL e T-SQL
Quem programa sempre acaba caindo numa situação onde precisa migrar de um banco pra outro. Nessas horas, é importante sacar as diferenças das linguagens. Bora ver os principais pontos.
Declaração de variáveis
PL/pgSQL: variáveis são declaradas no bloco DECLARE. Pra atribuir valor, usa :=.
DECLARE
total_de_alunos INT;
BEGIN
total_de_alunos := 5;
END;
PL/SQL: a declaração é parecida com o PL/pgSQL, mas o tipo da variável pode ser herdado de uma coluna da tabela usando %TYPE.
DECLARE
nome_do_aluno alunos.nome%TYPE;
BEGIN
nome_do_aluno := 'João';
END;
T-SQL: variáveis são declaradas com a palavra-chave DECLARE, atribuição é via SET ou SELECT.
DECLARE @total_de_alunos INT;
SET @total_de_alunos = 5; -- ou
SELECT @total_de_alunos = COUNT(*) FROM alunos;
Tratamento de erros
PL/pgSQL: usa o bloco EXCEPTION pra tratar erros. Exemplo:
BEGIN
SELECT * INTO minha_var FROM tabela_inexistente;
EXCEPTION
WHEN others THEN
RAISE NOTICE 'Rolou um erro!';
END;
PL/SQL: também usa EXCEPTION, mas com uma classificação de erros mais detalhada.
BEGIN
SELECT * INTO minha_var FROM tabela_inexistente;
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nenhum dado encontrado!');
END;
T-SQL: usa as estruturas TRY...CATCH.
BEGIN TRY
SELECT 1/0; -- Erro de divisão por zero
END TRY
BEGIN CATCH
PRINT 'Rolou um erro!';
END CATCH;
Trabalho com cursores
PL/pgSQL: cursores são implícitos e podem ser usados em loops.
FOR linha IN SELECT * FROM alunos LOOP
RAISE NOTICE 'Aluno: %', linha.nome;
END LOOP;
PL/SQL: cursores são estruturas declaradas explicitamente. Exemplo:
DECLARE
CURSOR cursor_aluno IS SELECT * FROM alunos;
linha_aluno alunos%ROWTYPE;
BEGIN
OPEN cursor_aluno;
FETCH cursor_aluno INTO linha_aluno;
CLOSE cursor_aluno;
END;
T-SQL: cursores são declarados com a palavra-chave CURSOR.
DECLARE cursor_aluno CURSOR FOR SELECT nome FROM alunos;
OPEN cursor_aluno;
FETCH NEXT FROM cursor_aluno;
CLOSE cursor_aluno;
DEALLOCATE cursor_aluno;
Trabalho com transações
PL/pgSQL: transações são controladas com os comandos BEGIN, COMMIT, ROLLBACK.
PL/SQL: transações também são controladas com COMMIT, ROLLBACK, e tem suporte a SAVEPOINT.
T-SQL: tem suporte a BEGIN TRANSACTION pra marcar o início da transação.
Suporte a JSON
PL/pgSQL: trabalha muito bem com JSON usando os tipos JSON e JSONB. Exemplo:
SELECT dados->>'chave' FROM tabela_json;
PL/SQL: suporte a JSON chegou depois e é um pouco menos flexível.
T-SQL: trabalhar com JSON é bem de boa usando as funções JSON_QUERY, JSON_VALUE.
Quando usar PL/pgSQL, PL/SQL ou T-SQL?
PL/pgSQL:
- É a escolha óbvia se seu banco é PostgreSQL.
- Ótimo pra processar grandes volumes de dados graças ao suporte a tipos poderosos (
JSONB, arrays). - Ecossistema aberto, flexível.
PL/SQL:
- É o caminho pra produtos Oracle.
- Ecossistema rico pra manipulação de dados (pacotes, procedures embutidas).
T-SQL:
- Usado no Microsoft SQL Server.
- Ideal pra apps Microsoft e integração com o stack Microsoft Azure.
Exemplo da mesma tarefa em PL/pgSQL, PL/SQL e T-SQL
Tarefa: contar o número de alunos e retornar o resultado
PL/pgSQL:
CREATE FUNCTION contar_alunos() RETURNS INT AS $$
DECLARE
total INT;
BEGIN
SELECT COUNT(*) INTO total FROM alunos;
RETURN total;
END;
$$ LANGUAGE plpgsql;
PL/SQL:
CREATE OR REPLACE FUNCTION contar_alunos RETURN NUMBER IS
total NUMBER;
BEGIN
SELECT COUNT(*) INTO total FROM alunos;
RETURN total;
END;
T-SQL:
CREATE FUNCTION contar_alunos()
RETURNS INT
AS
BEGIN
DECLARE @total INT;
SELECT @total = COUNT(*) FROM alunos;
RETURN @total;
END;
Agora você já tem uma ideia das diferenças entre PL/pgSQL, PL/SQL e T-SQL. Cada linguagem tem suas particularidades e cenários de uso que fazem dela única. A escolha da linguagem (e do banco) sempre depende do que você precisa e das características do seu projeto.
GO TO FULL VERSION