我正试图在匿名块中创建一个序列(这是一个将在多个环境中启动的脚本(,我正在使用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