交互式网格:仅使用不基于表的 PL/SQL 处理

Posted

技术标签:

【中文标题】交互式网格:仅使用不基于表的 PL/SQL 处理【英文标题】:Interactive Grid:Process with PL/SQL only that isn't based off a table 【发布时间】:2019-11-12 11:53:54 【问题描述】:

环境:Oracle APEX v5.1 和 Oracle 12c 第 2 版

首先,我创建了一个不基于基础表的交互式网格,因为我将使用 PL/SQL 手动处理它。

我一直使用以下内容作为指导:

https://apex.oracle.com/pls/apex/germancommunities/apexcommunity/tipp/6361/index-en.html

我基本上有以下查询:

select  
  level as id,  
  level as grid_row,  
  null as product,  
  null as product_item  
from dual connect by level <= 1  

只专注于 product_item 列将是只读列并且只能输入产品编号的 product_item 列,我想实现以下目标:

Product    Product Item
---------- -------------
123456     123456-1
123456     123456-2
556677     556677-1
654321     654321-1
654321     654321-2
654321     654321-3
123456     123456-3

根据上面的内容,当用户键入产品然后从字段中跳出标签时,我希望触发一个 DA,它将“-1”序列添加到该产品编号的末尾。然后是用户然后在 IG 中添加另一行并输入相同的产品编号,然后我希望它在其末尾附加“-2”。

仅当产品更改编号时,我需要按照 556677 等将新产品的序列重置为“-1”。

还应考虑的其他情况如下:

    从上面的 IG,用户再次输入 123456 但这应该计算出 123456 的下一个序列是“-3”

    当产品从 IG 中移除时,同样需要考虑,但始终查看该产品的最大序列号。

我在考虑可能使用 APEX_COLLECTIONS 作为存储网格中当前内容的一种方式,因为尚未对数据库进行任何更改。

【问题讨论】:

似乎没有问题(尽管有很多关于您的意图和想法的陈述)。如果您确切地阐明了您的要求(或者您拥有什么代码以及错误是什么),这将有所帮助。 @MT0 - 我正在寻求帮助,了解如何根据输入的产品价值最好地在 product_item 中生成和维护序列,并同时处理提到的两种情况。希望这更清楚一些。 【参考方案1】:

假设您有一个产品值的集合(在这种情况下,我使用的是内置的 SYS.ODCINUMBERLIST,它是一个 VARRAY 数据类型),那么您输出的 SQL 将是:

SELECT id,
       id AS grid_row,
       product,
       product || '-' || ROW_NUMBER() OVER ( PARTITION BY product ORDER BY id )
         AS product_item
FROM   (
  SELECT ROWNUM AS id,
         COLUMN_VALUE AS product
  FROM   TABLE(
           SYS.ODCINUMBERLIST(
             123456,
             123456,
             556677,
             654321,
             654321,
             654321,
             123456
           )
         )
)
ORDER BY id

输出

身份证 | GRID_ROW |产品 | PRODUCT_ITEM -: | --------: | ------: | :----------- 1 | 1 | 123456 | 123456-1 2 | 2 | 123456 | 123456-2 3 | 3 | 556677 | 556677-1 4 | 4 | 654321 | 654321-1 5 | 5 | 654321 | 654321-2 6 | 6 | 654321 | 654321-3 7 | 7 | 123456 | 123456-3

db小提琴here

【讨论】:

从您的解决方案中我可以看到,您正在提供一个查询。我实际上需要根据产品列中输入的值动态计算 product_item 序列。需要维护此序列,因为实际上没有任何内容存储在数据库中。最后,用户最终会按下“应用”按钮,然后将信息存储在后端。【参考方案2】:

正如您所提到的,您输入的数据在您插入产品时不会保存到数据库中,因此它实际上并没有存储在任何地方。 所以你不能去检查那个值是否已经存在并输入 -2 或其他。

需要考虑的一些事情是将值保存到临时表中,这样您就可以使用函数检查其中有多少 product_item(如 123456-%),并将该数字 +1 用作您的新 product_item。

或者你可以更艰难地使用 javascript 来完成这一切。为此,您需要以某种方式获取 IG 中的所有记录,查看所有记录并查看 123456 的出现次数,然后插入 123456-(出现次数 + 1)。

【讨论】:

以上是关于交互式网格:仅使用不基于表的 PL/SQL 处理的主要内容,如果未能解决你的问题,请参考以下文章

将PL / SQL块与交互式网格一起使用(Oracle Apex)

PL/SQL记录

Oracle pl/sql 更新表的过程 - 异常处理

SQL记录-PLSQL记录

PL/SQL编程

如何在不提交页面的情况下刷新 PL/SQL 动态内容区域