Sql 创建一个存储过程,该存储过程运行SELECT语句以保持Oracle表的更新
为了优化.NET应用程序,我在Oracle数据库上创建了一个自定义表,以避免每次应用程序查询数据库时代价高昂的联接。下面的SQL最初用于填充此自定义表。由于用于填充自定义表的表不断变化,我需要确保自定义表保持最新。我认为我需要创建一个以预定频率运行的存储过程,该存储过程将执行以下操作:a)删除SELECT返回的记录集中不再存在的任何记录b)追加SELECT返回的记录集中存在但在QL_ASSETS表中不存在的任何记录,c)更新在QL_ASSETS表和SELECT返回的记录集中都存在差异。一个简单的更新查询会实现这一点,还是仅仅更新QL_ASSETS表和SELECT返回的记录集中存在的记录中的数据?如果是后者,对于如何完成这三项任务有什么建议?谢谢Sql 创建一个存储过程,该存储过程运行SELECT语句以保持Oracle表的更新,sql,oracle,Sql,Oracle,为了优化.NET应用程序,我在Oracle数据库上创建了一个自定义表,以避免每次应用程序查询数据库时代价高昂的联接。下面的SQL最初用于填充此自定义表。由于用于填充自定义表的表不断变化,我需要确保自定义表保持最新。我认为我需要创建一个以预定频率运行的存储过程,该存储过程将执行以下操作:a)删除SELECT返回的记录集中不再存在的任何记录b)追加SELECT返回的记录集中存在但在QL_ASSETS表中不存在的任何记录,c)更新在QL_ASSETS表和SELECT返回的记录集中都存在差异。一个简单的
INSERT INTO QL_ASSETS (
THIRD_PARTY_SERVICE_CLEAN,
LOCATION_ACCOUNT_ID,
LOCATION_ACCOUNT_NUMBER,
PLI_NAME,
PLI,
STREET,
CITY,
STATE,
ZIPCODE,
COUNTRY,
ULTIMATE_PARENT_ID,
PARENT_ID,
LOCATION_STREET,
LOCATION_CITY,
LOCATION_STATE,
LOCATION_ZIPCODE,
LOCATION_COUNTRY,
ULTIMATE_PARENT_ACCOUNT_NUMBER)
(SELECT
B.THIRD_PARTY_SERVICE_CLEAN,
A.LOCATION_ACCOUNT_ID,
D.ACCOUNT_NUMBER AS LOCATION_ACCOUNT_NUMBER,
F.NAME AS PLI_NAME,
A.PLI,
H.STREET,
H.CITY,
H.STATE,
H.ZIPCODE,
H.COUNTRY,
D.ULTIMATE_PARENT_ID,
D.PARENT_ID,
G.STREET AS LOCATION_STREET,
G.CITY AS LOCATION_CITY,
G.STATE AS LOCATION_STATE,
G.ZIPCODE AS LOCATION_ZIPCODE,
G.COUNTRY AS LOCATION_COUNTRY,
E.ACCOUNT_NUMBER AS ULTIMATE_PARENT_ACCOUNT_NUMBER
FROM ASSET_PLUS A,
QUARTERLY_LETTER_LOAD B,
DATASTORE_PLI_MAPPING C,
ACCOUNT D,
ACCOUNT E,
PROD_INT F,
ADDRESS G,
ADDRESS H
WHERE B.THIRD_PARTY_SERVICE_CLEAN = C.DATASTORE_SVC_NAME
AND C.PLI = A.PLI
AND A.PRODUCT_ID = F.ROW_ID
AND E.PRIMARY_ADDRESS_ID = H.ADDRESS_ID
AND D.PRIMARY_ADDRESS_ID = G.ADDRESS_ID
AND D.ULTIMATE_PARENT_ID = E.ACCOUNT_ID
AND D.ACCOUNT_ID = A.LOCATION_ACCOUNT_ID
以下
实体化视图在创建后立即可用,并将按照您提到的时间框架每天刷新(从开始…)
您还可以手动刷新它,如
EXEC DBMS_REFRESH.REFRESH(name => 'YOUR_MAT_VIEW');
和MV的DDL:
CREATE MATERIALIZED VIEW YOUR_MAT_VIEW
BUILD IMMEDIATE
REFRESH COMPLETE
START WITH TRUNC(SYSDATE)--(+?/24) ?- HOUR OF DAY
NEXT TRUNC(SYSDATE)+1--(+?/24)
SELECT
B.THIRD_PARTY_SERVICE_CLEAN,
A.LOCATION_ACCOUNT_ID,
D.ACCOUNT_NUMBER AS LOCATION_ACCOUNT_NUMBER,
F.NAME AS PLI_NAME,
A.PLI,
H.STREET,
H.CITY,
H.STATE,
H.ZIPCODE,
H.COUNTRY,
D.ULTIMATE_PARENT_ID,
D.PARENT_ID,
G.STREET AS LOCATION_STREET,
G.CITY AS LOCATION_CITY,
G.STATE AS LOCATION_STATE,
G.ZIPCODE AS LOCATION_ZIPCODE,
G.COUNTRY AS LOCATION_COUNTRY,
E.ACCOUNT_NUMBER AS ULTIMATE_PARENT_ACCOUNT_NUMBER
FROM ASSET_PLUS A,
QUARTERLY_LETTER_LOAD B,
DATASTORE_PLI_MAPPING C,
ACCOUNT D,
ACCOUNT E,
PROD_INT F,
ADDRESS G,
ADDRESS H
WHERE B.THIRD_PARTY_SERVICE_CLEAN = C.DATASTORE_SVC_NAME
AND C.PLI = A.PLI
AND A.PRODUCT_ID = F.ROW_ID
AND E.PRIMARY_ADDRESS_ID = H.ADDRESS_ID
AND D.PRIMARY_ADDRESS_ID = G.ADDRESS_ID
AND D.ULTIMATE_PARENT_ID = E.ACCOUNT_ID
AND D.ACCOUNT_ID = A.LOCATION_ACCOUNT_ID;
您可以像普通的简单表一样从您的MAT视图进行进一步查询。希望物化视图能够帮助您!基础数据的更改频率如何?物化视图类似于select查询结果的快照,您可以要求oracle在指定的时间间隔内进行更新。它有一些缺点,如果您的表数据收到频繁的修改,那么基础数据每天都在更改,因此我希望刷新的频率相同。在这种情况下,简单的刷新可能已经有帮助了。在这种情况下,只有第一次执行需要一段时间。谢谢Maheswaran。一个问题:我在MV-DLL中没有看到任何要刷新的表的引用;MV是如何知道要刷新哪个表的?MV不只是一个表,刷新意味着,简单地说,它运行查询并用新数据填充视图。。所以它不是基于表的,而是基于查询的。。在这种情况下,此MV工作于刷新完成
,也可以使用快速刷新
创建MV。这种类型更快,因为它只更新更改的记录,而不是整个删除和插入。在这种情况下,您甚至可以在每次提交数据库之后刷新MV。要快速刷新,您必须在基表上创建物化视图日志
。@Wernfried yes,这与他的要求和重要性有关。在完成
和快速刷新
之间进行选择。我只是尽量保持简单,因为这是一天一次,明白了,谢谢Maheswaran。也可以将索引添加到材质视图中吗?