0

eingefügten Ich habe eine Prozedur, um die Balance vom Startdatum bis zum Enddatum zu aktualisieren und auch möchte ich eine Spur der Anzahl der Datensätze, die eingefügt werden. Ich verwende dbms_output.put_line, um die Anzahl der Datensätze zu erhalten, die eingefügt werden, aber es gibt keine Ausgabe, wenn die Ausführung abgeschlossen ist, wird die Ausgabe der Zählung angezeigt. Der Code des Verfahrens ist wie folgt:Gibt es eine Möglichkeit, eine Spur von Zeilen von einer Oracle-Funktion in der Datenbank

create or replace function updatebal(start_date IN DATE, end_date IN DATE) 
RETURN NUMBER 
IS 
difference number; 
curr_r number; 
BEGIN 
difference := end_date - start_date; 
curr_r := 0; 
while curr_r <= difference LOOP 
curr_r := curr_r + 10; 
for curr_in in 1..10 LOOP 
date_value := date_value +1 ; 
insertAvailBal(date_value); 
commit; 
select count(*) into totalCount from avail_bal; 
dbms_output.put_line('total count' || totalCount); 
end loop; 
END LOOP; 
RETURN 1; 
END; 

Jetzt versuche ich, die totalcount von diesem Verfahren zu drucken, die Anzahl der Zeilen in dieser Tabelle avail_bal eingefügt zu bekommen. Aber keine Ausgabe bekommen. Bitte helfen Sie mir, Danke im Voraus

Antwort

1

So funktioniert dbms_output, es zeigt alle seine Ausgabe nach dem Lauf abgeschlossen ist, können Sie nicht in Echtzeit überwachen.

Wenn Sie wirklich diese Echtzeit-Überwachung des Fortschritts benötigen, können Sie eine Prozedur mit einer autonomen Transaktion verwenden könnten die Nachrichten in eine spezielle Tabelle einzufügen, und dann aus einer anderen Sitzung Sie den Inhalt der Tabelle, während sehen konnte Der Prozess läuft noch.

Beispiel eines solchen Verfahrens:

procedure log_message (p_message varchar2) is 
    pragma autonomous_transaction; 
begin 
    insert into message_table (message) values (p_message); 
    commit; 
end; 
2

Wie Tony bereits beantwortet hat: Sie kann nicht das Verhalten von dbms_output ändern.

Der empfohlene Weg Fortschritt der Außenseite einer gespeicherten Prozedur der Signalisierung ist das dbms_application_info Paket verwenden, um Informationen in v$session_longops

Sie sogar separate Fortschrittsindikatoren für die äußere und die innere Schleife verwalten zu verwalten. zeigt sogar eine Schätzung, wie lange der Prozess dauert, basierend auf der durchschnittlichen Dauer im Laufe der Zeit. Diese Schätzung ist ziemlich genau, wenn die Laufzeit für jeden (gemeldeten) Schritt ziemlich konstant ist.

Sie können Ihre Funktion wie folgt verbessern:

create or replace function updatebal(start_date IN DATE, end_date IN DATE) 
    RETURN NUMBER 
IS 
    difference number; 
    curr_r number; 
    main_index binary_integer; 
    sub_index binary_integer; 
    main_slno binary_integer; 
    sub_slno binary_integer; 

BEGIN 
    difference := end_date - start_date; 
    curr_r := 0; 

    -- initialize the module information 
    dbms_application_info.set_module('updatebal', 'Calculate Balance'); 

    -- initialize two different "handles" for the inner and outer loop 
    main_index := dbms_application_info.set_session_longops_nohint; 
    sub_index := dbms_application_info.set_session_longops_nohint; 

    while curr_r <= difference LOOP 
    curr_r := curr_r + 10; 

    -- report each outer step 
    dbms_application_info.set_session_longops(rindex => main_index, 
      slno => main_slno, 
      op_name => 'main loop', 
      sofar => curr_r, 
      totalwork => difference); 

    for curr_in in 1..10 LOOP 

     date_value := date_value +1; 

     insertAvailBal(date_value); 
     commit; 

     select count(*) into totalCount from avail_bal; 

     -- report each inner step with the totalcount 
     dbms_application_info.set_session_longops(
         rindex => sub_index, 
         slno => sub_slno, 
         op_name => 'Sub Loop, totalcount'||totalcount, 
         sofar => curr_in, totalwork => 10); 

    end loop; 
    END LOOP; 

    RETURN 1; 

    dbms_application_info.set_module(null,null); 
END; 
/

siehe Handbuch für weitere Informationen:
https://docs.oracle.com/database/121/ARPLS/d_appinf.htm#ARPLS003

Verwandte Themen