我正在处理一个存储过程,该过程监视表中提供Last_Extract_Ts
信息的Extract Transform Load(ETL)
值。现在我想检查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 table,Exec stored procedure into dynamic temp table的临时表中,但我无法完全了解它是如何满足我的需求的。
我正在尝试实现的目标是什么,或者我需要采用不同的方法。
提前致谢。
P.S。我是PL / SQL和存储过程的绝对初学者,所以我是 没有任何尝试在我的帖子中展示我所做的研究。对不起。
答案 0 :(得分: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;
答案 1 :(得分:1)
您可以使用触发器进行检查:见下文:
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;