使用Execute Immediate在匿名块内创建序列



我正试图在匿名块中创建一个序列(这是一个将在多个环境中启动的脚本(,我正在使用execute immediate,这是代码:

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行

我不知道为什么,所以我尝试使用立即执行。。。使用,这是生成的代码:

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的结果。可能你的选择最大值没有给你正确的数字。

更新

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

创建序列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

相关内容

  • 没有找到相关文章

最新更新