如何解决使用立即执行在匿名块内创建序列
我正在尝试在一个匿名块内创建一个序列(这是一个将在多个环境中启动的脚本),我正在使用立即执行,这是代码:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。