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 $$
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!