Buenos días tengo una duda, estoy creando una funcion que me va a insertar los familiares pero para eso tengo que recorrer la tabla de personal para hacer unas comparaciones; mi duda es que valor tiene que retornar ya que la coloco para que retorne un registro pero no hace nada..
CREATE OR REPLACE FUNCTION fnc_ingresar_familiar()
RETURNS SETOF record AS
$BODY$
DECLARE
registro RECORD;
BEGIN
FOR registro IN SELECT * FROM sno_personal LOOP
insert into beneficiarios (nombre,codigo_sigesp,parent_id,sexo,parentesco,fecha_nacimiento)
select f.nomfam::text ||' '|| f.apefam::text as nombre, f.cedfam, b.id, sexfam,nexfam,fecnacfam from sno_personal p
join sno_familiar f on f.codper=p.codper
join beneficiarios b on b.codigo_sigesp=f.codper
where f.codper=registro.codper;
END LOOP;
RETURN;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION fnc_ingresar_familiar() OWNER TO postgres;
agradecería su ayuda..
ERROR:consulta no tiene un destino para los datos de resultado
Vie, 11/02/2011 - 19:59 — omar125-02HOLA TENGO UN PROBLEMA Y NESECITO AYUDA URGENTE:
TENGO UNA FUNCION CREADA EL CUAL RECIBE PARAMETROS ENTEROS Y CARACTERES,
RESULTA QUE AL MOMENTO DE EJECUTARLA NO ME SALE NINGUN ERROR, PERO AL MOMENTO DE INVOCARLA ME DA UN MENSAJE :
org.postgresql.util.PSQLException: ERROR: la consulta no tiene un destino para los datos de resultado
-NO SE QUE ESTOY HACIENDO MAL, SI ALGUIEN ME PUDEE AYUDAR LE AGRACERIA MUCHO.
YO INVOCO LA FUNCION DESDE JAVA
AYUDA CON CONSULTAS
Mar, 15/02/2011 - 19:42 — omar125-02hola menes, ayudenme please. tengo una funcion que quiero me retorne varios tipos de datos
Para mas especificacion les pongo my funcion:
CREATE OR REPLACE FUNCTION usp_tipoasociado(didtipoas integer, dtipoasociado character)
RETURNS tipoasociado AS
$BODY$
BEGIN
SELECT TipoAsociado
FROM tipoasociado
where(Id_TipoAsociado=1);
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION usp_tipoasociado(integer, character) OWNER TO postgres;
-Yo llamo my funcion desde java asi:
ItemsTipoAsociado=objeto.SeleccionarTodo("{call usp_tipoasociado(1,'A')}");
public static String[] SeleccionarTodo(String parametros)
{
Connection con;
String resul[]=new String[60];
try
{
ResultSet rs;
Class.forName(Driver);
con=DriverManager.getConnection(CadenaCon,Usuario,Contrasena);
CallableStatement cs = con.prepareCall(parametros);
rs=cs.executeQuery();
int fil=0;
while(rs.next())
{
fil++;
resul[fil]=rs.getString(1);
fil++;
resul[fil]=rs.getString(2);
}
resul[0]=""+fil+"";
rs.close();
cs.close();
con.close();
}
catch(Exception e)
{
e.printStackTrace();
tipo=JOptionPane.ERROR_MESSAGE;
JOptionPane.showMessageDialog((Component)null,"No se pudo llenar los datos de la lista.\nDetalles: "+e.getMessage(),"Error",tipo);
}
return resul;
}
- al momento de hacer un select my consulta me genera que:
ERROR:consulta no tiene un destino para los datos de resultado......
*.¿QUE ESTOY HACIENDO MAL EN MI CONSULTA. ALGUIN ME AYUDE?
AYUDA CON CONSULTAS
Mié, 16/02/2011 - 03:37 — lgarciamHola, lo que no comprendo de tu procedimiento almacenado es que no veo el return por ningun lado y ademas los parámetros de entrada que le pasas al procedimiento no se para que son. Si lo que quieres retornar es toda la tupla perteneciente a la relacion tipoasociado entonces lo que tienes que hacer es lo siguiente:
CREATE OR REPLACE FUNCTION usp_tipoasociado()
RETURNS tipoasociado AS
$BODY$
DECLARE
retorno tipoasociado;
BEGIN
SELECT * INTO retorno FROM tipoasociado where(Id_TipoAsociado=1);
RETURN retorno;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
o también lo puedes hacer de esta forma:
CREATE OR REPLACE FUNCTION usp_tipoasociado()
RETURNS SET OF tipoasociado AS
$BODY$
BEGIN
RETURN QUERY SELECT * INTO retorno FROM tipoasociado where(Id_TipoAsociado=1);
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
AYUDA CON CONSULTAS
Dom, 20/02/2011 - 21:22 — AnónimoTe agradezco tu ayuda pero al hacer un select usp_tipoasociado();
Lo que da como resultado tu ayuda es todo el resultado pero en una sola celda osea todos los campos los muestra en una sola celda
Lo que yo deseo visualizar es los resultados de la sgt forma:
los resultados pero en diferenre celda, osea la celda que corresponde al Id_TipoAsociado que muestre su resultados en una celda, los de TipoAsociado en otra celda y asi todo lo demas
Ósea lo tendría que hacer:
SELECT Id_TipoAsociado,TipoAsociado
FROM tipoasociado
where(Id_TipoAsociado=1);
Y ahora esto no se como hacer pero mediante funciones. Te agradecería que me ayude. Gracias
AYUDA CON CONSULTAS
Mar, 22/02/2011 - 21:03 — lgarciamMira a realizar un select sobre el procedimiento almacenado debolvera un resultado igual al que se obtendria si ejecutaras la consulta directamente y los resultados pertenecientes a una tupla van a salir cada uno en su fila. Te lo digo porque en donde trabajo la gestion sobre una aplicacion web se realiza a base de procedimientos y me funcionan. Ahora si lo que quieres es que los datos te salgan cada uno dentro de una celda entonces la llamada al procedimiento la estas haciendo mal, lo tienes que llamar de esta forma:
select * from (nombre del procedimiento);
AYUDA CON CONSULTAS
Mar, 22/02/2011 - 21:07 — lgarciamOtra cosa que tambien pudes utilizar son los cursores. En la documentacion de postgresql vienen muy bien explicados, si aun tienes problemas continúa escribiendo.
Una última acotación, en el comentario que te puse anteriormente donde dice fila va celda, jajajaj me confundí escribiendo.
Saludos.
AYUDA CON CONSULTAS
Vie, 25/02/2011 - 20:02 — AnónimoMi amigo en realidad yo soy nuevo en postgres, antes trabajaba en mysql y ahora por motivos de estudios estoy trabajando con postgres. en mysql trabajo con procedimientos los cuales me funcionan bien. La ayuda que me diste funciona pero no bien mi cundo ejecuto:
CREATE OR REPLACE FUNCTION usp_tipoasociado()
RETURNS tipoasociado AS
$BODY$
DECLARE
retorno tipoasociado;
BEGIN
SELECT * INTO retorno FROM tipoasociado where(Id_TipoAsociado=1);
RETURN retorno;
end;$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
**Me da como resultado el que cump0le con la condicion where,
pero cuando cambio la condicion y hago:
SELECT * INTO retorno FROM tipoasociado;
RETURN retorno;
**Me da como resultado el mismo valor, pero si veo manual mente mi tabla
eta tiene muchos datos los cuales no son mostrados
AYUDA CON CONSULTAS
Vie, 25/02/2011 - 20:42 — lgarciamPara retornar todos los valores lo que tienes que hacer es retornar un set con los resultados de esta forma:
CREATE OR REPLACE FUNCTION "public"."usp_tipoasociado" (
)
RETURNS SETOF "public"."tipoasociado" AS
$body$
DECLARE
retorno tipoasociado;
BEGIN
FOR retorno IN SELECT * FROM tipoasociado
Loop
RETURN NEXT retorno;
END Loop;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;
Tambien puedes utilizar cursores, cualquier problema tira pa aca sin pena.
Saludos.
AYUDA CON CONSULTAS
Mar, 15/03/2011 - 15:48 — AnónimoHOLA a todos estube ausente algunos dias y no tube acceso a internet, y por eso no pude consultar y congar mas en el foro. Ahora probe lo que colgaste y si me funciona gracias de antemano.
Ahora si quisiera se una insercion o actualizaciond de datos como lo haria:
Como utilizaria los retonos de datos ????
AYUDA CON BUSCADOR
Mié, 16/03/2011 - 16:47 — AnónimoHola de antemano gracias por su ayuda.
Tengo un procedimiento almacenado en MYSQL que me sirve para buscar datos. Este lo quiero pasar a POSTGRES pero en funciones.
• Este es el procedimiento en MSQL:
CREATE PROCEDURE `USP_Buscador` (op tinyint, Cad1 varchar(100),Cad2 varchar(100),Cad3 varchar(100),
Cad4 varchar(150))
BEGIN
DECLARE consultar varchar(500);
Case op
When 1 then
SET @consultar=CONCAT('SELECT * FROM ',Cad1,' WHERE Estado=0 AND ',Cad2,' LIKE \'%',Cad3,'%\' LIMIT 200');
End case;
PREPARE consultar FROM @consultar;
EXECUTE consultar;
End
• Ahora lo implemento en Postgres así, pero no se que poner en el return:
CREATE OR REPLACE FUNCTION USP_Buscador(op integer, Cad1 varchar(100),Cad2 varchar(100),Cad3 varchar(100),Cad4 varchar(150))
RETURNS Buscador AS
$BODY$
DECLARE consultar varchar(500);
BEGIN
case op
when 1 then
SET @consultar=CONCAT('SELECT * FROM ',Cad1,' WHERE Estado=0 AND ',Cad2,' ILIKE \'%',Cad3,'%\' LIMIT 200');
end case;
PREPARE consultar FROM @consultar;
EXECUTE consultar;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION USP_Buscador(integer, varchar(100), varchar(100), varchar(100), varchar(150)) OWNER TO postgres;
• En los anteriores ayudas que me dieron el return “Buscador” era el nombre de una tabla, pero aquí buscador no es una tabla
• Si ejecuto así en postgres me da un mensaje: Creo porque no hay una tabla así o no se pero en MSQL no me da problemas.
ERROR: no existe el tipo «buscador»
********** Error **********