Как я могу сделать подсчет (*) во время цикла? - PullRequest
0 голосов
/ 09 ноября 2019

Итак, у меня есть курсор, полный информации, и некоторые из них имеют один и тот же атрибут (скажем, matricula), но мне нужно вставить содержимое курсора в таблицу, где matricula - это PK. Так что ни один из этих атрибутов не допускается.

Чтобы решить эту проблему, я делаю два выборочных подсчета (*), чтобы убедиться, что 1-го номера в таблице нет, и я могу сделать оператор вставки. 2-й, если есть номерной знак, я проверю, есть ли какой-нибудь нулевой атрибут, и обновлю их.

Я делаю все это внутри оператора цикла извлечения.

c1 := funcObterInfoSemanalVeiculos(data_GuardarInfo);

LOOP
   FETCH c1 INTO data_inicio, data_fim, matricula, nr_viagens, soma_duracao, soma_km;
   EXIT WHEN c1%NOTFOUND;


    -- Verify if registry exists in the table
    SELECT count(*) into verificacao     
        FROM resumosveiculos rv
            WHERE   rv.matricula = matricula and
                    rv.soma_km = soma_km;  


    -- Verify if resgitry as some null values              
    SELECT count(*) into verificacao_2   
        FROM resumosveiculos rv
            WHERE   rv.matricula = matricula and
                    rv.soma_km = 0;             


IF (verificacao = 0) THEN

   INSERT INTO resumosveiculos (
    instante,
    data_inicio,
    data_fim,
    matricula,
    nr_viagens,
    soma_km,
    soma_duracao)
       VALUES((SELECT CURRENT_TIMESTAMP  FROM DUAL),
       l_data_inicio,
       l_data_fim,
       matricula,
       nr_viagens,
       soma_duracao,
       soma_km
       );

ELSIF (verificacao_2 > 0 and nr_viagens != 0 and soma_km != 0  and soma_duracao != 0 ) 
THEN

    Update resumosveiculos rv
    SET rv.nr_viagens = nr_viagens,
        rv.soma_km = soma_km,
        rv.soma_duracao = soma_duracao
    Where rv.matricula = matricula;

ELSE
DBMS_OUTPUT.PUT_LINE ('Not inserted-> ' || matricula);
DBMS_OUTPUT.PUT_LINE ('--------------------------------------------'); 
END IF;
END LOOP;

Когда строкавставленный элемент проверки всегда показывает, что текущее значение существует, даже если оно никогда не вставлялось в таблицу.

В таблице нет строк до выполнения процедуры.

1 Ответ

0 голосов
/ 09 ноября 2019

В вашем запросе вы используете имя переменной, которое совпадает с именем столбца таблицы.

rv.matricula = matricula

Здесь matricula - это имя column, а также имязаявленный параметр. Вы путаете компилятор PL / SQL. Ха-ха !!

Но компилятор PL / SQL будет считать его column name. Вот как это ведет себя. Следовательно, условие всегда будет выполняться (true), что вызывает проблемы в вашем случае.

Как я уже прокомментировал, пожалуйста, измените имя переменной на что-то вроде v_matricula и наслаждайтесь кодированием.

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...