使用游标立即执行

时间:2018-05-22 12:32:48

标签: oracle plsql

我有多少个表要删除一些列并再次添加其他列。 (oracle数据库)

所有表格都是空的。

有效吗?

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 :(得分:0)

是的,这肯定会奏效。不过,我建议放入表的所有者/架构。此外,通过列表查询表的数量和循环是不寻常的或不安全的。我把它放在一个简单的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;
/