powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / sqlplus copy не копирует дробную часть чисел
3 сообщений из 3, страница 1 из 1
sqlplus copy не копирует дробную часть чисел
    #40140277
Георгий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

Есть временная задача (отдельное приложение для её выполнения никто писать не будет) по регулярному копированию в одну базу 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 нет нигде, права на создание чего-то в одной схеме есть только на целевой БД.
...
Рейтинг: 0 / 0
sqlplus copy не копирует дробную часть чисел
    #40140279
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Георгий [игнорируется] 

Это документированное поведение: 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, а COPY использовать только для копирования данных.
Также COPY команда в SQLcl не имеет такого ограничения, как я вижу. Таким образом, можно использовать SQLcl, убедившись, что он работает со всеми нужными версиями.
...
Рейтинг: 0 / 0
sqlplus copy не копирует дробную часть чисел
    #40140282
Георгий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate [игнорируется] 

Мерзавцы! Испортили хорошую вещь, да ещё и задокументировали... :(
Да, про sqlcl я что-то и позабыл... Спасибо, что напомнил, она мне сейчас и в другой задаче должна зайти, как родная.

Пока коряво вышел из ситуации так, генерю:
Код: SQL
1.
2.
3.
COPY ... REPLACE ... SELECT  * FROM XXX WHERE 1=2;
EXEC  PATCH_NUMBER_COLUMNS( 'XXX_QQQ123');
COPY ... APPEND ... SELECT  * FROM XXX ;
где PATCH_NUMBER_COLUMNS - процедурка, которая по имени таблицы находит все её NUMBER-ные столбцы, и делает им EXECUTE IMMEDIATE 'ALTER TABLE XXX_QQQ123 MODIFY ( ... NUMBER)';
Процедурка мелкая, создаётся каждый раз при запуске скрипта им самим, поэтому пересоздание базы должна пережить без участия человеческого фактора.
...
Изменено: 06.03.2025, 16:17 - Георгий
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / sqlplus copy не копирует дробную часть чисел
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]