使用存储的procdeure监视表属性

时间:2016-09-30 07:09:26

标签: stored-procedures plsql oracle11g oracle-sqldeveloper

我正在处理一个存储过程,该过程监视表中提供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 tableExec stored procedure into dynamic temp table的临时表中,但我无法完全了解它是如何满足我的需求的。

我正在尝试实现的目标是什么,或者我需要采用不同的方法。

提前致谢。

  

P.S。我是PL / SQL和存储过程的绝对初学者,所以我是   没有任何尝试在我的帖子中展示我所做的研究。对不起。

2 个答案:

答案 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;