1. Куча / Говнокод #3693

    +129

    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
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    for i in 14 15 27 29 38; do # make a sed string to replace special characters
        hexval=$(printf \\\\x%02x $i)
        sedstr=$sedstr"s/'$hexval/chr($i)||'/g;s/$hexval'/'||chr($i)/g;s/$hexval/'||chr($i)||'/g;"
    done
    
    cat <<EOF | sqlplus -S $DB_LOGIN | sed $sedstr | awk -v dbdir=db/data '{print > dbdir"/"$3".sql"}'
    $SPINIT
    BEGIN
      FOR i IN (SELECT * FROM USER_OBJECTS WHERE OBJECT_TYPE='TABLE' ORDER BY OBJECT_NAME) LOOP
        DECLARE
          all_cols VARCHAR2(32767) := '';
          TYPE data_cur_type IS REF CURSOR;
          data_cur data_cur_type;
          ins_str VARCHAR2(32767);
        BEGIN
          FOR j IN (SELECT DISTINCT(COLUMN_NAME) FROM USER_TAB_COLUMNS
                    WHERE TABLE_NAME=i.OBJECT_NAME AND
                    DATA_TYPE IN ('VARCHAR2', 'CHAR', 'NUMBER', 'DATE')
                    ORDER BY COLUMN_NAME) LOOP
            all_cols := all_cols || j.column_name || ',';
          END LOOP;
          IF all_cols is null THEN GOTO end_of_loop; END IF;
          all_cols := RTRIM(all_cols,',');
        
          OPEN data_cur FOR 'select ' ||
           '''INSERT INTO ' || i.object_name || ' (' || all_cols || ') VALUES (' || '''''''||' || replace(all_cols, ',', '||'''''',''''''||') || '||'''''');''' ||
           ' from ' || i.object_name || ' order by ' || all_cols;
          LOOP
            FETCH data_cur INTO ins_str;
            EXIT WHEN data_cur%NOTFOUND;
            dbms_output.put_line(ins_str);
          END LOOP;
          CLOSE data_cur;
        END;
    <<end_of_loop>> NULL;
      END LOOP;
    END;
    /
    EOF

    Проблеме экранирования посвящается.
    На стыке технологий: экспорт данных из БД в виде insert-ов. Там еще есть awk-шный код по разбору всего, что получилось, но он не такой ужасный.
    Автор я, если чо:)

    Запостил: nil, 13 Июля 2010

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

    • И тут внезапно заметил, что внутристроковые кавычки таки обрабатываются неправильно, поскольку вставлять их в 26 строку было совсем бесчеловечно,
      то модифицировал район 20, добавив:
      IF cnt <> 0 THEN mod_cols := mod_cols || ' || '''''','''''' || '; END IF;
      mod_cols := mod_cols || 'REPLACE(' || j.column_name || ','''''''','''''''''''')';

      А 26 упростилась:
      '''INSERT INTO ' || i.object_name || ' (' || all_cols || ') VALUES (''''''||' || mod_cols || '||'''''');''' ||

      Но все равно, в моем фонте выглядит как будто висели на потолке запятые, сушились себе спокойно. А потом некоторые отвалились, некоторые изогнулись, некоторые вытянулись. Своеобразная брейнфаковая музыка, однако, в этом всем есть:)
      Ответить
    • EOF
      Ответить
      • Полный!

        Кстати, вроде стандарта де-факто стало, емакс автоматом вставляет именно такую конструкцию.
        Ответить

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