Estimados amigos, tengo la siguiente función en mi PostgresSQL 8.3.1;

CREATE OR REPLACE FUNCTION borra_usuario(arreglo_id integer[], esquema 
character varying)
  RETURNS void AS
$BODY$
DECLARE
        arreglo_rut varchar[];
        arreglo_usuario_id integer[];
        myrec RECORD;
        myrec1 RECORD;
        comando TEXT;
        comando_1 TEXT;
        cant_filas integer;
        contador integer := 1;
        contador1 integer := 1;
BEGIN
        -- Recupera los ruts de los usuarios involucrados
        -- desde la tabla esquema.usuario
        comando := 'SELECT * FROM '
        || quote_ident(esquema)
        || '.usuario WHERE user_id = ANY('
        || arreglo_id
        || ')';

        FOR myrec IN EXECUTE comando LOOP
                -- Chequea si el usuario tiene otras direcciones
                comando_1 := 'SELECT u.rut, u.usuario_id FROM public.usuarios 
u, 
public.direccion d WHERE u.rut = '
                || quote_literal(myrec.user_rut)
                || ' AND u.usuario_id=d.usuario_id AND d.user_schema<>'
                || quote_ident(esquema);
                EXECUTE comando_1 INTO myrec1;
                GET DIAGNOSTICS cant_filas = ROW_COUNT;
                IF cant_filas = 0 THEN        -- Si no hay resultados, es la 
única direccion
                        arreglo_rut[contador] := quote_literal(myrec.user_rut);
                        contador := contador + 1;
                ELSE                  -- Si hay resultados, solo hay que borrar 
la
                                         -- dirección correspondiente al esquema
                        arreglo_usuario_id[contador1] := myrec1.usuario_id;
                        contador1 := contador1 + 1;
                END IF;
        END LOOP;

        -- Si hay registros que borrar de public.usuarios, los borra
        IF contador > 1 THEN
                comando := 'DELETE FROM public.usuarios WHERE rut = ANY('
                || arreglo_rut
                || ')';
                EXECUTE comando;
        END IF;

        -- Si solo hay que borrar direcciones referente al usuario en este 
esquema,
        -- las borra
        IF contador1 > 1 THEN
                comando := 'DELETE FROM public.direccion WHERE usuario_id = 
ANY('
                || arreglo_usuario_id
                || ') AND user_schema = '
                || quote_literal(esquema);
                EXECUTE comando;
        END IF;

        -- Ahora queda eliminar al usuario de la tabla esquema.usuario
        comando := 'DELETE FROM '
        || quote_ident(esquema)
        || '.usuario WHERE user_id = ANY('
        || arreglo_id
        || ')';
        EXECUTE comando;

        RETURN;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION borra_usuario(integer[], character varying) OWNER TO adminis;
GRANT EXECUTE ON FUNCTION borra_usuario(integer[], character varying) TO 
adminis;
GRANT EXECUTE ON FUNCTION borra_usuario(integer[], character varying) TO 
adminis_user;

La cual ejecuto por ejemplo con la siguiente llamada:
select public.borra_usuario('{5}', '3')
y me retorna el siguiente mensaje de error:

ERROR:  el operador no existe: text || integer[]
LINEA 1: ...te_ident( $1 ) || '.usuario WHERE user_id = ANY(' ||  $2  ||...
                                                              ^
HINT:  Ningún operador coincide con el nombre y el tipo de los argumentos. 
Puede desear agregar conversiones explícitas de tipos.
CONSULTA:  SELECT  'SELECT * FROM ' || quote_ident( $1 ) || '.usuario WHERE 
user_id = ANY(' ||  $2  || ')'
CONTEXTO:  PL/pgSQL function "borra_usuario" line 13 at assignment

********** Error **********

ERROR: el operador no existe: text || integer[]
Estado SQL:42883
Sugerencias:Ningún operador coincide con el nombre y el tipo de los 
argumentos. Puede desear agregar conversiones explícitas de tipos.
Contexto:PL/pgSQL function "borra_usuario" line 13 at assignment

Estoy trabajando en este proyecto las últimas 28 Horas sin parar y ya estoy 
realmente mareado, y esta función me esta dando dolores de cabeza.

Alguien que esté mas descansado me puede dar una mano para pillar la falla?

Gracias desde ya.

CBD
 
--
TIP 4: No hagas 'kill -9' a postmaster

Responder a