每当程序开始和结束时插入日期和时间及其在 oracle 中的总计数

Insert date and time whenever a procedure starts and end and its total count in oracle

我有一个存储过程,我想为其插入执行该过程的日期和时间以及插入的行数。

TBL_SIGNOFF_ACT_CNT 是 table 我想在下面的过程中插入日期、时间、计数...的地方。

create or replace PROCEDURE FIBER_SIGNOFF_UGAR_UPD AS 
VSQLERR varchar2 (200);
VSQLERRCODE varchar2 (200);
v_ne_length number;
v_ug_length number;
v_ar_length number;
vper number;
cmpapprvlen number;
v_actual_ug_length number;
v_actual_ar_length number;

vcircle nvarchar2 (100);
vMpname nvarchar2 (100);
vMpcode nvarchar2 (100);
vspanlinkid nvarchar2(100);
vspantype nvarchar2(100);
vnelength number;

BEGIN

 execute immediate 'delete from APP_FIBERINV.TBL_FIBER_INV_SIGN_OFF_SHEET';

for cur_r in (
                   SELECT CIRCLE, 
                          regexp_substr(MP,'[^/]+',1,1)MPNAME,
                          regexp_substr(MP,'[^/]+',1,2)MPCODE,
                          SPAN_LINK_ID,
                          SPAN_TYPE,
                          NE_LENGTH,
                          ROUTE_APPROVED_BY_CMM AS CMM_APPROVED_LENGTH
                          FROM APP_FIBERINV.TBL_FIBER_INV_CMP_REPORT_MV 
                          where (CMM_APPROVED_DATE IS NOT NULL OR ROUTE_APPROVED_BY_CMM > 0 OR JOB_PROGRESS_FLAG = 1)
              )
              
loop

