Oracle:从程序内更新不起作用

八度音

在我的 Oracle PL/SQL 过程中,我试图更新这样的一行:

UPDATE personal p
SET p.surname = surname, p.name = name, p."alter" = alter, p.sex = sex, p.jobcode = jobcode, p.year_wage = month_wage * 12
WHERE p.personalnr = personalnr;
COMMIT;

我在提交后立即添加了这两个语句以确认代码已到达并使用正确的参数执行(例如,在这里我想更改名称):

DBMS_OUTPUT.put_line('updated ' || name);
DBMS_OUTPUT.put_line('personalnr ' || personalnr);

现在这个更新语句是从另一个过程中调用的过程的一部分。

但是,不会应用更改,即使执行了更新,名称也将保持不变。我也尝试使用异常处理程序,但似乎没有发生任何异常。我可以确认 -WHERE子句是意图。有一条记录与谓词匹配。

现在奇怪的是:当我将代码更改为下面的示例时,会发生更新。但是,它会更新每条记录,而不仅仅是具有正确个人编号的记录。再次:该例程仅被调用一次,其中一个personalnr只与表中的一个条目匹配。

UPDATE personal p
SET p.name = 'test'
WHERE p.personalnr = personalnr;
COMMIT;
亚历克斯·普尔

它正在工作,但它正在更新表中的所有行(或者至少是那些personalnr不为空的行),而不仅仅是您期望的行。

从文档

如果 SQL 语句引用的名称既属于列又属于局部变量或形式参数,则列名优先。

您有一个与列同名的 PL/SQL 变量。当你做

where p.personalnr = personalnr

你真的在做:

where p.personalnr = p.personalnr

同样的事情发生在set零件中;SET p.surname = surname将列值更新为它之前的任何值,而不是 PL/SQL 变量的值。所以看起来更新没有发生 - 它实际上发生了,但是因为所有内容都设置为与原始值相同,所以看起来没有发生任何事情。(除了 - 所有行现在都将具有相同的year_wage值......)

您可以使用过程名称作为变量的前缀:

where p.personalnr = my_proc.personalnr

或更改变量名称,使它们不冲突;通常使用短前缀,例如l_用于局部变量或p_传入参数等。

where p.personalnr = l_personalnr

请记住也为该set部分执行此操作,否则您的更新似乎仍然不会执行任何操作。

UPDATE personal p
SET p.surname = l_surname, p.name = l_name, p."alter" = l_alter,
  p.sex = l_sex, p.jobcode = l_jobcode, p.year_wage = l_month_wage * 12
WHERE p.personalnr = l_personalnr;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章