2

我有许多现有的表,每个表都有一个名为“id”的列。该列有一个从 1 开始的整数值。例如,表 MY_TABLE 包含 3 条记录,id 为 1、2 和 3(超级基本)。

我想为我拥有的每个表创建一个序列,并使用表的最大 id 设置它的起始值。在我的例子中,我需要这样的东西:

CREATE SEQUENCE MY_TABLE_SEQ START WITH 3 INCREMENT BY 1;

我尝试了这样的事情,但没有奏效:

CREATE SEQUENCE MY_TABLE_SEQ START WITH (SELECT NVL(MAX(id),1) FROM MY_TABLE) INCREMENT BY 1;

知道我能做什么吗?

谢谢

4

2 回答 2

5
DECLARE
    MAXVAL MY_TABLE.ID%TYPE;
BEGIN
    SELECT NVL(MAX(id),1) INTO MAXVAL FROM MY_TABLE;
    EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_TABLE_SEQ START WITH ' || MAXVAL || ' INCREMENT BY 1';
END
/

您还可以在创建序列后更改它们。

关于这个主题的一些读物:http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID: 951269671592

于 2013-10-29T18:32:02.927 回答
2

您可以生成 CREATE SEQUENCE 命令:

CREATE TABLE test_tab1 (
  id number
);

CREATE TABLE test_tab2 (
  id number
);

INSERT INTO test_tab1 VALUES (20);
INSERT INTO test_tab2 VALUES (40);

COMMIT;

DECLARE
  v_max_id NUMBER;
BEGIN
  FOR v_table IN (SELECT table_name
                    FROM user_tables
                  WHERE table_name IN ('TEST_TAB1', 'TEST_TAB2'))
  LOOP
    EXECUTE IMMEDIATE 'SELECT NVL(MAX(id), 1) FROM ' || v_table.table_name
      INTO v_max_id;
    dbms_output.put_line(
      'CREATE SEQUENCE ' || upper(v_table.table_name) || '_SEQ START WITH ' || v_max_id || ' INCREMENT BY 1;');
  END LOOP;
END;

输出:

CREATE SEQUENCE TEST_TAB1_SEQ START WITH 20 INCREMENT BY 1;
CREATE SEQUENCE TEST_TAB2_SEQ START WITH 40 INCREMENT BY 1;
于 2013-10-29T18:36:38.220 回答