使用Trigger& amp; Oracle SQL中的序列

时间:2018-03-30 15:38:01

标签: sql oracle function triggers sequence

我有一个触发器,在插入每个Item(Parent Item)后插入一个自定义Sequence(Ref_No。)。 现在我有一个子项目,通过父项目ID链接到第一项(父项),它可以超过1。 我的父项触发器生成序列为“P2505”,我希望我的子项目序列应该是“P2505-1”,对于第二个子项目,它应该是“P2505-2”,依此类推。

每次插入新的父项时,子项的序列都应附加父项序列后跟1并进一步递增。

这是我生成父项序列的触发器

    create or replace trigger REF_NO_TRIGGER before insert on LOST_ITEM for each row

DECLARE
    PREFIX      VARCHAR2(254);

BEGIN


    SELECT NAME INTO PREFIX FROM SUBCAT WHERE SUBCAT.ID= :NEW.SUBCAT_ID;

   :new.REF_NO := substr(PREFIX,1,1)||(:NEW.CATEGORY_ID)||(:NEW.SUBCAT_ID)||(:NEW.ID);

 end;

根据我的理解,我需要检查Sub-Item表中的父项序列并查看是否有任何条目,如果没有条目,那么第一个子项应该是ParentItemSequence-1然后再次计数和追加“-2”,“ - 3”等等

我的子项目表是“子项目”,其中包含“序列”列。

需要帮助!!!

1 个答案:

答案 0 :(得分:0)

以下是如何根据父项的ID生成子项的ID:

SELECT COALESCE( MAX( TO_NUMBER( REGEXP_SUBSTR(parent_id, '\d+$' ) ) ), 0 ) + 1
  FROM subitem_table;

但是这里有一个困难,你不能在subitem表的INSERT或UPDATE触发器中执行此操作,因为......表正在变异。

另一个行动方案可能是使用序列/ IDENTITY列为每个子项生成ID。然后,您可以在子项目表上创建一个视图,以根据查询中的父ID生成ID:

SELECT id, parent_id, parent_id || '-' || ROW_NUMBER() OVER ( PARTITION BY parent_id ORDER BY id ) AS subitem_id
  FROM subitem_table;

希望这有帮助。