使用立即执行在匿名块内创建序列

问题描述

我正在尝试在一个匿名块内创建一个序列(这是一个将在多个环境中启动的脚本),我正在使用立即执行,这是代码

SELECT MAX(ID_VINculaCION)
INTO vMAX_VINculaCION
FROM SA_ENTIDADES_VINculaDAS;

EXECUTE IMMEDIATE 'CREATE SEQUENCE "GPP"."SEQ_ENTIDADES_VINculaDAS" MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH ' || vMAX_VINculaCION || ' NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL';

我正在使用select max作为开始,所以我可以获得现有的最大ID,但是会抛出此错误

ORA-00933:sql命令未正确结束 ORA-06512:在第40行 ORA-06512:在第40行

我不知道为什么,所以我尝试使用Execute Instant ...使用,这是结果代码

SELECT MAX(ID_VINculaCION)
    INTO vMAX_VINculaCION
    FROM SA_ENTIDADES_VINculaDAS;

EXECUTE IMMEDIATE 'CREATE SEQUENCE "GPP"."SEQ_ENTIDADES_VINculaDAS" MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH :a NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' USING vMAX_VINculaCION;

这又引发了另一个错误...:

ora-01722:无效的数字

我也没有得到这个,因为Max函数返回一个数字。我尝试启动查询,并返回5。

所以我在这里很迷路,希望您能帮助我。

谢谢。

解决方法

立即执行在运行时进行评估。我进行了测试,并且没有问题(在测试中,我删除了双引号,因为您不需要双引号)。尝试通过dbms_output打印execute immediate的结果。可能您选择的max编号不能给您正确的数字。

更新

选项NOKEEP NOSCALE GLOBAL在10g中不可用

Create Sequence 10g

declare
v_max pls_integer;
begin
   SELECT 1000 INTO v_max FROM dual;
EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_SEQ MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH '||v_max||' 
                   NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' ;
end;
/

测试

SQL> declare
v_max pls_integer;
   begin
    SELECT 1000 INTO v_max FROM dual;
  EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_SEQ MINVALUE 1  MAXVALUE 99999999999999999999999999 INCREMENT BY 1 START WITH '||v_max||'
                    NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' ;
end;
/  

PL/SQL procedure successfully completed.

SQL> select sequence_name,min_value,max_value from dba_sequences where sequence_name = 'MY_SEQ' ;

SEQUENCE_NAME
--------------------------------------------------------------------------------
 MIN_VALUE  MAX_VALUE
---------- ----------
MY_SEQ
         1 1.0000E+26


SQL> SQL> select my_seq.nextval from dual ;

   NEXTVAL
----------
      1000