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

    −166

    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
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    CREATE OR REPLACE FUNCTION "GET_SOTR_FULL_NAME" (sotr_id in number)
      RETURN  varchar2 IS
    cursor surname (sotr_id number)
     is
      select fc_fam from tsotr
      where tsotr.fk_id=sotr_id;
    cursor name (sotr_id number)
     is
      select fc_name from tsotr
      where tsotr.fk_id=sotr_id;
    cursor patronym (sotr_id number)
     is
      select fc_otch from tsotr
      where tsotr.fk_id=sotr_id;
     fio   varchar2(90);
     fam   varchar2(30);
     im    varchar2(30);
     otch  varchar2(30);
    BEGIN
      open surname (sotr_id);
       fetch surname into fam;
      close surname;
      open name (sotr_id);
       fetch name into im;
      close name;
      open patronym (sotr_id);
       fetch patronym into otch;
      close patronym;
       fio:=fam||' '||im||' '||otch;
      return fio;
    END;

    По ИД сотрудника получаем его ФИО

    Запостил: Dimm_J, 23 Июня 2014

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

    • ФИО должно быть 92 символа... Это человек так с джоинами боролся?
      Ответить
      • Фамилия - 30, имя - 30, отчество - 30. Итого - 90. Все норм.
        Ответить
        • причем, латинских, ога
          Ответить
          • Rhoshandiatellyneshiaunneveshenk Koyaanisquatsiuth Williams

            P.S. Почему латинских?
            P.P.S. 32 символа, имя не влезло.
            Ответить
            • потому что varchar2(30) это в точности varchar2(30 byte)
              альтернативы:
              nvarchar2(30) - строго юникодная строка
              или varchar2(30 char) - 30 символов в установленной кодировке БД (обычно никто не играет с огнем и ставит utf)
              Ответить
              • > в точности varchar2(30 byte)
                селф-фикс: регулируется параметром NLS_LENGTH_SEMANTICS, который по умолчанию byte
                Ответить
              • Бля, так это еще и байты...

                Кстати, а почему он varchar2? Первая версия варчара оказалась неудачной?
                Ответить
                • да
                  к слову, varchar давно синоним для varchar2, но все как-то не осмеливаются перейти на человеческое название
                  и сам оракл почему-то не советует

                  The VARCHAR datatype is synonymous with the VARCHAR2 datatype. To avoid possible changes in behavior, always use the VARCHAR2 datatype to store variable-length character strings.
                  Ответить
                  • Эх, а в слонёнке с этим всё просто: SQL defines two primary character types: character varying(n) and character(n), where n is a positive integer. Both of these types can store strings up to n characters (not bytes) in length.
                    Ответить
                  • мне человек, имеющий сертификаты по ораклу, на этот вопрос отвечал, что они накосячили с типом varchar, и он получился корявый. поэтому добавили varchar2, чтобы не нарушать совместимость с уже имеющимися базами при переходе на новые версии. после чего, они порезали его, и сделали вместо него синоним varchar2
                    Ответить
                  • Насколько я помню из моего непродолжительного анального сношения^W^W общения с Oracle BDSM^W RDBMS у них с большинством типов какие то косяки, все крашется, взрывается...
                    Ответить
              • > обычно никто не играет с огнем и ставит utf
                Зато в мускуле по-умолчанию только latin1_swedish_ci, только хардкор... Наверное каждый, кто юзал мускуль, на эту хрень хоть раз налетал, замечая, что "как-то оно не так сортирует русские буквы", а потом матерился и перезаливал базу...
                Ответить
                • оракл при установке сам предлагает al32utf8, надо сильно постараться поменять его на latin1
                  Ответить
                • обычно latin_iso1, и потом при проблемах оказыватся битая кодировка дампа.
                  Ответить
        • Ой, 92, я пробелы не заметил.
          Ответить
    • ах ты ж ебаный ты нахуй!
      Ответить
    • Лютая магия с курсорами.
      Ответить
      • какая ж магия
        очевидно, чукча не знал, как из одного курсора сразу в три переменных зафетчить, что можно склеить строки прямо в селекте
        да и смысл в хранимой процедуре тут, она ничего особенного не делает - только лишний раз контекст переключать
        Ответить
        • это задел для будущей оптимизации.
          Ответить
        • зачем вообще этот курсор нужен? очевидно же, что функция используется в запросе, для каждой строки, и для каждой строки она вызывается. энивэй, переключение контекста pl-sql <---> sql это всегда плохо, и занимает не мало времени.
          select *,
          	(select fc_fam||' '||c_name||' '||fc_otch from tsotr) as FIO where tsotr.fk_id=sotr_id
          from users_table;

          что-то типа этого решило бы все его проблемы с производительностью
          Ответить
          • У тебя where отклеилось и куда-то не туда прилипло.
            Ответить
            • главное, все поняли, что я хотел сказать :)
              Ответить
          • Именно такой вопрос у меня и возник.
            Ответить

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