如何在Oracle SQL中使用序列加载分层表

gz5pxeao  于 2023-08-03  发布在  Oracle
关注(0)|答案(1)|浏览(95)

如果我有一个分层表:树(ID,PARENT_ID,NAME)
如何在SQL中使用序列加载它?在PLSQL中,我们可以使用变量等。但我想知道是否可以用SQL来完成。
这显然不起作用,它在第2行失败,因为ID = PARENT_ID,我有一个检查约束阻止它。

insert into tree (TREE_SEQ.NEXTVAL, NULL, 'root');
insert into tree (TREE_SEQ.CURRVAL, TREE_SEQ.NEXTVAL, 'branch');

字符串
这是可行的,但我担心并发性。
它还假设序列是用INCREMENT BY 1定义的

insert into tree (TREE_SEQ.NEXTVAL, NULL, 'root');
insert into tree (TREE_SEQ.NEXTVAL, TREE_SEQ.CURRVAL - 1, 'branch');

gwo2fgha

gwo2fgha1#

你应该使用PL/SQL:

DECLARE
  v_id tree.id%TYPE;
BEGIN
  INSERT INTO tree (ID, PARENT_ID, NAME)
  VALUES (TREE_SEQ.NEXTVAL, NULL, 'root')
  RETURNING id INTO v_id;

  INSERT INTO tree (ID, PARENT_ID, NAME)
  VALUES (TREE_SEQ.NEXTVAL, v_id, 'branch');
END;
/

字符串
其中,给定的设置:

CREATE TABLE TREE (
  ID        NUMBER PRIMARY KEY,
  PARENT_ID REFERENCES tree(id),
  NAME      VARCHAR2(10)
);

CREATE SEQUENCE tree_seq;


然后在PL/SQL块之后,该表包含:
| 父ID|姓名| NAME |
| --|--| ------------ |
| * 空 *| 根| root |
| 一个|分支| branch |
但是,如果创建一个函数来 Package 序列:

CREATE FUNCTION get_tree_sequence RETURN TREE.ID%TYPE
IS
BEGIN
  RETURN TREE_SEQ.NEXTVAL;
END;
/


然后你可以在SQL语句中使用它:

INSERT INTO tree (ID, PARENT_ID, NAME)
SELECT id,
       LAG(id) OVER (ORDER BY ROWNUM),
       CASE ROWNUM WHEN 1 THEN 'root' ELSE 'branch' END
FROM   (
  SELECT get_tree_sequence() AS id
  FROM   DUAL
  CONNECT BY LEVEL <= 2
);


那么该表现在包含:
| 父ID|姓名| NAME |
| --|--| ------------ |
| * 空 *| 根| root |
| 一个|分支| branch |
| * 空 *| 根| root |
| 三个|分支| branch |
fiddle

相关问题