|
sqlplus copy не копирует дробную часть чисел
|
|||
---|---|---|---|
#18+
Доброго времени суток. Есть временная задача (отдельное приложение для её выполнения никто писать не будет) по регулярному копированию в одну базу Oracle некоторого количества таблиц из сотни других баз. Самым простым и легко автоматизируемым решением было быстренько сделать скрипт на sqlplus, который генерирует последовательность команд sqlplus COPY FROM USER/PASSWORD@QQQ123 APPEND XXX_QQQ123 USING SELECT * FROM YYY.XXX;, запускает это всё, и к утру данные уже приехали, можно развлекаться. Однако, в исходных системах на таблицах есть столбцы типы NUMBER, без всяких значений в скобочках (CREATE TABLE XXX ( BALANCE NUMBER, ...), содержащих числа с дробной частью ( 0.02, например). sqlplus COPY создаёт целевую таблицу, в которой столбец NUMBER имеет вид (22,0), после чего без малейшего сомнения копирует дробные числа как целые, и 0.02 превращается в просто 0 :( Казалось бы - создай целевую таблицу ручками с правильными типами данных, и всё будет нормально. Но это так не работает: на источниках приложения разных версий, слегка разный состав столбцов, переименования, иногда кто-то ручками что-то добавит, или столбец расширит, а потом набегают аналитики "мне там вчера создали столбец, почему я его не вижу в сегодняшней копии?" . А в некоторых источниках это вообще не таблица, а вьюха. Разбираться со всем этим проще на приёмной стороне, поэтому таблица XXX из базы данных QQQ123 копируется в XXX_QQQ123, а из базы ZZZ567 в XXX_ZZZ567, а потом уже скрипты и аналитики разбираются как это сливать воедино и сравнивать между собой. Да еще и целевая база иногда пересоздаётся, как копия с продуктива, rman'ом. Ну и список исходных баз и исходных таблиц тоже заранее не известен - аналитики могут накидать нужного в настроечную таблицу сами. ДБлинки в текущей ситуации не возможны. Переливать через файлы не возможно - на машине с sqlplus, с которой доступны все базы, просто нет места. Нужно как-то заставить sqlplus создавать таблицы, не дописывая ,0) к NUMBER'ам, изначально созданным без указания точности. Или, может быть, я забыл про ещё какую-нибудь утилиту, которая может это сделать? Исходные базы - от 11.2 до 19, целевая - 19.2, sqlplus'ы есть 11.2.0.4 и 19.3. Прав DBA нет нигде, права на создание чего-то в одной схеме есть только на целевой БД. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2025, 14:14 |
|
sqlplus copy не копирует дробную часть чисел
|
|||
---|---|---|---|
#18+
Георгий [игнорируется] Это документированное поведение: https://docs.oracle.com/en/database/oracle/oracle-database/19/sqpug/SQL-Plus-COPY-command.html#SQPUG-GUID-F2590ACD-D3B8-4016-817C-D14167281554 Цитата [игнорируется] Hence, if you are copying between Oracle databases, a NUMBER column with no precision will be changed to a DECIMAL(38) column. When copying between Oracle databases, you should use SQL commands (CREATE TABLE AS and INSERT) or you should ensure that your columns have a precision specified. Также COPY команда в SQLcl не имеет такого ограничения, как я вижу. Таким образом, можно использовать SQLcl, убедившись, что он работает со всеми нужными версиями. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.03.2025, 14:57 |
|
|
start [/forum/topic.php?fid=52&gotonew=1&tid=2187213]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
11ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 276ms |
total: | 409ms |
0 / 0 |