1

最初に関数を定義することなく、Oracle 10g で 10 進数を 2 進数に、または 2 進数を 10 進数に変換する方法はありますか? データベースへのアクセスが制限されており (SELECT のみ)、オンラインで見つけたすべての解決策には が含まれているようで、うまくいきCREATE FUNCTIONません。

4

5 に答える 5

2

16 進数で十分な場合は、TO_CHAR と TO_NUMBER を使用できます。

SQL> select to_char(31, '0x') from dual;

TO_
---
 1f

SQL> select to_number('1f', '0x') from dual;

TO_NUMBER('1F','0X')
--------------------
                  31

RAWTOHEX()およびHEXTORAW()関数を使用して、16 進から 2 進への移行も行うことができる場合があります。

于 2010-06-21T15:52:20.173 に答える
1

危険な SQL パズルを専門とする Frank Zhou は、この問題に対する純粋な SQL ソリューションを考案しました。彼の OraQA サイトで見つけることができます。しかし、注意してください。それは本当に危険です。

アップデート

OraQA への元のリンクは壊れています。Wayback Machine のアーカイブ バージョンはこちらにあります

于 2010-06-21T19:43:54.333 に答える
0

10 進数から 2 進数への大まかな、しかし簡単な解決策:

SELECT REPLACE
       (REPLACE
        (REPLACE
         (REPLACE
          (REPLACE
           (REPLACE
            (REPLACE
             (REPLACE
              (REPLACE
               (REPLACE
                (REPLACE
                 (REPLACE
                  (REPLACE
                   (REPLACE
                    (REPLACE
                     (REPLACE
                      (TO_CHAR (100,'FMxxx'),
                       '0','0000'),
                      '1','0001'),
                     '2','0010'),
                    '3','0011'),
                   '4','0100'),   
                  '5','0101'),
                 '6','0110'),
                '7','0111'),
               '8','1000'),
              '9','1001'),
             'A','1010'),
            'B','1011'),
           'C','1100'),
          'D','1101'),
         'E','1110'),
        'F','1111')
  FROM DUAL;

2 進数から 10 進数への変換は、よりトリッキーになります。connect byを使用して、文字列を 4 文字のセグメントに分割し、それらを同様の方法で変換してから、それらを連結して戻すことができるかもしれませんが(?connect byを使用して 1 秒SYS_CONNECT_BY_PATH)、今夜解決するには少し面倒です。


考え直して、2進数から10進数への解決策を次に示します(私はconnect by問題が大好きです):

SELECT     TO_NUMBER(
               REPLACE (
                   SYS_CONNECT_BY_PATH (octet, '!'), 
                   '!', ''),
               'xxxxxx')
      FROM (SELECT     CASE SUBSTR
                                (LPAD (a,
                                       CEIL (LENGTH(a)/4)*4, '0'),
                                 (LEVEL-1)*4+1, 4)
                          WHEN '0000'
                             THEN '0'
                          WHEN '0001'
                             THEN '1'
                          WHEN '0010'
                             THEN '2'
                          WHEN '0011'
                             THEN '3'
                          WHEN '0100'
                             THEN '4'
                          WHEN '0101'
                             THEN '5'
                          WHEN '0110'
                             THEN '6'
                          WHEN '0111'
                             THEN '7'
                          WHEN '1000'
                             THEN '8'
                          WHEN '1001'
                             THEN '9'
                          WHEN '1010'
                             THEN 'A'
                          WHEN '1011'
                             THEN 'B'
                          WHEN '1100'
                             THEN 'C'
                          WHEN '1101'
                             THEN 'D'
                          WHEN '1110'
                             THEN 'E'
                          WHEN '1111'
                             THEN 'F'
                       END AS octet,
                       LEVEL AS seq,
                       CEIL (LENGTH(a)/4) AS max_level
                  FROM (SELECT '101010101010101010' AS a
                          FROM DUAL)
            CONNECT BY LEVEL <= CEIL(LENGTH(a)/4))
     WHERE LEVEL = max_level
CONNECT BY PRIOR seq = seq-1

このソリューションは、現在書かれているように、一度に 1 つの行に対してのみ機能します。複数の行で機能させるには、何らかの一意の識別子を最も外側に追加する必要がありますconnect by

于 2010-06-21T22:38:19.543 に答える
0

次のような SQLPlus スクリプトで PL/SQL を実行できますか。

declare
    procedure bin_2_dec(/*some parameters here*/) is
    begin
        /*do computation and print result*/
    end;
begin    
    bin_2_dec('11110000');
end;
/

よくわかりませんが、関数がデータベースに永続的に作成されるとは思いません。スクリプトの実行中に一時的にしか存在しないと思うので、これでうまくいくかもしれません。試してみる価値はありますよね?;)

または、それがうまくいかない場合はSELECT ... from dual、変換することもできますが、それはおそらく厄介で、桁数がわかっている場合にのみ機能します-多分(数分できれば一緒に投げてみます.可能であれば)。

于 2010-06-21T15:46:57.860 に答える