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

    −122

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    select CMPNPFCOD into c_CMPCOD from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select CMPPRFCOD into c_CMPPRF from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select CMPDCL_YER into c_CMPDCL_YER from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DPTCOD into c_DPTCOD_CHS from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DCINMB into c_DCINMB_CHS from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DCIDCK into c_DCIDCK_CHS from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DCICPY into c_DCICPY_CHS from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DPTCOD into c_DPTCOD_AGR from SPECPART.AGRNPFALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DCINMB into c_DCINMB_AGR from SPECPART.AGRNPFALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DCIDCK into c_DCIDCK_AGR from SPECPART.AGRNPFALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select DCICPY into c_DCICPY_AGR from SPECPART.AGRNPFALL where INSNMB = l_INSNMB fetch first 1 rows only;
    select PROCDATE into c_PROCDATE from SPECPART.CHSCMPALL where INSNMB = l_INSNMB fetch first 1 rows only;

    Глумление над DB2

    Запостил: rush, 25 Февраля 2014

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

    • показать все, что скрытоВъебал минус.
      Ответить
    • Боюсь оказаться капитаном Очевидностью, но увиденное мне кажется невероятным. Я правильно понял, что несколько строк кода выбирают из базы одну и ту же запись?
      Ответить
      • почему одну и ту же
        учитывая, что тут first 1 rows only, то предполагается, что в таблице может быть много строк, удовлетворяющих условию where
        не знаю как DB2, но почти уверен, что и она не даёт гарантии, что в результате двух последовательных селектов строки в резалтсете будут одинаково взаимно отсортированы

        так что, автор ведь так и задумывал
        Ответить
        • Автор наверняка всё предусмотрел рахитектурой, сделав INSNMB праймари ки.

          ЗЫЖ Только не говорите, что INSNMB = l_INSNMB - это сравнение джвух полей в таблице... OH SHI---
          Ответить
          • Смотрим документацию IBM по синтаксису SELECT INTO:
            assignment-target
            
            >>-+-global-variable-name-------------------+------------------><
               +-host-variable-name---------------------+   
               +-SQL-parameter-name---------------------+   
               +-SQL-variable-name----------------------+   
               +-transition-variable-name---------------+   
               +-array-variable-name--[--array-index--]-+   
               '-field-reference------------------------'
            Только не говорите мне, что c_CMPCOD — это field-reference.
            Ответить
            • Нет, это
              SQL-variable-name
              в хранимой процедуре
              Ответить
      • Запись одна и та же, но поля после слова SELECT разные.
        Там еще 2 таблицы: CHSCMPALL и AGRNPFALL.
        Ответить
        • Оставим для ясности только строки, относящиеся к одной таблице. Всё равно красиво. Даже если выборки заключены в транзакцию или если INSNMB — первичный, всё равно красиво.

          А вдруг DB2 что-нибудь кэширует? Ну а вдруг?
          Ответить
          • Все субд что-то кешируют... По крайней мере страничка с этой записью всяко будет в памяти.
            Ответить
      • Да КЭП, одну и ту же запись из одной таблички
        и мимоходом из другой таблички, но то же одну и ту же
        Ответить
    • Забыл добавить, что вся эта красота еще и в цикле...
      Нашел случайно этот кусок кода, при поиске где же теряется производительность
      Такого я еще не видел :)
      Ответить

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