Обсуждение: Function xxxx() does no exist

Поиск
Список
Период
Сортировка

Function xxxx() does no exist

От
Philippe Lefèvre
Дата:
I've already sent this request for help to the novice mail list but I <br />never get any answer. So I wonder if it
wasthe good list for that kind <br />of question and I'm publishing it here. <br />(thousand of apologies if I'm wrong
!)<p>I'm a beginner with postgres and I'm trying to understand how I can <br />workaround the FOREIGN KEY mechanism
withinPostgres. <p>I've read that it's not supported yet (before rel 7) and I can use a trigger but I have some trouble
witha Function. <p>So I created: <br />CREATE TABLE "tbl_article" ( <br />   "i_article" serial PRIMARY KEY, <br />  
"repere"text, <br />   "refmedia" int4 NOT NULL, <br />   "theme" int4 NOT NULL, <br />   "mot_cle1" int4 NOT NULL, <br
/>  "mot_cle2" int4, <br />   "mot_cle3" int4); <p>and: <br /> CREATE TABLE "tbl_theme" ( <br />    "i_theme" serial
PRIMARYKEY, <br />    "theme" text NOT NULL UNIQUE); <p>then: <br />  CREATE FUNCTION chk_itheme_proc(int4) RETURNS
int4<br />    AS 'SELECT COUNT(i_theme) FROM tbl_theme <br />    WHERE i_theme = $1;' <br />    LANGUAGE 'sql'; <p>and
Icreated a trigger: <br /> CREATE TRIGGER chk_itheme_trig BEFORE INSERT OR UPDATE ON tbl_article <br />    FOR EACH ROW
EXECUTEPROCEDURE chk_itheme_proc ('theme'); <p>but I get the message: <br />     ERROR:  CreateTrigger: function
chk_itheme_proc()does not exist <p>If I do: <br />SELECT theme FROM tbl_article <br />   WHERE chk_itheme_proc(5) = 1; 
--i_theme goes from 1 to 12 <p>theme <br />----- <br />   11 <br />(1 row) <p>If I do now: <br />SELECT theme FROM
tbl_article<br />   WHERE chk_itheme_proc(15) = 1; <br />theme <br />----- <br />(0 row) <p>So I can see that the
functionis available .... <p>I'm stuck with this issue and I wasn't able to find any help on <br />documentations.
<p>Isthere somebody who could help me ??? <p>Many thanks in advance, <br />PhiL <pre>-- 
 
==============================================================================
*  PhiL is using a Linux Kernel 2.2.14                                       *
==============================================================================</pre>  

Re: Function xxxx() does no exist

От
Tom Lane
Дата:
Philippe Lefèvre <ph.l@libertysurf.fr> writes:
> So I created:
>   CREATE FUNCTION chk_itheme_proc(int4) RETURNS int4
>     AS 'SELECT COUNT(i_theme) FROM tbl_theme
>     WHERE i_theme = $1;'
>     LANGUAGE 'sql';

> and I created a trigger:
>  CREATE TRIGGER chk_itheme_trig BEFORE INSERT OR UPDATE ON tbl_article
>     FOR EACH ROW EXECUTE PROCEDURE chk_itheme_proc ('theme');

> but I get the message:
>      ERROR:  CreateTrigger: function chk_itheme_proc() does not exist

Poorly worded error message, I'd say.  You have a function
chk_itheme_proc(int4), but the trigger as you show it requires a
function with a signature of chk_itheme_proc(text) or something close
to it.  Those are different functions.

The error message ought to print out the expected parameter types to
remind you about that...
        regards, tom lane


Re: Function xxxx() does no exist

От
wieck@debis.com (Jan Wieck)
Дата:
> Philippe Lefèvre <ph.l@libertysurf.fr> writes:
> > So I created:
> >   CREATE FUNCTION chk_itheme_proc(int4) RETURNS int4
> >     AS 'SELECT COUNT(i_theme) FROM tbl_theme
> >     WHERE i_theme = $1;'
> >     LANGUAGE 'sql';
>
> > and I created a trigger:
> >  CREATE TRIGGER chk_itheme_trig BEFORE INSERT OR UPDATE ON tbl_article
> >     FOR EACH ROW EXECUTE PROCEDURE chk_itheme_proc ('theme');
>
> > but I get the message:
> >      ERROR:  CreateTrigger: function chk_itheme_proc() does not exist
>
> Poorly worded error message, I'd say.  You have a function
> chk_itheme_proc(int4), but the trigger as you show it requires a
> function with a signature of chk_itheme_proc(text) or something close
> to it.  Those are different functions.
>
> The error message ought to print out the expected parameter types to
> remind you about that...

No,
   trigger procedures in Postgres are allways defined to take no   arguments and have a return type "opaque".
   The main error above is, that the "sql"  language  cannot  be   used to define a trigger!
   Use  the  PL/pgSQL  or  PL/Tcl  languages  instead.   They're   documented in the programmers manual.  Version 7.0
will have   PL/Perl  too,  but  I  don't know if that one can be used for   trigger procs yet.
 


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#========================================= wieck@debis.com (Jan Wieck) #