我有以下代码(一个调用另一个函数的函数)。在我的第二个函数中输出'INSERT INTO'行试图插入一行满是null。为什么会发生这种情况?
CREATE OR REPLACE FUNCTION LIMPIA_REPETIDOS()
RETURNS VOID AS $$
DECLARE
REP RECORD;
cursor1 CURSOR FOR SELECT DISTINCT usuario, fecha_hora_ret, tiempo_uso FROM auxi ORDER BY tiempo_uso DESC;
begin
open cursor1;
LOOP
FETCH cursor1 INTO REP;
EXIT WHEN NOT FOUND;
PERFORM GUARDA(REP.usuario, REP.fecha_hora_ret);
END LOOP;
CLOSE cursor1;
end;
$$ LANGUAGE PLPGSQL;
CREATE OR REPLACE FUNCTION GUARDA
(myid auxi.usuario%TYPE, my_time auxi.fecha_hora_ret%type) RETURNS VOID AS $$
DECLARE
mycursor CURSOR FOR
SELECT * FROM auxi
WHERE myid = usuario AND my_time = fecha_hora_ret
ORDER BY tiempo_uso;
CANT INT;
mystruct RECORD;
BEGIN
OPEN mycursor;
CANT = 0;
LOOP
FETCH mycursor INTO mystruct;
EXIT WHEN NOT FOUND;
IF CANT = 2 THEN
INSERT INTO RECORRIDO_FINAL VALUES(mystruct.periodo, mystruct.usuario, mystruct.fecha_hora_ret, mystruct.est_origen, mystruct.est_origen, crear_fecha_hora_devolucion(mystruct.tiempo_uso, mystruct.fecha_hora_ret));
END IF;
CANT := CANT + 1;
END LOOP;
IF CANT = 1 THEN
INSERT INTO RECORRIDO_FINAL VALUES(mystruct.periodo, mystruct.usuario, mystruct.fecha_hora_ret, mystruct.est_origen, mystruct.est_destino, crear_fecha_hora_devolucion(mystruct.tiempo_uso, mystruct.fecha_hora_ret) );
END IF;
CLOSE mycursor;
END;
$$ LANGUAGE PLPGSQL;
我在这里要做的是从名为'auxi'的表中选择行,然后将它们转移到另一个表。问题是当'auxi'中有两行或更多行时,'usuario'和'fecha_hora_ret'的值相同,我必须按'tiempo_uso'排序,然后选择第二行。
答案 0 :(得分:1)
当EXIT WHEN NOT FOUND被执行时,变量mystruct
将不包含任何值,因为您已经遍历了游标中的所有行。
因此,当您为光标包含1行的情况退出循环时,INSERT将以mystruct
为空执行。