【问题标题】:Oracle automatically insert record in multirecord block part 2Oracle 自动在多记录块中插入记录第 2 部分
【发布时间】:2018-11-24 00:53:43
【问题描述】:

我的桌子是这样的:

+-------------------+
|Name               |
+-------------------+
|Name1              |
|Name2              |
|Name3              |
|Name4              |
|Name1Jr            |
|Name2Jr            |
|Name4Jr            |
+-------------------+

我的多行块看起来像:

我想知道的是,插入名字后如何插入与Jr同名的记录。例如,我插入了 Name2,它也会将 Name2Jr 插入到多行块中。像这样:

注意:我需要从数据库中获取自动插入数据的值。

我尝试了 WHEN-NEW-RECORD-INSTANCE 触发器(@Littlefoot 爵士对我最后一个问题的回答):

if :system.trigger_record = 1 and :test.name is null then
    -- do nothing if it is the first record in a form
    null;
else
    duplicate_record;
    if substr(:test.name, -2) = 'Jr' then
        -- you've duplicated a record which already has 'Jr' at the end - don't do it
        :test.name := null;
    else       
        -- concatenate 'Jr' to the duplicated record
        :test.name := :test.name || 'Jr';
    end if;      
end if;  

现在,我想知道是否有办法在 WHEN-VALIDATE-RECORD 触发器上执行此操作。问题在于 duplicate_record 不能在 WHEN-VALIDATE-RECORD 触发器中使用。如何使用过程,函数或其他东西来做到这一点?提前致谢!

【问题讨论】:

    标签: oracle oracle11g oracleforms


    【解决方案1】:

    DUPLICATE_RECORD 是一个受限过程,您不能在WHEN-VALIDATE-RECORD 触发器(或任何其他同类)中使用它。

    由于您必须导航到下一条记录(如果您想复制它),即使您将该受限过程放入另一个 PL/SQL 程序单元,一切都会传播 并且 - 最终 - 引发同样的错误。所以……你运气不好。

    即使您编写了一个(存储的)过程,将“Jr”行插入到后台某处的数据库中,您也必须将这些值提取到屏幕上。因为EXECUTE_QUERY 是这样做的方式,而且因为它是(又一个)受限程序,所以这也行不通。

    如果您计划清除数据块并手动填充(通过使用循环),则必须使用NEXT_RECORD 导航到下一个(以及下一个和下一个)记录,这又是一个受限过程。此外,如果它是一个数据块(是的,它是),一旦您保存更改,您实际上会为所有记录创建 duplicates - 要么它会因违反唯一约束而失败(这很好),否则您会创建重复项(更糟)。

    顺便说一句,WHEN-NEW-RECORD-INSTANCE 有什么问题?使用过程中遇到什么问题?

    【讨论】:

    • 我插入的带有 Jr 的名字都来自一个表。我也忘了说我为此使用了 LOV。对不起先生,再次感谢您的回复。
    • 显然 (stackoverflow.com/questions/50901744/create-record-oracle-forms),您发现应该使用 WHEN-NEW-RECORD-INSTANCE 。无论您打开多少主题,答案仍然是相同的。您越早接受受限程序无法在您想要的任何地方使用这一事实,您就会越早继续前进。我建议您阅读表单帮助中的受限程序。希望事情对你来说会更清楚。
    【解决方案2】:

    我们需要的是

    • 一个数据块 (BLOCK1) 与

      Query Data Source Namemytable

      Number of Records Displayed 设置为超过1(在你的情况下让它为5)。

    • 一个名为NAME的文本项,与表的列名相同 mytableDatabase Item property 设置为 Yes
    • Number of Records Displayed 设置为 1 的按钮,

      Keyboard NavigableMouse Navigate 属性设置为 No

      并具有以下代码(在WHEN-BUTTON-PRESSED 触发器内):

      commit;
      Query_Block1;
      

      Query_Block1 位于 Program Units 节点下方,代码如下:

      PROCEDURE Query_Block1 IS
      BEGIN
        execute_query;
        last_record;
        down;
      END;
      
    • BLOCK1 节点下的 POST-INSERT 触发器,代码:

         insert into mytable(name) values(:name||'Jr');
      
    • 带有代码的表单级别的ON-MESSAGE 触发器(在提交之后抑制消息):

            if    Message_Code in (40400, 40401) then 
              null;
            end if;
      
    • WHEN-NEW-FORM-INSTANCE 使用代码触发:

            Query_Block1;
      

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多