標籤:
關於這個內容,其實從ArcSDE9.2推出ST_Geometry就讓使用者感到很有吸引力,而且特別是在ArcSDE9.3之後,使用者使用SQL操作ST_geometry越來越多,但是在配置Oracle監聽來說總是碰到這樣那樣的問題,以下就是總結一下配置 Oracle 接聽程式來使用SQL操作ST_Geometry 。
首先說明一下:如果你的ArcSDE版本是9.2最好不要使用這種方式,因為Bug也是比較多的。
例如:http://support.esri.com/en/knowledgebase/techarticles/detail/33918
1:我們需要使用SQL操作ST_Geometry,那麼我們的資料存放區都應該以ST_Geometry,但是有一點容易被使用者忽視的就是原來的資料可能是ArcSDE9.2他們都是以BLOB或者Long Raw進行儲存,然後升級到ArcSDE9.3但是儲存沒有升級,這樣怎麼配置都不能SQL操作,這是往往被使用者忽視的問題。
解決該問題:使用Migrate工具遷移一下儲存。
2:查看一下Oracle的監聽狀態,extporc(CLRextproc)的狀態必須為靜態(Unknow),如果是Ready狀態就有可能出現問題,而且Oracle監聽必須同時監聽TCP和IPC
- C:\Users\Administrator>lsnrctl status
-
- LSNRCTL for 64-bit Windows: Version 11.2.0.1.0 - Production on 26-12月-2011 10:2
- 9:44
-
- Copyright (c) 1991, 2010, Oracle. All rights reserved.
-
- 正在串連到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
- LISTENER 的 STATUS
- ------------------------
- 別名 LISTENER
- 版本 TNSLSNR for 64-bit Windows: Version 11.2.0.1.0 - Produ
- ction
- 啟動日期 26-12月-2011 10:28:14
- 正常已耗用時間 0 天 0 小時 1 分 34 秒
- 追蹤層級 off
- 安全性 ON: Local OS Authentication
- SNMP OFF
- 監聽程式參數檔案 D:\app\Administrator\product\11.2.0\dbhome_1\network\a
- dmin\listener.ora
- 監聽程式記錄檔 d:\app\administrator\diag\tnslsnr\lish\listener\alert\
- log.xml
- 監聽端點概要...
- (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
- (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.100.111)(PORT=1521)))
- 服務摘要..
- 服務 "CLRExtProc" 包含 1 個執行個體。
- 執行個體 "CLRExtProc", 狀態 UNKNOWN, 包含此服務的 1 個處理常式...
- 服務 "orcl" 包含 2 個執行個體。
- 執行個體 "orcl", 狀態 UNKNOWN, 包含此服務的 1 個處理常式...
- 執行個體 "orcl", 狀態 READY, 包含此服務的 1 個處理常式...
- 服務 "orclXDB" 包含 1 個執行個體。
- 執行個體 "orcl", 狀態 READY, 包含此服務的 1 個處理常式...
- 命令執行成功
3:如果是分布式安裝情況下
a:比如伺服器安裝的64Bit的Oracle伺服器端,ArcSDE機器安裝的32Bit的軟體,兩者都是Windows作業系統
b:比如伺服器安裝的64Bit的Oracle伺服器端,AIX作業系統,ArcSDE機器安裝的32Bit的軟體,Windows作業系統
那麼這就需要根據伺服器端的Oracle的位元以及所以的作業系統來定相關的dll或者so的位元,也就是說這個配置必須跟Oracle的伺服器端打交道,我們根據伺服器的作業系統和位元來定
解決:
a:在伺服器端安裝一個64Bit的ArcSDE軟體即可,其實最主要的就是需要64Bit的相關dll
b:在伺服器端安裝一個64Bit的適用於AIX作業系統的ArcSDE軟體,一樣道理
4:引用相關的dll以Windows為例,不僅僅只有一個st_shapelib.dll,還包括pe.dll,sg.dll,所以在使用過程中需要注意是否這三個dll都存在,在非windows環境下更是如此,此外還需要注意對這三個檔案的讀寫操作。
5:配置完畢,我們可以使用以下命令來檢查
注意:這個是在sde使用者下
- SQL> select * from user_libraries;
-
- LIBRARY_NAME
- ------------------------------
- FILE_SPEC
- ------------------------------------------------------------------------------
- --------------------
- D STATUS
- - -------
- ST_SHAPELIB
- C:\Program Files\ArcGIS\ArcSDE\ora11gexe\bin\st_shapelib.dll
- Y VALID
如果沒有的話
- SQL> create or replace library ST_SHAPELIB
- 2 as ‘D:\Oracle\product\11.2.0\dbhome_1\BIN\st_shapelib.dll‘;
- 3 /
-
- 庫已建立。
-
- SQL> alter package sde.st_geometry_shapelib_pkg compile reuse settings;
-
- 程式包已變更。
6:其實配置來說,也就是對listener.ora和TNSName.ora檔案的配置
listener.ora:檔案主要對相關St_shapelib.dll的引用,使用者也可以將我所講到的三個dll拷貝到ORACLE_HOME/bin檔案夾裡面,注意相關的許可權,然後EXTPROC_DLLS=ANY,這種方法也可以可以的。
- # listener.ora Network Configuration File: D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
- # Generated by Oracle configuration tools.
-
- SID_LIST_LISTENER =
- (SID_LIST =
- (SID_DESC =
- (SID_NAME = CLRExtProc)
- (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
- (PROGRAM = extproc)
- (ENVS = "EXTPROC_DLLS=ANY")
- )
- (SID_DESC =
- (GLOBAL_DBANAME = orcl)
- (ORACLE_HOME = D:\app\Administrator\product\11.2.0\dbhome_1)
- (SID_NAME = orcl)
- )
- )
-
- LISTENER =
- (DESCRIPTION_LIST =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.111)(PORT = 1521))
- )
- )
-
- ADR_BASE_LISTENER = D:\app\Administrator
7:TNSName.ora檔案來說就是兩個檔案都有KEY值,保證這兩個檔案的KEY值一致就可以了,還有就是以我的經驗,安裝最新版本的Oracle比如現在我機器的環境就是oracle 11.2.0.1,他的TNSNAME檔案並不會出現EXTPROC_CONNECTION_DATA關鍵字,所以我們需要修改為這個關鍵字即可。 Esri也有關於Oracle11gR2相關配置ST_Geometry的文章:http://support.esri.com/en/knowledgebase/techarticles/detail/38043
- # tnsnames.ora Network Configuration File: D:\app\Administrator\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
- # Generated by Oracle configuration tools.
-
- LISTENER_ORCL =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.111)(PORT = 1521))
-
-
- EXTPROC_CONNECTION_DATA =
- (DESCRIPTION =
- (ADDRESS_LIST =
- (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
- )
- (CONNECT_DATA =
- (SID = CLRExtProc)
- (PRESENTATION = RO)
- )
- )
-
- ORCL =
- (DESCRIPTION =
- (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.100.111)(PORT = 1521))
- (CONNECT_DATA =
- (SERVER = DEDICATED)
- (SERVICE_NAME = orcl)
- )
- )
如果環境跟我一致,也可以將這兩個檔案複製,將使用者的相關參數進行修改即可。相關參數參考
- <span style="font-size:13px;">SID_LIST_LISTENER
- 此標註是名為 LISTENER(預設接聽程式名稱)的接聽程式要處理的 SID 列表的開頭。
-
- SID_LIST 和 SID_DESC
- 標題 SID_LIST 下的 SID_DESC 條目用於定義服務。列表中的第一個?蹌看? extproc 請求,第二個條目處理用戶端工作階段。
-
- SID_NAME
- 其值必須與在檔案 tnsnames.ora 中為 extproc 指定的 SID 對應。
-
- ORACLE_HOME
- 定義此項服務的 Oracle 首頁的位置。從此位置下的檔案夾載入 extproc 程式檔案。
-
- PROGRAM
- 指定 extproc 可執行檔的檔案名稱。此區分大小寫名稱可能是 extproc 或 extproc.exe,具體取決於作業系統的類型。檔案位於 ORACLE_HOME/bin。
-
- ENVS
- 這是 extproc 在運行時所使用的環境變數的列表。列表用冒號分隔。此列表必須包括環境變數 EXTPROC_DLLS 以及 extproc 在運行時需要的任何其他環境變數的定義,其他環境變數通常包括 UNIX 和 Linux 系統中的 LD_LIBRARY_PATH、SHLIB_PATH 或 LIBPATH,或者 Windows 伺服器上的 PATH。路徑變數通常包括幾何與投影引擎庫的位置。
-
- EXTPROC_DLLS
- 此環境變數用於定義 extproc 可直接從中載入和調用函數的庫的列表。包含 ST_SHAPELIB 和 LIBST_RASTER 庫的檔案的路徑必須在此指定。
-
- 對於安裝在 UNIX 上的 Oracle 伺服器,列表用冒號分隔,對於安裝在 Windows 上的 Oracle 伺服器,列表用分號分隔。所有路徑都必須是絕對路徑並且指向本地目錄,或者是 Oracle 系統使用者可訪問的 UNC 路徑。這也意味著如果已將 ArcSDE 安裝在非 Oracle 伺服器上,則必須將形狀和柵格庫複製到 Oracle 伺服器。有關詳細資料,請參閱在不同的伺服器上安裝 Oracle 和 ArcSDE。
-
- 不存在環境變數替換。
-
- 可選關鍵字 ANY 和 ONLY 可用於放寬或限制 extproc 使用庫檔案的方式。如果將 ANY 放在路徑前面,Oracle 可從指定路徑載入任何庫並且不必提供庫名稱。如果將 ONLY 放在路徑前面,Oracle 將僅使用路徑中提供的特定庫。
-
- KEY
- 為此條目設定的值將此接聽程式連結到檔案 tnsnames.ora 中的對應服務條目。該值將此接聽程式與可能存在於同一資料庫伺服器的其他 IPC 接聽程式區分開來。key 可為任何簡短名稱,但在檔案 listener.ora 和 tnsnames.ora 中必須相同。key 區分大小寫。</span><span style="font-size:18px;">
- </span>
8:測試是否正常
- SQL> select sde.st_astext(shape) from aa where objectid<3;
-
- SDE.ST_ASTEXT(SHAPE)
- ------------------------------------------------------------------
-
- POINT ( -13625889.61620000 4541020.47880000)
- POINT ( -13627070.41230000 4548787.04140000)
怎麼配置 Oracle 接聽程式來使用SQL操作ST_Geometry