Thread: Syntax help please

Syntax help please

From
"Ruben Gouveia"
Date:
<div dir="ltr">I can't for the life of me figure out what's wrong with this syntax. I get the following error when i
tryand create this function.<br /><br /><i style="color: rgb(255, 0, 0);">ERROR:  syntax error at or near "$2" at
character15<br /> QUERY:  SELECT   $1   $2  :=  $3  ||  $4  ||  $5 <br />CONTEXT:  SQL statement in PL/PgSQL function
"fcn_gen_statement"near line 24</i><br style="color: rgb(255, 0, 0);" /><br />here's what i am trying to create:<br
/><br/>CREATE OR REPLACE FUNCTION fcn_gen_statement(p_type varchar, <br />                                            
p_wherevarchar,<br />                                             p_newonly numeric)<br />RETURNS varchar AS $$<br
/><br/>DECLARE<br />    c_select varchar(64) := 'select count(distinct <a href="http://m.id">m.id</a>) ';<br />   
c_fromvarchar(64) := 'from job m ';<br />    c_newonly_from varchar(128) := 'from (select id, min(date_created) as
date_created'||<br />                                          'from hr '||<br
/>                                        'group_by id) m ';<br />    v_from varchar(512);<br />    v_where
varchar(512);<br/>    v_stmt varchar(2048);                                  <br /><br />BEGIN<br />    if p_newonly =
1then<br />        v_from := c_newonly_from;<br />    else<br />        v_from := c_from;<br />    end if;<br /><br
/>   if upper(p_type) = 'NEW' then<br />        v_stmt := c_select || v_from || p_where;<br />     elsif upper(p_type)
='OLD' then<br />        v_from := c_from ;<br />        v_where := p_where<br />        v_stmt := c_select || v_from
||v_where;<br />    elsif upper(p_type) = 'LAST_JOB' then<br />        v_from := v_from || <br />             ',
(selectdistinct job_id ' ||<br />            'from job_log' ||<br />            'where status = 10) d ';<br />       
v_where:= p_where ||<br />            'and <a href="http://m.id">m.id</a> = d.job_id ';<br />         v_stmt :=
c_select|| v_from || v_where;<br />    elsif upper(p_type) = 'NEW_JOB' then<br />        v_from := v_from ||<br
/>           ', (select distinct job_id ' ||<br />            'from job_log' ||<br />             'where status = 12) d
';<br/>        v_where := p_where ||<br />            'and <a href="http://m.id">m.id</a> = d.job_id ';<br />       
v_stmt:= c_select || v_from || v_where;<br /><br />    end if;<br />     return (v_stmt);<br />END;<br />$$ LANGUAGE
plpgsql;<br/></div> 

Re: Syntax help please

From
"Fernando Hevia"
Date:
You seem to be missing a ';' in this line:       v_from := c_from ;       v_where := p_where            <--- missing ;
here      v_stmt := c_select || v_from || v_where;
 

Regards,
Fernando



________________________________
De: pgsql-sql-owner@postgresql.org
[mailto:pgsql-sql-owner@postgresql.org] En nombre de Ruben GouveiaEnviado el: Jueves, 04 de Septiembre de 2008
16:37Para:pgsql-sql@postgresql.orgAsunto: [SQL] Syntax help pleaseI can't for the life of me figure out what's wrong
withthis syntax.
 
I get the following error when i try and create this function.ERROR:  syntax error at or near "$2" at character
15QUERY: SELECT   $1   $2  :=  $3  ||  $4  ||  $5 CONTEXT:  SQL statement in PL/PgSQL function "fcn_gen_statement"
 
near line 24here's what i am trying to create:CREATE OR REPLACE FUNCTION fcn_gen_statement(p_type varchar,
                               p_where varchar,                                             p_newonly numeric)RETURNS
varcharAS $$DECLARE    c_select varchar(64) := 'select count(distinct m.id) ';    c_from varchar(64) := 'from job m ';
 c_newonly_from varchar(128) := 'from (select id,
 
