2012-04-26 2 views
1

Как я могу создать процедуру со следующим кодом, потому что я новичок в oracle, всегда использовал sybase/ms sql, и это было проще.Как добавить блок annonymus в процедуру Oracle?

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; 
+1

Как есть операторы DDL там с двумя неявными совершает каждое присутствие явного принятия не имеет значения. Более сильное возражение - КОГДА ДРУГИЕ, ЧЕМ NULL, что ужасно. Это, вероятно, не имеет значения, поскольку у wuery есть DISTINCT, и операция сортировки должна позаботиться о проблеме «моментального снимка слишком старой». И column_name = 'id' должно быть column_name = 'ID'. Нет необходимости в явном указателе - придерживаться неявного. И не объявляйте temp, просто ссылку c1.table_name. И last_val должно быть просто целым числом, а не NUMBER (9,0) –

ответ

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; 

/
+0

Thx для вашей помощи :) – Endiss

+0

Использование commit в pl/sql не рекомендуется .. – hkutluay

+3

Так как есть DDL-заявления там с двумя неявными коммитами, каждый наличие явного коммита не имеет значения. Более сильное возражение - КОГДА ДРУГИЕ, ЧЕМ NULL, что ужасно. Это, вероятно, не имеет значения, поскольку у wuery есть DISTINCT, и операция сортировки должна позаботиться о проблеме «моментального снимка слишком старой». И column_name = 'id' должно быть column_name = 'ID'. –

Смежные вопросы