10

shiftPL/SQLに代替演算子があるかどうか? 関数はありますが、 binary_integer型の引数bitandのみを受け入れます。

非常に長い数値 (おそらく行に設定されている) の下位/上位ビットを確認する必要がある場合はどうすればよいですか?

と演算子Cがあります。PL/SQLでそれらを実現するにはどうすればよいですか?<<>>

4

3 に答える 3

9

次の答えはエンディアンにとらわれず、私の言い回しはリトルエンディアン形式に基づいています...

引数を2でxの累乗で乗算(左シフト)または除算(右シフト)するだけでビットをシフトできます。ここで、xはシフトするビット数です。たとえば、数値の下位バイト(255:11111111)を16ビット左にシフトする必要がある場合は、次の操作を実行します。

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

逆に、値16711680を16ビット右にシフトする場合は、次のように実行します。

select 16711680 / power(2,16) from dual;
-- the result will be (255:11111111)
于 2009-06-30T19:53:50.703 に答える
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 がサポートされていないためです。

于 2009-04-22T11:16:31.260 に答える
3

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

トム・カイトのパッケージをベースにして拡張します。

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> /
于 2009-04-22T11:56:11.383 に答える