1

我如何使用以下代码创建过程,因为我是 oracle 的新手,总是使用 sybase/ms sql,而且更容易。

DECLARE
    temp     VARCHAR2 (255);
    last_val NUMBER(9, 0);
    CURSOR c1 IS
      SELECT DISTINCT table_name
      FROM   user_tab_cols
      WHERE  column_name = 'id';
BEGIN
    FOR asd IN c1 LOOP
        temp := asd.table_name;

        EXECUTE IMMEDIATE 'select NVL(max("id"),0)+1 from "'||temp||'"' INTO
        last_val;

        BEGIN
            EXECUTE IMMEDIATE 'drop sequence "seq_'|| temp||'"';

            EXECUTE IMMEDIATE 'create SEQUENCE "seq_'|| temp||'" MINVALUE '||
            last_val||
            'MAXVALUE     999999999999999999999999999 INCREMENT BY 1 NOCACHE';

            EXECUTE IMMEDIATE 'select '||temp||'.nextval from dual';

            EXECUTE IMMEDIATE 'ALTER SEQUENCE "seq_'||temp||'" INCREMENT BY 1';
        EXCEPTION
            WHEN OTHERS THEN
              NULL;
        END;
    END LOOP;

    COMMIT;
END; 
4

1 回答 1

2

使用喜欢

CREATE OR replace PROCEDURE Proc_name
IS
  temp     VARCHAR2 (255);
  last_val NUMBER(9, 0);
  CURSOR c1 IS
    SELECT DISTINCT table_name
    FROM   user_tab_cols
    WHERE  column_name = 'id';
BEGIN
    FOR asd IN c1 LOOP
        temp := asd.table_name;

        EXECUTE IMMEDIATE 'select NVL(max("id"),0)+1 from "'||temp||'"' INTO
        last_val;

        BEGIN
            EXECUTE IMMEDIATE 'drop sequence "seq_'|| temp||'"';

            EXECUTE IMMEDIATE 'create SEQUENCE "seq_'|| temp||'" MINVALUE '||
            last_val||
            'MAXVALUE     999999999999999999999999999 INCREMENT BY 1 NOCACHE';

            EXECUTE IMMEDIATE 'select '||temp||'.nextval from dual';

            EXECUTE IMMEDIATE 'ALTER SEQUENCE "seq_'||temp||'" INCREMENT BY 1';
        EXCEPTION
            WHEN OTHERS THEN
              NULL;
        END;
    END LOOP;

    COMMIT;
END;

/ 
于 2012-04-26T08:14:25.483 回答