El probelma es como dicen. LO raro es que en 9.1 funciona sin problemas pero no 
en 8.4. LO que hice fue cambiar los nombres en el select Gracias

Date: Sun, 7 Oct 2012 16:32:18 -0400
From: asotolo...@uci.cu
To: listas_quij...@hotmail.com
CC: pgsql-es-ayuda@postgresql.org
Subject: Re: [pgsql-es-ayuda] Diferencia entre 8.4 y 9.1 ??




  
  


El 06/10/2012 11:43, Edwin Quijada escribió:

  
  Hola!

Estoy teniendo problemas con una funcion que desarrolle en 9.1 pero que
no me compila en 8.4. La necesito en 8.4 porque esta base de datos esta
en un servidor en la nube y ahi es un poco dificil cambiar la base de
datos porque yo lo pida, aunque lo quisiera.
  

  
  La funcion en cuestion es esta
  

  
  
  CREATE OR REPLACE FUNCTION public."_Test" (
    out tipo varchar,
    out fecha varchar,
    x integer
  )
  RETURNS SETOF record AS
  $body$
  DECLARE
    r record;
  BEGIN
    case x
     when
1 THEN
       return
query
           select 'Linea1'::varchar as tipo, '00-00-00'::varchar
as fecha
           union all
       
select 'Quijada'::varchar as tipo,to_char(now()::date,'YYYYMMDD') as
fecha;
           
      when 2 THEN
       return
query
           select 'Linea1'::varchar as tipo, '00-00-00'::varchar
as fecha
           union all
       
select 'Edwin'::varchar as tipo,to_char(now()::date,'YYYY/MM/DD') as
fecha;
           
      when 3 THEN
       return
query
           select 'Linea1'::varchar as tipo, '00-00-00'::varchar
as fecha
           union all
       
select 'Alberto'::varchar as tipo,to_char(now()::date,'YYYY-MM-DD') as
fecha;
           
       else
       select
'Nada'::varchar as tipo;
    end case;
  END;
  $body$
  LANGUAGE 'plpgsql'
  VOLATILE
  CALLED ON NULL INPUT
  SECURITY INVOKER
  COST 100 ROWS 1000;
  
  

  
  

  
  En 8.4 al compilarla consigo este error :
  
  ERROR:  syntax error at or near "$1"
  LINE 1:  select 'Linea1'::varchar as  $1 , '00-00-00'::varchar
as  $...
                                        ^
  QUERY:   select 'Linea1'::varchar as  $1 , '00-00-00'::varchar
as  $2  union all select 'Quijada'::varchar as  $1
,to_char(now()::date,'YYYYMMDD') as  $2 
  CONTEXT:  SQL statement in PL/PgSQL function "_Test" near line 9
  (5.453 sec)
  
  

  
  Pero en 9.1
  Linea1 00-00-00
  Edwin  20121005
  

  
  No creia que hubiese alguna diferencia,al menos en esto, entre
estas dos versiones?
  

  
  Alguien tiene alguna idea ??
  

  
  

  
  
  

  
  

  
Hola Edwin, lo único que he modificado es que le cambie en nombre a las
salidas tipo1 y fecha1, pues  hay incompatibilidad con los parámetros y
las variables que usas dentro de las funciones que no se pueden llamar
iguales, ese error lo he tenido otras veces pero no como te da a ti, es
decir cuando tenia un parámetro con un nombre X no podía definir  una
variable interna con ese nombre.

saludos





CREATE OR REPLACE FUNCTION public."_Test" (

  out tipo varchar,

  out fecha varchar,

  x integer

)

RETURNS SETOF record AS

$body$

DECLARE

  r record;

BEGIN

  case x

  when 1 THEN

    return query

         select 'Linea1'::varchar as tipo1, '00-00-00'::varchar as
fecha1

         union all

    select 'Quijada'::varchar as tipo1,to_char(now()::date,'YYYYMMDD')
as fecha1;

         

    when 2 THEN

    return query

         select 'Linea1'::varchar as tipo1, '00-00-00'::varchar as
fecha1

         union all

    select 'Edwin'::varchar as tipo1,to_char(now()::date,'YYYY/MM/DD')
as fecha1;

         

    when 3 THEN

    return query

         select 'Linea1'::varchar as tipo1, '00-00-00'::varchar as
fecha1

         union all

    select 'Alberto'::varchar as
tipo1,to_char(now()::date,'YYYY-MM-DD') as fecha1;

         

     else

    select 'Nada'::varchar as tipo1;

  end case;

END;

$body$

LANGUAGE 'plpgsql'













                                          

Responder a