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


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;

上面给了我ORA-00933: SQL command not properly ended执行时

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

并且可以正常工作

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

将 execute 语句更改为以下内容后,它适用于两个版本,没有任何错误。

CREATE SEQUENCE  MY_TABLE_ID  MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || '''

这是一个已知问题吗?

正如@Alex所提到的,使用 Partition 子句创建序列是未记录的功能,如WMCONCAT.请参阅下面的解释:

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将序列定义保存在某些partition中,因此它显示在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

你现在看到这个 Oracle 在某个部分中创建了序列,因此在 DDL 定义中显示了它。

oracle保留了一些功能供其内部使用,因此未记录。

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

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;

根据 12cR1 或 12cR2 文档,没有NOPARTITION选项。

该语句在 12cR1 中确实有效,但似乎被默默忽略了,因为它似乎没有做任何事情 - 尽管它可能在引擎盖下,正如 @XING 的演示所暗示的那样。预计在 12cR2 和 11gR2 中会出现错误。

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

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

有趣的是,all_sequences视图在 12cR1 中获得了partition_count列,但在 12cR2 中再次丢失了它。(纯粹是猜测,但也许这与分区表的自动增量列的内部实现有关,并且实际上并不意味着要为其他序列公开。

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

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

相关内容

  • 没有找到相关文章

最新更新