Stored procedures 使用存储的procdeure监视表属性

Stored procedures 使用存储的procdeure监视表属性,stored-procedures,plsql,oracle11g,oracle-sqldeveloper,Stored Procedures,Plsql,Oracle11g,Oracle Sqldeveloper,我正在开发一个存储过程,该过程监视表中的最后一个提取值,该表提供了有关提取转换LoadETL的信息。现在我想检查上一次提取的值是否与上一次运行过程时的值相比发生了变化,但我不太清楚如何存储上一次运行过程的结果,以便在当前过程中使用它 以下是我的程序 create or replace PROCEDURE MONITOR AS v_count number:=0; v_Last_Extract_Ts VARCHAR2(80) := ''; v_Last_

我正在开发一个存储过程,该过程监视表中的最后一个提取值,该表提供了有关提取转换LoadETL的信息。现在我想检查上一次提取的值是否与上一次运行过程时的值相比发生了变化,但我不太清楚如何存储上一次运行过程的结果,以便在当前过程中使用它

以下是我的程序

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;
我遇到了类似于将存储过程的结果存储在中的临时表中的情况,但我不太清楚它是如何满足我的需要的

我想要实现的是可能的还是我需要一个不同的方法

提前谢谢

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


最简单的方法是将最后的结果保存在表中

创建一个表:

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;
在存储过程中,更新表中的值:


您可以使用触发器执行此检查:请参见下文:

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;

Oracle PL\SQL或SQL Server T-SQL???@Aditya这是Oracle PL-SQL,而不是SQL Server T SQL。您可以编辑标记吗?您可以在表上创建一个触发器,并检查值在此运行期间是否更改。在这种情况下,您可以发出一条消息,也可以询问您需要对新旧设备执行何种操作values@XING如果每5分钟运行一次的存储过程的consequential three run中的值没有更改,那么我需要发送一封警告邮件。您的意思是我应该使用过程删除并使用触发器而不是使用触发器吗。,在这个例子中,我们假设我插入了一条记录。下一次当有相同值的更新时,您将收到一条错误消息好的,只有一个问题。如果ETL停止工作,那么它不会将任何条目放入表中,这就是上次提取没有改变的情况,那么这个触发器是如何工作的呢。我可以看到它在桌子上的每一次更新上都会触发,在那里你可以做出改变。创建一个自治事务,即使ETL失败,它也会向表中插入一条记录。当然,触发器只有在更新为相同值时才会触发。感谢所有帮助。这看起来是个不错的方法,我会尝试,并在它工作时将您的答案标记为已接受。感谢您的回答,但我没有被授予在数据库中创建新表的权限。我可以看看我是否可以用你的方法,这是我最初的想法,但后来放弃了。
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;