FAQ
技術情報:Oracleでのジオデータベースの server_config テーブルへの open_cursors パラメータの設定方法

ナレッジ番号:5349 | 登録日:2023/07/26 | 更新日:2024/11/21

概要

Oracle の Critical Patch Update - October 2014 での変更によって、v$parameter ビューに対してアクセス権限を付与された接続ユーザでない限り、ArcGIS は Oracle インスタンスの open_cursors パラメータを取得することができなくなりました。

ジオデータベースは、Oracle のエラー「ORA-01000:最大オープン・カーソル数を超えました」の発生を防ぐために、open_cursors パラメータの値を必要とします。

たとえば、ArcGIS はセッション内で空間クエリ、頻繁な編集作業で使用されるカーソル、ジオデータベース データディクショナリにアクセスするカーソルなどの様々なカーソルをオープンした状態に保ちます。

Oracle の Critical Patch Update の変更により、ArcGIS から open_cursors の値を取得する目的で接続を確立した時に、dbms_utility.get_parameter_value の実行でエラーが返されます。エラーが発生すると、ArcGIS は open_cursors という名前のパラメータがジオデータベースの server_config 内のテーブルに存在するかどうか確認します。そのパラメータが存在しなければ ArcGIS はその値のデフォルト値を 300 に設定します。

ジオデータベースではない Oracle インスタンスへの接続では、接続セッションは dbms_utility.get_parameter_value の実行を試み、もしそのセッションでエラーが発生すれば、ArcGIS は自動的に open_cursors の値に 300 をを設定します。

つまり、ArcGIS セッションが Oracle インスタンスに接続すると、dbms_utility.get_parameter_value サブプログラムが実行されます。エラーが返された場合、ジオデータベースの server_config テーブル に open_cursors パラメータが存在するかが確認され、存在しない場合は自動的に 300 をデフォルト値に設定します。

Oracle にジオデータベースで server_config テーブルに open_cursors パラメータを設定する方法は以下の手順です。

手順

SQL*Plusを使用して、v$parameter ビューへのアクセス権限を持つジオデータベース 管理者ユーザとして接続し、以下のプロシージャを実行します。

  1. ArcGIS 10.2.2 より以前のリリースを使用している場合には、ArcGIS 'Oracle Critical Patch Update - October 2014' Connection Issue Patch を接続するすべての ArcGIS クライアントに適用してください。
  2. 必要があれば、SYS もしくは SYSTEM ユーザで接続し SDE ユーザに v$parameter ビューへの select 権限を付与してください。
    SQL> GRANT SELECT ON v_$parameter TO SDE
    
  3. 次に、SDE ユーザとして接続し、以下のプロシージャを実行します。このプロシージャは server_config テーブルに open_cursors という名前の新しいエントリおよび dbms_utility.get_parameter_value サブプログラムの実行から得られた Oracle の open_cursor パラメータの値を挿入します。
    このプロシージャはすべての ArcGIS ジオデータベース、マスターインスタンス、そしてすべてのプロジェクトインスタンスに open_cursors パラメータを作成します。
    DECLARE
      rval        INTEGER;
      ival        INTEGER := 0;
      pname       VARCHAR2 (256) := 'OPEN_CURSORS';
      sval        VARCHAR2(256);
      gdb_name    NVARCHAR2(256);
      cprop_val   VARCHAR2(256) := NULL;
      c1          INTEGER;
      c1_status   INTEGER;
      sqlstmt     CLOB;
    
      CURSOR instances_curs IS
        SELECT instance_name 
        FROM sde.instances;
       
    BEGIN
      rval := dbms_utility.get_parameter_value(pname, ival, sval);
    
      IF ival > 0 THEN
        OPEN instances_curs;
        FETCH instances_curs INTO gdb_name;
    
        WHILE instances_curs%FOUND
          LOOP
            sqlstmt :=
                  'BEGIN '
                ||  gdb_name
                || '.svr_config_util.insert_server_config(:s1,:s2,:s3); ' 
                || 'EXCEPTION WHEN DUP_VAL_ON_INDEX THEN '
                ||  gdb_name 
                || '.svr_config_util.update_server_config(:s1,:s2,:s3); '
                || 'END;';
    
            IF NOT dbms_sql.is_open (c1) THEN
                c1 := dbms_sql.open_cursor;
            END IF;
    
            dbms_sql.parse (c1, TO_CHAR (sqlstmt), dbms_sql.native);
            dbms_sql.bind_variable (c1, ':s1', pname);
            dbms_sql.bind_variable (c1, ':s2', cprop_val);
            dbms_sql.bind_variable (c1, ':s3', ival);
    
            c1_status := dbms_sql.execute (c1);
            dbms_sql.close_cursor (c1);
    
            FETCH instances_curs INTO gdb_name;
        END LOOP;
    
        CLOSE instances_curs;
      END IF;
       
     EXCEPTION
       WHEN OTHERS THEN
          RAISE;
    END;
    /
    
  4. ここまでの手順が正常に実行された後、SYS もしくは SYSTEM ユーザで SDE ユーザから v$parameter ビューへの SELECT 権限を削除できます。
    SQL> REVOKE SELECT ON v_$parameter FROM SDE;
    

関連する質問

メタデータ

機能

種類

製品