2016-05-10 6 views
0

FE80:0000:0000:0000:0202:B3FF:FE1E:8329/120のようなipv6の範囲を処理し、テーブルを使用してください。PL/SQLブロック。サブネットの値が与えられたときにipv6の範囲を効率的に作成する

現在の実装では、アドレスをバイナリに変換して、whileループの最小アドレスと最大アドレスを繰り返してテーブルに挿入しています。

それは小さい範囲については正常に動作しますが、大規模な範囲を処理するための効率的な方法が必要です(フェッチ使用して一括挿入の行に何か)

while ipv6_counter_iterator <= ipv6_counter_max 
      loop 
     ipv6_value_intermediate := nvl(lpad(dec2bin(ipv6_counter_iterator), 
              ipv6_counter, 
              '0'), 
             ''); 
     ipv6_binary_value  := substr(ipv6_addr, 1, ipv6_range) || 
            ipv6_value_intermediate; 
     ipv6_address_value  := Binary_to_ipv6(ipv6_binary_value); 
     ipv6_counter_iterator := ipv6_counter_iterator + 1; 
     insert into sdb_ip_range_values 
      (ip_address, session_id) 
     values 
      (ipv6_address_value, session); 
     end loop; 
    END IF; 
+0

実際に行っていることを再考する必要があります。範囲の開始と終了を保存するだけで十分であり、すべてのアドレスを保存するよりもパフォーマンスが向上するはずです。 – Peter

+0

はい、私のプロジェクトでは、これらのアドレスに接続して情報を処理する必要があるため、範囲内のすべてのアドレスをテーブルに保存することが不可欠です –

答えて

0

あなたはかどうかを確認するストアドプロシージャを使用して考えなければなりません指定されたipv6アドレスはブロック内にあります。

そうするための2つの方法があります:

  • は、IPv6アドレスと範囲は、バイナリにし、そのためのサブネットマスクを構築します。次に、ipv6アドレスと範囲のバイナリANDを比較します。それは同じでなければなりません。
  • もう1つの方法は、アドレスが開始アドレスより大きくかつ等しいか、終了アドレス以下であるかどうかのテストです。
関連する問題