Итак, у меня есть курсор, полный информации, и некоторые из них имеют один и тот же атрибут (скажем, 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;
Когда строкавставленный элемент проверки всегда показывает, что текущее значение существует, даже если оно никогда не вставлялось в таблицу.
В таблице нет строк до выполнения процедуры.