- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 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.07.2010 14:36 # 0
то модифицировал район 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 || '||'''''');''' ||
Но все равно, в моем фонте выглядит как будто висели на потолке запятые, сушились себе спокойно. А потом некоторые отвалились, некоторые изогнулись, некоторые вытянулись. Своеобразная брейнфаковая музыка, однако, в этом всем есть:)
Lure Of Chaos 14.07.2010 23:01 # 0
nil 14.07.2010 23:04 # 0
Кстати, вроде стандарта де-факто стало, емакс автоматом вставляет именно такую конструкцию.
Lure Of Chaos 14.07.2010 23:37 # 0