экспортируется в файл/кэш как набор Insert-скриптов
Не надо так делать, а то откат операции может получиться дольше, чем сама операция.
Экспортировать надо в виде CSV-файла и шаблона для SQL*Loader
Дарю код – как новичку на Хабре. Если разберётесь, плюс стопиццот вам в карму. Клянусь, что патча Бармина внутри нет :)
Hidden text
#!/bin/bash
# Usage: export.sh login/password@tnsalias table {table}
# Exports DDL statement, control file for SQL*Loader and the data itself
#=== SETTINGS ===
# quotation mark
_ENC=
#_ENC=\"
#_ENC=\~
# field separator (should be character or hexadecimal code with leading zero)
_SEP=09
#_SEP="|"
# max row count
#_ROWS=
#_ROWS=100000
# end-of-line (for character fields with linefeed)
_EOL=
#_EOL=@@@
RESERVED="'ACCESS','ADD','ALL','ALTER','AND','ANY','AS','ASC','AUDIT','BETWEEN','BY','CHAR','CHECK','CLUSTER','COLUMN','COMMENT','COMPRESS','CONNECT','CREATE','CURRENT','DATE','DECIMAL','DEFAULT','DELETE','DESC','DISTINCT','DROP','ELSE','EXCLUSIVE','EXISTS','FILE','FLOAT','FOR','FROM','GRANT','GROUP','HAVING','IDENTIFIED','IMMEDIATE','IN','INCREMENT','INDEX','INITIAL','INSERT','INTEGER','INTERSECT','INTO','IS','LEVEL','LIKE','LOCK','LONG','MAXEXTENTS','MINUS','MLSLABEL','MODE','MODIFY','NOAUDIT','NOCOMPRESS','NOT','NOWAIT','NULL','NUMBER','OF','OFFLINE','ON','ONLINE','OPTION','OR','ORDER','PCTFREE','PRIOR','PRIVILEGES','PUBLIC','RAW','RENAME','RESOURCE','REVOKE','ROW','ROWID','ROWNUM','ROWS','SELECT','SESSION','SET','SHARE','SIZE','SMALLINT','START','SUCCESSFUL','SYNONYM','SYSDATE','TABLE','THEN','TO','TRIGGER','UID','UNION','UNIQUE','UPDATE','USER','VALIDATE','VALUES','VARCHAR','VARCHAR2','VIEW','WHENEVER','WHERE','WITH'"
#=== SETTINGS ===
IFS="
"
login=$1
shift 1
__UNAME=`uname`
if [[ $_ENC != "" ]]
then
sql_left_quote="'''${_ENC}''||replace('||"
sql_right_quote="||',''${_ENC}'',''${_ENC}${_ENC}'')||''${_ENC}'''"
ldr_quote=" enclosed by ''${_ENC}''"
fi
if [[ $_ROWS != "" ]]
then
stop_cond=" where rownum<=${_ROWS}"
fi
if [[ "${_SEP#0}" != "${_SEP}" ]]
then
sql_sep="'chr(to_number(''${_SEP}'',''XX''))'"
ldr_sep="X'${_SEP}'"
else
sql_sep="'''${_SEP}'''"
ldr_sep="'${_SEP}'"
fi
if [[ $_EOL != "" ]]
then
sql_eol="||'${_EOL}'"
if [[ ${OSTYPE} == "cygwin" ]]
then
ldr_eol=" \"str '${_EOL}\\r\\n'\""
else
ldr_eol=" \"str '${_EOL}\\n'\""
fi
fi
for t
do
# table definition
echo "create table $t (" >$t.sql
sqlplus -s -L $login <<EOF >>$t.sql
set newpage none pagesize 0 linesize 128 underline off feedback off head off timing off tab off
select
decode(column_id,1,' ',' ,')||
case when
upper(t.column_name)<>t.column_name or upper(t.column_name) in (${RESERVED})
then '"'||t.column_name||'"'
else lower(t.column_name)
end || ' ' ||
lower(t.data_type
||decode(decode(t.data_type,'VARCHAR2','C','CHAR','C'),'C','('||t.data_length||')')
||decode(decode(t.data_type,'NUMBER','N','FLOAT','N'),'N',decode(nvl(t.data_precision,t.data_scale),null,null,'('||nvl(to_char(t.data_precision),'*')
||decode(t.data_scale,null,null,','||t.data_scale)||')'))) ||
decode(t.nullable,'Y',null,'N',' not null') as field
from all_tab_columns t
where t.data_type in ('CHAR','VARCHAR2','DATE','NUMBER','FLOAT')
and (t.owner,t.table_name) in (
select
min(owner) keep (dense_rank first order by priority),
min(table_name) keep (dense_rank first order by priority)
from
(
select
1 as priority, owner, table_name
from all_tables
where
owner=nvl(substr(upper('$t'),1,instr(upper('$t'),'.',1)-1),user)
and table_name=substr(upper('$t'),instr(upper('$t'),'.',1)+1)
union all
select
2 as priority, owner, view_name
from all_views
where
owner=nvl(substr(upper('$t'),1,instr(upper('$t'),'.',1)-1),user)
and view_name=substr(upper('$t'),instr(upper('$t'),'.',1)+1)
union all
select case owner when user then 3 else 4 end as priority, table_owner, table_name
from all_synonyms
where synonym_name=upper('$t') and owner in (user,'PUBLIC')
)
)
order by column_id;
EOF
echo ");" >>$t.sql
#SQL*Loader control file
cat <<EOF >$t.ctl
options (DIRECT=TRUE, STREAMSIZE=8388608, COLUMNARRAYROWS=16384)
LOAD DATA
CHARACTERSET ${NLS_LANG##*.}
INFILE '$t.txt'${ldr_eol} BADFILE '$t.bad'
TRUNCATE INTO TABLE $t fields terminated by ${ldr_sep} trailing nullcols (
EOF
sqlplus -s -L $login <<EOF >>$t.ctl
set newpage none pagesize 0 linesize 128 underline off feedback off head off timing off tab off
select
decode(column_id,1,' ',' ,')||
decode(upper(t.column_name),t.column_name,lower(t.column_name),'"'||t.column_name||'"') || ' ' ||
case
when data_type in ('CHAR','VARCHAR2') then
case when data_length>255 then 'char('||data_length||')' else 'char' end ||'${ldr_quote}'
when data_type='NUMBER' then
case
when data_scale>=0 then 'integer external'
else 'float external'
end
when data_type='FLOAT' then 'float external'
when data_type='DATE' then 'date ''dd.mm.yyyy hh24:mi:ss'''
end
from all_tab_columns t
where t.data_type in ('CHAR','VARCHAR2','DATE','NUMBER','FLOAT')
and (t.owner,t.table_name) in (
select
min(owner) keep (dense_rank first order by priority),
min(table_name) keep (dense_rank first order by priority)
from
(
select
1 as priority, owner, table_name
from all_tables
where
owner=nvl(substr(upper('$t'),1,instr(upper('$t'),'.',1)-1),user)
and table_name=substr(upper('$t'),instr(upper('$t'),'.',1)+1)
union all
select
2 as priority, owner, view_name
from all_views
where
owner=nvl(substr(upper('$t'),1,instr(upper('$t'),'.',1)-1),user)
and view_name=substr(upper('$t'),instr(upper('$t'),'.',1)+1)
union all
select case owner when user then 3 else 4 end as priority, table_owner, table_name
from all_synonyms
where synonym_name=upper('$t') and owner in (user,'PUBLIC')
)
)
order by column_id;
EOF
echo ")" >>$t.ctl
#data
unset sel
for c in `sqlplus -s -L $login <<EOF
set newpage none pagesize 0 linesize 128 underline off feedback off head off timing off tab off
select
decode(column_id,1,null,'||'||${sql_sep}||'||')||
case
when data_type='CHAR' or data_type='VARCHAR2' then ${sql_left_quote}case when upper(t.column_name)<>t.column_name or upper(t.column_name) in (${RESERVED}) then '"'||t.column_name||'"' else lower(t.column_name) end${sql_right_quote}
when data_type='NUMBER' or data_type='FLOAT' then 'to_char('||case when upper(t.column_name)<>t.column_name or upper(t.column_name) in (${RESERVED}) then '"'||t.column_name||'"' else lower(t.column_name) end||',''TM'',''NLS_NUMERIC_CHARACTERS = ''''. '''''')'
when data_type='DATE' then 'to_char('||case when upper(t.column_name)<>t.column_name or upper(t.column_name) in (${RESERVED}) then '"'||t.column_name||'"' else lower(t.column_name) end||',''dd.mm.yyyy hh24:mi:ss'')'
end
from all_tab_columns t
where t.data_type in ('CHAR','VARCHAR2','DATE','NUMBER','FLOAT')
and (t.owner,t.table_name) in (
select
min(owner) keep (dense_rank first order by priority),
min(table_name) keep (dense_rank first order by priority)
from
(
select
1 as priority, owner, table_name
from all_tables
where
owner=nvl(substr(upper('$t'),1,instr(upper('$t'),'.',1)-1),user)
and table_name=substr(upper('$t'),instr(upper('$t'),'.',1)+1)
union all
select
2 as priority, owner, view_name
from all_views
where
owner=nvl(substr(upper('$t'),1,instr(upper('$t'),'.',1)-1),user)
and view_name=substr(upper('$t'),instr(upper('$t'),'.',1)+1)
union all
select case owner when user then 3 else 4 end as priority, table_owner, table_name
from all_synonyms
where synonym_name=upper('$t') and owner in (user,'PUBLIC')
)
)
order by column_id;
EOF
`
do
sel=$sel$c"\n"
done
# sqlplus -s -L $login <<EOF >$t.txt
# sqlplus -s -L $login <<EOF | gzip >$t.txt.gz
# cat <<EOF >$t.txt
sqlplus -s -L $login <<EOF | gzip >$t.txt.gz
set newpage none pagesize 0 linesize 16384 underline off feedback off head off timing off tab off
set recsep off
set arraysize 4096
select
`if [[ ${__UNAME} != AIX ]]; then echo -e ${sel}; else echo ${sel}; fi`${sql_eol}
from
${t}${stop_cond};
EOF
done
Позвольте же вас спросить, как же может управлять человек, если он не только лишен возможности составить какой-нибудь план хотя бы на смехотворно короткий срок, ну, лет, скажем, в тысячу, но не может ручаться даже за свой собственный завтрашний день?
Я к тому, что текущим специалистам по Oracle на кусок хлеба с маслом хватит всегда. Но вот новичкам, конечно, стоит подумать, связывать ли свою карьеру с. Но вообще, конечно, жаль, потому что если отвлечься от политики, то платформа очень классная.
Вполне возможно. Но я почему-то слышал это слово только применительно к оверпровижынингу процессоров на виртуальных фермах, но не применительно к дискам.
Ну почему же, налицо явный непрофессионализм. Или непонимание слова «отдельное», или неудачное название, из которого явно следует, что приложение вовсе не отдельное, а укомплектованное голосовым помощником. Для продукта это так же плохо, как некачественный код. Может, ещё и хуже, потому что убедиться, что код некачественный, можно только при использовании приложения. А вот неудачное название поставит крест на самой идее попробовать приложение.
По п. 3 скажу, что всегда можно определить, как именно запущено приложение, – чтобы что-то запланировать или чтобы войти в конкретную конференцию. Казалось бы, элементарное знание, но - - -
Окошки, может, и уменьшаются, но больше 10-15 человек в списке всё равно не помещается. Дизайнеры почему-то забывают, что есть настольные компьютеры и смартфоны, и если размеры изображения в точках совпадают, то физические размеры при этом отличаются в 4-5 раз. Казалось бы, общедоступное знание, но опять же...
«Отдельное» приложение – это именно отдельное, без всяких салютов. Вот казалось бы, термин «отдельное» однозначный, но и его маркетологи Сбера понимают по-своему...
Вообще у Сбера нормальный бэкенд, но разработчики UI – все сплошь криворукие неумехи. Вот конкретно про Jazz:
Web-версия через раз работает в Firefox.
При нажатии «открыть в приложении» запускается приложение «Jazz». Запускается и запускается, запускается и запускается... На современном компьютере с 16 Гбайт памяти это занимает несколько секунд. При том, что Zoom запускается мгновенно.
Когда приложение запустилось, видеоконференция не начинается автоматически – зачем-то надо нажать кнопку «войти в конференцию».
Имена участников написаны огромными буквами. На FullHD монитор влезает десяток-полтора. Для индивидуальных встреч более чем достаточно, но для бизнеса – так себе решение.
Приложение для Андроида спрятано в недра какого-то голосового помощника. Не представляю, кто в здравом уме будет ставить себе это на личный телефон.
Если нажать «поделиться», то свёрнутое окно не видно в списке того, чем надо поделиться, – сначала надо развернуть окно.
Я написал скрипт на перле, который решает задачу. Подход автора фундаментален, я же поступил проще: начинаю со слова с самыми распространёнными буквами (по статистике моего словаря это коран/оркан/крона), а потом фильтрую список в соответствии с ответами. Почти всегда слово угадывается с 4 попытки, единственное слово, на которое понадобилось 5 попыток – «кабан»:
> я знаю 3274 слов
> оркан
$ xx.++
> я знаю 4 слов
> кулан
$ +xx++
> я знаю 3 слов
> казан
$ ++x++
> я знаю 2 слов
> каган
$ ++x++
> я знаю 1 слов
> кабан
$ +++++
А «монстр» – всё. Куча кода, который без статьи совершенно не понятен.
Это хорошо для Perl’а, на котором пишутся «одноразовые» скрипты. Но для продукта, который предполагается развивать и поддерживать, я б такой язык не взял.
Когда вы говорите «несоответствующие действительности», вы обвиняете сказавшего во лжи. Соответственно, бремя доказательства переносится на вас – вы должны доказать, что в действительности вот так, а сказано было вот эдак.
Вашу мысль корректно было бы выразить словом «не доказанные».
Понимаю презрительное отношение технарей к юристам и дипломатам. Но всё же их не даром столько лет учат подбирать слова. Слова в человеческой речи имеют не меньшее, а иногда и большее значение, чем операторы и функции в коде :)
Справедливости ради, «документо-ориентированные» БД также решают все перечисленные проблемы.
Не надо так делать, а то откат операции может получиться дольше, чем сама операция.
Экспортировать надо в виде CSV-файла и шаблона для SQL*Loader
Дарю код – как новичку на Хабре. Если разберётесь, плюс стопиццот вам в карму. Клянусь, что патча Бармина внутри нет :)
Hidden text
Я к тому, что текущим специалистам по Oracle на кусок хлеба с маслом хватит всегда. Но вот новичкам, конечно, стоит подумать, связывать ли свою карьеру с. Но вообще, конечно, жаль, потому что если отвлечься от политики, то платформа очень классная.
Да ладно.
https://habr.com/ru/post/403037/
Вполне возможно. Но я почему-то слышал это слово только применительно к оверпровижынингу процессоров на виртуальных фермах, но не применительно к дискам.
Ну почему же, налицо явный непрофессионализм. Или непонимание слова «отдельное», или неудачное название, из которого явно следует, что приложение вовсе не отдельное, а укомплектованное голосовым помощником. Для продукта это так же плохо, как некачественный код. Может, ещё и хуже, потому что убедиться, что код некачественный, можно только при использовании приложения. А вот неудачное название поставит крест на самой идее попробовать приложение.
Подождите, я один вижу там слово «Салют»?
Зачем мне на личное устройство ставить что-то с «Салютом»???
P. S. Возможен, конечно, вариант, когда в названии «салют» есть, а в коде его нет. Но это значит, что и маркетологи Сбера тоже - - -
По п. 3 скажу, что всегда можно определить, как именно запущено приложение, – чтобы что-то запланировать или чтобы войти в конкретную конференцию. Казалось бы, элементарное знание, но - - -
Окошки, может, и уменьшаются, но больше 10-15 человек в списке всё равно не помещается. Дизайнеры почему-то забывают, что есть настольные компьютеры и смартфоны, и если размеры изображения в точках совпадают, то физические размеры при этом отличаются в 4-5 раз. Казалось бы, общедоступное знание, но опять же...
«Отдельное» приложение – это именно отдельное, без всяких салютов. Вот казалось бы, термин «отдельное» однозначный, но и его маркетологи Сбера понимают по-своему...
«Салют!» – это и есть голосовой помощник.
Вообще у Сбера нормальный бэкенд, но разработчики UI – все сплошь криворукие неумехи. Вот конкретно про Jazz:
Web-версия через раз работает в Firefox.
При нажатии «открыть в приложении» запускается приложение «Jazz». Запускается и запускается, запускается и запускается... На современном компьютере с 16 Гбайт памяти это занимает несколько секунд. При том, что Zoom запускается мгновенно.
Когда приложение запустилось, видеоконференция не начинается автоматически – зачем-то надо нажать кнопку «войти в конференцию».
Имена участников написаны огромными буквами. На FullHD монитор влезает десяток-полтора. Для индивидуальных встреч более чем достаточно, но для бизнеса – так себе решение.
Приложение для Андроида спрятано в недра какого-то голосового помощника. Не представляю, кто в здравом уме будет ставить себе это на личный телефон.
Если нажать «поделиться», то свёрнутое окно не видно в списке того, чем надо поделиться, – сначала надо развернуть окно.
Справедливости ради, это не уровень технической экспертизы, а уровень PR (или типа DR) отдела.
Я написал скрипт на перле, который решает задачу. Подход автора фундаментален, я же поступил проще: начинаю со слова с самыми распространёнными буквами (по статистике моего словаря это коран/оркан/крона), а потом фильтрую список в соответствии с ответами. Почти всегда слово угадывается с 4 попытки, единственное слово, на которое понадобилось 5 попыток – «кабан»:
ШАЯ же!
А вот буквально сейчас меняют турбины на Красноярской ГЭС. Говорят, турбины сделаны в Санкт-Петербурге. Врут, поди?
Джеки Чан
А разве флаги не сбрасываются после каждой операции?
Это не C, а его далёкий наследник, да.
А «монстр» – всё. Куча кода, который без статьи совершенно не понятен.
Это хорошо для Perl’а, на котором пишутся «одноразовые» скрипты. Но для продукта, который предполагается развивать и поддерживать, я б такой язык не взял.
Обалдеть. C в своё время был такой лаконичный и понятный язык, а теперь из него сделали какого-то монстра.
Конкурент, скорее, Yugabyte.
Таракан построен по другому принципу, больше похоже на Google Spanner.
Поищите в интернетах эпические битвы между Cockroach и Yugabyte и попробуйте решить, какой подход лучше :))
Когда вы говорите «несоответствующие действительности», вы обвиняете сказавшего во лжи. Соответственно, бремя доказательства переносится на вас – вы должны доказать, что в действительности вот так, а сказано было вот эдак.
Вашу мысль корректно было бы выразить словом «не доказанные».
Понимаю презрительное отношение технарей к юристам и дипломатам. Но всё же их не даром столько лет учат подбирать слова. Слова в человеческой речи имеют не меньшее, а иногда и большее значение, чем операторы и функции в коде :)