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