我有一个采用两个参数的过程(从日期到日期 - 即 2022-03-01 - 2022-03-12)。
如果相同日期插入两次,我需要做的是在第二次插入时,它不应该显示在表中,应该只有使用 DBMS_OUPUT.PUT_LINE 的错误消息。
我需要做的另一件事是,如果输入了不存在的日期(即 2022-01-01 - 2022-01-15),请根据第一个或最后一个填写日期填写表格输入的日期小于或大于现有日期。
我试过的代码:
CREATE OR replace PROCEDURE P_dates (p_start DATE,
p_finish DATE)
IS
V_DATES DATE := p_start;
v_exists NUMBER;
v_first DATE;
v_last DATE;
BEGIN
SELECT Min(v_dates)
INTO v_first
FROM table1;
SELECT Max(v_dates)
INTO v_last
FROM table1;
SELECT Count(*)
INTO v_exists
FROM table1
WHERE v_dates = v_dates;
IF p_finish < v_dates THEN
dbms_output.Put_line('You can not do this.');
ELSE
WHILE v_dates <= p_finish
LOOP
IF v_exists 0 THEN
dbms_output.put_line('Date '
|| to_char(p_start ,'YYYY-MM-DD')
||' is already in the table.');
ELSE
INSERT INTO table1
(
id_dates,
dates,
year,
quartal ,
month
)
VALUES
(
to_char(v_dates, 'yyyymmdd'),
v_dates ,
extract(year FROM v_dates) ,
CASE
WHEN extract(month FROM v_dates) IN (1,2,3) THEN 'Q1'
WHEN extract(month FROM v_dates) IN (4,5,6) THEN 'Q2'
WHEN extract(month FROM v_dates) IN (7,8,9) THEN 'Q3'
WHEN extract(month FROM v_dates) IN (10,11,12) THEN 'Q4'
END ,
extract(month FROM v_dates) ,
to_char(v_datum, 'Month')
);
v_dates := v_dates + 1;
IF p_start < v_first p_dates(p_start, v_first - 1);
ELSIF p_finish v_last THEN
p_dates(v_last + 1, p_finish);
END IF;
END IF;
END LOOP;
END IF;
END;