rowtypes as arguments to functions

rowtypes as arguments to functions

am 22.12.2004 19:30:54 von Jose Fernandes

Hello

I have this function:

CREATE OR REPLACE FUNCTION data_migrate() RETURNS trigger AS'
DECLARE
dados BD%ROWTYPE;
id_produto integer;
BEGIN
-- Ok, há o problema que não se pode passar o NEW para dentro de uma função
-- Por enquanto este é o único workaround que conhece
dados.produto_codigo := NEW.produto_codigo;
dados.produto_tipo := NEW.produto_tipo;
dados.produto_nome := NEW.produto_nome;
dados.produto_preco := NEW.produto_preco;
dados.produto_desconto := NEW.produto_desconto;
dados.produto_iva := NEW.produto_iva;

-- Chama as varias funcoes de migracao
id_produto := migrate_produto(dados);
RETURN null;
END;
'LANGUAGE plpgsql;

Which calls the function:

CREATE OR REPLACE FUNCTION migrate_produto(BD) RETURNS integer AS'
DECLARE
data ALIAS FOR $1;
produto_d Produto%ROWTYPE;
BEGIN
produto_d.idProduto := NEW.produto_codigo;
produto_d.nome := NEW.produto_nome;
produto_d.preco := NEW.produto_preco;
produto_d.IVA := NEW.produto_iva;
produto_d.desconto := NEW.produto_desconto;

insert into Produto values produto_d;

return null;
END;

However this gives me the error:

psql:dados.sql:1: ERROR: column "dados" does not exist
CONTEXT: PL/pgSQL function "data_migrate" line 16 at assignment

Have i done anything wrong? I dont understand why this doesn't works.

I've been searching the web and this
http://www.webservertalk.com/archive139-2004-3-161754.html
says
"plpgsql also doesn't support passing whole record variables into SQL
commands"

However in the pgSQL section in the manual you can read:
"Functions written in PL/pgSQL can accept as arguments any scalar or array
data type supported (..). They can also accept or return any composite
(row type) specified by name."
which makes me wonder how i can call such a function.

Don't you think the manual should specify this more carefully?
Do you know a workaround for this?

Thank you!