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 Name
是 mytable
,
和 Number of Records Displayed
设置为 大于 1(如您的情况,设为 5)。
- 一个名为
NAME
的文本项与 table 的列名称相同
mytable
,Database Item property
设置为 Yes
。
一个按钮,Number of Records Displayed
设置为 1,
Keyboard Navigable
和 Mouse Navigate
属性设置为 No
并具有以下代码(在 WHEN-BUTTON-PRESSED
触发器内):
commit;
Query_Block1;
其中 Query_Block1
在 Program 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;
我的 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
) withQuery Data Source Name
是mytable
,和
Number of Records Displayed
设置为 大于 1(如您的情况,设为 5)。- 一个名为
NAME
的文本项与 table 的列名称相同mytable
,Database Item property
设置为Yes
。 一个按钮,
Number of Records Displayed
设置为 1,Keyboard Navigable
和Mouse Navigate
属性设置为No
并具有以下代码(在
WHEN-BUTTON-PRESSED
触发器内):commit; Query_Block1;
其中
Query_Block1
在Program 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;