0

開始日から終了日までの残高を更新する手順があります。 また、挿入するレコード数のトラックを保持します。 dbms_output.put_lineを使用して挿入されたレコードの数を取得していますが、実行が完了してカウントの出力が表示されている間は出力がありません。今私は、この表のavail_balに挿入された行数を取得するには、この手順からtotalCountプロパティを印刷しようとしていますデータベースにoracle関数によって挿入された行のトラックを保持する方法はありますか?

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; 

:次のように手順のコードがあります。しかし、出力を得ることはありません。 助けてくださいありがとうございました

答えて

1

これは、dbms_outputが動作する方法で、実行完了後にすべての出力を表示するので、リアルタイムで監視することはできません。

このリアルタイムの進行状況の監視が必要な場合は、自律型トランザクションを使用してメッセージを特別なテーブルに挿入し、別のセッションのを使用することができます。そのテーブルの内容を表示できます。プロセスはまだ実行中です。このような手順の

例:

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

トニーはすでに答えたように:あなたはDBMS_OUTPUTの動作を変更することはできません。

ストアドプロシージャの外部へ進行シグナリングの推奨される方法は、あなたも外側と内側のループに対して別々の進捗インジケータを管理することができるv$session_longops

の情報を管理するdbms_application_infoパッケージを使用することです。 v$session_longopsは、時間の経過とともに平均所要時間に基づいてプロセスがかかる時間の見積もりを表示します。これらの推定値は、各(報告された)ステップの実行時間がかなり一定であればかなり正確です。

あなたはこのようなあなたの機能を高めることができます。

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; 
/

は、より多くの詳細については、マニュアルを参照してください:
https://docs.oracle.com/database/121/ARPLS/d_appinf.htm#ARPLS003

関連する問題