2012-11-02 2 views
0

이 함수는 시퀀스의 currval을 최대 id + 1로 설정하기 위해이 함수를 작성했습니다. 하지만 다음과 같은 오류가 발생합니다.시퀀스의 currval을 설정하는 함수

ORA-14552: cannot perform a DDL, commit or rollback inside a query or DML 

이 문제를 해결하는 데 도움을주십시오.

CREATE OR REPLACE Function createcurrentid (
    model_in IN varchar2, 
    primarykey_in IN VARCHAR2, 
    seq_name IN VARCHAR2) 
    RETURN number 
IS 
    cnumber number; 
    c2  sys_refcursor; 
    c3  sys_refcursor; 
    c6  sys_refcursor; 
    c7  sys_refcursor; 
    c8  sys_refcursor; 
    c9  sys_refcursor; 
    c4 number; 
    c5 number; 
    type result_rec is record (
    id  number, 
    currvalvalue number 
); 
l_result_rec result_rec; 
BEGIN 
open c2 FOR 'SELECT max('||primarykey_in||') AS id FROM '||model_in; 
fetch c2 into c4; 
close c2; 
open c3 FOR 'select '||seq_name||'.currval AS currvalvalue from dual'; 
fetch c3 into c5; 
close c3; 
cnumber:=c4-c5; 
open c6 FOR 'alter sequence'||seq_name||' increment BY'||cnumber; 
commit; 
open c8 FOR 'select '||seq_name||'.nextval from dual'; 
commit; 
open c9 FOR 'select '||seq_name||'.CURRVAL from dual'; 
commit; 
open c7 FOR 'alter sequence'||seq_name||' increment BY 1'; 
commit; 
RETURN cnumber; 
END; 

답변

3

, 모든 단일 행 또는 없음을 반환 매우 유용하지 않는 것 그리고 아마도 문제의 원천 문에 대한 그 모든 열린 커서.

은 다음과 같은 것을 시도해보십시오
create or replace function createcurrentid (
    model_in in varchar2, 
    primarykey_in in varchar2, 
    seq_name in varchar2) 
    return number 
is 
    maxval number; 
    lastval number; 
    delta number; 
    nextval number; 
begin 
execute immediate 'select max('||primarykey_in||') as id from '||model_in 
    into maxval; 
execute immediate 'select '||seq_name||'.nextval from dual' 
    into lastval; 
delta:=maxval-lastval; 

execute immediate 'alter sequence '||seq_name||' increment by '||delta; 
execute immediate 'select '||seq_name||'.nextval from dual' 
    into nextval; -- this var needs to be read for the sequence to increment 
execute immediate 'alter sequence '||seq_name||' increment by 1'; 
return delta; 
end; 

는 DDL은 암시 적 커밋 않는, 그래서 당신이 가지고있는 명시적인 사람이 중복 것을 기억하십시오.

또한 이것은 본질적으로 내가 믿는 것 같지만, 한 번만 수정하면 괜찮을 것입니다.

관련 문제