выполнить немедленно с помощью курсора - PullRequest
0 голосов
/ 22 мая 2018

У меня есть количество таблиц, в которые я хочу добавить несколько столбцов и снова добавить несколько других столбцов.(база данных оракула)

Все таблицы пусты.

это работает ??

DECLARE
    CURSOR cursor_name
    IS
        SELECT TABLE_NAME
          FROM SYS.ALL_TABLES
         WHERE OWNER = 'username';

    TN            NVARCHAR2 (30);
    TABLE_COUNT   NUMBER (3);

    TCDROP        NVARCHAR2 (1000);

    TCADD         NVARCHAR2 (1000);
BEGIN
    SELECT COUNT (1)
      INTO TABLE_COUNT
      FROM SYS.ALL_TABLES
     WHERE OWNER = 'username';

    OPEN cursor_name;

    FOR i IN 1 .. TABLE_COUNT
    LOOP
        FETCH cursor_name INTO TN;

        TCDROP := 'ALTER TABLE ' || TN || ' DROP (*columns list*);';

        EXECUTE IMMEDIATE TCDROP;

        TCADD :=
            'ALTER TABLE ' || TN || ' ADD (*columns and datatype list*);';

        EXECUTE IMMEDIATE TCADD;

        EXIT WHEN cursor_name%NOTFOUND;
    END LOOP;

    CLOSE cursor_name;
END;
/

1 Ответ

0 голосов
/ 23 мая 2018

Да, это, безусловно, будет работать.Я бы порекомендовал указать владельца / схему таблиц.Кроме того, это необычно или небезопасно запрашивать количество таблиц и цикл по списку.Я бы поставил это в простой цикл for:

DECLARE
  stmt VARCHAR2(1000);
BEGIN
  FOR t IN (SELECT table_name FROM all_tables WHERE owner='XYZ') LOOP
    stmt := 'ALTER TABLE '||owner||'.'||table_name||' DROP (*columns list*);';
    DBMS_OUTPUT.PUT_LINE(stmt);
    EXECUTE IMMEDIATE (stmt);

    stmt:= 'ALTER TABLE '||owner||'.'||table_name||' ADD (*columns and datatype list*);';
    DBMS_OUTPUT.PUT_LINE(stmt);
    EXECUTE IMMEDIATE (stmt);
  END LOOP;
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...