首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有人尝试过使用intersect而不是oracle-apex列表的值存储方法?

是否有人尝试过使用intersect而不是oracle-apex列表的值存储方法?
EN

Stack Overflow用户
提问于 2021-02-11 07:15:02
回答 2查看 129关注 0票数 0

如您所知,ApEx通过用“:”分隔值,将值的多个选择列表存储在一个列中

代码语言:javascript
运行
复制
qwe:rty:yui:opa:sdf:ghj

但这不是数据库的工作方式,应该有一个带有外键的中间表。所以我的问题是,有没有人试图用正确的方法来做这件事,还是我只是坚持佩奇的方法呢?如果是的话,是否有出错的危险?我不是很有经验的顶点,所以我仍然不知道如何在同一时间插入两个表,如果有人可以告诉我,也许我可以自己找到一个解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-11 08:40:41

在APEX中,多个select中的值被视为冒号分隔的列表,但是在存储数据时您有所有想要的自由。对于多个选择没有内置的支持(可能是因为在后端有很多方法来实现这个功能),但是自己实现逻辑并不困难。

请允许我举例说明一下。有一个表TEAMS (主键TEAM_ID)和一个子表MEMBERS (主键MEMBER_ID)和一个相交表TEAM_MEMBERS (主键TEAM_MEMBER_ID自动生成)。在teams中,有一个选择列表类型的页面项P1_TEAM_MEMBERS,其中“允许多选择”设置为"on“。其中有两部分:

load

  • processing页面上的
  1. 将数据从intersect获取到页面项中

(1)第一部分相当简单。您可以在"SQL (返回冒号分隔值)“类型的P1_TEAM_MEMBERS上创建一个计算(在表单初始化过程之后运行)。这种类型的计算是专门为处理多个选择而创建的。消息来源是

代码语言:javascript
运行
复制
SELECT member_id FROM team_members WHERE team_id = :P1_TEAM_ID

如果希望拥有更多的控件,还可以使用"SQL Query (返回单个值)“和us LISTAGG类型将列转换为冒号分隔的字符串。

(2)为了处理数据,可以使用在自动行处理过程之后执行的应用程序进程。这是因为如果您想要创建一个包含成员的新团队,则需要主表的主键值(在本例中为P1_TEAM)。在我的代码中,我使用了另一个页面项P1_TEAM_MEMBERS_OLD thas具有团队成员的原始值。它还有一个冒号分隔的字符串,它是在这个页面进程之前计算的。plsql apex_string提供了一个非常有用的函数。apex_string.split接受带有分隔符的字符串,并将其转换为pl/sql集合。使用MULTISET识别旧值和新值的差异。

代码语言:javascript
运行
复制
DECLARE
  l_old_team_members apex_t_varchar2;
  l_new_team_members apex_t_varchar2;
  l_members_added apex_t_varchar2;
  l_members_removed apex_t_varchar2;
BEGIN
  l_old_team_members := apex_string.split(:P1_MEMBERS_OLD,':');
  l_new_team_members := apex_string.split(:P1_MEMBERS,':');
  l_members_added := l_new_team MULTISET EXCEPT l_old_team;
  l_members_removed := l_old_team MULTISET EXCEPT l_new_team;
  -- add new team members
  FOR i IN 1 .. l_members_added.COUNT LOOP
    INSERT INTO team_members(team_id, member_id)
      VALUES (:P1_TEAM_ID,l_members_added(i));
  END LOOP;
  -- delete removed team members
  FOR i IN 1 .. l_members_removed.COUNT LOOP
    DELETE FROM team_members WHERE team_id = :P1_TEAM_ID AND member_id = l_members_removed(i);
  END LOOP;
END;

此代码的缺点是没有丢失的更新检测结果,但如果需要,可以手动实现。

票数 1
EN

Stack Overflow用户

发布于 2021-02-11 07:31:58

据我所知,要么您使用Apex提供的内容(这是一个冒号分隔的值列表),要么您“发明”了您自己的解决方案。

我不知道为什么他们(甲骨文)选择这样做,但是的-这是令人讨厌的。不能将这些值正确地存储到表中,无法强制执行引用完整性约束,在编写报告时存在“问题”(因为我们通常存储IDs并显示names,因此必须将列转换为行;并不是说不能这样做),.

由于我没有(太多)多选择的项目,我有点生活在我所拥有的,但我不喜欢它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66150266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档