如您所知,ApEx通过用“:”分隔值,将值的多个选择列表存储在一个列中
qwe:rty:yui:opa:sdf:ghj但这不是数据库的工作方式,应该有一个带有外键的中间表。所以我的问题是,有没有人试图用正确的方法来做这件事,还是我只是坚持佩奇的方法呢?如果是的话,是否有出错的危险?我不是很有经验的顶点,所以我仍然不知道如何在同一时间插入两个表,如果有人可以告诉我,也许我可以自己找到一个解决方案。
发布于 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
(1)第一部分相当简单。您可以在"SQL (返回冒号分隔值)“类型的P1_TEAM_MEMBERS上创建一个计算(在表单初始化过程之后运行)。这种类型的计算是专门为处理多个选择而创建的。消息来源是
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识别旧值和新值的差异。
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;此代码的缺点是没有丢失的更新检测结果,但如果需要,可以手动实现。
发布于 2021-02-11 07:31:58
据我所知,要么您使用Apex提供的内容(这是一个冒号分隔的值列表),要么您“发明”了您自己的解决方案。
我不知道为什么他们(甲骨文)选择这样做,但是的-这是令人讨厌的。不能将这些值正确地存储到表中,无法强制执行引用完整性约束,在编写报告时存在“问题”(因为我们通常存储IDs并显示names,因此必须将列转换为行;并不是说不能这样做),.
由于我没有(太多)多选择的项目,我有点生活在我所拥有的,但我不喜欢它。
https://stackoverflow.com/questions/66150266
复制相似问题