Errores desde función

From: Carlos Bazán <cbazan(at)vtr(dot)net>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Errores desde función
Date: 2009-01-27 21:19:44
Message-ID: 200901271819.44516.cbazan@vtr.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message yanguma 2009-01-27 21:23:54 Re: Parametro en vista
Previous Message Gabriel Hermes Colina Zambra 2009-01-27 21:08:57 Re: Cambio el Asunto por OT Sistemas Operativos Fedora