Oracle: Как я преобразовываю шестнадцатеричное число в десятичное число в Oracle SQL?

Этот поток заставляет меня съежиться, потому что уже было "решение, отправленное", и это, во всех отношениях, неправильно. Давайте перечислим:

  1. Определяет, действительно дороги в PHP. Вы можете взгляд это или тестировать его сами, но единственный эффективный способ определить глобальную константу в PHP через расширение. (Константы класса являются на самом деле довольно достойной мудрой производительностью, но это - спорный вопрос, из-за 2)

  2. , Если Вы используете require_once() соответственно, то есть, для включения классов, Вам даже не нужно определение; просто проверьте если class_exists('Classname'). Если файл, который Вы включаете, содержит код, т.е. Вы используете его процедурным способом, нет абсолютно никакой причины, которая require_once() должна быть необходимой для Вас; каждый раз, когда Вы включаете файл, Вы предполагаете для создания вызова подпрограммы.

Поэтому некоторое время, много людей действительно использовало class_exists() метод для их включений. Мне не нравится он, потому что это - fugly, но у них было серьезное основание к: require_once() было довольно неэффективно перед некоторыми более свежими версиями PHP. Но это было зафиксировано, и это - моя конкуренция, что дополнительный байт-код, который необходимо было бы скомпилировать для условного выражения и дополнительного вызова метода, безусловно перевесит любую внутреннюю проверку хеш-таблицы.

Теперь, подтверждение: этот материал жесток для тестирования на, потому что он составляет так мало времени выполнения.

Вот вопрос, о котором необходимо думать: включает, как правило, являются дорогими в PHP, потому что каждый раз интерпретатор поражает тот, который это должно переключить назад в режим синтаксического анализа, генерировать коды операций, и затем перейти назад. Если у Вас есть 100 +, включает, это определенно окажет влияние производительности. Причина, почему использование или не использование require_once являются таким важным вопросом, состоит в том, потому что это делает жизнь трудной для кэшей кода операции. объяснение этого может быть найдено здесь, но к чему это сводится, то, что:

  • , Если в течение времени синтаксического анализа, Вы знаете точно, что включает файлы, в которых Вы будете нуждаться для всей жизни запроса, require(), те в самом начале и кэше кода операции обработают все остальное для Вас.

  • , Если Вы не выполняете кэш кода операции, Вы находитесь в твердом месте. Встраивание всего Вашего включает в один файл (не делайте этого во время разработки, только в производстве), может, конечно, помочь проанализировать время, но это - боль, чтобы сделать, и также, необходимо знать точно, что Вы будете включать во время запроса.

  • Автозагрузка является очень удобной, но медленной по причине, что логика автозагрузки должна быть выполнена каждый раз, когда включать сделано. На практике я нашел, что автозагрузка нескольких специализированных файлов для одного запроса не вызывает слишком много проблемы, но Вы не должны автоматически загружать все файлы, в которых Вы будете нуждаться.

  • , Если Вы имеете, возможно, 10, включает (это очень задняя часть вычисления конверта), весь этот wanking не стоит того: просто оптимизируйте свои запросы базы данных или что-то.

22
задан a_horse_with_no_name 30 August 2019 в 08:08
поделиться

4 ответа

Если вы используете 8.1.5 и выше, вы можете использовать:

Для преобразования из шестнадцатеричного в десятичное:

select to_number('AA', 'xx') from dual;     

Чтобы преобразовать десятичное число в шестнадцатеричное:

select to_char(111, 'xxxx') from dual;
36
ответ дан 29 November 2019 в 04:02
поделиться

Если вам нужно генерировать пограничные документы,

11
ответ дан 29 November 2019 в 04:02
поделиться

FTA: Oracle to Decimal :

CREATE OR REPLACE FUNCTION hex2dec (hexnum IN CHAR) RETURN NUMBER IS
  i                 NUMBER;
  digits            NUMBER;
  result            NUMBER := 0;
  current_digit     CHAR(1);
  current_digit_dec NUMBER;
BEGIN
  digits := LENGTH(hexnum);
  FOR i IN 1..digits LOOP
     current_digit := SUBSTR(hexnum, i, 1);
     IF current_digit IN ('A','B','C','D','E','F') THEN
        current_digit_dec := ASCII(current_digit) - ASCII('A') + 10;
     ELSE
        current_digit_dec := TO_NUMBER(current_digit);
     END IF;
     result := (result * 16) + current_digit_dec;
  END LOOP;
  RETURN result;
END hex2dec;
/
show errors

CREATE OR REPLACE FUNCTION num2hex (N IN NUMBER) RETURN VARCHAR2 IS
  H  VARCHAR2(64) :='';
  N2 INTEGER      := N;
BEGIN
  LOOP
     SELECT RAWTOHEX(CHR(N2))||H
     INTO   H
     FROM   dual;

     N2 := TRUNC(N2 / 256);
     EXIT WHEN N2=0;
  END LOOP;
  RETURN H;
END num2hex;
/
show errors
3
ответ дан 29 November 2019 в 04:02
поделиться
​​

Начиная с Oracle8i, TO_CHAR и TO_NUMBER функции могут обрабатывать преобразования из основания 10 (десятичного) в основание 16 (шестнадцатеричное) и обратно:

SQL> select to_char(123,'XX') to_hex, 
2    to_number('7B','XX') from_hex   
3   from dual  
4  /   
TO_     FROM_HEX
------  -----------------
7B     123

источник

5
ответ дан 29 November 2019 в 04:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: