Не добавляются данные процедурой в БД oracle

Сделал процедуру, которая добавляет в таблицу запись с текущей датой, если она отсутствует. Но сколько бы не вызывал процедуру, таблица не обновляется. Только вручную получается вписать значения. В чем может быть причина?

CREATE OR REPLACE PROCEDURE SP_UPDATE 
IS
   existing_count INT;
 BEGIN
    SELECT COUNT(*)
    INTO existing_count
    FROM AVER.SUM_DAY
    WHERE ST_ID = 85693
    AND DATE = CURRENT_DATE;

    IF existing_count = 0 THEN 
        INSERT INTO AVER.SUM_DAY (ST_ID, DATE)
        VALUES (85693, CURRENT_DATE);
    END IF;
COMMIT;
END SP_UPDATE;

Ответы (1 шт):

Автор решения: Basil Peace
  1. В Oracle DATE, несмотря на название, хранит также время с точностью до секунд. CURRENT_DATE аналогично, возвращает значение со временем.

Вот это

добавляет в таблицу запись с текущей датой

неверно. Добавляется запись с датой и временем.

таблица не обновляется

А как вы проверяете? Если пытаетесь найти точную дату, то её действительно не будет.

Чтобы увидеть время, можно поменять параметр сессии NLS_DATE_FORMAT:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';

Можно добавить TRUNC(CURRENT_DATE)

  1. Значение CURRENT_DATE меняется при каждом вызове. Между первым и вторым вызовом значение может поменяться, и вставляться будет уже другая дата. Можно зафиксировать дату в переменную

  2. CURRENT_DATE возвращает дату в часовом поясе сессии. Я оставил эту функцию, но в зависимости от требований может быть надо или использовать SYSDATE, или устанавливать часовой пояс явно

Проблемы 1 и 2 исправлены:

CREATE OR REPLACE PROCEDURE SP_UPDATE 
IS
   D DATE := TRUNC(CURRENT_DATE);
   existing_count INT;
BEGIN
    SELECT COUNT(*)
    INTO existing_count
    FROM SUM_DAY
    WHERE ST_ID = 85693
    AND DATE_ = D;

    IF existing_count = 0 THEN 
        INSERT INTO SUM_DAY (ST_ID, DATE_)
        VALUES (85693, D);
    END IF;
    COMMIT;
END;

Проверка: https://dbfiddle.uk/4b7xXvjT

→ Ссылка