Oracle Apex 更新表的特定行

Posted

技术标签:

【中文标题】Oracle Apex 更新表的特定行【英文标题】:Oracle Apex update specific row of table 【发布时间】:2021-01-25 20:38:06 【问题描述】:

您好,我想通过 apex 更新我的 oracle 数据库的特定行。所以我需要通过 where 子句到达/解决特定行。

示例条目:

GATTUNG ART UNTERART ABART VARIETÄT
AAA AAA AAA NULL NULL
AAA AAA NULL NULL AAA
AAA AAA NULL NULL NULL

现在我有两种方法。

第一:

UPDATE TBL_PFLANZE
SET NAMEN =:P1_NAMEN
WHERE (GATTUNG = :P1_GATTUNG AND ART = :P1_ART_KREUZUNG)
AND ((UNTERART=:P1_UNTERART OR :P1_UNTERART IS NULL) AND (VARIETÄT=:P1_VARIETAET OR :P1_VARIETAET IS NULL) AND (ABART=:P1_ABART OR :P1_ABART IS NULL));

秒:

UPDATE TBL_PFLANZE 
SET NAMEN ='&P1_NAMEN.' 
WHERE (GATTUNG = '&P1_GATTUNG.' AND ART = '&P1_ART_KREUZUNG.') 
AND (UNTERART &P1_WHERE_UNTERART. AND VARIETÄT &P1_WHERE_VARIETAET. AND ABART &P1_WHERE_ABART.);

这两种方法的区别在于P1_WHERE_...variables。

    第一个使用例如 :P1_UNTERART 并包含整个值 第二个使用例如 &P1_WHERE_UNTERART。并包含 = '&P1_UNTERART.'IS NULL

我的问题是:

    如果我只设置 GATTUNG 和 ART(如果我没有指定其他变量之一),第一个更新所有条目 第二种方法可行,但不是正确的方法,因为我应该使用绑定变量而不是&VAR.

所以我的问题是,我如何使用第一种方法来获得所需的结果... :(

【问题讨论】:

:P1_UNTERART 为空时,是否应该只在UNTERART 列也为空时才更新?例如。你想要(UNTERART=:P1_UNTERART OR (UNTERART IS NULL AND :P1_UNTERART IS NULL)) @kfinity no,例如,我有 3 或 6 个或 n 个条目,它们在 (GATTUNG + TYPE) + UNTERART + ABART + VARIETÄT 的组合中是唯一的。而且我总是必须能够更新其中一个 n 组合。因此:WHERE UNTERART 为空且 ABART 为空且 VARIETY 为空。然后:WHERE UNTERART 为空且 ABART 为空且 VARIETÄT = 'STRING' 下一个:WHERE UNTERART 为空且 ABART = 'String' 且 VARIETÄT 为空,依此类推 【参考方案1】:

这能解决问题吗?如果任何列与相应的页面项具有相同的值或数据库列和页面项都为空,它将更新行:

UPDATE tbl_pflanze
   SET
  namen = :P1_NAMEN
 WHERE
  ( gattung = :P1_GATTUNG AND art = :P1_ART_KREUZUNG)
    AND
  ( ( NVL(unterart,'X') = NVL(:P1_UNTERART,'X')) AND
    ( NVL(varietät,'X') = NVL(:P1_VARIETAET,'X')) AND
    ( NVL(abart,'X') = NVL(:P1_ABART,'X')) );

【讨论】:

它虽然看起来有点毛骨悚然^^,谢谢 太棒了。将“X”替换为“novalue”之类的东西会让它看起来更专业;)。你能把答案标记为正确吗? 是的,没错。我去做。我认为可能还有其他方法(为了更好地理解:D)。 ;) 但是是的,我会标记为正确的。谢谢【参考方案2】:

在我看来,第一个查询是正确的,第二个是错误的。

为什么错了?因为您使用的是 strings。这个:

SET NAMEN ='&P1_NAMEN.' 
WHERE (GATTUNG = '&P1_GATTUNG.'

希望将 litally &P1_NAMEN. 字符串放入 NAMEN 列中,用于所有 GATTUNG 列包含字面上 &P1_GATTUNG. 字符串的行(并且很可能没有,所以第二个查询不会做任何事情,永远)。

那么,您的问题到底是什么?为什么您认为第一个查询不起作用?您是否在调试模式下运行该页面并查看了调试结果?会不会是 P1 页面的项目没有存储到会话状态中,所以 UPDATE 语句看不到它们?

另外,你在哪里执行UPDATE?作为按下按钮后运行的进程?还有什么?

【讨论】:

您好,很抱歉,我可能忘记解释了。我使用动态操作和服务器端代码执行,对于任何误解,我深表歉意。我知道第二种方法是错误的,但按预期工作:D.(P1_GATTUNG 和 P1_ART 已设置并仅更新第 3 行)当我设置 P1_GATTUNG 和 P1_ART 时,第一种也是正确的方法会更新所有行。但由于数据完整性,如果字段 P1_UNTERART、P1_ABART 和 P1_VARIETÄT 为空或数据库中的相应字段为 NULL,我只想更新第 3 行。 da 由按钮触发。 P1_NAMEN 和 P1_GATTUNG 和 P1_ART 包含一个简单的字符串。但是对于 where 子句,当字段为空时使用 IS NULL 以获得正确的行很重要。

以上是关于Oracle Apex 更新表的特定行的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle Apex 5 中为每一行唯一地更新列?

Oracle Apex - 如何使用动态操作更新更改操作的值列表?

创建一个将在 apex 中更新数据库表的按钮

提交表单数据不刷新页面oracle apex

根据 Oracle APEX 项目值更新和插入

Oracle Apex 4.1 复选框更新穿梭