Oracle 自动在多记录块中插入记录第 2 部分

Oracle automatically insert record in multirecord block part 2

我的 table 看起来像这样:

+-------------------+
|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触发。如何使用过程、函数或其他东西来做到这一点?提前致谢!

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

因为你必须导航到下一条记录(如果你想复制它),即使你把那个限制程序放到另一个PL/SQL程序单元中,一切都会 propagate 并且 - 最终 - 引发相同的错误。所以……你倒霉了。

即使您编写了一个(存储的)过程来将 "Jr" 行插入数据库中的某个位置,您也必须将这些值提取到屏幕上。由于 EXECUTE_QUERY 是执行此操作的方法,并且由于它是(又一个)受限程序,因此也行不通。

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

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

我们需要的是

  • 一个数据块 (BLOCK1) with

    Query Data Source Namemytable,

    Number of Records Displayed 设置为 大于 1(如您的情况,设为 5)。

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

    Keyboard NavigableMouse Navigate 属性设置为 No

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

    commit;
    Query_Block1;
    

    其中 Query_Block1Program Units 节点下方,代码如下:

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

       insert into mytable(name) values(:name||'Jr');
    
  • 一个 ON-MESSAGE 触发器在表单级别使用代码(在 commit 之后抑制消息):

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

          Query_Block1;