Обсуждение: plpgsql
We are trying to make some things work with plpgsql. The problem is that I
built several functions that call one another, and I thought that the way of
calling it was just making the assign:
var:=func1(arg1,arg2);
which gave me an error near ")".
Now if I did the same, but like this:
PERFORM ''SELECT func1(arg1,arg2)'';
it didn't give the error anymore. The problem was that the other function
(func1()) aparently didn't get executed (logs stop at the PERFORM).
Am I doing something wrong?
--
select 'mmarques' || '@' || 'unl.edu.ar' AS email;
-----------------------------------------------------------------
Martín Marqués | mmarques@unl.edu.ar
Programador, Administrador, DBA | Centro de Telemática
Universidad Nacional
del Litoral
-----------------------------------------------------------------
On Sat, Oct 18, 2003 at 06:48:10PM -0300, Martin Marques wrote: > We are trying to make some things work with plpgsql. The problem is that I > built several functions that call one another, and I thought that the way of > calling it was just making the assign: > > var:=func1(arg1,arg2); Have you tried plpgsql's SELECT INTO ? FWIW this works for me: alvh=> create function a() returns text as 'select ''foo''::text' language sql; CREATE FUNCTION alvh=> create or replace function b() returns text as 'declare b text; begin select into b a(); return b; end;' languageplpgsql; CREATE FUNCTION alvh=> select b(); b ----- foo (1 registro) alvh=> create or replace function b() returns text as 'declare b text; begin b := a(); return b; end;' language plpgsql; CREATE FUNCTION alvh=> select b(); b ----- foo (1 registro) -- Alvaro Herrera (<alvherre[a]dcc.uchile.cl>) "Por suerte hoy explotó el califont porque si no me habría muerto de aburrido" (Papelucho)
Hello This works fine. I have PostgreSQL 7.4 CREATE OR REPLACE FUNCTION foo1(int, int) RETURNS int AS ' BEGIN RETURN $1 + $2; END; ' LANGUAGE plpgsql; CREATE OR REPLACE FUNCTION foo2() RETURNS boolean AS ' DECLARE i int; BEGIN i := foo1(10,10); RETURN i = 20; END; ' LANGUAGE plpgsql; testdb011=> \i pokus.sql CREATE FUNCTION CREATE FUNCTION testdb011=> select foo2(); foo2 ------ t (1 řádka) On Sat, 18 Oct 2003, Martin Marques wrote: > We are trying to make some things work with plpgsql. The problem is that I > built several functions that call one another, and I thought that the way of > calling it was just making the assign: > > var:=func1(arg1,arg2); > > which gave me an error near ")". > > Now if I did the same, but like this: > > PERFORM ''SELECT func1(arg1,arg2)''; > > it didn't give the error anymore. The problem was that the other function > (func1()) aparently didn't get executed (logs stop at the PERFORM). > > Am I doing something wrong? > >
El Dom 19 Oct 2003 18:25, Alvaro Herrera escribió:
> On Sat, Oct 18, 2003 at 06:48:10PM -0300, Martin Marques wrote:
> > We are trying to make some things work with plpgsql. The problem is that
> > I built several functions that call one another, and I thought that the
> > way of calling it was just making the assign:
> >
> > var:=func1(arg1,arg2);
>
> Have you tried plpgsql's SELECT INTO ?
OK, let me be more specific. I tried this aready with this error:
2003-10-20 09:28:05 [27039] ERROR: parser: parse error at or near ")" at
character 15
2003-10-20 09:28:05 [27039] WARNING: plpgsql: ERROR during compile of
objetosdatosactualizadicc near line 2
Now, here are the specifications about my function.
I'm building a function that does things with the fields of each row inserted.
This function is called from a Trigger. Also, this function calls another
function with does the actual job (well, it really cals some other functions,
all writen in plpgsql).
Here's the code:
CREATE OR REPLACE FUNCTION objetosdatosActualizaDicc() RETURNS TRIGGER AS '
DECLARE
newPk INT;
oldPk INT;
newVcampo VARCHAR;
oldVcampo VARCHAR;
salida RECORD;
BEGIN
IF TG_OP = ''UPDATE'' OR TG_OP = ''INSERT'' THEN
newPk := NEW.codigo;
newVcampo := NEW.titulo;
END IF;
IF TG_OP = ''UPDATE'' OR TG_OP = ''DELETE'' THEN
oldPk := OLD.codigo;
oldVcampo := OLD.titulo;
END IF;
SELECT INTO salida
actualizarDiccionario(newPk,newVcampo,oldPk,oldVcampo,
''biblioteca'',''titulo'',TG_RELNAME,TG_OP);
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
(actualizarDiccionario is declared like this:
actualizarDiccionario(INT,INT,INT,INT,VARCHAR,VARCHAR,VARCHAR,VARCHAR)
)
This is what's giving me the error:
2003-10-20 09:28:05 [27039] ERROR: parser: parse error at or near ")" at
character 15
2003-10-20 09:28:05 [27039] WARNING: plpgsql: ERROR during compile of
objetosdatosactualizadicc near line 2
If I change the last SELECT INTO for a PERFORM I don't get the error, but I
also don't get the things from actualizarDiccionario() done (as if it wasn't
executed).
--
09:28:01 up 17 days, 19:00, 3 users, load average: 0.33, 0.38, 0.36
-----------------------------------------------------------------
Martín Marqués | mmarques@unl.edu.ar
Programador, Administrador, DBA | Centro de Telematica
Universidad Nacional
del Litoral
-----------------------------------------------------------------
Martin Marques <martin@bugs.unl.edu.ar> writes:
> OK, let me be more specific. I tried this aready with this error:
> 2003-10-20 09:28:05 [27039] ERROR: parser: parse error at or near ")" at
> character 15
> 2003-10-20 09:28:05 [27039] WARNING: plpgsql: ERROR during compile of
> objetosdatosactualizadicc near line 2
Line 2 of the function is not where your assignment is; there seems to
be something wrong with your first variable declaration. I'm not sure
what --- when I copied-and-pasted the text it worked fine. One
possibility is that you seem to have tabs rather than spaces between
the variable name and datatype --- if you are trying to feed this file
in via psql, that could possibly boomerang on you.
regards, tom lane
El Lun 20 Oct 2003 10:54, escribió:
> Martin Marques <martin@bugs.unl.edu.ar> writes:
> > OK, let me be more specific. I tried this aready with this error:
> >
> > 2003-10-20 09:28:05 [27039] ERROR: parser: parse error at or near ")"
> > at character 15
> > 2003-10-20 09:28:05 [27039] WARNING: plpgsql: ERROR during compile of
> > objetosdatosactualizadicc near line 2
>
> Line 2 of the function is not where your assignment is; there seems to
> be something wrong with your first variable declaration. I'm not sure
> what --- when I copied-and-pasted the text it worked fine. One
> possibility is that you seem to have tabs rather than spaces between
> the variable name and datatype --- if you are trying to feed this file
> in via psql, that could possibly boomerang on you.
Great! I don't understand why I started putting tabs. The first 4 functions
have spaces between the variable name and the type.
That made it pass. I am now working on another function which is called from
this one.
Is there a standard way of debugging plpgsql code?
--
11:11:01 up 17 days, 20:43, 3 users, load average: 1.54, 1.68, 1.29
-----------------------------------------------------------------
Martín Marqués | mmarques@unl.edu.ar
Programador, Administrador, DBA | Centro de Telematica
Universidad Nacional
del Litoral
-----------------------------------------------------------------
Martin Marques <martin@bugs.unl.edu.ar> writes:
>> Line 2 of the function is not where your assignment is; there seems to
>> be something wrong with your first variable declaration.
> Great! I don't understand why I started putting tabs. The first 4 functions
> have spaces between the variable name and the type.
Okay. I've improved the error reporting here for 7.4. CVS tip now does
regression=# create function foo() returns int as '
regression'# declare
regression'# xyzint;
regression'# begin
regression'# ...
regression'# end' language plpgsql;
CREATE FUNCTION
regression=# select foo();
ERROR: invalid type name ""
CONTEXT: compile of PL/pgSQL function "foo" near line 2
which should be at least a little less confusing ...
regards, tom lane