A在Oracle上修改(删除、插入和更新)后调整表行

A在Oracle上修改(删除、插入和更新)后调整表行,oracle,plsql,Oracle,Plsql,在表格类型上,行顺序应由字段ordem控制 在任何数据修改删除、插入或更新之后,应调整其他行,以确保内容的正确显示 为了实现这一功能,我尝试编写一个触发器,以两种类似的方式I、II更正这些值 创建表类型 ID号主键, ARG_1 VARCHAR220不为空, ARG_2 VARCHAR220不为空, ORDEM编号不为空 ; ------------------------ -我 ------------------------ 创建或替换触发器TGR_类型 在类型上插入、更新或删除之后

在表格类型上,行顺序应由字段ordem控制

在任何数据修改删除、插入或更新之后,应调整其他行,以确保内容的正确显示

为了实现这一功能,我尝试编写一个触发器,以两种类似的方式I、II更正这些值

创建表类型 ID号主键, ARG_1 VARCHAR220不为空, ARG_2 VARCHAR220不为空, ORDEM编号不为空 ; ------------------------ -我 ------------------------ 创建或替换触发器TGR_类型 在类型上插入、更新或删除之后 声明 V_NORDEM编号:=NEW.ORDEM; 游标C_类型为 选择ID、ORDEM 从类型 其中ORDEM>=V_NORDEM; 开始 如果更新或插入,则 开始 对于C_类型循环中的R_类型 更新TYPEA SET ORDEM=ORDEM+1,其中ID=R_TYPE.ID; 端环; 终止 其他的 声明订单号:=0; 开始 对于C_类型循环中的R_类型 更新OSP_TP_ADDR_COMPLEMENTOS SET ORDEM=V_ORDEM+1,其中ID=R_COMPLEMENTO.ID; 端环; 终止 如果结束; 终止 /* 编译时出错: ORA-04082:指新的或旧的许可证,不包括新的或旧的许可证 408200000-表级触发器中不允许新引用或旧引用 *原因:触发器正在访问表触发器中的新值或旧值。 *操作:删除任何新的或旧的引用。 */ ------------------------ -二, ------------------------ 创建或替换 触发训练类型 在类型上插入、更新或删除之后 每行 开始 如果更新或插入,则 开始 对于TP-IN 挑选* 从类型 其中ORDEM>=:NEW.ORDEM 环 更新类型集合ORDEM=ORDEM+1,其中ID=TP.ID; 犯罪 端环; 终止 其他的 声明订单号:=0; 开始 对于TP-IN 挑选* 从类型 点菜 环 更新类型集合ORDEM=V_ORDEM+1,其中ID=TP.ID; 端环; 终止 如果结束; 终止 /* 更新时出错: 更新类型 设置ORDEM=14 其中ID=26 埃罗斯酒店- ORA-04091:一个tabela TYPESé突变体;talvez o gatilho/funçãonão possa localizála ORA-06512:em,第9行 ORA-04088:erro durante a execução do gatilho */
我希望有一种解决方案可以确保触发器操作或其他方法来保证订单字段的完整性。我考虑过改变索引组织的表结构,但不确定。

IOT在这方面没有帮助,IOT只是关于存储,而不是数据内容。关于您编写触发器的动机,有一个问题:您希望应用程序的用户能够控制行的显示顺序吗?在任何数据修改之后,调整其他行-这肯定不是一个好主意。你能详细说明你的问题吗?你到底想干什么?排序背后的逻辑是什么?只是连续的数字吗?这真是个坏主意。显示顺序是一种UI功能,因此它应该在客户机或数据访问层中处理,比如通过对键列进行排序或其他同样有意义的操作。但是要真正理解为什么这是一个坏主意,考虑一下这个场景:你插入一个新的记录,同时我删除一个现存的记录-现在该怎么办?IOT不会有帮助,IOT仅仅是关于存储,而不是数据内容。关于您编写触发器的动机,有一个问题:您希望应用程序的用户能够控制行的显示顺序吗?在任何数据修改之后,调整其他行-这肯定不是一个好主意。你能详细说明你的问题吗?你到底想干什么?排序背后的逻辑是什么?只是连续的数字吗?这真是个坏主意。显示顺序是一种UI功能,因此它应该在客户机或数据访问层中处理,比如通过对键列进行排序或其他同样有意义的操作。但是要真正理解为什么这是一个坏主意,请考虑这个场景:在插入一个新的记录的同时删除一个已有的记录——现在该怎么办?