Oracle 无法在PLSQL中的匿名块中创建和删除序列
今天我尝试在匿名块中创建一个序列。我的要求是,当序列达到最大值时,它应该自动删除。因此,我已经执行了下面的代码,但它显示了类似“PL/SQL:ORA-02289:sequence不存在”这样的错误 有人能帮我解决这个问题吗?试试这个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
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将停止执行并打印错误和行号,这将很快指出问题所在。