Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   PLSQL - Pasar un array como parametro. (https://www.clubdelphi.com/foros/showthread.php?t=41045)

movorack 06-03-2007 17:41:05

PLSQL - Pasar un array como parametro.
 
Hola a todos.:D

estoy usando PostgreSQL 8.1 y he creado una funcion algo así:p :

Código SQL [-]
CREATE FUNCTION "public"."fn0" (prm0 varchar, prm1 integer []) RETURNS integer AS
$body$
DECLARE
BEGIN
  -- AQUI HAGO ALGO CON ESE ARRAY.
  RETURN NULL;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;


esto para manejar un conjunto de líneas que he recopilado en un StringGrid despues de 4 consultas distintas y permitir la edición por parte del usuario.:cool:

podria procesar estas líneas una por una... pero entoces la ejecución dependeria de delphi y si a medio camino hay un error de programación o se corta el suministro de energia?:rolleyes:

Entonces quiero pasarlo como un procedimiento para que la ejecución dependa de PostgreSQL :) . Pero quisiera pasar TODAS las líeas de mi StringGrid a la función y no una por una (muy parecido seria hacer consultas desde delphi :eek: )
Si tengo los siguientes datos:

Volante de venta : 0001

ProductoID,ProductoNom,ProductoVal
1,nombreproducto1,valorproducto1
2,nombreproducto2,valorproducto2
3,nombreproducto3,valorproducto3
4,nombreproducto4,valorproducto4

quisiera hacer algo como :

select public.fn0('VolanteNo', (codprod1, codprod2, codprod3, codprod4))

pero cuando hago esto, me dice:
Código SQL [-]
ERROR:  function public.fn0(character varying, record) does not exist
HINT:  No function matches the given name and argument types. You may need to add explicit type casts.

y lo he intentado de varias maneras, he buscado un resto por la web, he leido la documentación y no se si me patina el coco o es que estoy mas rayao que el tablero de mi escuela primaria pero NO LOGRO ENCONTRAR SOLUCION.

Please!!!! alguien que me ayude.

movorack 06-03-2007 20:07:59

Que chevere!!!!
 
Bueno mi gente... la busqueda en realidad fué extenuante pero lo CONSEGUI!!!!, lo encontre, lo hallé, está conmigo, es inherente a mi. :D

esta es la solución:

Código SQL [-]
Select public.foo('{2,4,6,8,10,12,14,16,18,20,22,24,26,28,30}'::integer[])

para este ejemplo, hice algunas pruebas y cree una función así:

Código SQL [-]
CREATE OR REPLACE FUNCTION "public"."foo" (var1 integer []) RETURNS integer AS
$body$
DECLARE
 i INTEGER;
 var1_size INTEGER;
BEGIN
  var1_size := substring(substring(array_dims(var1), 4), 1,strpos(substring(array_dims(var1), 4), ']')-1)::INTEGER;
  FOR i IN 1..var1_size LOOP
    RAISE NOTICE '% - VALOR: %', i, var1[i];
  END LOOP;
  RETURN NULL;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

lo que al ejecutar la primera porción de código me devuelve:

NOTICE: 1 - VALOR: 2
NOTICE: 2 - VALOR: 4
NOTICE: 3 - VALOR: 6
NOTICE: 4 - VALOR: 8
NOTICE: 5 - VALOR: 10
NOTICE: 6 - VALOR: 12
NOTICE: 7 - VALOR: 14
NOTICE: 8 - VALOR: 16
NOTICE: 9 - VALOR: 18
NOTICE: 10 - VALOR: 20
NOTICE: 11 - VALOR: 22
NOTICE: 12 - VALOR: 24
NOTICE: 13 - VALOR: 26
NOTICE: 14 - VALOR: 28
NOTICE: 15 - VALOR: 30

comparditos... gracias... la soulción era realizar un TypeCast a la cadena que paso en la consulta y listo.

bueno... muchas gracias y bendiciones a todos.


La franja horaria es GMT +2. Ahora son las 14:41:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi