建立一个测试序列
create sequence test14
minvalue 1
maxvalue 10
start with 6
increment by 1
cycle
nocache;
重建测试序列的存储过程
create or replace procedure seq_reset(v_seqname varchar2) as
 n number(10);
 tsql varchar2(100);
 begin
 execute immediate 'select' || v_seqname || '.nextval into n from dual';
 n:=-(n-1);
 tsql:='alter sequence' || v_seqname || 'increment by' || n;
 execute immediate tsql;
 execute immediate 'select'|| v_seqname ||'.nextval into n from dual';
 tsql:='alter sequence' || v_seqname || 'increment by 1';
 execute immediate tsql;
 end seq_reset;
 / 
exec seq_reset('test14') 
第 1 行出现错误:
ORA-00900: 无效 SQL 语句
ORA-06512: 在 "SYS.SEQ_RESET", line 5
ORA-06512: 在 line 1
执行时报以上错误,请大家帮帮忙。谢谢!

解决方案 »

  1.   

    execute immediate 'select' || v_seqname || '.nextval into n from dual';
    ==>
    execute immediate 'select' || v_seqname || '.nextval from dual' into n;
      

  2.   

    至少加上  空格吧execute immediate 'select  ' || v_seqname || '.nextval from dual' into n;
      

  3.   

    >tsql:='alter sequence' || v_seqname || 'increment by' || n;
                          *                  *           **处需补足空格
      

  4.   

    >tsql:='alter sequence' || v_seqname || 'increment by' || n;
    1111111111111111111111*11111111111111111*111111111111**处需补足空格
      

  5.   

    序列能够更改?
    -- alter sequence 成吗?-- 还有:好多语句要加空格
      

  6.   

    已用时间:  00: 00: 00.03
    scott@SZTYORA> alter sequence test14 increment by 2;序列已更改。已用时间:  00: 00: 00.01
    scott@SZTYORA> alter sequence test14 increment by 20;
    alter sequence test14 increment by 20
    *
    第 1 行出现错误:
    ORA-04005: INCREMENT 必须小于 MAXVALUE 与 MINVALUE 的差-- Alter sequence 是可以,但是容易出错!
      

  7.   

    -- 上面这个错误,是因为你定义的test14序列,其maxvalue 为10,更改下一个序列增长为20,超过了最大值,当然出错!
      

  8.   


    SQL> create sequence test14
      2  minvalue 1
      3  maxvalue 10
      4  start with 6
      5  increment by 1
      6  cycle
      7  nocache
      8  /序列已创建。
    SQL> edi
    已写入 file afiedt.buf  1  create or replace procedure seq_reset(v_seqname varchar2) as
      2   n number(10);
      3   tsql varchar2(100);
      4   begin
      5   execute immediate 'select  '|| v_seqname ||'.nextval  from dual' into n;
      6   n:=-(n-1);
      7   tsql:='alter sequence ' || v_seqname || ' increment by '|| n;
      8   execute immediate tsql;
      9   execute immediate 'select '|| v_seqname ||'.nextval  from dual' into n;
     10  dbms_output.put_line(n);
     11   tsql:='alter sequence '|| v_seqname ||' increment by 1';
     12   execute immediate tsql;
     13  dbms_output.put_line(n);
     14*  end seq_reset;
    SQL> /过程已创建。SQL> exec seq_reset('test14');
    1
    1PL/SQL 过程已成功完成。
    --  连接处要加空格;序列是可以改的就是不能改序列的开始值,可以改增量以及最大小值
      

  9.   

    谢谢大家分析、解答。其实我还是有点不明白这个地方n:=-(n-1);tsql:='alter sequence ' || v_seqname || ' increment by '|| n;到了这一步,增了n变成多少了?