在Oracle存储过程中创建和使用序列-序列不存在
当执行上述过程时,我得到以下错误 ORA-06550:第13行第10列: PL/SQL:ORA-02289:序列不存在 ORA-06550:第13行第3列: PL/SQL:SQL语句被忽略 但是当执行下面的过程时,它是成功的,并且创建了序列在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
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;
/