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
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 |