创建序列时PL/SQL Oracle脚本中出现语法错误

创建序列时PL/SQL Oracle脚本中出现语法错误,oracle,plsql,Oracle,Plsql,我有下面的PL/SQL脚本,我正试图使用Oracle SQL开发人员的“Run script”命令执行该脚本 我得到以下错误: PLS-00103: Encountered the symbol "CREATE" when expecting one of the following: 在搜索了类似的问题之后,我想应该通过某种方式解决这个问题,把/放在某个地方,但我还没有弄清楚确切的位置(以及为什么需要它——上面写的脚本对解释器来说不够明确吗?)。不能在PL/SQL上使用DDL。您需要立即执行

我有下面的PL/SQL脚本,我正试图使用Oracle SQL开发人员的“Run script”命令执行该脚本

我得到以下错误:

PLS-00103: Encountered the symbol "CREATE" when expecting one of the following:

在搜索了类似的问题之后,我想应该通过某种方式解决这个问题,把
/
放在某个地方,但我还没有弄清楚确切的位置(以及为什么需要它——上面写的脚本对解释器来说不够明确吗?)。

不能在PL/SQL上使用DDL。您需要
立即执行

declare      
  current_max_value_id      number(8, 0);

begin

  select max(id) into current_max_value_id from DIM_VALUE;

  execute immediate 'create sequence value_id_seq increment by 1 start with current_max_value_id + 1 nomaxvalue nocycle'; 

  -- Edited based on Alex's Poole comment
  execute immediate 'insert into DIM_VALUE (ID, UNIT_ID) values (value_id_seq.NEXTVAL, 1)';
  execute immediate 'insert into DIM_VALUE (ID, UNIT_ID) values (value_id_seq.NEXTVAL, 2)';

  execute immediate 'drop sequence value_id_seq';

end;
您也可以尝试不按顺序使用
按级别连接
(您需要更改
someLimit
,以确定要创建的记录数)

声明
当前最大值标识号(8,0);
开始
从尺寸值中选择最大值(id)到当前最大值(id);
插入尺寸值(ID、单位ID)
选择级别+nvl(当前\u最大\u值\u id,0),级别
来自双重

按级别连接在Oracle中运行时删除和创建对象是一个糟糕的计划。如果不使用动态SQL,则无法从PL/SQL发出DDL,这可能是因为使用了
executeimmediate
。但是创建一个序列只是为了稍后再删除它是没有意义的。你到底想实现什么?为什么一开始就没有
dim\u value.id
的序列呢?@a\u horse\u和\u no\u name让我们假设没有,我无法更改它。另外,我需要在表中插入几十行,并且这些值是逻辑分组的,所以可能会发生其他人需要通过在代码中间放置更多的<代码> INSERT < /C> >来修改脚本。出于这些原因,我认为只使用
value\u id\u seq.NEXTVAL
将使维护更加容易,并且不会出错;在编译时,序列仍然不存在,因此
value\u id\u seq.NEXTVAL
将出错。我相信无论怎样,
insert all
都会为所有行获得相同的序列值,它只计算一次。无论如何,connectby方法更有意义,而且也没有来自DDL的隐式提交。顺便说一句,作为最佳实践,我将避免双重引用标识符。它可能在这里工作,但它会自找麻烦。@WilliamRobertson是的,你是对的,我不知道OP为什么要用它们
declare      
  current_max_value_id      number(8, 0);

begin

  select max(id) into current_max_value_id from DIM_VALUE;

  execute immediate 'create sequence value_id_seq increment by 1 start with current_max_value_id + 1 nomaxvalue nocycle'; 

  -- Edited based on Alex's Poole comment
  execute immediate 'insert into DIM_VALUE (ID, UNIT_ID) values (value_id_seq.NEXTVAL, 1)';
  execute immediate 'insert into DIM_VALUE (ID, UNIT_ID) values (value_id_seq.NEXTVAL, 2)';

  execute immediate 'drop sequence value_id_seq';

end;
declare      
  current_max_value_id      number(8, 0);

begin

  select max(id) into current_max_value_id from DIM_VALUE;


  insert into DIM_VALUE (ID, UNIT_ID) 
   select level + nvl(current_max_value_id,0), level
     from dual
   connect by level <= someLimit;

end;