frustrated by plpgsql procedure
Hi guys,
I trying for days to get this simple plpgsql procedure
to run but I keep getting this error:
psql:pgsql_procedure.txt:15: ERROR: syntax error at
or near at character 17
QUERY: copy cancel TO $1 with delimiter as ',' null
as '.'
CONTEXT: SQL statement in PL/PgSQL function doedit
near line 12
psql:pgsql_procedure.txt:15: LINE 1: copy cancel TO $1
with delimiter as ',' null as '.'
psql:pgsql_procedure.txt:15:
The source code of this plpgsql procedure is:
create or replace function doedit() returns void AS $$
/* Procedure to create textfile from database table.
*/
DECLARE
i integer := 340;
start date :='2004-08-06';
eind date :='2004-08-12';
location varchar(30) :='/usr/Data/plpgtrainin';
BEGIN
create table cancel as (SOME QUERY);
location := location || i || '.txt' ::varchar(30);
raise notice 'location is here %', location;
copy cancel TO location with delimiter as ',' null as
'.' ;
END
$$ Language plpgsql;
Can somebody tell me why my location variable is NOT
working as expected? I would like to use it in a loop
to create multiple text files which names would be
different because of the way I concatenate it with the
looping variable.
Hope somebody can help me because it's a big
frustration.
Thanks in advanced.
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
Dino Vliet wrote:
Hi guys,
I trying for days to get this simple plpgsql procedure
to run but I keep getting this error:psql:pgsql_procedure.txt:15: ERROR: syntax error at
or near at character 17
QUERY: copy cancel TO $1 with delimiter as ',' null
as '.'
CONTEXT: SQL statement in PL/PgSQL function doedit
near line 12
psql:pgsql_procedure.txt:15: LINE 1: copy cancel TO $1
with delimiter as ',' null as '.'
psql:pgsql_procedure.txt:15:The source code of this plpgsql procedure is:
create or replace function doedit() returns void AS $$
/* Procedure to create textfile from database table.
*/DECLARE
i integer := 340;
start date :='2004-08-06';
eind date :='2004-08-12';
location varchar(30) :='/usr/Data/plpgtrainin';BEGIN
create table cancel as (SOME QUERY);
location := location || i || '.txt' ::varchar(30);
raise notice 'location is here %', location;
copy cancel TO location with delimiter as ',' null as
'.' ;
END
$$ Language plpgsql;
Missing semi-colon after END?
Nope:-(
I added it just now and still the same error message!!
--- Bricklen Anderson <banderson@presinet.com> wrote:
Dino Vliet wrote:
Hi guys,
I trying for days to get this simple plpgsql
procedure
to run but I keep getting this error:
psql:pgsql_procedure.txt:15: ERROR: syntax error
at
or near at character 17
QUERY: copy cancel TO $1 with delimiter as ','null
as '.'
CONTEXT: SQL statement in PL/PgSQL functiondoedit
near line 12
psql:pgsql_procedure.txt:15: LINE 1: copy cancelTO $1
with delimiter as ',' null as '.'
psql:pgsql_procedure.txt:15:The source code of this plpgsql procedure is:
create or replace function doedit() returns void
AS $$
/* Procedure to create textfile from database
table.
*/
DECLARE
i integer := 340;
start date :='2004-08-06';
eind date :='2004-08-12';
location varchar(30) :='/usr/Data/plpgtrainin';BEGIN
create table cancel as (SOME QUERY);
location := location || i || '.txt' ::varchar(30);
raise notice 'location is here %', location;
copy cancel TO location with delimiter as ',' nullas
'.' ;
END
$$ Language plpgsql;Missing semi-colon after END?
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com
Dino Vliet wrote:
Nope:-(
I added it just now and still the same error message!!
Have you tried it with your "copy" command executed dynamically?
eg. execute 'copy cancel to location ...';
Dino Vliet <dino_vliet@yahoo.com> writes:
I trying for days to get this simple plpgsql procedure
to run but I keep getting this error:
You can't ordinarily use a variable to supply a table (or field) name
in a plpgsql query; that doesn't work because plpgsql wants to cache a
plan for the query. A workaround is to build the query as a string
value, then use EXECUTE.
regards, tom lane
On Mar 27, 2006, at 2:10 PM, Dino Vliet wrote:
Can somebody tell me why my location variable is NOT
working as expected? I would like to use it in a loop
to create multiple text files which names would be
different because of the way I concatenate it with the
looping variable.
You can't just stick an arbitrary string in the middle of a SQL
statement. You can build a SQL statement and then run it with EXECUTE.
Try something like this:
create or replace function doedit() returns varchar AS $$
/* Procedure to create textfile from database table.
*/
DECLARE
i integer := 340;
start date :='2004-08-06';
eind date :='2004-08-12';
location varchar(30) :='/usr/Data/plpgtrainin';
BEGIN
create table cancel as (SOME QUERY);
location := location || i || '.txt' ::varchar(30);
raise notice 'location is here %', location;
execute 'copy cancel to ' || location || ' with delimiter as \',\'
null as \'.\'';
return location;
END;
$$ Language plpgsql;
Also note you must have super user access to use COPY, so it still
might fail if you don't have the right privileges.
John DeSoi, Ph.D.
http://pgedit.com/
Power Tools for PostgreSQL
Ok thanks for now. I understood the problem and what I
should do to fix it. Will try that later.
Thanks for all the tips and the REALLY FAST answers!!
--- John DeSoi <desoi@pgedit.com> wrote:
On Mar 27, 2006, at 2:10 PM, Dino Vliet wrote:
Can somebody tell me why my location variable is
NOT
working as expected? I would like to use it in a
loop
to create multiple text files which names would
be
different because of the way I concatenate it with
the
looping variable.
You can't just stick an arbitrary string in the
middle of a SQL
statement. You can build a SQL statement and then
run it with EXECUTE.Try something like this:
create or replace function doedit() returns varchar
AS $$
/* Procedure to create textfile from database table.
*/DECLARE
i integer := 340;
start date :='2004-08-06';
eind date :='2004-08-12';
location varchar(30) :='/usr/Data/plpgtrainin';BEGIN
create table cancel as (SOME QUERY);
location := location || i || '.txt' ::varchar(30);
raise notice 'location is here %', location;
execute 'copy cancel to ' || location || ' with
delimiter as \',\'
null as \'.\'';
return location;
END;
$$ Language plpgsql;Also note you must have super user access to use
COPY, so it still
might fail if you don't have the right privileges.John DeSoi, Ph.D.
http://pgedit.com/
Power Tools for PostgreSQL---------------------------(end of
broadcast)---------------------------
TIP 4: Have you searched our list archives?
__________________________________________________
Do You Yahoo!?
Tired of spam? Yahoo! Mail has the best spam protection around
http://mail.yahoo.com