PL/SQL 中的日期

问题描述 投票:0回答:0

我有一个采用两个参数的过程(从日期到日期 - 即 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; 
sql oracle plsql procedure
© www.soinside.com 2019 - 2024. All rights reserved.