【问题标题】:Oracle Apex 5: Using PL/SQL to insert a value to a page itemOracle Apex 5:使用 PL/SQL 向页面项插入值
【发布时间】:2017-05-25 14:11:43
【问题描述】:

我正在尝试为向导创建的问卷创建一个自动递增的主键。问题是,我需要在预渲染阶段将主键插入页面项目 P2_ID(这是一个隐藏项目),以便我可以在问卷的每个部分运行 ARF 进程以允许员工返回并更改他们的答案。

我似乎无法使用触发器,因为它在提交时实现,我希望 PK 在会话开始时填充。

目前,我有一个进程在预渲染阶段使用此 PL/SQL 代码运行:

begin
    select SEQ_UAT.nextval into :P2_ID from dual;
end;

但无论我做什么,我似乎都无法获得这个非常简单的 PL/SQL 代码来填充 P2_ID 页面项!

有什么想法吗?

【问题讨论】:

  • 调试日志告诉您 P2_ID 发生了什么?

标签: sql oracle plsql oracle-apex


【解决方案1】:

感谢您的回答。

我能够以某种方式弄清楚。基本上,我删除了我正在运行的 ARP 并将其设为 PL/SQL 函数,这允许我创建一个预渲染 PL/SQL 进程以使用 seq.nextval 创建一个 PK。

不知道为什么,但似乎 ARP 无法与 seq.nextval 一起使用!

【讨论】:

    【解决方案2】:

    不知道为什么这不起作用,但您可以使用MAX(pk_id)+1。如果您使用seq.nextval,它将在每次用户刷新页面等时递增。

    编辑:您不能也将 :P2_id 的源设置为 sql 查询并从那里填充吗?

    【讨论】:

    • 我不同意您使用 MAX + 1 的能力,至少在多用户环境中是这样。这是一个错误,最终会导致重复键。这就是为什么。在 Oracle 中,写入不会阻止其他人从同一个表中读取数据。但是直到提交之后,才能在另一个会话中看到来自 1 个会话的 DML。因此会发生以下情况:为简化起见,假设您的桌子上的最大 pk 为 100。现在 User1 登录并获取 session1,而 user2 登录并获取 session2。
    • (续) 现在 user1 运行您的程序,获得 PK=101 并插入一行。但是,在提交 user2 运行该过程之前。 User2 也将获得 PK=101。这可能需要很长时间,但最终会发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多