SQL 在 ORACLE APEX 5.x

SQL on ORACLE APEX 5.x

我正在尝试更新名为 application_history 的 table 上的时间,每个列名都列在 'CASE' 部分,我试图在其中设置 [=16] =] 到列名。然后我稍后尝试使用该列尝试将时间插入该列。 这是我尝试过的,请记住我不知道触发限制是什么。

create or replace TRIGGER update_application_history AFTER UPDATE ON application
FOR EACH ROW
DECLARE
  status VARCHAR(35);
BEGIN 
  CASE
    WHEN old.application_status LIKE 'Application Withdrawn' THEN SET status = 'APPLICATION_WITHDRAWN'
    WHEN old.application_status LIKE 'Applicant Accepted Offer' THEN SET status = 'APPLICANT_ACCEPTED_OFFER'
    WHEN old.application_status LIKE 'Applicant Declined Offer' THEN SET status = 'APPLICANT_DECLINED_OFFER'
    WHEN old.application_status LIKE 'Applicant Invited for Assessment' THEN SET status = 'INVITED_TO_ASSESMENT_CENTRE'
    WHEN old.application_status LIKE 'Applicant Invited for Interview' THEN SET status = 'INVITED_FOR_INTERVIEW'
    WHEN old.application_status LIKE 'Applicant Offered Position' THEN SET status = 'APPLICANT_OFFERED_POSITION'
    WHEN old.application_status LIKE 'Applicant Rejected'THEN SET status = 'APPLICANT_REJECTED'
  END
UPDATE application_history
SET status = TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS')
WHERE old.arn LIKE arn
END;
  1. 您不能在 PL/SQL 中使用动态列名(至少不能那样)
  2. 变量的赋值由 PL/SQL 中的 := 运算符处理。
  3. 当你真的应该使用 =
  4. 时,不要使用 LIKE
  5. 为什么将 sysdate 作为 varchar2 存储在 application_history table 中?也许这些列确实是 varchar2 类型,但如果它们只存储日期,那么请考虑将其更改为 date.

总而言之,您的触发器应如下所示:

create or replace TRIGGER update_application_history AFTER UPDATE ON application
FOR EACH ROW
BEGIN 
  CASE
    WHEN :old.application_status = 'Application Withdrawn' 
    THEN 
      UPDATE application_history
      SET APPLICATION_WITHDRAWN = sysdate
      WHERE :old.arn = arn;
    WHEN :old.application_status = 'Applicant Accepted Offer' 
    THEN 
      UPDATE application_history
      SET APPLICANT_ACCEPTED_OFFER = sysdate
      WHERE :old.arn = arn;
    -- you get the point... add the rest here
    END CASE;
END;