PLS-00357:当立即执行块

问题描述 投票:0回答:1

thanks用于使用失败的代码和错误消息更新问题。

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || &&PowerTsmUsername..&&SeqName || ' RESTART START WITH ' || dummy;
您应该能够简单地删除单个引号:
sql oracle-database plsql oracle-sqldeveloper sqlplus
1个回答
0
投票

,无论如何,我建议一种不同的方法。使用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,其中不仅包括表的列表,还包括它们用于填充的序列和列的映射。但是,如您所见,很有可能以干净,可维护的方式进行此操作。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.