0

この関数を作成して、シーケンスの currval を最大 ID+1 に設定しました。しかし、次のようなエラーが発生します。

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;
4

1 に答える 1

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 は暗黙的なコミットを行うため、明示的なものは冗長であることを忘れないでください。

また、これは本質的に際どいものだと思いますが、1 回限りの修正であれば、おそらく問題ありません。

于 2012-11-02T13:49:05.713 に答える