Oracle PL/SQL版本12.2.0.1.0 vs 12.1.0.2.0-使用参数立即执行

Oracle PL/SQL版本12.2.0.1.0 vs 12.1.0.2.0-使用参数立即执行,oracle,plsql,execute-immediate,Oracle,Plsql,Execute Immediate,上面给出了在上执行时ORA-00933:SQL命令未正确结束的情况 DECLARE max_id INTEGER; BEGIN SELECT MAX(ID) + 1 INTO max_id FROM MY_TABLE; EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_TABLE_ID MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || ' CACHE

上面给出了在上执行时ORA-00933:SQL命令未正确结束的情况

DECLARE
  max_id INTEGER;
BEGIN
  SELECT MAX(ID) + 1 INTO max_id FROM MY_TABLE;

  EXECUTE IMMEDIATE 'CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || ' CACHE 100 NOORDER  NOCYCLE  NOPARTITION';

END;
并且在上无错误地工作

Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
在我将execute语句更改为以下内容后,它在两个版本上都可以正常工作,没有任何错误

   Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production

这是一个已知问题吗?

根据或文档,没有分区选项

在12cR1中,statment确实可以工作,但似乎被默默忽略,因为它似乎什么也不做——尽管它可能在引擎盖下,正如@XING的演示所示。12cR2和11gR2中预计会出现it错误

因此,这似乎是12cR1中未记录的(根据MoS搜索)错误,因为当包含无效选项时,它不会导致错误。除了在MoS中,有一些点击间接地将其称为有效,例如,bug 23210794,其中指定选项显示为一种解决方法;相反,doc ID 2253744.1提到

PARTITION
/
NOPARTITION
关键字在序列创建过程中使用,该关键字不是12.1功能

有趣的是,
all_sequences
视图在中获得了一个
partition_count
列,但在中又丢失了它。(纯粹是推测,但这可能与分区表的自动增量列的内部实现有关,并且wan实际上并不打算为其他序列公开。)

有关更多信息,您需要向Oracle提出服务请求


但解决问题的方法是从语句中删除
NOPARTITION
关键字。

正如@Alex所提到的,创建带有Partition子句的序列是未记录的功能,如
WMCONCAT
。见以下说明:

 CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || '''
您可以在这里看到,oracle在内部将序列定义保存在一些
分区中,因此它显示在
DDL

创建另一个序列

sql> create sequence s1;

Sequence created.

sql> select s1.nextval from dual;

     NEXTVAL
     ---------
     1

sql> select dbms_metadata.get_ddl('SEQUENCE','S1') from dual;

DBMS_METADATA.GET_DDL('SEQUENCE','S1')
--------------------------------------------------------------------------------

 CREATE SEQUENCE  "SCOTT"."S1"  MINVALUE 1 MAXVALUE 99999999999999999999999999
99 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER  NOCYCLE  NOPARTITION
您现在可以看到,这次Oracle在某些部分中创建了序列,因此在DDL定义中显示了这一点

甲骨文保留了一些内部使用的功能,因此没有记录在案

在您的情况下,如果您删除该部分,其他部分将正常工作。见下文:

sql> create sequence s2 partition;

  Sequence created.

sql> select s2.nextval from dual;

     NEXTVAL
---------------
      4103920000000000000000000000000001

sql> select dbms_metadata.get_ddl('SEQUENCE','S2') from dual;

DBMS_METADATA.GET_DDL('SEQUENCE','S2')
--------------------------------------------------------------------------------

 CREATE SEQUENCE  "SCOTT"."S2"  MINVALUE 1 MAXVALUE 99999999999999999999999999
99 INCREMENT BY 1 START WITH 21 CACHE 20 NOORDER  NOCYCLE  PARTITION 100000000

现在还不清楚它在哪里起作用,在哪里不起作用,因为你发布了12.2.0.1.0两次(都是在“不起作用”和“起作用”)。@Littlefoot更新了问题。你编辑了这条消息,但12.2.0.1.0仍然存在于这两个声明中。仔细看看。@Littlefoot真的很抱歉。现在更正
DECLARE
  max_id INTEGER;
BEGIN
  SELECT MAX(ID) + 1 INTO max_id FROM MY_TABLE;

  EXECUTE IMMEDIATE 'CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH '|| max_id||'  CACHE 100 NOORDER  NOCYCLE  ' ;
END;