Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 创建一个存储过程,该存储过程运行SELECT语句以保持Oracle表的更新_Sql_Oracle - Fatal编程技术网

Sql 创建一个存储过程,该存储过程运行SELECT语句以保持Oracle表的更新

Sql 创建一个存储过程,该存储过程运行SELECT语句以保持Oracle表的更新,sql,oracle,Sql,Oracle,为了优化.NET应用程序,我在Oracle数据库上创建了一个自定义表,以避免每次应用程序查询数据库时代价高昂的联接。下面的SQL最初用于填充此自定义表。由于用于填充自定义表的表不断变化,我需要确保自定义表保持最新。我认为我需要创建一个以预定频率运行的存储过程,该存储过程将执行以下操作:a)删除SELECT返回的记录集中不再存在的任何记录b)追加SELECT返回的记录集中存在但在QL_ASSETS表中不存在的任何记录,c)更新在QL_ASSETS表和SELECT返回的记录集中都存在差异。一个简单的

为了优化.NET应用程序,我在Oracle数据库上创建了一个自定义表,以避免每次应用程序查询数据库时代价高昂的联接。下面的SQL最初用于填充此自定义表。由于用于填充自定义表的表不断变化,我需要确保自定义表保持最新。我认为我需要创建一个以预定频率运行的存储过程,该存储过程将执行以下操作:a)删除SELECT返回的记录集中不再存在的任何记录b)追加SELECT返回的记录集中存在但在QL_ASSETS表中不存在的任何记录,c)更新在QL_ASSETS表和SELECT返回的记录集中都存在差异。一个简单的更新查询会实现这一点,还是仅仅更新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。也可以将索引添加到材质视图中吗?