【问题标题】:Creating a sequence inside an anonymous block using Execute Immediate使用立即执行在匿名块内创建序列
【发布时间】:2020-12-16 02:07:20
【问题描述】:

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

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 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 :a NOCACHE NOORDER NOCYCLE NOKEEP NOSCALE GLOBAL' USING vMAX_VINCULACION;

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

ORA-01722: 无效号码

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

所以我在这里很迷茫,希望你能帮助我。

提前致谢。

【问题讨论】:

  • EXECUTE IMMEDIATE 用于不带参数的语句。

标签: sql oracle oracle10g execute-immediate


【解决方案1】:

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

更新

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

【讨论】:

  • 感谢您的回复。我尝试了您所说的并删除了双引号。我还尝试了最大值的 dbms_ouput 并返回 5 并使用 dbms_ouput 来查看执行的样子: EXECUTE IMMEDIATE CREATE SEQUENCE GPP.SEQ_ENTIDADES_VINCULADAS MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 5 NOCACHE NOORDER NOCYC仍然抛出第一个错误,ORA-00933 SQL 命令未正确结束
  • 如果您在不使用 PLSQL 的情况下运行此命令,它是否有效?我的意思是,它应该工作
  • 好的,尝试了你所说的,通过一个小测试,我想我看到了问题。创建序列时,我必须删除最后三个参数:NOKEEP、NOSCALE 和 GLOBAL。不知道为什么,但它是这样工作的。谢谢你的帮助。
  • @robexpo,你能投票给答案吗?顺便问一下,您使用的是哪个版本的 Oracle?我的测试是在 19c 完成的
  • 不客气。的确,这就是原因。这些选项在旧版本中不可用。 docs.oracle.com/cd/B12037_01/server.101/b10759/….
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2021-01-01
  • 1970-01-01
  • 2013-11-13
  • 2018-02-25
相关资源
最近更新 更多