簡體   English   中英

創建一個運行SELECT語句的存儲過程,以保持Oracle表的更新

[英]Create a stored procedure that runs a SELECT statement to keep an Oracle table updated

為了優化.NET應用程序,我在Oracle數據庫上創建了一個自定義表,以避免每次應用程序查詢數據庫時都進行昂貴的JOIN。 下面的SQL最初用於填充此自定義表。 由於用於填充定制表的表在不斷變化,因此我需要確保定制表保持最新狀態。 我相信我需要創建一個以預定頻率運行的存儲過程,該存儲過程將執行以下操作:a)刪除SELECT返回的記錄集中不再存在的所有記錄b)附加由SELECT返回的記錄集中存在的任何記錄SELECT但在QL_ASSETS表中不存在,並且c)更新QL_ASSETS表和SELECT返回的記錄集中不同的記錄中的任何數據。 一個簡單的UPDATE查詢是否可以做到這一點,還是僅更新QL_ASSETS表和SELECT返回的記錄集中不同的記錄中的數據? 如果是后者,那么關於我如何完成所有3個任務的任何建議? 謝謝!

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

下面的materialised view在創建后立即可用,並將根據您提到的時間范圍每天更新(從... START WITH )。

您也可以手動刷新

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;

您可以像普通的簡單表格一樣,從YOUR_MAT_VIEW中進一步查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM