2008/10/29 tetraetila(R) <[EMAIL PROTECTED]>
>
> Pessoal
>
> Minha função abaixo está me retornando o seguinte erro:
>
> ERROR: record "myrec" has no field "id"
> CONTEXT: PL/pgSQL function "whichrowslocked" line 10 at assignment
>
O erro esta' descrito nos comentarios do proprio blog de onde voce
copiou essa funcao. Encontrei sem nem saber de onde ela tinha vindo,
so' desconfiei que nao era voce quem tinha escrito.
CREATE OR REPLACE FUNCTION whichrowslocked(text,text)
RETURNS SETOF TEXT
LANGUAGE plpgsql
VOLATILE
STRICT
AS
$gsm$
DECLARE
myrec RECORD;
myst TEXT;
innermyst TEXT;
BEGIN
myst = 'SELECT '||quote_ident($2)||'AS id FROM '||quote_ident($1);
innermyst = 'SELECT '||quote_ident($2)||' AS id FROM '
||quote_ident($1)||' WHERE '||quote_ident($2)||'=';
FOR myrec IN EXECUTE myst LOOP
myst = innermyst||myrec.id||' FOR UPDATE NOWAIT';
BEGIN
EXECUTE myst;
EXCEPTION WHEN lock_not_available THEN
RETURN NEXT myrec.id;
END;
END LOOP;
RETURN;
END;
$gsm$;
Note que o proprio autor diz o seguinte:
"The above function is inefficient, does not scale well, and assumes
some things about your tables..."
"For a better solution to the which-row-is-locked problem, I'd
recommend using the pgrowlocks[1] contrib module by Tatsuo Ishii,
which I'll go over in detail in a later article."
Ou seja, a funcao e' claramente ineficiente. Voce deveria procurar uma
solucao melhor, como apontada pelo proprio autor da funcao, e usar o
pgrowlocks. Ele faz parte do contrib que acompanha o PostgreSQL, e e'
empactoado separadamente em varias distribuicoes do Linux. Basta ler
as instrucoes do modulo de como instala-lo e usa-lo.
Roberto
[1] http://www.postgresql.org/docs/8.3/static/pgrowlocks.html
--
http://blog.divisiblebyfour.org/
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral