pl / sql在oracle apex中存储更新过程

时间:2015-03-22 19:18:19

标签: oracle

我在pl / sql存储过程中发现了一些非常奇怪的更新问题,代码是:

create or replace procedure "UPDATECURRENTOFFICE"
(trans_pk IN NUMBER,
office_pk IN NUMBER)
is
BEGIN
UPDATE TRANSACTION
SET TRANSACTION.OFFICE_PK_CURRENT = office_pk
WHERE TRANSACTION.TRANS_PK = trans_pk;
end;​

它最终会更新表中的每条记录,而不仅仅是一条记录。我正在一个进程中使用这个pl / sql程序进行提交 - 在计算和验证之后。我是apex的新手,我觉得用它制作在线系统真的很难。请帮帮我T.T

3 个答案:

答案 0 :(得分:0)

更改参数名称。 用于查询的PL / SQL内的sql解析器

UPDATE TRANSACTION
SET TRANSACTION.OFFICE_PK_CURRENT = office_pk
WHERE TRANSACTION.TRANS_PK = trans_pk;

将trans_pk识别为列trans_pk而不是pl / sql变量。所以WHERE条件被读为WHERE TRANS_PK = TRANS_PK女巫意味着WHERE TRANS_PK不是NULL

以下内容应该有效

create or replace procedure "UPDATECURRENTOFFICE"
(inp_trans_pk IN NUMBER,
office_pk IN NUMBER)
is
BEGIN
UPDATE TRANSACTION
SET TRANSACTION.OFFICE_PK_CURRENT = office_pk
WHERE TRANSACTION.TRANS_PK = inp_trans_pk;
end;​

答案 1 :(得分:0)

这里的问题是您的表中有一列,而存储过程的参数都称为TRANS_PK。您可能已经编写了参数trans_pk,但在Oracle中编写了identifiers (such as parameter names) are case-insensitive

在您的查询中,名称trans_pk被识别为列名而不是参数名。因此,您的查询将更新TRANS_PK值等于TRANS_PK值的每一行。这将是表格中的每一行,除非TRANS_PK不是NULL的任何行。但是,鉴于此列的名称,我怀疑它是TRANSACTION表的主键的一部分,因此不会包含任何NULL值。

如果对函数/过程参数名称使用前缀,例如p_,则此问题就会消失。这是存储过程的固定版本:

create or replace procedure "UPDATECURRENTOFFICE"
(p_trans_pk IN NUMBER,
p_office_pk IN NUMBER)
is
BEGIN
UPDATE TRANSACTION
SET TRANSACTION.OFFICE_PK_CURRENT = p_office_pk
WHERE TRANSACTION.TRANS_PK = p_trans_pk;
end;​

答案 2 :(得分:0)

您可以重命名该参数,但最佳做法是始终在PL / SQL中使用SQL时使用别名,例如:

create or replace procedure "UPDATECURRENTOFFICE"
(trans_pk IN NUMBER,
office_pk IN NUMBER)
is
BEGIN
UPDATE TRANSACTION
SET TRANSACTION.OFFICE_PK_CURRENT = UPDATECURRENTOFFICE.office_pk
WHERE TRANSACTION.TRANS_PK = UPDATECURRENTOFFICE.trans_pk;
end;​

此代码可以适应表结构的意外更改。