Куча говна / Говнокод #3693 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 nil, (Updated )

Комментарии (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 || '||'''''');''' ||

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

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

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

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8