ORACLE 10g:从远程数据库重置序列

ORACLE 10g: Reset Sequences from remote database

我有团队使用的需要复制的远程数据库。我创建了一个数据库 link 和一个可以从远程访问 all_sequences table 的同义词。

create synonym rprod_all_sequences for all_sequences@rprod_production;

现在我创建了一个 sql 文件,它将获取所有用户序列并更改它们以从正确的数字开始。

set serveroutput on
/******************************************************************************/
/* RESET ALL SEQUENCE NUMBERS                                                 */
/******************************************************************************/

declare 
cursor c_cursor is 
  select sequence_owner||'.'||sequence_name AS name, TO_CHAR(last_number + 1) AS last_number
    from rprod_all_sequences
     where sequence_owner not in ('WMSYS','XDB','SYS','SYSTEM','SYSMAN','MDSYS','LBACSYS','EXFSYS','DMSYS','DBSNMP','CTXSYS');

begin
 for r_record in c_cursor loop
    execute immediate 'alter sequence ' || r_record.name || ' ' ||' INCREMENT BY '|| r_record.last_number ||';';
  end loop;

end;
/
exit;

但我总是收到这个错误:

sqlplus@RPROD> @reset_seq.sql
declare
*
ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at line 7

我不确定为什么它会抱怨脚本,因为我单独尝试过它并且它正在运行。抱歉,这可能是一个菜鸟问题。关于原因有什么想法吗?

谢谢。

你在立即执行语句的末尾有一个额外的 ;。试试这个:

 DECLARE
   CURSOR c_cursor
   IS
      SELECT sequence_owner || '.' || sequence_name AS name,
             TO_CHAR (last_number + 1) AS last_number
        FROM rprod_all_sequences
       WHERE sequence_owner NOT IN ('WMSYS',
                                    'XDB',
                                    'SYS',
                                    'SYSTEM',
                                    'SYSMAN',
                                    'MDSYS',
                                    'LBACSYS',
                                    'EXFSYS',
                                    'DMSYS',
                                    'DBSNMP',
                                    'CTXSYS');
BEGIN
   FOR r_record IN c_cursor
   LOOP
      EXECUTE IMMEDIATE
            'alter sequence '
         || r_record.name
         || ' '
         || ' INCREMENT BY '
         || r_record.last_number
          ;
   END LOOP;
END;
/