Oracle MV 要求將對像類型定義為 FINAL?
我想在具有名為ST_GEOMETRY的使用者定義數據類型的表上創建 Oracle 18c物化視圖 (MV):
- MV 將按計劃執行 COMPLETE 刷新——在本地表上。
關於 ST_GEOMETRY 的一些資訊:
ST_Geometry數據類型實現了使用者定義數據類型 (UDT)的SQL 3 規範,允許您創建能夠儲存空間數據的列,例如地標、街道或地塊的位置。它提供國際標準組織 (ISO) 和開放地理空間聯盟 (OGC) 兼容的結構化查詢語言 (SQL) 訪問地理數據庫和數據庫。此儲存通過為表示地理特徵的對象(點、線和多邊形)提供儲存來擴展數據庫的功能。它旨在有效利用數據庫資源;與複製和分區等數據庫功能兼容;並提供對空間數據的快速訪問。
ST_Geometry 本身是一個抽象的、未實例化的超類。但是,它的子類可以被實例化。實例化數據類型是一種可以定義為表列並將其類型的值插入其中的數據類型。
使用者定義數據類型的 SQL 定義可以在這裡找到:db<>fiddle。
CREATE OR REPLACE TYPE SDE."ST_GEOMETRY" ( ... ) NOT final
(雖然,我猜大部分邏輯都儲存在 EXTPROC 中。)
MV 對像類型必須是 FINAL:
嘗試在 ST_GEOMETRY 使用者定義數據類型 ( ORA-30373 )上創建 MV 時存在一個已知問題:
為包含 ST_Geometry 屬性的表創建 Oracle 物化視圖會返回以下錯誤:
"ORA-30373: object data types are not supported in this context". Code: SQL> CREATE MATERIALIZED VIEW parcel_view 2 AS SELECT * FROM parcel@remote_server; CREATE MATERIALIZED VIEW parcel_view * ERROR at line 1: ORA-30373: object data types are not supported in this context
原因:
Oracle 的高級複製功能要求將所有對 像類型定義為 FINAL以參與物化視圖。
ST_Geometry 不能定義為 FINAL 的原因是該類型包含用於類型繼承的子類型。Oracle 不允許將具有子類型的類型定義為 FINAL。
Esri 目前正在與 Oracle 合作解決此問題和限制。以下 Oracle TAR 文件可供參考:“6482996.992 - ORA-30373 MATERIALIZE VIEW 無法複製包含子類型的類型。增強請求 (ER) 6370112”。
注意:我已經聯繫了 ESRI 支持,他們說 Oracle 在增強請求方面沒有任何進展。
問題:
有沒有辦法解決這個問題?
- 我之所以這麼問,是因為 ESRI 的名聲是不適合 Oracle。所以他們有可能誤解了這個問題或者沒有足夠的創造力。
例如,ONLY 關鍵字呢?
對於基於對象表的對象關係視圖和對象物化視圖,如果主對象表的類型不是 FINAL,則物化視圖定義查詢中的 FROM 子句必須包含 ONLY 關鍵字。
例如:
CREATE MATERIALIZED VIEW customer OF cust_objtyp AS SELECT CustNo FROM ONLY HR.Customer_objtab@dbs1;
否則,FROM 子句必須省略 ONLY 關鍵字。
筆記:
- 不幸的是,該簡介是關於對象表的,而不是關於對象列的(我相信 ST_GEOMETRY 使用者定義的數據類型將被視為“對象列”)。
- 但我想知道是否可以使用 ONLY 關鍵字的概念來幫助解決 ST_GEOMETRY 對象列的最終問題。有任何想法嗎?
我在我的測試伺服器環境中測試並工作。
SQL> create table test_mv (col1 number not null unique, col2 number); Table created. SQL> create materialized view log on test_mv with primary key; Materialized view log created. SQL> create materialized view mv refresh fast on demand as 2 select col1,col2, sdo_geometry(2001, 26917, sdo_point_type(col1,col2, null), null, null) as shape 3 from test_mv; Materialized view created. SQL> insert into test_mv values (1, 1); 1 row created. SQL> insert into test_mv values (2, 2); 1 row created. SQL> commit; Commit complete. SQL> exec dbms_mview.refresh('MV', 'f'); PL/SQL procedure successfully completed. col1 col2 shape 1 1 (2001, 26917, (1, 1, ), (, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ), (, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , )) 2 2 (2001, 26917, (2, 2, ), (, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ), (, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ))
我在我的測試伺服器中進行了測試。我使用 ST_GEOMETRY (TYPE) 創建了“COLA_MARKETS”表。為了創建“物化視圖”,我必須創建視圖“COLA_MARKETS_VIEW”,然後將“物化視圖”名稱創建為“COLA_MARKETS_MVIEW”。
CREATE TABLE cola_markets ( mkt_id NUMBER PRIMARY KEY, name VARCHAR2(32), shape ST_GEOMETRY); select * from cola_markets; CREATE VIEW cola_markets_view as select * from cola_markets; select * from cola_markets_view; CREATE MATERIALIZED VIEW cola_markets_mview REFRESH COMPLETE ON DEMAND AS SELECT * From cola_markets_view; select * from COLA_MARKETS_MVIEW t;