创建序列时PL/SQL Oracle脚本中出现语法错误
我有下面的PL/SQL脚本,我正试图使用Oracle SQL开发人员的“Run script”命令执行该脚本 我得到以下错误:创建序列时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。您需要立即执行
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;