INSERT INTO插入一整行空值

时间:2018-06-14 01:53:45

标签: sql postgresql plpgsql database-cursor

我有以下代码(一个调用另一个函数的函数)。在我的第二个函数中输出'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'排序,然后选择第二行。

1 个答案:

答案 0 :(得分:1)

当EXIT WHEN NOT FOUND被执行时,变量mystruct将不包含任何值,因为您已经遍历了游标中的所有行。

因此,当您为光标包含1行的情况退出循环时,INSERT将以mystruct为空执行。