PostgreSQL - Query has no destination for result data

 
Vista:
sin imagen de perfil

Query has no destination for result data

Publicado por antonio (1 intervención) el 12/04/2022 01:55:10
tengo el codigo de la siguiente funcion en posgres

y al hacer un select a la funcion me sale el sigueinte error: Query has no destination for result data

quicierqa saber si me podriar ayudar.

de ante mano muchas gracias.

soy nuevo en esto



-- FUNCTION: public.sp_carga_menu(integer, integer, integer)

-- DROP FUNCTION IF EXISTS public.sp_carga_menu(integer, integer, integer);

CREATE OR REPLACE FUNCTION public.sp_carga_menu(
cve_cte_fun integer,
semana_fun integer,
consec_evento_fun integer)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
AS $BODY$
declare consec_menu integer;
declare consec_menu_ant integer;
declare descripcion varchar(100);
declare descripcion_1 varchar(100);
declare descripcion_2 varchar(100);
declare consecutivo integer;
declare renglon integer;
declare encabezado integer;
begin

create temporary table t_menus(
descripcion_1 char(100) null,
descripcion_2 char(100) null,
consecutivo integer null,
encabezado integer null,
encabezado_2 integer null
)on commit delete rows;

begin declare cur_menus scroll cursor for select clientes_menus.consec_menu,clientes_menus.descripcion,platillos.desc_platillo,platillos.cve_encabezado from clientes_menus,clientes_menus_detalle,platillos where(clientes_menus.cve_cte = clientes_menus_detalle.cve_cte) and(clientes_menus_detalle.cve_platillo = platillos.cve_platillo) and(clientes_menus.semana = clientes_menus_detalle.semana) and(clientes_menus.consecutivo = clientes_menus_detalle.consecutivo) and(clientes_menus.consec_menu = clientes_menus_detalle.consec_menu) and((clientes_menus.cve_cte = cve_cte_fun) and(clientes_menus.semana = semana_fun) and(clientes_menus.consecutivo = consec_evento_fun)) order by clientes_menus.consec_menu asc,clientes_menus_detalle.renglon asc;
begin open cur_menus;

fetch next from cur_menus into consec_menu,descripcion_1,descripcion_2,encabezado;

select consecutivo = 0,consec_menu_ant = 0,renglon = 0;

if encabezado is null then
select encabezado = 0;
end if;


while sqlstatus <> 2 loop
if consec_menu_ant <> consec_menu then
select consec_menu_ant = consec_menu,descripcion = to_char(consec_menu)+' '+descripcion_1,consecutivo =consecutivo+1;

if consecutivo < 32 then
insert into t_menus( consecutivo,descripcion_1,encabezado ) values( consecutivo,descripcion,encabezado );
else
select renglon = renglon+1;
update t_menus set descripcion_2 = descripcion,encabezado_2 = encabezado where consecutivo = renglon;
end if;
end if;


if consec_menu_ant = consec_menu then
select descripcion =descripcion_2,consecutivo = consecutivo+1;
if consecutivo < 32 then
insert into t_menus( consecutivo,descripcion_1,encabezado ) values( consecutivo,descripcion_2,encabezado );
else
select renglon = renglon+1;
update t_menus set descripcion_2 = descripcion,encabezado_2 = encabezado where consecutivo = renglon;
end if;
end if;


begin fetch next from cur_menus into consec_menu,descripcion_1,descripcion_2,encabezado;
if encabezado is null then
select encabezado =0;
end if;

end;
end loop;

close cur_menus;
end;
end;
deallocate cur_menus;

select * from t_menus;

end;
$BODY$;

ALTER FUNCTION public.sp_carga_menu(integer, integer, integer)
OWNER TO postgres;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Francisco
Val: 256
Oro
Ha mantenido su posición en PostgreSQL (en relación al último mes)
Gráfica de PostgreSQL

Query has no destination for result data

Publicado por Francisco (110 intervenciones) el 21/04/2022 00:47:55
Hola

Los cursores en postgres se tratan de diferente manera, el error lo que indica es que una sentencia SELECT esta devolviendo uno o mas valores y no consigue donde guardarlos porque no tiene una expresion INTO, por ejemplo:

1
2
3
4
5
6
7
8
9
10
DO
$$
DECLARE
   contador integer;
BEGIN
    SELECT 1 INTO contadores;
    RAISE INFO 'Valor guardado -> %', contador;
END
$$
LANGUAGE plpgsql;

De tal manera que si tienes una tabla por ejemplo clientes con las siguientes columnas id, nombre, dirección entonces

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DO
$$
DECLARE
    rec_cliente record;
BEGIN
    FOR rec_cliente IN
        SELECT id, nombre, direccion FROM clientes
    LOOP
        RAISE INFO '%', rec_cliente;
        RAISE INFO 'ID -> %; Nombre -> %; Direccion -> %', rec_cliente.id, rec_cliente.nombre, rec_cliente.direccion;
    END LOOP;
END
$$
LANGUAGE plpgsql;

otra variante para un solo registro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DO
$$
DECLARE
    v_id integer;
    v_nombre varchar;
    v_direccion varchar;
BEGIN
    SELECT id, nombre, direccion
        INTO v_id, v_nombre, v_direccion  -- SE GUARDA EN VARIABLES
    FROM clientes
    WHERE id = 100;
 
    RAISE INFO 'ID -> %; Nombre -> %; Direccion -> %', v_id, v_nombre, v_direccion;
END
$$
LANGUAGE plpgsql;

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar