Oracle 无法在PLSQL中的匿名块中创建和删除序列

Oracle 无法在PLSQL中的匿名块中创建和删除序列,oracle,plsql,Oracle,Plsql,今天我尝试在匿名块中创建一个序列。我的要求是,当序列达到最大值时,它应该自动删除。因此,我已经执行了下面的代码,但它显示了类似“PL/SQL:ORA-02289:sequence不存在”这样的错误 有人能帮我解决这个问题吗?试试这个 DECLARE V_NUM NUMBER := 0; V_QUERY VARCHAR2 (2000); CNT NUMBER := 0; BEGIN V_QUERY :='CREATE SEQUENCE SEQ_GEN

今天我尝试在匿名块中创建一个序列。我的要求是,当序列达到最大值时,它应该自动删除。因此,我已经执行了下面的代码,但它显示了类似“PL/SQL:ORA-02289:sequence不存在”这样的错误

有人能帮我解决这个问题吗?

试试这个

DECLARE
   V_NUM     NUMBER := 0;
   V_QUERY   VARCHAR2 (2000);
   CNT       NUMBER := 0;
BEGIN
   V_QUERY :='CREATE SEQUENCE SEQ_GEN START WITH 100 INCREMENT BY 10 MAXVALUE 200';

   EXECUTE IMMEDIATE V_QUERY; 

   FOR I IN 1 .. 11
   LOOP      
      V_QUERY :='SELECT SEQ_GEN.NEXTVAL FROM DUAL';

      EXECUTE IMMEDIATE V_QUERY INTO V_NUM;

      DBMS_OUTPUT.PUT_LINE (V_NUM);

      IF V_NUM >= 200
      THEN
         EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';

         DBMS_OUTPUT.PUT_LINE ('sequence has reached maximum value');
      END IF;
   END LOOP;

   SELECT COUNT (1)
     INTO CNT
     FROM USER_SEQUENCES
    WHERE SEQUENCE_NAME = 'SEQ_GEN';

   DBMS_OUTPUT.PUT_LINE (CNT);
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
/
试试这个

DECLARE
   V_NUM     NUMBER := 0;
   V_QUERY   VARCHAR2 (2000);
   CNT       NUMBER := 0;
BEGIN
   V_QUERY :='CREATE SEQUENCE SEQ_GEN START WITH 100 INCREMENT BY 10 MAXVALUE 200';

   EXECUTE IMMEDIATE V_QUERY; 

   FOR I IN 1 .. 11
   LOOP      
      V_QUERY :='SELECT SEQ_GEN.NEXTVAL FROM DUAL';

      EXECUTE IMMEDIATE V_QUERY INTO V_NUM;

      DBMS_OUTPUT.PUT_LINE (V_NUM);

      IF V_NUM >= 200
      THEN
         EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';

         DBMS_OUTPUT.PUT_LINE ('sequence has reached maximum value');
      END IF;
   END LOOP;

   SELECT COUNT (1)
     INTO CNT
     FROM USER_SEQUENCES
    WHERE SEQUENCE_NAME = 'SEQ_GEN';

   DBMS_OUTPUT.PUT_LINE (CNT);
EXCEPTION
   WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;
/

问题是,Oracle试图在执行之前解析匿名块。如果序列不存在,则此行将出现错误ORA-02289:

SELECT SEQ_GEN.NEXTVAL INTO V_NUM FROM DUAL;
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
您无法捕获它,因为它是在解析时发生的。你应该下一个动作。如果序列存在,则此行将出现错误:

SELECT SEQ_GEN.NEXTVAL INTO V_NUM FROM DUAL;
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
但这个错误会被其他人发现。另一件事是,当达到最大值时,您可以使用direct ORA-08004

DECLARE
   sequence_reached_max_value   EXCEPTION;
   PRAGMA EXCEPTION_INIT (sequence_reached_max_value, -8004);
   sequence_exists              EXCEPTION;
   PRAGMA EXCEPTION_INIT (sequence_exists, -955);
   V_NUM                        NUMBER := 0;
   V_QUERY                      VARCHAR2 (2000);
   CNT                          NUMBER := 0;
BEGIN
   V_QUERY := 'CREATE SEQUENCE SEQ_GEN START WITH 100 INCREMENT BY 10 MAXVALUE 200';

   BEGIN
      EXECUTE IMMEDIATE V_QUERY;
   EXCEPTION
      WHEN sequence_exists THEN
         EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
         EXECUTE IMMEDIATE V_QUERY;
   END;

   BEGIN
      FOR I IN 1 .. 21
      LOOP
         EXECUTE IMMEDIATE 'SELECT SEQ_GEN.NEXTVAL FROM DUAL' into V_NUM;

         DBMS_OUTPUT.PUT_LINE (V_NUM);
      END LOOP;
   EXCEPTION
      WHEN sequence_reached_max_value THEN
         EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
         DBMS_OUTPUT.PUT_LINE ('sequence has reached maximum value');
   END;

   SELECT COUNT (1)
     INTO CNT
     FROM USER_SEQUENCES
    WHERE SEQUENCE_NAME = 'SEQ_GEN';

   DBMS_OUTPUT.PUT_LINE (CNT);
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;

问题是,Oracle试图在执行之前解析匿名块。如果序列不存在,则此行将出现错误ORA-02289:

SELECT SEQ_GEN.NEXTVAL INTO V_NUM FROM DUAL;
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
您无法捕获它,因为它是在解析时发生的。你应该下一个动作。如果序列存在,则此行将出现错误:

SELECT SEQ_GEN.NEXTVAL INTO V_NUM FROM DUAL;
EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
但这个错误会被其他人发现。另一件事是,当达到最大值时,您可以使用direct ORA-08004

DECLARE
   sequence_reached_max_value   EXCEPTION;
   PRAGMA EXCEPTION_INIT (sequence_reached_max_value, -8004);
   sequence_exists              EXCEPTION;
   PRAGMA EXCEPTION_INIT (sequence_exists, -955);
   V_NUM                        NUMBER := 0;
   V_QUERY                      VARCHAR2 (2000);
   CNT                          NUMBER := 0;
BEGIN
   V_QUERY := 'CREATE SEQUENCE SEQ_GEN START WITH 100 INCREMENT BY 10 MAXVALUE 200';

   BEGIN
      EXECUTE IMMEDIATE V_QUERY;
   EXCEPTION
      WHEN sequence_exists THEN
         EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
         EXECUTE IMMEDIATE V_QUERY;
   END;

   BEGIN
      FOR I IN 1 .. 21
      LOOP
         EXECUTE IMMEDIATE 'SELECT SEQ_GEN.NEXTVAL FROM DUAL' into V_NUM;

         DBMS_OUTPUT.PUT_LINE (V_NUM);
      END LOOP;
   EXCEPTION
      WHEN sequence_reached_max_value THEN
         EXECUTE IMMEDIATE 'DROP SEQUENCE SEQ_GEN';
         DBMS_OUTPUT.PUT_LINE ('sequence has reached maximum value');
   END;

   SELECT COUNT (1)
     INTO CNT
     FROM USER_SEQUENCES
    WHERE SEQUENCE_NAME = 'SEQ_GEN';

   DBMS_OUTPUT.PUT_LINE (CNT);
EXCEPTION
   WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE (SQLERRM);
END;

第7行尝试在第8行创建序列之前删除该序列。要帮助调试,请删除异常块。默认情况下,Oracle将停止执行并打印错误和行号,这将很快指出问题所在。第7行尝试在第8行创建序列之前删除序列。要帮助调试,请删除异常块。默认情况下,Oracle将停止执行并打印错误和行号,这将很快指出问题所在。