在 Oracle 中基于 ddmmyyy 格式的日期更新触发器列

Update trigger column based on date in ddmmyyy format in Oracle

我创建了一个触发器,我想根据它为列分配一些值。

例如:我有一个列名称 BILL_CALCULATED_DATE,其值为 19-10-21,格式为 dd-mm-yy。我想提取 mm 如果它是 10 那么我想将它分配为 October

下面是我的触发器

CREATE OR REPLACE TRIGGER TRG_UPD_GTL_BILL
BEFORE INSERT OR UPDATE ON IPFEE_MST_INSRT_GTL
FOR EACH ROW
 BEGIN
 :new.BILL_CALCULATED_DATE := case :NEW.UPLOADED_MONTH
                     when '01' then 'January'
                     when '02' then 'February'
                     when '03' then 'March'
                     when '04' then 'April'
                     when '05' then 'May'
                     when '06' then 'June'
                     when '07' then 'July'
                     when '08' then 'August'
                     when '09' then 'September'
                     when '10' then 'October'
                     when '11' then 'November'
                     when '12' then 'December'
end;
end;

但问题是,在触发器中分配月份之前,我想提取月份。我应该如何实现它?

是这样的吗?

SELECT EXTRACT(month FROM SYSDATE) from dual

据我了解,您的专栏不是日期格式。首先将其转换为日期,然后使用 EXTRACT 函数 -

SELECT EXTRACT(month FROM TO_DATE(BILL_CALCULATED_DATE, 'dd-mm-yy'))
  FROM IPFEE_MST_INSRT_GTL;

假设您的 BILL_CALCULATED_DATE 列是 DATE 数据类型并且您希望 UPLOADED_MONTH 列是对应于 BILL_CALCULATED_DATE 的月份的名称然后月份:

不要使用触发器;使用虚拟列,那么列值将始终同步。

要么创建 table 使用:

CREATE TABLE IPFEE_MST_INSRT_GTL(
  BILL_CALCULATED_DATE DATE,
  UPLOADED_MONTH      VARCHAR2(9)
    GENERATED ALWAYS AS (
      CAST(
        TO_CHAR(BILL_CALCULATED_DATE, 'fmMonth', 'NLS_DATE_LANGUAGE=English')
        AS VARCHAR2(9)
      )
    )
);

或修改现有的table以删除non-virtual列并添加一个虚拟列:

ALTER TABLE IPFEE_MST_INSRT_GTL DROP COLUMN UPLOADED_MONTH;

ALTER TABLE IPFEE_MST_INSRT_GTL
  ADD UPLOADED_MONTH VARCHAR2(9)
    GENERATED ALWAYS AS (
      CAST(
        TO_CHAR(BILL_CALCULATED_DATE, 'fmMonth', 'NLS_DATE_LANGUAGE=English')
        AS VARCHAR2(9)
      )
    );

如果必须使用触发器和真实列,则:

CREATE OR REPLACE TRIGGER TRG_UPD_GTL_BILL
BEFORE INSERT OR UPDATE ON IPFEE_MST_INSRT_GTL
FOR EACH ROW
BEGIN
  :NEW.UPLOADED_MONTH := TO_CHAR(
                           :new.BILL_CALCULATED_DATE,
                           'fmMonth',
                           'NLS_DATE_LANGUAGE=English'
                         );
END;
/

如果您的 BILL_CALCULATED_DATE 列是 CHARVARCHAR2 数据类型,则:

  1. 将该列更改为 DATE
  2. 如果您无法将其更改为 DATE,请与可以将其更改为 DATE 的人交谈。
  3. 如果你真的,真的不能把它改成 DATE 然后花时间对无法遵循最佳实践感到绝望,试着说服那些可能有能力做某事的人你应该改变东西,然后在上面的代码片段中将 BILL_CALCULATED_DATE 替换为 TO_DATE(BILL_CALCULATED_DATE, 'DD-MM-YY') 或将 :new.BILL_CALCULATED_DATE 替换为 TO_DATE(:new.BILL_CALCULATED_DATE, 'DD-MM-YY')

db<>fiddle here