1
resposta

INSERT com variáveis

Estou com uma dúvida.

Seria sobre como fazer um insert utilizando uma função, porém os valores inseridos na tabela será uma variável, desse modo sempre que a função for chamada deverá ser informado os valores a serem inseridos na tabela.

Por exemplo:

Para cadastrar os colaboradore de uma empresa, foi criado uma tabela chamada "Colaboradores".

CREATE TABLE Colaboradores ( 

        ID SERIAL PRIMARY KEY,
        nome_colab VARCHAR (255) NOT NULL,
        salario_colab NUMERIC (10,2) NOT NULL

);

A partir dessa tabela será inserido os valores pela nossa função.

CREATE OR REPLACE FUNCTION  inserir_colab (Variavel_Nome, Variavel_Salario) RETURNS Colaboradores $$

        DECLARE Variavel_Nome VARCHAR;
        DECLARE Variavel_Salario NUMERIC;

        BEGIN

                INSERT INTO Colaboradores ( nome_colab, salario_colab) VALUES (Variavel_Nome, Variavel_Salario);

                RETURNS Colaboradores;

        END;

$$ LANGUAGE plpgsql;


SELECT inserir_colab (Variavel_Nome, Variavel_Salario);
1 resposta

Olá Vinicius, tudo bem?

Peço desculpas pela demora no retorno.

Ao executar a sua função, um erro é retornado e a função acaba não sendo criada, o erro retornado é o LINE 1: ...b (Variavel_Nome, Variavel_Salario) RETURNS Colaboradores $$

erro retornado ao tentar executar o código para a criação da função do Vinicius

Esse erro está sendo gerado por alguns motivos:

  • Não ter declarado o tipo das variáveis no parâmetro
  • Ausência da cláusula “AS” após o “RETURNS Colaboradores”
  • Não ter declarado explicitamente um alias(“apelido”) no DECLARE para os parâmetros

Você precisaria fazer essa declaração de um alias para os parâmetros, pois quando criamos uma função no postgreSQL e passamos parâmetros para essa função, internamente, esses parâmetros são nomeados com identificadores numérico, como por exemplo, $1 $2 $3, e assim vai. Então, quando vamos chamar os parâmetros dentro da função, utilizamos o seu identificador ao invés do nome.

Para utilizar o nome do parâmetro, ao invés do identificador numérico, é necessário declarar um alias para o parâmetro, ou seja, podemos dar um apelido para ele.

Existem duas formas de declarar um alias:

  • Dar um nome ao parâmetro no comando de criação da função

Ao invés de passar só o tipo, informamos também um nome para o parâmetro:

CREATE FUNCTION dobra_salario(instrutor instrutor) RETURNS DECIMAL AS $$
    SELECT instrutor.salario * 2 AS salario_pretendido;
$$ LANGUAGE SQL;
  • Declarar explicitamente um alias, usando a sintaxe de declaração

Passamos apenas um tipo no momento de criar a função e no bloco DECLARE, criamos um alias para o parâmetro:

CREATE FUNCTION dobra_salario(instrutor) RETURNS DECIMAL AS $$
DECLARE
    instrutor ALIAS FOR $1;
BEGIN
    RETURN instrutor.salario * 2 AS salario_pretendido;
END;
$$ LANGUAGE plpgsql;

Normalmente a primeira é a forma mais utilizada, passando o tipo e nome do parâmetro na criação da função. Mas, fique a vontade para utilizar a forma que desejar Vinicius.

Após analisar a sua função, ela ficou da seguinte forma:

CREATE OR REPLACE FUNCTION  inserir_colab (Variavel_Nome varchar(255), Variavel_Salario numeric(10,2)) RETURNS VOID  AS $$
DECLARE
    Variavel_Nome ALIAS FOR $1;
    Variavel_Salario ALIAS FOR $2;
BEGIN
    INSERT INTO Colaboradores (nome_colab, salario_colab) VALUES (Variavel_Nome, Variavel_Salario);
END;
$$ LANGUAGE plpgsql;
  • Foi declarado o tipo das variáveis no parâmetro
  • Foi declarado um alias(“apelido”) para os parâmetros
  • Como o objetivo da função é apenas inserir os dados, não é necessário retornar um valor

Outra forma de resolver este problema, seria retornar uma tabela, sempre que a função for executada:

CREATE OR REPLACE FUNCTION  inserir_colab_retorna_tabela (Variavel_Nome varchar, Variavel_Salario numeric) 
RETURNS TABLE (id int, nome_colab varchar, salario_colab numeric) AS $$
DECLARE
    Variavel_Nome ALIAS FOR $1;
    Variavel_Salario ALIAS FOR $2;
BEGIN
    INSERT INTO Colaboradores (nome_colab, salario_colab) VALUES (Variavel_Nome, Variavel_Salario);
    RETURN QUERY SELECT c.id, c.nome_colab, c.salario_colab FROM Colaboradores as C;
END;
$$ LANGUAGE plpgsql; 
  • Foi declarado o tipo das variáveis no parâmetro
  • Foi declarado um alias(“apelido”) para os parâmetros
  • Retorna uma tabela com os dados inseridos sempre que a função for chamada

Vou deixar aqui para você Vinicius links da documentação do PostgreSQL, que podem te ajudar na dúvida sobre a criação de funções.

Espero ter ajudado e bons estudos!