在Oracle存储过程中创建和使用序列-序列不存在

在Oracle存储过程中创建和使用序列-序列不存在,oracle,stored-procedures,plsql,dynamic-sql,Oracle,Stored Procedures,Plsql,Dynamic Sql,当执行上述过程时,我得到以下错误 ORA-06550:第13行第10列: PL/SQL:ORA-02289:序列不存在 ORA-06550:第13行第3列: PL/SQL:SQL语句被忽略 但是当执行下面的过程时,它是成功的,并且创建了序列 DECLARE v_emp_id NUMBER; empid NUMBER; stmt VARCHAR2(1000); BEGIN SELECT MAX(emp_id) + 1 I

当执行上述过程时,我得到以下错误 ORA-06550:第13行第10列: PL/SQL:ORA-02289:序列不存在 ORA-06550:第13行第3列: PL/SQL:SQL语句被忽略

但是当执行下面的过程时,它是成功的,并且创建了序列

    DECLARE
      v_emp_id NUMBER;
      empid    NUMBER;
      stmt     VARCHAR2(1000);
    BEGIN
      SELECT MAX(emp_id) + 1 INTO v_emp_id FROM employees;
      BEGIN
        dbms_output.put_line(v_emp_id );
        stmt := 'CREATE SEQUENCE emp_seq start with ' ||v_emp_id|| ' increment by 1 NOCYCLE';
        EXECUTE IMMEDIATE stmt;
        COMMIT;
      END;
      insert into emp_new select emp_seq.nextval,empname from (select * from employee where active = 0);
      dbms_output.put_line(empid);
    END;
    /

编译期间序列不存在,因此编译器返回错误。executeimmediate将在运行时执行,但编译器不知道它将创建稍后在代码中调用的序列

    DECLARE
      v_emp_id NUMBER;
      empid    NUMBER;
      stmt     VARCHAR2(1000);
    BEGIN
      SELECT MAX(emp_id) + 1 INTO v_emp_id FROM employees;
      BEGIN
        dbms_output.put_line(v_emp_id );
        stmt := 'CREATE SEQUENCE emp_seq start with ' ||v_emp_id|| ' increment by 1 NOCYCLE';
        EXECUTE IMMEDIATE stmt;
        COMMIT;
      END;
      dbms_output.put_line(empid);
    END;
    /
由于表t1不存在,因此给出与您相同的错误。所以insert语句无效。这是编译PL/SQL期间的错误

create or replace procedure createtest as
begin 
execute immediate 'create table t1 (c1 number)';
insert into t1 values (1);
end;
/
之后,我可以创建过程,但当我创建时:

create table t1 (c1 number);
我发现错误,表已经存在。但编译器不知道我正在尝试再次创建同一个表,所以它将在运行时返回,而不是在编译期间返回

如果您确实需要这样做,请执行以下操作:

exec createtest;
就你而言:

create or replace procedure createtest as
begin 
execute immediate 'create table t1 (c1 number)';
execute immediate 'insert into t1 values (1)';
end;
/
[编辑] 我的理解是,您希望确保序列设置为maxempid,所以请不要尝试在过程中创建它。创建序列一次,然后在程序体中执行:

execute immediate 'SELECT emp_seq.nextval FROM dual' INTO empid;

在创建过程之前,应该先创建序列static

select max(empid) into maxempid from employee;
select emp_seq.currval into maxseq from dual;
if(empid-maxseq>0) then
execute immediate 'alter sequence emp_seq increment by ' || empid-maxseq;
end if;

然后创建或替换函数/过程/包。。。。这是指您的序列

谢谢:我正在使用seq in insert with select语句。有什么办法吗?很抱歉,我对oracle过程执行立即“选择emp_seq.nextval FROM dual”到empid的内容知之甚少;这是如何在select中使用新创建的序列,并将值返回empid.insert到emp_new select emp_seq.nextval,empname from employee;我已经更新了所问的问题。你们可以看看它吗?你们可以用光标从序列中选择值来获得它,但这确实是不必要的复杂化。请创建一次序列。然后在不包含CREATESEQUENCE语句的情况下创建过程。
DROP SEQUENCE emp_seq
/

BEGIN
  SELECT MAX(emp_id) + 1 INTO v_emp_id FROM employees;
  dbms_output.put_line(v_emp_id );
  execute immediate 'CREATE SEQUENCE emp_seq start with ' ||v_emp_id|| ' increment by 1 NOCYCLE';
END;
/