gpt4 book ai didi

oracle - oracle中触发器中声明和调用变量

转载 作者:行者123 更新时间:2023-12-04 01:51:18 29 4
gpt4 key购买 nike

我正在尝试声明一个变量并再次访问它以更新特定 id 的同一个表。(更新 STATUS'E''R ')

create or replace trigger resume_trgr
before update on temp_jobs

DECLARE
job_status varchar(2);

begin
select STATUS into :job_status from temp_jobs where id=6120;
if :job_status='E'
then
update temp_jobs set STATUS='R' where id=6120;
end if;
end;
/

但是在执行上面的代码时返回错误。错误代码如下:

触发resume_trgr编译

 Errors: check compiler log

Error(5,27): PLS-00049: bad bind variable 'STATUS'

最佳答案

题中你说错误指的是STATUS ,但这与您发布的代码不匹配您应该收到两个错误,指的是 JOB_STATUS .

那是因为它被定义为局部变量,而您正试图将其作为绑定(bind)变量引用。它不应该有冒号前缀;所以这个编译:

create or replace trigger resume_trgr
before update on temp_jobs
declare
job_status temp_jobs.status%type;
begin
select STATUS into job_status from temp_jobs where id=6120;
if job_status='E'
then
update temp_jobs set STATUS='R' where id=6120;
end if;
end;
/

就像这样,它完全跳过了变量:

create or replace trigger resume_trgr
before update on temp_jobs
begin
update temp_jobs set STATUS='R' where id=6120 and status = 'E';
end;
/

在触发器内执行的操作是否有用、有效或明智是另一回事。这似乎是一个单独的更新,你应该在你的“真实”更新之前手动进行,可能是在一个过程中 - 如果你真的想始终更新该特定 ID 的行,而不管你在“真实”中实际做了什么(触发)更新。

如果您真正想做的是确保状态更改为 R即使调用者没有明确地这样做,那么您可能需要一个设置伪行值的行级触发器,而不是具有硬编码 ID 的语句级触发器。

关于oracle - oracle中触发器中声明和调用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52928263/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com