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

    −49

    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
    Declare
    alph Varchar2(26)   := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    ch   Varchar2(1);
    
    Begin
        dbms_output.put_line('Starting search: ' || srch);
        For i In 1..26 Loop
            
        Select Substr(alph,i,1) Into ch From dual;
    
            with 
              v_tab_col as (
            Select '"' || c.Table_Name || '"' As Table_Name,
                   '"' || c.Column_Name || '"' As Column_Name,
                   '"' || c.Owner || '"' As Owner,
                   Row_Number() Over(Partition By c.Owner, c.Table_Name Order By c.Column_Id) As Rn
              From Dba_Tab_Columns c, Dba_Objects o
            Where Data_Type In ('CHAR', 'VARCHAR2')
               And c.Table_Name = o.Object_Name
               And o.Object_Type = 'TABLE'
               And o.Owner = c.Owner
               And o.object_name Like ch || '%' -- checking by letter

    Циклическая выборка таблиц, начинающихся на букву алфавита, в каждом следующем прогоне берется следующая.

    Запостил: eggman, 26 Мая 2016

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

    • а дебаггер для SQL ещё не придумали? А то не представляю как люди пишут программы на sql.
      Ответить
      • Есть же профайлер вроде.
        Ответить
        • c with всё окей, маразм в методе нахождения буквы.
          Ответить
        • Для нормальных бд есть

          Для мускула нонрмального нет
          Ответить
          • das ist oracle.
            Ответить
            • В оракле хороший
              Ответить
              • вот и рассказал бы кто про менее идиотский способ реализации.
                Ответить
                • менее идиотский способ реализации чего?
                  зачем вообще ходить по каталогу и искать текстовые колонки?
                  почему нужно именно цикл по буквам, почему одним запросом это всё нельзя сделать?
                  Ответить
                  • менее идиотский способ циклического перебора буковок.

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

                    это либо моё незнание методов поиска в содержимом таблиц, либо одно из двух.
                    Ответить
                    • какой-то пиздец, прости
                      на что только не пойдут люди, чтобы ректально решить какие-то ректальные бизнес-задачи

                      из того, что ты рассказал, я могу сделать вывод, что это пиздец одноразовая задача - тебе принесли чужую базу и ты не хочешь разбираться в схеме, а хочешь погрепать ну где же хранится название чего-либо

                      я бы посоветовал сделать текстовый дамп и искать грепом, греп хорошо ищет, поверь

                      если говорить о тонкостях реализации, чего ты сейчас тут понаписал
                      - массив букв норм, см. следующий пункт
                      - ..26 не норм, есть же length
                      - ch varchar2 не норм, есть же char(1)
                      - like ch || '%' ваще не норм, есть же substr(foo, 1, 1), гораздо быстрее будет работать (а ты уповаешь, что оптимизатор смилуется и сделает этот субстр за тебя)
                      - dba_objects не норм, есть же dba_tables (открыл первую попавшуюся под руки базу - count(*) в dba_objects - 71268, count(*) в dba_tables - 2491)
                      - Да И Вообще Этот Стиль Не Норм - sql прекрасно смотрится в ловер кейсе, но это моё имхо
                      - на скорость исполнения одноразовой задачи тебе явно пофиг, поэтому я не буду наматывать сопли на кулак про смесь sql и pl/sql, bulk collect - это не сюда

                      ну и
                      > поиск ключевого слова ... ко всем варчарным столбцам
                      ты ведь построил фулл текст индекс?
                      я бы хотел сказать эластик/сфинкс, но я уже выше предложил греп
                      Ответить
                      • > я бы посоветовал сделать текстовый дамп и искать грепом, греп хорошо ищет, поверь
                        Ты удивишься тому, что он напишет ....
                        Ответить
                      • кейс - древнючая база, которую проектировали какие-то индусы, в которой нужно найти, я цитирую, "что-нибудь о слове Pipe". Ну то есть вообще хрен знает где, просто найти следы.

                        - length умнее, не спорю.
                        - я такой джуниор, что принципиального смысла в char не вижу, варчар2 по привычке.
                        - принято, благодарю.
                        - аналогично, не подумалось.

                        Чем тебе кэмелкейс навредил? от капса, да, глаза кровоточат, а кэмел вроде норм.

                        а про индекс придется rtfm.
                        -
                        Ответить
                        • какого размера база?
                          насколько она прирастает за сутки/неделю?
                          как часто надо искать?
                          Ответить
                          • одноразовая задачка, разве что, нужно несколько слов поискать (5-7 прогонов), данные - дамп двухмесячной давности.

                            если я правильно посмотрел (по sys.ts$), то всего 500 метров.
                            Ответить
                            • одноразовая - греп

                              многоразовая - делаешь один раз одну таблицу
                              crutch.all_fucking_text (
                                schema_name varchar2(30),
                                table_name varchar2(30),
                                column_name varchar2(30),
                                row_id urowid,
                                value varchar2(4000)
                              );
                              один раз её наполняешь
                              строишь один фул текст индекс
                              профит
                              Ответить
                              • нельзя. ограничение - не создавать новых объектов. но я запомню.

                                там выше что-то негативное в сторону грепа высказывали. why?
                                Ответить
                                • 1) всё хорошо с грепом
                                  2) создай новую таблицу в другом месте. у тебя же оракл, дблинк есть в стандарте.
                                  Ответить
                    • У меня очень большое сомнение, что именно так и нужно делать.
                      1. Если нужен поиск по ключевым словам, то какого хрена ключевые слова до сих пор не вынесены в отдельную таблицу?
                      2. Нахуя создавать таблицу с таким количеством столбцов? Упрощать схему не учили? Или тупо набрали кодомакак, которым пофиг на сложность и поддержку?
                      3. Самое главное. Дебаггер в SQL в принципе невозможен, т.к. сам язык предназначен для сокрытия внутренних процессов. Да, есть разной подробности логи, есть сообщения об ошибках, есть explain. Но дебаггера там никогда не было.
                      Ответить
                      • http://govnokod.ru/20082#comment329376
                        Ответить
                      • >> Дебаггер в SQL в принципе невозможен
                        Когда ты перестанешь возиться с наколенным игрушечным дерьмом типа MySQL, для тебя откроется огромный новый мир настоящих СУБД:

                        https://msdn.microsoft.com/en-us/library/cc645997.aspx


                        https://www.pgadmin.org/svnrepo/pgadmin3-1.18/docs/en_US/_build/html/debugger.html


                        http://www.oracle.com/webfolder/technetwork/tutorials/obe/db/11g/r2/prod/appdev/sqldev/plsql_debug/plsql_debug_otn.htm
                        Ответить
                        • От вы охуенные товарищи. Думаете, что я с другим игрушечным дерьмом не вожусь.
                          Да, давайте говорить сейчас о PG/SQL, T/SQL функциях! Типа, если мы можем по ним step through, то это есть истинный и православный дебаггер, ага.
                          Эскуэльщики вообще знают, что такое дебаггер? Если я в селект напихаю 100500 джойнов и оно будет тормозить, как я это буду дебажить?
                          Ответить
                          • http://troels.arvin.dk/db/rdbms/#cli-explain

                            Не помогает?
                            Ответить
                            • Тащем-та я про эксплейн и писал чуть раньше. Но это не дебаг ни разу, ведь правда?
                              Ответить
                              • Проморгал. Да, это не дебаг.

                                Вообще в современном ПО много чего скрыто от посторонних глаз. Декодер графических файлов вроде GIF или JPEG не выдаст подробности, на чём именно он споткнулся при попытке разобрать повреждённый файл. Браузер не скажет, как именно он разбирал страницу, только выдаст в отладчике коды ошибок и номера строк, на которых он споткнулся.

                                SQL-запрос нельзя оттрассировать по шагам, в отличие от программы на Бейсике/Си/Паскале и даже на JS, потому что SQL не является вполне императивным (хотя и допускает императивные действия в подпрограммах). Да и операции, выполняемые СУБД в данный момент, могут относиться не только к нашему запросу, но и к другим, потому что они могут быть связаны транзакциями. Так что если их открыть, увидим слишком много лишнего.

                                Самое главное, что СУБД не обязана повторяться: один и тот же запрос при первом выполнении и при повторах может исполняться по разной схеме. Возникает вопрос, нужна ли пошаговая отладка, если в боевых условиях запрос всё равно будет исполняться по-другому.
                                Ответить
                                • Да вот вроде всё правильно, но при наличии исходников библиотеки можно отдебажить всё что угодно. В принципе, и SQL чисто теоретически можно дебажить, но толщина абстракций такая, что толку от этого ноль.
                                  Ответить
                                  • Да и в императивных языках зачастую толку от пошаговой отладки мало, если через алгоритм нужно пропустить огромное количество данных.

                                    Спасёт только разбиение задачи на части и написание тестов для каждого участка.
                                    Ответить
                                    • > разбиение задачи на части
                                      ну и с запросами всё так же абсолютно

                                      если писать хитровыебанный запрос на 5 пейдждаунов для хитровыебанного отчета, то в нормальных субд есть отличная вещь with, которая позволяет емко и просто описывать каждый шаг -
                                      with
                                        step1 as (... from source1 ...),
                                        step2 as (... from source2 join step1 ...),
                                        step3 as (... from source3 join step2 ...) ...
                                      и всегда можно вставить на нужном месте select * from stepX и посмотреть, что же насобирал запрос до этого места, всё ли хорошо

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

                                      в какой то момент проект, в котором оказываются востребованными такие пиздецовые приемчики, должен дозреть до того, что его статистика требует предаггрегации в соответствии с бизнес-потребностями - вплоть до олап - в этом случае разработчик разносит задачу на части распределенные по времени и способу хранения, что тоже соответствует "разбиение задачи на части"
                                      Ответить
                          • > если мы можем по ним step through, то это есть истинный и православный дебаггер
                            Так точно.

                            > я в селект напихаю 100500 джойнов и оно будет тормозить
                            Тогда тебе нужен профайлер...
                            Ответить
          • Для нормальных БД есть, но нормальных нет.
            Для мускула нормального тоже нет, согласен.
            Ответить
    • Так вот оно как делается-то. Я ж два года это ищу...
      Ответить
      • быстро и на коленке я ничего более остроумного не придумал. реализация показалась тем ещё говном, пусть и стабильным (разве что o.object_name в аппер не обернут, хотя в частном случае было пофиг).
        Ответить
    • Что автору ОРАКЛ плохого сделал?
      select * from all_all_tables
      where regexp_like(table_name,'^[A-Z]{1}.')
      order by table_name
      Чем не устраивает?
      Ответить
      • поиск в содержимом таблиц, а не в их названиях.
        Ответить
        • Ткни пальцем, где поиск в содержимом...
          Data_Type In ('CHAR', 'VARCHAR2') - это чтоли?
          это не поиск в содержимом ....
          я вижу только поиск таблиц, начинающихся на буквы A-Z с полями CHAR или VARCHAR2....
          Ответить
          • это фрагмент общего скрипта. у меня основные вопросы были к реализации циклического перебора по алфавиту.

            ps. нахера столько многозначительных многоточий, друг?
            Ответить

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