1. SQL / Говнокод #9684

    −124

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    function encode(p_string VARCHAR2) RETURN VARCHAR2 DETERMINISTIC AS
       begin
         RETURN REPLACE(
                  REPLACE(
                    REPLACE(
                      REPLACE(
                        REPLACE(
                          utl_encode.text_encode(p_string, NULL, utl_encode.base64),
                          '+', '_p'),
                        '/', '_s'),
                      '=', '_e'),
                    CHR(10)),
                  CHR(13));
       end encode;
    
       function decode(p_string VARCHAR2) RETURN VARCHAR2 DETERMINISTIC AS
       begin
         RETURN utl_encode.text_decode(
                  REPLACE(
                    REPLACE(
                      REPLACE(p_string, '_p', '+'),
                      '_s', '/'),
                    '_e', '='),
                  NULL, utl_encode.base64);
       end decode;

    Убираем и возвращаем нецифробуквенные символы из/в BASE64

    Запостил: wecanstoptrain, 15 Марта 2012

    Комментарии (15) RSS

    • Репласе,
      Репласе,
      Репласе,
      Репласе
      горячей крови!
      Ответить
    • > DETERMINISTIC

      Это что за слово? Это типа что функция чистая?
      Ответить
      • то, что функция однозначно зависит только от аргументов и в случае чего ее можно закешировать, а не вычислять заново.
        Ответить
        • т.е. Тарас угадал
          Ответить
          • да
            Ответить
            • А константы при компиляции для такой вычисляются?
              Ответить
              • нет, процесс компиляции сводится к преобразованию в промежуточное представление (с разрешением зависимостей, мелкими оптимизациями).
                а дальше в рантайме интерпретатор работает.

                код такого вида:
                function a(gg varchar2) return number deterministic is
                begin
                 return 1 + 2;
                end;

                при "компиляции" будет сведен к

                function a(gg varchar2) return number deterministic is
                begin
                 return 3;
                end;

                а дальше уже дело интерпретатора как он будет его вызывать (если есть в кэше, то берем значение из него, иначе вычисляем и закидываем к кэш).

                но в константу вида a := 3; никак не будет преобразовано
                Ответить
                • а мне вот что интересно - майкрософт взорвется, если я напишу deterministic, а верну RAND?
                  Ответить
                  • Microsoft'у пофиг, это - Oracle.
                    У меня есть подозрение, что функа с рандом просто не скомпилится. Жаль Ораклы сейчас под рукой нет.
                    Тот же эффект должен быть с использованием sysdate.
                    Ответить
                    • скомпилится.
                      Насколько мне позволяет судить опыт, кеширование происходит при выполнении запросов. и в этом случае должно закешироваться. при случае проверю.
                      Ответить
                  • Оно будет работать вот так:
                    http://imgs.xkcd.com/comics/random_number.png
                    Ответить
                    • в пределах одной сессии, одного exec'а при условии, что значение не из кеша другими deterministic-функциями.
                      Ответить

    Добавить комментарий