Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Stored Procedure en Sql a Postgresql Traducirlo

Estas en el tema de Stored Procedure en Sql a Postgresql Traducirlo en el foro de PostgreSQL en Foros del Web. Buen día Señores, quería ver si me harían el gran favor de ayudarme, resulta que soy muy nuevo en esto de Postgresql, ahorita estoy utilizando ...
  #1 (permalink)  
Antiguo 15/05/2012, 15:28
Avatar de scorpion191191  
Fecha de Ingreso: mayo-2012
Ubicación: Costa R
Mensajes: 4
Antigüedad: 11 años, 11 meses
Puntos: 0
Pregunta Stored Procedure en Sql a Postgresql Traducirlo

Buen día Señores, quería ver si me harían el gran favor de ayudarme, resulta que soy muy nuevo en esto de Postgresql, ahorita estoy utilizando la version 9.1 en un servidor Ubuntu 11.04 el cual tengo en una maquina virtual que se conecta por odbc a un Windows 7 (Maquina fisica), desde en el pgAdmin III en win 7 estoy tratando de crear un simple procedimiento almacenado:

Al cual se le ingresan 3 parametros: Hilera_Entrada, Hilera_Salida y Longitud_Hilera_Salida, los dos ultimus pueden venir vacios, y el procedimiento se encarga de contar la cantidad de caracteres de Hilera_Entrada y pasarlos A Hilera_Salida, este sp lo hice en Sqlserver 2005 y sin problemas =)

Se los muestro acá:

Código:
Create Procedure dbo.Procesa_Trama_v2 @Hilera_Entrada varchar(50), @Hilera_Salida varchar(50), @Longitud_Hilera_Salida int
as
set @Hilera_Salida= @Hilera_Entrada
set @Longitud_Hilera_Salida= LEN(@Hilera_Salida)
Select @Hilera_Salida as 'Hilera_Salida', @Longitud_Hilera_Salida as 'Longitud Hilera Salida'

Al momento de realizarlo en Postgresql me topo con que es una cosa totalmente diferente XD, y de mucho investigar se que se usan funciones en ves de sp, y a lo mucho que llegué fue a esto:

Código:
CREATE OR REPLACE FUNCTION procesa_trama_v2(hilera_entrada character varying)
  RETURNS character varying AS
$BODY$
        BEGIN
              Select Hilera_Entrada, length(Hilera_Entrada);
        END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION procesa_trama_v2(character varying)
  OWNER TO postgres;
El cual me permite crearlo y todo, pero ni siquiera se la manera correcta de ejecutarlo, lo estaba ejecutando de la siguiente manera:

Código:
select procesa_trama_v2 ('hola soy una cadena');
La cual me arroja el siguiente error:

Código:
ERROR:  query has no destination for result data
HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
CONTEXT:  PL/pgSQL function "procesa_trama_v2" line 3 at SQL statement

La verdad me estoy volviendo loco, por ello pido alguna orientación, sobre cual es mi fallo, ya sea en la manera de programar la función, traducir el procedimiento a postgresql o en la manera por la cual llamo a la función
  #2 (permalink)  
Antiguo 15/05/2012, 19:46
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Stored Procedure en Sql a Postgresql Traducirlo

Ejecutala con perform.

perform procesa_trama_v2 ('hola soy una cadena');
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 16/05/2012, 08:52
Avatar de scorpion191191  
Fecha de Ingreso: mayo-2012
Ubicación: Costa R
Mensajes: 4
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Stored Procedure en Sql a Postgresql Traducirlo

Cita:
Iniciado por huesos52 Ver Mensaje
Ejecutala con perform.

perform procesa_trama_v2 ('hola soy una cadena');
Hola Huesos, gracias por responder, la verdad intenté ejecutar la funcion con perform, pero como "Execute query" y con "Execute pgScript " pero en los dos casos me arroja un error =S.

Con "Execute query":

Código:
ERROR:  syntax error at or near "perform"
LINE 1: perform procesa_trama_v2 ('hola soy una cadena');
Con "Execute pgScript":

Código:
[ERROR    ] 1.0: syntax error, unexpected character
No sé en que podré estar fallando =(

Saludos¡
  #4 (permalink)  
Antiguo 16/05/2012, 13:13
Avatar de drako_darpan  
Fecha de Ingreso: octubre-2008
Ubicación: Sinaloa
Mensajes: 617
Antigüedad: 15 años, 6 meses
Puntos: 58
Respuesta: Stored Procedure en Sql a Postgresql Traducirlo

Modifique tu query y funciona asi:

Código PostgreSQL:
Ver original
  1. CREATE OR REPLACE FUNCTION procesa_trama_v2(hilera_entrada character varying)
  2.   RETURNS INT4 AS
  3. $BODY$
  4.     DECLARE
  5.         nLongitud INT4;
  6.  
  7.         BEGIN
  8.         nLongitud := 0;
  9.  
  10.         nLongitud = length(Hilera_Entrada);
  11.         RETURN nLongitud;
  12.         END;
  13. $BODY$
  14.   LANGUAGE 'plpgsql' VOLATILE;
  15.  
  16. --Cualquiera de las dos funciones sirve.
  17. select procesa_trama_v2 ('hola soy una cadena');
  18. select * FROM procesa_trama_v2 ('hola soy una cadena');
  #5 (permalink)  
Antiguo 16/05/2012, 16:04
Avatar de scorpion191191  
Fecha de Ingreso: mayo-2012
Ubicación: Costa R
Mensajes: 4
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Stored Procedure en Sql a Postgresql Traducirlo

Cita:
Iniciado por drako_darpan Ver Mensaje
Modifique tu query y funciona asi:

Código PostgreSQL:
Ver original
  1. CREATE OR REPLACE FUNCTION procesa_trama_v2(hilera_entrada character varying)
  2.   RETURNS INT4 AS
  3. $BODY$
  4.     DECLARE
  5.         nLongitud INT4;
  6.  
  7.         BEGIN
  8.         nLongitud := 0;
  9.  
  10.         nLongitud = length(Hilera_Entrada);
  11.         RETURN nLongitud;
  12.         END;
  13. $BODY$
  14.   LANGUAGE 'plpgsql' VOLATILE;
  15.  
  16. --Cualquiera de las dos funciones sirve.
  17. select procesa_trama_v2 ('hola soy una cadena');
  18. select * FROM procesa_trama_v2 ('hola soy una cadena');


Gracias Drako, me puse a investigar un poco y logré algo como esto:

Código:
CREATE OR REPLACE FUNCTION procesa_trama_ve(IN hilera_entrada text, IN hilera_salida text, IN longitud_hilera_salida integer)
  RETURNS TABLE(hilera_salida_s text, longitud_hilera_salida_s integer) AS
$BODY$
BEGIN
hilera_salida:= hilera_entrada;
    longitud_hilera_salida:= LENGTH(hilera_entrada);
    -- @todo hide password
    RETURN QUERY
        SELECT hilera_salida, longitud_hilera_salida;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE STRICT SECURITY DEFINER
  COST 100
  ROWS 1000;
ALTER FUNCTION procesa_trama_ve(text, text, integer)
  OWNER TO postgres;
Todo bien con la funcion, pero lo que quiero es que la salida de la consulta me la muestre en columna independientes, en ves de eso si corro la función me muestra algo como esto:

Código:
Select procesa_trama_v3('Hola','',0)
(Hola,4)
Y no me sirve, ya que hice las pruebas con un textbox en vvb.net 2005 y el dataset solo me devuelve una columna, esta: "(Hola,4)"

Es posible generar el resultado de la función en columnas independientes, o hay que realizar algún tipo de conversión con un programa adicional?

Gracias por leer¡
¡Saludos!
  #6 (permalink)  
Antiguo 16/05/2012, 16:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Stored Procedure en Sql a Postgresql Traducirlo

Creo que si ejecutas:

Select *from procesa_trama_v3('Hola','',0)

te sale en columnas.

Prueba y nos cuentas
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 17/05/2012, 10:21
Avatar de scorpion191191  
Fecha de Ingreso: mayo-2012
Ubicación: Costa R
Mensajes: 4
Antigüedad: 11 años, 11 meses
Puntos: 0
Respuesta: Stored Procedure en Sql a Postgresql Traducirlo

Cita:
Iniciado por huesos52 Ver Mensaje
Creo que si ejecutas:

Select *from procesa_trama_v3('Hola','',0)

te sale en columnas.

Prueba y nos cuentas
Efectivamente señor Huesos, probé ejecutar la función de esa manera y el resultado si lo muestra por columnas

!Gracias¡, a Drakan tambien, por la ayuda =)

Saludos

Etiquetas: funciones, sql, sqlserver2005, traducir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:55.