min(date_created) as date_created '||                                         'from hr '||
          'group_by id) m ';    v_from varchar(512);    v_where varchar(512);    v_stmt varchar(2048);
               BEGIN    if p_newonly = 1 then        v_from := c_newonly_from;    else        v_from := c_from;    end
if;   if upper(p_type) = 'NEW' then        v_stmt := c_select || v_from || p_where;    elsif upper(p_type) = 'OLD' then
      v_from := c_from ;        v_where := p_where        v_stmt := c_select || v_from || v_where;      elsif
upper(p_type)= 'LAST_JOB' then        v_from := v_from ||             ', (select distinct job_id ' ||            'from
job_log'||            'where status = 10) d ';        v_where := p_where ||            'and m.id = d.job_id ';
v_stmt:= c_select || v_from || v_where;    elsif upper(p_type) = 'NEW_JOB' then        v_from := v_from ||
',(select distinct job_id ' ||            'from job_log' ||            'where status = 12) d ';        v_where :=
p_where||            'and m.id = d.job_id ';        v_stmt := c_select || v_from || v_where;    end if;    return
(v_stmt);END;$$LANGUAGE plpgsql;   
 




Re: Syntax help please

From
"Ruben Gouveia"
Date:
I can't believe myself. It always comes down to some missing semicolon. Thanks for your help. I am embarrassed.

On Thu, Sep 4, 2008 at 12:49 PM, Fernando Hevia <fhevia@ip-tel.com.ar> wrote:
You seem to be missing a ';' in this line:

       v_from := c_from ;
       v_where := p_where            <--- missing ; here
       v_stmt := c_select || v_from || v_where;

Regards,
Fernando



________________________________

       De: pgsql-sql-owner@postgresql.org
[mailto:pgsql-sql-owner@postgresql.org] En nombre de Ruben Gouveia
       Enviado el: Jueves, 04 de Septiembre de 2008 16:37
       Para: pgsql-sql@postgresql.org
       Asunto: [SQL] Syntax help please


       I can't for the life of me figure out what's wrong with this syntax.
I get the following error when i try and create this function.

       ERROR:  syntax error at or near "$2" at character 15
       QUERY:  SELECT   $1   $2  :=  $3  ||  $4  ||  $5
       CONTEXT:  SQL statement in PL/PgSQL function "fcn_gen_statement"
near line 24

       here's what i am trying to create:

       CREATE OR REPLACE FUNCTION fcn_gen_statement(p_type varchar,
                                                    p_where varchar,
                                                    p_newonly numeric)
       RETURNS varchar AS $$

       DECLARE
           c_select varchar(64) := 'select count(distinct m.id) ';
           c_from varchar(64) := 'from job m ';
           c_newonly_from varchar(128) := 'from (select id,
min(date_created) as date_created '||
                                                'from hr '||
                                                'group_by id) m ';
           v_from varchar(512);
           v_where varchar(512);
           v_stmt varchar(2048);

       BEGIN
           if p_newonly = 1 then
               v_from := c_newonly_from;
           else
               v_from := c_from;
           end if;

           if upper(p_type) = 'NEW' then
               v_stmt := c_select || v_from || p_where;
           elsif upper(p_type) = 'OLD' then
               v_from := c_from ;
               v_where := p_where
               v_stmt := c_select || v_from || v_where;
             elsif upper(p_type) = 'LAST_JOB' then
               v_from := v_from ||
                   ', (select distinct job_id ' ||
                   'from job_log' ||
                   'where status = 10) d ';
               v_where := p_where ||
                   'and m.id = d.job_id ';
               v_stmt := c_select || v_from || v_where;
           elsif upper(p_type) = 'NEW_JOB' then
               v_from := v_from ||
                   ', (select distinct job_id ' ||
                   'from job_log' ||
                   'where status = 12) d ';
               v_where := p_where ||
                   'and m.id = d.job_id ';
               v_stmt := c_select || v_from || v_where;

           end if;
           return (v_stmt);
       END;
       $$ LANGUAGE plpgsql;