1

DATA_COUNT.REC_CNT_ACTUAL(tablename.coumnname) でカウントを取得して更新する必要がある 20 個のテーブル (table_id は 1 から 20) があります。

13 個のテーブルの場合、カウントの更新は成功しています。次に、このエラーがポップアップします。

最初に、table_id と table_name を渡す手順として以下を書きました。プロシージャは 20 回連続して呼び出されました。それがエラーの原因かもしれません: ORA-21780: オブジェクト期間の最大数を超えました。

次に、その手順を削除しました。現在、これらの 20 の更新ステートメントは、パッケージ全体の 20 の異なる場所にあります。それでも同じエラー。問題を理解するのを手伝うか、代替案を提案してください。

UPDATE DATA_COUNT
SET REC_CNT_ACTUAL=
  (SELECT COUNT(1) FROM TITLE
  )
WHERE TABLE_ID =20;

使用した手順は次のとおりです。


PROCEDURE DELETE_COUNT(
    PI_TABLE_ID   IN NUMBER,
    pi_table_name IN VARCHAR2)
AS
  pragma autonomous_transaction;
  V_SQLERRM    VARCHAR2(4000) := NULL;
  V_SQLERRCODE VARCHAR2(50)   := NULL;
  V_CNT        NUMBER;
  V_SQL        varchar2(4000);

BEGIN
  V_SQL:='select COUNT(1) from '|| PI_TABLE_NAME;
  EXECUTE immediate V_SQL INTO v_cnt;
  UPDATE DATA_COUNT
  SET REC_CNT_ACTUAL=v_cnt
  where TABLE_ID    =PI_TABLE_ID;

  commit;

EXCEPTION
WHEN OTHERS THEN
  ROLLBACK;
  v_sqlerrm    := SUBSTR(sqlerrm,1,255);
  v_sqlerrcode := SQLCODE;
  /*Log error*/
  datareduction_run_log (-20001, 'procedure DELETE_COUNT', CURRENT_TIMESTAMP, 'FAILED', 'Error in procedure DELETE_COUNT. Error Number:'||v_sqlerrcode||'-Error Msg:'||v_sqlerrm||'- backtrace - ' || dbms_utility.format_error_backtrace, SYSDATE, USER, NULL, NULL );
  RAISE_APPLICATION_ERROR(   -20001,'Unexpected Error: Error Number:'||V_SQLERRCODE||'-Error Msg:'||V_SQLERRM||'- backtrace - ' || DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END DELETE_COUNT;

4

2 に答える 2

2

ORA-00018: セッションの最大数を超えました

このエラーは、操作に十分な数のセッションが残っていない場合に発生しますDDL/DML

これは、DDL/DMLステートメントで再帰を使用する必要がありDML、一部の再帰 (データ ディクショナリ) 操作Oracleが再帰セッション コンテキストを使用して実行されるためです。

Oracle は、セッション状態オブジェクト配列 (V$SESSION / X$KSUSE) から新しいセッション状態オブジェクトを静かに割り当て、すべての再帰操作状態オブジェクト (ロック、トランザクション状態オブジェクトなど) はその再帰セッションに属します。また、データ ディクショナリQUERIES(ディクショナリ キャッシュの作成) は、別の再帰セッションを使用して行われます。

使用session可能な数とsessions parameter値 a は、次を使用して確認できます。

SQL> select value from v$parameter where name = 'sessions';

VALUE
--------------------------------------------------------------
170

SQL>
SQL> select count(*) from v$session;

  COUNT(*)
----------
       163

7オーバー セッションが残っているにもかかわらず、まだエラーが発生していることがわかりますORA-00018

V$RESOURCE_LIMITそれでは、セッション状態オブジェクト配列を含む、Oracle インスタンスでのさまざまな固定およびセグメント化された配列の使用法を示すものを再確認しましょうV$SESSION

 SQL> select * from v$resource_limit where resource_name = 'sessions';

   RESOURCE_NAME                  CURRENT_UTILIZATION MAX_UTILIZATION INITIAL_AL LIMIT_VALU
------------------------------ ------------------- --------------- ---------- ----------
sessions                                       170             170        170        170

CURRENT_UTILIZATIONそこで、セッション パラメータ値セットと同じになることがわかります。

またRECURSIVE、セッションは再帰的なデータ ディクショナリ呼び出しに使用され、V$SESSIONこれらは表示されません。

このようなセッションは、テーブルをクエリすることで確認できます」

SQL> select paddr from v$session where sid = userenv('sid');

PADDR
----------------
BF46591C

別のセッションで、上記のプロセス状態オブジェクトに属するセッションを確認するために、次のクエリを実行しました。

SQL> select 
    decode(bitand(ksuseflg,19),17,'BACKGROUND',1,'USER',2,'RECURSIVE','?'),ksuudsna
    from x$ksuse s where ksusepro = 'BF46591C';

DECODE(BITAND(KSUSEFLG,19),17,   KSUUDSNA
-------------------------------- ------------------------------
USER                             SYSTEM
RECURSIVE                        SYS

この2つは、あなたの場合も理由かもしれません。

したがって、ORA-00018エラーが発生した場合は、sessions parameter配列を大きくするか、接続またはセッションの使用量を減らすようにアプリケーションを構成してください。

DBA注:これらのテーブルをクエリするには権限が必要です。

于 2019-11-03T11:44:04.300 に答える