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;
- 您不能在 PL/SQL 中使用动态列名(至少不能那样)
- 变量的赋值由 PL/SQL 中的
:=
运算符处理。
- 当你真的应该使用
=
时,不要使用 LIKE
- 为什么将
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;
我正在尝试更新名为 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;
- 您不能在 PL/SQL 中使用动态列名(至少不能那样)
- 变量的赋值由 PL/SQL 中的
:=
运算符处理。 - 当你真的应该使用
=
时,不要使用 - 为什么将
sysdate
作为varchar2
存储在 application_history table 中?也许这些列确实是varchar2
类型,但如果它们只存储日期,那么请考虑将其更改为date
.
LIKE
总而言之,您的触发器应如下所示:
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;