问题描述
我正在尝试在一个匿名块内创建一个序列(这是一个将在多个环境中启动的脚本),我正在使用立即执行,这是代码:
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中不可用
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