2016-09-30 23 views
1

我正在處理一個存儲過程,該過程監視提供有關Extract Transform Load(ETL)的信息的表中的Last_Extract_Ts值。現在我想檢查Last_Extract_ts值是否從最後一次運行過程開始改變,但我無法完全弄清楚如何存儲上次過程運行的結果,以便我可以在當前運行的結果中使用它。使用存儲過程監視表屬性

下面是我的程序

create or replace PROCEDURE MONITOR AS 


    v_count    number:=0; 
    v_Last_Extract_Ts VARCHAR2(80) := ''; 
    v_Last_ETL_Run VARCHAR2(80) := ''; 
    BEGIN 

select count(*) into v_count from oms_etl_config where ATTR_NM='last_extract_ts' and process_type='upd' and ATTR_VALUE<=to_char(sys_extract_utc(systimestamp)-5/1440,'YYYY-MM-DD HH24:MI:SS'); 
select Attr_value into v_Last_Extract_Ts from OMS_ETL_CONFIG where PROCESS_TYPE='upd' AND ATTR_NM='last_extract_ts'; 
Select MAX(START_TS) into v_Last_ETL_Run from OMS_ETL_AUDIT; 

dbms_output.put_line(v_count); 
dbms_output.put_line(v_Last_Extract_Ts); 
dbms_output.put_line(v_Last_ETL_Run); 


END; 

我碰到的東西來了,如同在Insert results of a stored procedure into a temporary tableExec stored procedure into dynamic temp table存儲在臨時表的存儲過程的結果,但我不能完全看它如何滿足我的需求。

正是我想實現的可能或者我需要有不同的方法。

在此先感謝。

P.S.我絕對是PL/SQL和存儲過程的初學者,所以我 沒有任何嘗試在我的帖子中展示我所做的研究。對不起。

+0

Oracle(PL \ SQL)或SQL Server(T-SQL)? – Aditya

+0

@Aditya它是Oracle PL-SQL,而不是SQL服務器t SQL可以編輯標籤 –

+0

您可以在表上創建一個觸發器,並檢查在此運行期間值是否更改。在這種情況下,您可以提出一條消息 – XING

回答

1

最簡單的方法是將最後的結果保存在表中。

創建一個表:

Create table monitor_results 
( 
    last_run_date   date 
, last_Last_Extract_Ts varchar2(80) 
, last_ETL_Run   varchar2(80) 
, last_count   NUMBER 
); 

初始化值:

insert into monitor_results values (NULL, NULL, NULL, NULL); 
commit; 

在存儲過程更新表中的值:

...

update monitor_results 
set 
     last_run_date   = SYSDATE 
    , last_Last_Extract_Ts = v_Last_Extract_Ts 
    , last_ETL_Run   = v_Last_ETL_Run 
    , last_count   = v_count 
; 
commit; 
+0

感謝您的答案,但我沒有被授予在數據庫中創建新表的權限。我可以看看我是否可以用你的方法,這是我一開始想的,但放棄了它。 –

1

你可以做這個檢查usi如下:

CREATE OR REPLACE TRIGGER reporting_trigger 
    AFTER UPDATE ON <Table> 
    FOR EACH ROW 
BEGIN 
/**Your column which holds the record**/ 
IF :new.a = :old.a THEN 
    raise_application_error(-20001, 'This is a custom error'); 

END IF; 


END; 
+0

你的意思是我應該放棄使用程序並使用觸發器代替 –

+0

是的,所以這裏的例子讓我說如果我插入一條記錄。並且下一次當有相同值的更新時,您將收到錯誤消息 – XING

+0

好的,只有一個問題。如果ETL停止工作,那麼它不會將任何條目介紹到表中,那就是當Last_Extract_ts不更改時的情況,那麼此觸發器如何工作。我可以看到桌上的每一次更新都會觸發 –