Re: Problema para construir una funcion dinamicamente

From: Leonel Fuentes Marrero <lfmarrero(at)uci(dot)cu>
To: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problema para construir una funcion dinamicamente
Date: 2012-02-08 19:45:14
Message-ID: cd769dd1-9132-41c2-b127-3842b74054ef@ucimail1.uci.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Vale, gracias a todos por la ayuda y saludos para los que conosco y me conocen, terminé haciendolo de una forma que no se si será la más optima pero funciona y aquí va...

CREATE OR REPLACE FUNCTION check_table_schema(_schema text)
RETURNS void AS
$BODY$
begin
------------------------------------------------------------------------
execute 'CREATE OR REPLACE FUNCTION provisional(_schema text)
RETURNS void AS ' || '$' || 'BODY' || '$' || '
declare
-- variables
begin
-- ....
end;
' || '$' || 'BODY' || '$' || '
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION check_table_schema(_schema text)
OWNER TO postgres; ';
perform provisional($1::text);
drop FUNCTION provisional(_schema text);
end;
-----------------------------------------------------------------------
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION check_table_schema(_schema text)
OWNER TO postgres;

eso era todo lo que tenia que escribir, por el momento.

----- Mensaje original -----
De: "Alvaro Herrera" <alvherre(at)alvh(dot)no-ip(dot)org>
Para: "Leonel Fuentes Marrero" <lfmarrero(at)uci(dot)cu>
CC: "Ayuda" <pgsql-es-ayuda(at)postgresql(dot)org>
Enviados: Miércoles, 8 de Febrero 2012 9:05:40
Asunto: Re: [pgsql-es-ayuda] Problema para construir una funcion dinamicamente

Excerpts from Leonel Fuentes Marrero's message of mié feb 08 10:25:33 -0300 2012:
> Hola Familia:
>
> Quiero construir una función dinámicamente y me da error.

> -------------------------------------------------------------
> CREATE OR REPLACE FUNCTION loca(_var text)
> RETURNS void AS
> $BODY$
> declare
> nuevas record;
> inicio record;
> nomb varchar;
> script text;
> begin
> script:= '
> SELECT * from pg_catalog.pg_class pgc,pg_catalog.pg_namespace pgn where pgc.relname = ' || '''loca1''' || ' and pgc.relnamespace=pgn.oid and pgn.nspname=' || '''' || $1::text || '''' || ';
> if not found then
> create table loca1 (id int);
> else
> insert into loca1 values (1);
> insert into loca1 values (2);
> insert into loca1 values (3);
> end if;
> ';
>
> execute script;
> end;
> $BODY$

Aquí no estás creando una función. Lo que estás haciendo es ejecutar
código dinámico con execute. Creo que tu problema es que estás tratando de
usar execute como si fuera una especie de "eval", que hipotéticamente
tomara un trozo de código y lo ejecutara como si fuera código plpgsql.
EXECUTE no hace eso; lo que hace es tomar un trozo de código y lo
ejecuta como si fuera SQL. No tengo claro cuál es el propósito de poner
ese "if" dentro del execute en vez de fuera, pero esto no puede
funcionar.

Quizás te sirva poner un DO ahí, o sea:

execute 'DO $$ select bla bla; if foo then bar; end if; $$'

A todo esto, otra cosa que no está bien en tu código es que estás usando
SELECT dentro de ese trozo de código, lo cual no funciona bien; usa
PERFORM.

--
Álvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>

Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU!
http://www.antiterroristas.cu
http://justiciaparaloscinco.wordpress.com

--
Ing. Leonel Fuentes Marrero

Fin a la injusticia, LIBERTAD AHORA A NUESTROS CINCO COMPATRIOTAS QUE SE ENCUENTRAN INJUSTAMENTE EN PRISIONES DE LOS EEUU!
http://www.antiterroristas.cu
http://justiciaparaloscinco.wordpress.com

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2012-02-08 20:24:38 Re: Problema para construir una funcion dinamicamente
Previous Message Juan Carlos Ramirez Zambrano 2012-02-08 19:29:29 Re: Pregunta sobre catalogos