sentencia COPY en un procedimiento almacenado

From: Felipe de Jesús Molina Bravo <fjmolinabravo(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: sentencia COPY en un procedimiento almacenado
Date: 2010-02-24 18:22:59
Message-ID: c31298e51002241022t62d0c1e0o3c0b165edbcb35ea@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Que tal

Quiero optimizar la inserción a una tabla (se insertan varios registros en
una sola sentencia). Investigando resulto que la sentencia COPY es mas
rápida que un INSERT. La requiero usar en un procedimiento almacenado y lo
primero que intente fue lo siguiente:

drop table pba;
create table pba
(
id integer
);

CREATE OR REPLACE FUNCTION fnpba (
) RETURNS INTEGER AS
$$
DECLARE
sql text;
BEGIN
sql= E'COPY pba(id) FROM STDIN ;\n' ||
E'1\n' ||
E'2\n' ||
E'\.';
EXECUTE sql;

return 1;

END;
$$ LANGUAGE 'plpgsql';

Marca el siguiente error:

ERROR: syntax error at or near "1"
LÍNEA 2: 1
^
CONSULTA: COPY pba(id) FROM STDIN ;
1
2
.

Escape las diagonales y marco el sig. error:

ERROR: syntax error at or near "\"
LÍNEA 1: COPY pba(id) FROM STDIN ;\n1\n2\n\.
^
CONSULTA: COPY pba(id) FROM STDIN ;\n1\n2\n\.
CONTEXTO: PL/pgSQL function "fnpba" line 8 at EXECUTE statement

Investigando un poco acerca de COPY en una función plpgsql, encontre que
plpgsql (leguaje trust) no existe la "entrada estandard".

Por lo tanto intente probarlo en "plperlu" de la siguiente forma:

CREATE OR REPLACE FUNCTION fnpba (
) RETURNS INTEGER AS
$$
my $sql= "COPY pba(id) FROM STDIN ;\n1\n2\n\\.";

elog NOTICE, 'sql ' . $sql ;

my $r = spi_exec_query($sql);

return 1;
$$ LANGUAGE 'plperlu';

obteniendo el siguiente error:

aee=# select fnpba();
NOTICE: sql COPY pba(id) FROM STDIN ;
1
2
\.
ERROR: error from Perl function "fnpba": syntax error at or near "1" at
line 7.
aee=#

Según yo esto debería correr... no veo mi error ... o quizas no puede
ejecutarse el comando COPY desde un lenguaje procedural.

Habrá alguna solución para ejecutarlo en algún lenguaje procedural?

Continuare investigando .... si encuentro algo lo postearé .... voy a tratar
de ejecutarlo en C

Saludos y gracias de antemano

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Angel Hernandez Moreno 2010-02-24 18:27:36 Re: B-Tree o HASH
Previous Message Gerardo Herzig 2010-02-24 18:19:38 Re: B-Tree o HASH