但是前提是Oracle地理数据库实例中的管理员账户的Server_config表中包含Open_Cursors的字段。所以我们需要在该表中添加该字段记录,默认是没有该记录的。
该问题涉及到ArcGIS版本包括:10.1, 10.2, 10.2.1, 10.2.2, 10.3
解决方法
1:打上ArcGIS发布的最新补丁,截止到博文发布,目前补丁只有ArcGIS 10.2.2,其他版本补丁还在调试当中。
ArcGIS 'Oracle Critical Patch Update - October 2014' Connection Issue Patch
2:直接使用SQL语句解决该问题(其他版本适用)
a):使用管理员账户,为地理数据库管理员对V$Parameter视图赋予权限。
SQL> GRANT SELECT ON v$parameter TO SDE; GRANT SELECT ON v$parameter TO SDE * 第 1 行出现错误: ORA-02030: 只能从固定的表/视图查询
其实该视图只是一个同义词,通过以下SQL语句来说的相关表名
SQL> select synonym_name,table_name from dba_synonyms where synonym_name='V$PARAMETER'; SYNONYM_NAME TABLE_NAME ------------------------------ ------------------------------ V$PARAMETER V_$PARAMETER
然后赋予地理数据库管理员选择该表的权限即可
SQL> GRANT SELECT ON v_$parameter TO SDE;
b):使用地理管理员用户连接,执行如下存储过程,目的就是往相关地理管理员账户的Server_Config表中添加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; /
c):然后再取消该地理管理员对V$PARAMETER的执行权限
SQL> REVOKE SELECT ON v_$parameter FROM SDE;
接下来,我们查看Server_Config表里面的值,发现已经有Open_Cursors项,当然默认的300可能比较少,根据情况可以直接增大到2000.