Не добавляются данные процедурой в БД 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 шт):
- В Oracle
DATE
, несмотря на название, хранит также время с точностью до секунд.CURRENT_DATE
аналогично, возвращает значение со временем.
Вот это
добавляет в таблицу запись с текущей датой
неверно. Добавляется запись с датой и временем.
таблица не обновляется
А как вы проверяете? Если пытаетесь найти точную дату, то её действительно не будет.
Чтобы увидеть время, можно поменять параметр сессии NLS_DATE_FORMAT
:
ALTER SESSION SET NLS_DATE_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
Можно добавить TRUNC(CURRENT_DATE)
Значение
CURRENT_DATE
меняется при каждом вызове. Между первым и вторым вызовом значение может поменяться, и вставляться будет уже другая дата. Можно зафиксировать дату в переменную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