最近一直接到售前的请求,客户现场成功部署SDE for Oracle后,在部署SQL
ORA-28595: Extproc 代理: DLL 路径无效 ORA-06512: 在 "SDE.ST_GEOMETRY_SHAPELIB_PKG", line 70 ORA-06512: 在 "SDE.ST_GEOMETRY_OPERATORS", line 68 View program sources of error stack? -------------------------------------------------------------- listener.ora: SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc) (ORACLE_HOME = F:\oracle\product\10.2.0\db_1) (PROGRAM = extproc) (ENVS="EXTPROC_DLLS=E:\ArcGIS\ArcSDE\ora10gexe\bin\st_shapelib.dll" )---这个“E:\ArcGIS\ArcSDE\ora10gexe\bin\st_shapelib.dll”是可以在本机打开找到文件的 ) (SID_DESC = (GLOBAL_DBNAME = webgis) (ORACLE_HOME = F:\oracle\product\10.2.0\db_1) (SID_NAME = webgis ) ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.238.185.71)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) ) -------------------------------------------------------- tnsname.ora: EXTPROC_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) ) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO) ) ) WEBGIS = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.238.185.71)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = webgis) ) ) --------------- C:\Documents and Settings\Administrator>tnsping EXTPROC_CONNECTION_DATA ---这里也是通的 TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 07-9月 - 2011 12:30:55 Copyright (c) 1997, 2007, Oracle. All rights reserved. 已使用的参数文件: F:\oracle\product\10.2.0\db_1\network\admin\sqlnet.ora 已使用 TNSNAMES 适配器来解析别名 Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC) (KEY = EXTPROC0))) (CONNECT_DATA = (SID = PLSExtProc) (PRESENTATION = RO))) OK (0 毫秒) |
直接操作空间数据的时候始终无法配置成功,现把SQL访问空间数据的原理以及配置过程中经常碰到的问题详细的介绍一下。
原理
从ArcSDE9.2 for oracle开始,提供了使用直接调用SQL来操作空间数据的方法,但是得进行配置才能使用,而且空间数据的存储方式只能是ST_GEOMETRY才支持直接SQL。
由于这些空间操作的函数都是GIS的核心算法,并且这些算法都是非常消耗CPU的算法,所以ESRI是以动态库而不是PL/SQL(适用于批量数据处理)的方式提供的这部分函数,然后在oracle中使用C的external procedure对动态库进行调用。
调用的结构图如下所示:
调用过程如下:
1. 用户进程执行SQL,在sqlplus执行select sde.st_astext(shape) from sde.test,在数据库中调用的顺序是:
上述三个对象的定义如下
sde.astext:
CREATE OR REPLACE PACKAGE BODY "SDE"."ST_GEOMETRY_OPERATORS"
IS
--st_Astext
Function st_astext_f(prim SDE.st_geometry)
Return clob
IS
spref SDE.spx_util.spatial_ref_record_t;
temp varchar2(1);
text_clob clob := empty_clob();
rc number;
Begin
If prim IS NULL THEN
Return NULL;
End If;
If prim.numpts = 0 and prim.entity = 0 Then
text_clob := 'EMPTY';
return(text_clob);
End If;
spref.srid := prim.srid;
rc := SDE.st_spref_util.select_spref(spref);
If rc != SDE.st_type_user.se_success THEN
raise_application_error (SDE.st_type_util.st_no_srid,'srid '||spref.srid||
' does not exist in st_spatial_references table.');
End If;
text_clob := ' ';
SDE.st_geometry_shapelib_pkg.astext(spref.srid,spref.x_offset,spref.y_offset,spref.xyunits,spref.z_offset,
spref.z_scale,spref.m_offset,spref.m_scale,spref.Definition,prim.numpts,
prim.entity,prim.points,text_clob);
Return(text_clob);
End st_astext_f;
Sde.st_geometry_shapelib_pkg.st_astext的存储过程的代码如下:
CREATE OR REPLACE PACKAGE BODY "SDE"."ST_GEOMETRY_SHAPELIB_PKG" AS
Procedure astext (srid IN number,
false_x IN number,
false_y IN number,
xyunits IN number,
false_z IN number,
zunits IN number,
false_m IN number,
munits IN number,
proj_str IN varchar2,
pls_numpts IN number,
pls_entity IN number,
points IN blob,
shptxt IN Out clob
)
AS
language c
name "AsText"
library st_shapelib
WITH CONTEXT
parameters (
CONTEXT,
srid ocinumber,
false_x ocinumber,
false_y ocinumber,
xyunits ocinumber,
false_z ocinumber,
zunits ocinumber,
false_m ocinumber,
munits ocinumber,
proj_str string, proj_str Indicator short, proj_str length int,
pls_numpts ocinumber,
pls_entity ocinumber,
points ociloblocator, points Indicator short,
shptxt ociloblocator, shptxt Indicator short
)
2。 在执行的Sde.st_geometry_shapelib_pkg.st_astext程序过程中,调用了一个astext函数(该函数在SDEHOME/bin/st_shapelib.dll(windows),$SDEHOME/lib/libst_shapelib.so(unix,linux)定义的)。这里需要借助别名库(Alias Library)来表示动态库路径。别名库是数据库里的一个对象,在SDE中就是st_shapelib对象(该对象的类型为library对象,其定义在下面),用来描述一个外部函数所在的动态链接库的路径和名称。通过别名库,从而可以知道被调用的外部函数在哪个文件里。
Library对象的定义:
Windows:
Linux,Unix:
Astext函数的定义:
Windows:
从上图可以看出,空间运算的所有的核心算法都在这17个函数中。
Linux,Unix:
3.当某个session调用某个sql的时候,监听器会生成一个ext(extproc.exe windows,extproc(linux))该进程专门用来处理对外部函数的调用。并且在整个session生命周期里,extproc进程会一直存在,只有当所有的session断开后,该进程才会退出。
4. Extproc进程负责将别名库所指定的动态链接库文件加载到内存,(windows:st_shapelib.dll,unix,linux:libst_shapelib.so必须放在数据库服务器端,并且由于windows:st_shapelib.dll要调用sg.dll和pe.dll两个动态库, unix,linux:libst_shapelib.so要调用libsg.so,libpe.so两个动态库,所以相关的两个动态库也要放到服务器端)
5. Extproc进程执行指定的外部函数,并将结果返回给服务器进程,进而服务器进程返回给用户进程。
从上述原理可以看到,使用外部存储过程,既保证了调用的效率,又很好的隐藏了源代码。
配置
st_shapelib对象的配置
该对象位于sde的schema下,类型为library,以sde用户登陆后可以通过查询user_libraries字典进行详细信息的查询。
分以下几种情况进行说明:
1. ArcSDE和数据库服务器安装在一台机器。
在post过程中会自动创建该对象,而且该对象指向的外部的动态库的路径一定正确的,对这种情况不用做特别的设置。
2. ArcSDE和数据库服务器是分开部署的并且数据库服务器和sde服务器是同类型,同厂商的操作系统,如都是windows操作系统或者都是solairs操作系统。
在post过程中也会自动创建该对象,但是该对象所指向的外部的动态库为sde服务器上的路径,如sde安装在d:/program/arcgis/arcsde目录中,则该对象指向d:/program files/arcgis/arcsde/ora10gexe/bin/st_shapelib.dll,但是该路径在数据库服务上并不存在,此时可以用以下两种方法进行处理。
A. 在数据库服务器上也建立d:/program files/arcgis/arcsde/ora10gexe/bin/目录,然后把sde服务器上的st_shapelib.dll文件拷贝到该目录中。
B. 在数据库服务器上随便建立一个目录,如d:/arcsde/bin,然后把sde服务器上的st_shapelib.dll文件拷贝到该目录中,然后到数据库中修改st_shapelib对象所指向的动态库,
3. ArcSDE和数据库服务器是分开部署的,并且数据库服务器和sde服务器不是同类型的操作系统。
如数据库服务器是linux,sde服务器是window操作系统。
如sde安装在d:/program files/arcgis/arcsde目录中,做完post后,数据库中的st_shapelib对象所指向的动态库为d:/program files/arcgis/arcsde/ora10gexe/bin/st_shapelib.dll。该路径在linux实际上不存在。此时需要在数据库服务器上把ArcSDE的软件安装上,然后通过sql到数据库中把st_shapelib对象指向正确的动态库。
Oracle外部存储过程的配置
配置方法
数据库服务器端:
Windows操作系统下通过菜单打开net manager, linux, unix操作系统执行netmgr,启动的界面如下图所示:
1.
选中已经存在的某个listener(一般情况下只会有一个listener),选择监听位置,并添加一个监听地址,协议选择IPC,如下图所示:
2. 然后选择数据库服务,并填写相关信息,如下:
3. 选择其他服务,
在环境处填写:
"EXTPROC_DLLS=d:/program files/arcgis/arcsde/ora10gexe/bin/st_shapelib.dll"
在程序名处填写:
extproc
SID处填写:
PLSExtProc
3. 选择文件à保存网络配置后,退出,完成监听器的配置。
4. 修改tnsnames.ora文件,添加如下一行:
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(Key = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.222)(PORT = 1521))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
常见问题
1. Linux,Unix下没有把$SDEHOME/lib目录添加到oracle用户下的.profile或者.bash_profile的相关环境变量中。
2. 监听器除了监听TCP协议,一定还要要监听IPC协议,可以通过lsnrctl status命令来查看。
3. St_shapelib对象所指向的动态库的路径不正确,可以通过select * from user_libraries查看指向的动态库的路径是否正确,如果不正确可以通过create or replace library st_shapelib as ‘your lib path’来修改。
相关推荐
标题 "sql/oracle培训与学习资料" 暗示了这个压缩包主要包含与SQL语言以及Oracle数据库管理系统相关的学习资源。Oracle是世界上最广泛使用的数据库系统之一,尤其在企业级应用中占据重要地位。SQL(Structured Query...
在Oracle数据库环境中,数据删除操作通常是不可逆的。然而,如果意外删除了重要数据,有几种方法可以帮助恢复这些数据。本文将深入探讨如何利用SQL和Oracle数据库特性来尝试恢复被DELETE语句删除的数据。 首先,...
- **共享SQL区域**:Oracle会在内存的共享池中缓存已执行过的SQL语句,以便后续执行时可以直接使用而无需重新解析。 - **SQL语句处理的阶段**:包括解析、执行、归还等阶段。 - **共享游标**:多个SQL语句如果...
2. **SQL语言基础**:Oracle基于SQL(结构化查询语言)进行数据操作,手册会详细介绍SQL的语法,如DML(数据操纵语言)的INSERT、UPDATE、DELETE命令,以及DDL(数据定义语言)的CREATE、ALTER和DROP用于创建、修改...
3. **SQL语句优化**:包括编写高效的SQL语句,避免全表扫描,合理使用JOIN操作,减少子查询,以及使用绑定变量等技巧。理解SQL执行计划,学会使用`EXPLAIN PLAN`来分析和改进查询性能。 4. **表和分区设计**:表的...
表压缩的工作原理是删除在数据库表中发现的重复数据值,以节省空间。压缩是在数据库的数据块级别上进行的。当确定一个表要被压缩后,数据库便在每一个数据库数据块中保留空间,以便储存在该数据块中的多个位置上出现...
- **调优领域**:包括应用程序级(如SQL和管理变化)、实例级(内存、数据结构、配置)和操作系统交互(I/O、SWAP、参数)。本课程重点在于应用程序级的SQL语句调优。 **2. SQL语句处理过程** - **共享SQL区域**:...
### Oracle性能调优原理及具体手段 #### 一、Oracle结构与实例 ##### 1.1 Oracle实例(Instance) - **定义与作用**:Oracle实例是访问Oracle数据库的一个途径,它仅能打开一个数据库。 - **组成**:由SGA(系统...
- 存储结构:数据块(Data Block)是Oracle存储数据的基本单位,它包含了头部信息、表目录、行目录、行数据、空闲空间和事务使用的空间。理解这些组成部分对于识别性能瓶颈至关重要。 2. **Oracle存储结构详解** ...
本篇文章将深入探讨SQL*Loader的工作原理、使用方法以及如何通过界面操作它。 首先,我们来理解SQL*Loader的基本概念。SQL*Loader是Oracle提供的一种实用程序,它能够读取文本文件(通常称为控制文件或数据文件)中...
本文介绍了基于Oracle Spatial空间数据库数据的动态读取的方法和原理,并提供了使用VC++ 6.0和MapX集成二次开发的实现步骤。通过本文,读者可以了解Oracle Spatial空间数据库的基本概念和功能,以及如何使用VC++ 6.0...
### 使用Oracle移植工作台从Microsoft SQL Server移植到Oracle数据库10g #### 一、概述与背景 在当今数字化转型的背景下,企业面临着各种各样的技术挑战,其中之一就是数据库迁移。随着业务的发展和技术的进步,很...
本章节将详细介绍 Oracle 9i 的主要特性以及使用方法。 #### 二、Oracle 9i 主要特点 1. **增强的安全性**:Oracle 9i 在安全性方面进行了显著增强,提供了更加灵活和安全的用户权限管理机制。 2. **支持XML**:...
在Linux环境下,对Oracle数据库进行批量操作是一项常见的任务,尤其对于系统管理员和DBA来说,高效地执行SQL脚本可以显著提升工作效率。本篇将详细讲解如何利用shell脚本来批量执行Oracle数据库脚本,以及涉及的相关...
本手册旨在为初学者提供一个全面的Oracle入门指南,帮助理解其基本概念、功能以及操作方法。 1. **Oracle概述** Oracle数据库系统是一种支持分布式数据库管理、事务处理、数据仓库和网络计算的高性能平台。它采用...
本文将基于"Oracle学习心得,Oracle使用方法,Oracle教程,Oracle入门教程"的主题,结合"源码"和"工具"的标签,为你提供丰富的Oracle知识。 首先,Oracle数据库的核心概念包括SQL(结构化查询语言)和PL/SQL,它们是...
- RAC与Data Guard:了解Oracle集群解决方案,理解RAC(实时应用集群)和Data Guard(数据保护)的作用和配置。 - 分区与表空间:掌握Oracle的分区技术,理解表空间的管理。 4. 笔试面试剖析: - 面试技巧:了解...
2. **SQL语句与Spatial函数**:通过SQL查询语句和Oracle9i Spatial提供的特定函数(如SDO_GEOM)来获取、操作空间数据。例如,可以使用SDO_RELATE函数检查两个几何对象之间的空间关系。 3. **数据类型转换**:VC++...
最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。 ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用...
此外,还将深入探讨Oracle的数据类型、表空间、表和索引的创建与管理,以及SQL查询语句的使用。 二、Oracle数据库管理 在Oracle中,数据库的日常管理包括用户管理、权限控制、备份与恢复、性能监控等。学习这部分...