CodeGym /Cursos /SQL SELF /Comparação do PL/pgSQL com outras linguagens de programaç...

Comparação do PL/pgSQL com outras linguagens de programação procedural (PL/SQL, T-SQL)

SQL SELF
Nível 49 , Lição 2
Disponível

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:

  1. 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.
  2. 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.

  3. Estruturas de controle

    Todas suportam IF...THEN, CASE, LOOP, FOR, WHILE, o que permite escrever algoritmos mais complexos.

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

2
Tarefa
SQL SELF, nível 49, lição 2
Bloqueado
Criando uma função simples para contar linhas
Criando uma função simples para contar linhas
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION