2009-04-22 25 views
7

PL/SQLにshift演算子の代替があるかどうかを確認します。 bitand関数がありますが、それはbinary_integer型引数のみを受け入れます。PL/SQLのシフト演算子

本当に長い番号の下位/上位ビットをチェックする必要がある場合はどうすればよいですか(おそらく、その行に設定されています)。

Cには、<<>>の演算子があります。私はPL/SQLでどのようにそれらを実現できますか?

答えて

3

これは私自身のLPAD/RPADソリューションです。

私はTom Kyte packageをベースにして展開します。

create or replace function bin_shift_right 
( p_bin in varchar2, 
    p_shift in number default null) return varchar2 
is 
    l_len number; 
    l_shift number; 
begin 
    l_shift := nvl(p_shift, 1); 
    l_len := length(p_bin); 
    if (l_len <= 0) then 
     return null; 
    end if; 
    if (l_shift > l_len) then 
     l_shift := l_len; 
    end if; 

    return lpad(substr(p_bin, 1, l_len - l_shift), l_len, '0'); 
end bin_shift_right; 

create or replace function shright 
( p_num in number, 
    p_shift in number default null) return number 
is 
begin 
    if (trunc(p_num) <> p_num OR p_num < 0) then 
     raise PROGRAM_ERROR; 
    end if; 
    return nvl(to_dec(bin_shift_right(to_bin(p_num), p_shift), 2), 0); 
end shright; 
/

やテスト

SQL> 
SQL> select shright(123) from dual; 

SHRIGHT(123) 
------------ 
      61 

SQL> 
SQL> select shright(123, 2) from dual; 

SHRIGHT(123,2) 
-------------- 
      30 

SQL> 
SQL> select shright(123, 10) from dual; 

SHRIGHT(123,10) 
--------------- 


SQL>/
5

Oracleバージョン8以降、データベースにJavaコードを使用することは可能です。 PL/SQLでは、Javaコードのラッパーを定義できます。例えば

PACKAGE BODY JAVA_CODE 
IS 
    function bitshift_left(x in number, 
         n in number) return number 
    is language java name 'com.foo.Bitshift(java.lang.Integer, 
              java.lang.Integer) return java.lang.Integer'; 
END JAVA_CODE; 

Javaコードでは、シフト演算子を使用できます。少し不器用ですが、それはこのように動作することができます。

悲しいことに、これはOracle XEでは不可能です。その「無料版」ではJavaのサポートがないためです。

+0

おかげで、ソリューション、ありがとう。 私はpl/SQLの方法を見つける、私は数分以内に投稿する – drnk

6

次の答えはとらわれないエンディアンされていないと私の文言は、リトルエンディアンフォーマットに基づいています...

あなたは、単に(シフトを乗算ビットをシフトすることができます引数を2でxのべき乗に分割する(右にシフトする)。ここで、xはシフトするビットの数である。私は、値16711680をシフトしたい場合は、逆に

select 255 * power(2,16) from dual; 
-- the result will be (16711680:111111110000000000000000) 

:例えば、私は数(255:11111111)の下位バイトシフトする必要がある場合は、左に16ビットを、私は、次の操作を実行します右に16ビット私は以下を実行するでしょう:

select 16711680/power(2,16) from dual; 
-- the result will be (255:11111111) 
関連する問題