thanks用于使用失败的代码和错误消息更新问题。
EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || &&PowerTsmUsername..&&SeqName || ' RESTART START WITH ' || dummy;
您应该能够简单地删除单个引号:
,无论如何,我建议一种不同的方法。使用PL/SQL和
EXECUTE IMMEDIATE
,您可以将DDL的任何部分(包括表名称)串起,而无需使用SQL*Plus替换变量。因此,您只需要写一次语句即可在循环中使用它以在所有200个表上工作。我建议不要使用SQL*加上像这样的划分控制器,从外部乘坐值(SQL*Plus是任何类型的编程控制的繁琐工具,而对于数据输入来说是不可算的工具),而是简单地进行创建一个会话,其中调用所有执行所有程序控制控制的PL/SQL块:从控制表和循环循环,在循环中的每个块上执行
EXECUTE IMMEDIATE
并重置序列。
e.g.DECLARE
dummy number;
BEGIN
FOR rec_table IN (SELECT * FROM controltable)
LOOP
EXECUTE IMMEDIATE 'SELECT NVL(MAX("'||rec_table.sequence_column_name||'"),0)+1 from "'||rec_table.table_owner||'"."'||rec_table.table_name||'"' INTO dummy;
EXECUTE IMMEDIATE 'ALTER SEQUENCE "'||rec_table.sequence_owner||'"."'||rec_table.sequence_name||'" RESTART START WITH ' || dummy;
END LOOP;
END;
显然,您必须用元数据填充
controltable
,其中不仅包括表的列表,还包括它们用于填充的序列和列的映射。但是,如您所见,很有可能以干净,可维护的方式进行此操作。