begin
      vcircle := cur_r.CIRCLE; vMpname := cur_r.MPNAME; vMpcode := cur_r.MPCODE; vspanlinkid := cur_r.SPAN_LINK_ID; vspantype := cur_r.SPAN_TYPE; vnelength := cur_r.NE_LENGTH;
      cmpapprvlen:=cur_r.CMM_APPROVED_LENGTH;
          IF vspantype = 'INTERCITY' AND length(vspanlinkid) = 21              
             THEN             
             BEGIN
             --DBMS_OUTPUT.PUT_LINE('Start '||vspantype||vspanlinkid); 
             SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH, 
                    ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' AND RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL  THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
                   ,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH
                  
                  into v_ne_length, v_ug_length, v_ar_length
                   FROM ne.mv_span@db_link_ne_viewer
                   WHERE RJ_SPAN_ID = vspanlinkid
                  AND (RJ_INTRACITY_LINK_ID NOT LIKE ('%\_9%') ESCAPE '\' OR RJ_INTRACITY_LINK_ID IS NULL) 
                   and  INVENTORY_STATUS_CODE = 'IPL'
                   and  RJ_MAINTENANCE_ZONE_CODE = vMpcode;            
                  
                   if(v_ne_length > 0 or cmpapprvlen > 0) then 
                    vper:= (v_ug_length / v_ne_length)*100;  
                    
                    v_actual_ug_length:= (cmpapprvlen*vper)/100;
                    v_actual_ar_length:= cmpapprvlen-v_actual_ug_length;                 --
                    else
                     v_actual_ug_length:= cmpapprvlen;
                     v_actual_ar_length:= 0;   
                   end if;
                 DBMS_OUTPUT.PUT_LINE('CALC '||v_actual_ug_length||v_actual_ar_length); 
    
                 INSERT INTO APP_FIBERINV.TBL_FIBER_INV_SIGN_OFF_SHEET (FSA_UG, FSA_AERIAL, CIRCLE, MAINTENANCEZONENAME, MAINTENANCEZONECODE, SPAN_LINK_ID, SPAN_TYPE,NE_LENGTH, HOTOOFFERDATE)
                           VALUES (v_actual_ug_length, v_actual_ar_length, vcircle, vMpname, vMpcode, vspanlinkid, vspantype,vnelength, SYSDATE);

                COMMIT;
                DBMS_OUTPUT.PUT_LINE('INSERTED'); 
                EXCEPTION WHEN NO_DATA_FOUND THEN  
                  v_actual_ug_length:=cmpapprvlen;
                  v_actual_ar_length:=0;
                  v_ne_length:=0; v_ug_length:=0; v_ar_length:=0;

                WHEN OTHERS THEN    
                    VSQLERRCODE:= SUBSTR(SQLCODE, 1, 5);
                    VSQLERR:= SUBSTR(SQLERRM, 1, 200);
                     INSERT INTO SIGNOFF_SHEET_ERR (err_code,err_msg,err_date) VALUES ('db:scheduler',VSQLERRCODE||':'||VSQLERR,SYSDATE);
                     COMMIT; 
                  --ROLLBACK;
                   
             END;
             
          ELSIF vspantype = 'INTERCITY' AND length(vspanlinkid) = 9             
             THEN
             BEGIN
                DBMS_OUTPUT.PUT_LINE('Start '||vspantype||vspanlinkid); 
                SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH, 
                     ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
                   ,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH
                  into v_ne_length, v_ug_length, v_ar_length
                   FROM ne.mv_span@db_link_ne_viewer
                   WHERE RJ_INTRACITY_LINK_ID = vspanlinkid
                   and  INVENTORY_STATUS_CODE = 'IPL'
                   and  RJ_MAINTENANCE_ZONE_CODE = vMpcode; 
                    
                   
                  if(v_ne_length > 0  or cmpapprvlen > 0) then 
                    vper:= (v_ug_length/v_ne_length)*100;  
                    
                    v_actual_ug_length:= (cmpapprvlen*vper)/100;
                    v_actual_ar_length:= cmpapprvlen-v_actual_ug_length;                 --
                    else
                     v_actual_ug_length:= cmpapprvlen;
                     v_actual_ar_length:= 0;   
                   end if;
                  DBMS_OUTPUT.PUT_LINE('CALC '||v_actual_ug_length||v_actual_ar_length); 
                    
                 INSERT INTO APP_FIBERINV.TBL_FIBER_INV_SIGN_OFF_SHEET (FSA_UG, FSA_AERIAL, CIRCLE, MAINTENANCEZONENAME, MAINTENANCEZONECODE, SPAN_LINK_ID, SPAN_TYPE,NE_LENGTH, HOTOOFFERDATE)
                           VALUES (v_actual_ug_length, v_actual_ar_length, vcircle, vMpname, vMpcode, vspanlinkid, vspantype,vnelength, SYSDATE);

                COMMIT; 
                DBMS_OUTPUT.PUT_LINE('INSERTED'); 
                EXCEPTION WHEN NO_DATA_FOUND THEN  
                  v_actual_ug_length:=cmpapprvlen;
                  v_actual_ar_length:=0;
                  v_ne_length:=0; v_ug_length:=0; v_ar_length:=0;

                WHEN OTHERS THEN     
                    VSQLERRCODE:= SUBSTR(SQLCODE, 1, 5);
                    VSQLERR:= SUBSTR(SQLERRM, 1, 200);
                     INSERT INTO SIGNOFF_SHEET_ERR (err_code,err_msg,err_date) VALUES ('db:scheduler',VSQLERRCODE||':'||VSQLERR,SYSDATE);
                     COMMIT;   
                
             END;
             
          ELSIF (vspantype = 'INTRACITY' OR vspantype = 'ENTERPRISE')
             THEN
             BEGIN
                DBMS_OUTPUT.PUT_LINE('Start '||vspantype||vspanlinkid); 
                SELECT ROUND(SUM(NVL(CALCULATED_LENGTH,0)/1000),4) AS NE_LENGTH, 
                    ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY IS  NULL OR RJ_CONSTRUCTION_METHODOLOGY NOT LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS UG_LENGTH
                   ,ROUND(SUM(CASE WHEN RJ_CONSTRUCTION_METHODOLOGY LIKE '%AERIAL%' OR RJ_CONSTRUCTION_METHODOLOGY LIKE '%CLAMP%' THEN NVL(CALCULATED_LENGTH,0) ELSE 0 END)/1000,4) AS AR_LENGTH
                  into v_ne_length, v_ug_length, v_ar_length
                   FROM ne.mv_span@db_link_ne_viewer
                   WHERE RJ_INTRACITY_LINK_ID = vspanlinkid
                    and  INVENTORY_STATUS_CODE = 'IPL'
                   and  RJ_MAINTENANCE_ZONE_CODE = vMpcode; 
                   
                  if(v_ne_length > 0  or cmpapprvlen > 0) then 
                    vper:= (v_ug_length/v_ne_length)*100;  
                    
                    v_actual_ug_length:= (cmpapprvlen*vper)/100;
                    v_actual_ar_length:= cmpapprvlen-v_actual_ug_length;                 --
                    else
                     v_actual_ug_length:= cmpapprvlen;
                     v_actual_ar_length:= 0;   
                   end if;

                   DBMS_OUTPUT.PUT_LINE('CALC '||v_actual_ug_length||v_actual_ar_length); 
                  INSERT INTO APP_FIBERINV.TBL_FIBER_INV_SIGN_OFF_SHEET (FSA_UG, FSA_AERIAL, CIRCLE, MAINTENANCEZONENAME, MAINTENANCEZONECODE, SPAN_LINK_ID, SPAN_TYPE,NE_LENGTH, HOTOOFFERDATE)
                   VALUES (v_actual_ug_length, v_actual_ar_length, vcircle, vMpname, vMpcode, vspanlinkid, vspantype,vnelength, SYSDATE);
                  COMMIT; 
                  DBMS_OUTPUT.PUT_LINE('INSERTED'); 
                  EXCEPTION WHEN NO_DATA_FOUND THEN  
                      v_actual_ug_length:=cmpapprvlen;
                      v_actual_ar_length:=0;
                      v_ne_length:=0; v_ug_length:=0; v_ar_length:=0;

                  WHEN OTHERS THEN     
                     VSQLERRCODE:= SUBSTR(SQLCODE, 1, 5);
                     VSQLERR:= SUBSTR(SQLERRM, 1, 200);
                     INSERT INTO SIGNOFF_SHEET_ERR (err_code,err_msg,err_date) VALUES ('db:scheduler',VSQLERRCODE||':'||VSQLERR,SYSDATE);
                     COMMIT; 
             END;
        end if;
        
     EXCEPTION WHEN OTHERS THEN    
                    VSQLERRCODE:= SUBSTR(SQLCODE, 1, 5);
                    VSQLERR:= SUBSTR(SQLERRM, 1, 200);
                     INSERT INTO SIGNOFF_SHEET_ERR (err_code,err_msg,err_date) VALUES ('db:scheduler',VSQLERRCODE||':'||VSQLERR,SYSDATE);
                     COMMIT; 
                     
end;           


end loop;



END FIBER_SIGNOFF_UGAR_UPD;

TBL_SIGNOFF_ACT_CNTtable的描述也是

Name          Null? Type            
------------- ----- --------------- 
ERROR_MESSAGE       NVARCHAR2(2000) 
INSERT_COUNT        NUMBER 

对于COUNT,您可以使用下面的方法。

V_NUMBERVARIABLE:= SQL%ROWCOUNT;

EXCEPTION 部分之前的过程结束时。您可以使用以下 INSERT INTO 语法。

CREATE TABLE TBL_SIGNOFF_ACT_CNT
(
   ERROR_MESSAGE   NVARCHAR2 (2000),
   INSERT_COUNT    NUMBER
);


DECLARE
   V_ROWCNT   NUMBER;
BEGIN
   V_ROWCNT := SQL%ROWCOUNT;

   INSERT INTO TBL_SIGNOFF_ACT_CNT
        VALUES ('Proc started: ' || TO_CHAR (SYSDATE, 'YYYYMMDD HH24:MI:SS'), V_ROWCNT);

   COMMIT;
   
   ...
   ...
   
   V_ROWCNT := SQL%ROWCOUNT;

   INSERT INTO TBL_SIGNOFF_ACT_CNT
        VALUES ('Proc end: ' || TO_CHAR (SYSDATE, 'YYYYMMDD HH24:MI:SS'), V_ROWCNT);

   COMMIT;
END;

Here is a link of my solution:

And this one is your solution updated: