Добавить пустые строки oracle
Я должен написать компонент, который повторно создает таблицы SQL Server (структуру и данные) в базе данных Oracle. Этот компонент также должен принимать новые данные, введенные в базу данных Oracle, и копировать их обратно в SQL Server.
перевод типов данных из SQL Server в Oracle не является проблемой. Однако критическое различие между Oracle и SQL Server вызывает серьезную головную боль. SQL Server считает, что пустая строка ( "" ) отличается от NULL значение, поэтому char столбец можно определить как NOT NULL и все же все еще включают пустые строки в данные.
Oracle считает пустую строку такой же, как NULL значение, так что если
Я не вижу простого решения для этого.
возможно, вы можете хранить свои значения как один или несколько пробелов -> ' ' , которые не являются нулями в Oracle или отслеживают этот особый случай через дополнительные поля/таблицы и слой адаптера.
моим типичным решением было бы добавить ограничение в SQL Server, заставляющее все строковые значения в затронутых столбцах иметь длину больше 0:
однако, как вы уже заявили, у вас нет контроля над базой данных SQL. Таким образом, у вас действительно есть четыре варианта (как я вижу):
номер четыре будет моим предпочтением, но не всегда возможно. Действие, которое вы предпримете, действительно будет зависеть от того, что нужно пользователям oracle. В конечном счете, если ничего не может быть сделано о базе данных SQL, я бы объяснить проблему владельцам бизнес-системы oracle, объяснить варианты и последствия и заставить их принять решение:)
Примечание: Я считаю, что в этом случае SQL Server фактически демонстрирует "правильное" поведение.
вы должны разрешить пустые строки в системе SQL Server? Если вы можете добавить ограничение в систему SQL Server, которое запрещает пустые строки, это, вероятно, самое простое решение.
его неприятный и может иметь неожиданные побочные эффекты.. но вы можете просто вставить " chr (0)" вместо ".
NOT NULL-это ограничение базы данных, используемое для прекращения ввода недопустимых данных в базу данных. Это не служит какой-либо цели в вашей базе данных Oracle, и поэтому я бы этого не сделал.
Я думаю, вы должны просто продолжать разрешать нули в любом столбце Oracle, который отражает столбец SqlServer, который, как известно, содержит пустые строки.
Если есть логическая разница в базе данных SqlServer между NULL и пустой строкой, то вам понадобится что-то дополнительное для моделирования этого разница в Oracle.
Я бы пошел с дополнительным столбцом на стороне oracle. Пусть ваш столбец разрешает нули и имеет второй столбец, который определяет, должна ли сторона SQL-Server получить нулевое значение или пустую строку для строки.
для тех, кто думает, что Null и пустая строка должны считаться одинаковыми. Значение null отличается от значения пустой строки. Он фиксирует разницу между "undefined" и "known to be blank". В качестве примера запись может быть создана автоматически, но никогда не проверена вводом пользователя, и, таким образом, получить "null" в ожидании, что когда пользователь проверит его, он будет установлен как пустой. Практически мы можем не хотеть запускать логику на нуле, но можем хотеть на пустая строка. Это аналогично случаю для флажка состояния 3 Yes/No / Undefined.
и SQL, и Oracle не получили его полностью правильно. Пробел не должен удовлетворять ограничению "not null", и необходимо, чтобы пустая строка обрабатывалась иначе, чем обрабатывается null.
Если вы переносите данные, вам может потребоваться заменить пустую строку пробелом. Не очень элегантно, но вполне реально. Это неприятная "особенность" Oracle.
- удалите ограничение not null из столбца Oracle
- проверить для каждого столбца, если допустимо разместить в столбце '' или 0 или фиктивную дату, чтобы иметь возможность сохранять ваши данные.
ну, главное, что я бы рассмотрел, это отсутствие задач, когда какое-то поле может быть нулевым, то же поле может быть пустой строкой, и бизнес-логика требует различать эти значения. Поэтому я бы сделал такую логику:
- проверьте MSSQL, если столбец не имеет нулевого ограничения
- проверьте MSSQL, если столбец имеет проверку (столбец ") или аналогичное ограничение
Если оба значения true, сделайте столбец Oracle не NULL. Если значение равно true, сделайте столбец Oracle NULL. Если ни одно не верно, поднимите недопустимое исключение дизайна (или, возможно, проигнорируйте его, если это приемлемо для этого приложения).
при отправке данных из MSSQL в Oracle просто не делайте ничего особенного, все данные будут переданы правильно. При получении данных в MSSQL любые ненулевые данные должны быть отправлены как есть. Для нулевых строк вы должны решить, следует ли вставлять его как null или как пустую строку. Для этого вы должны снова проверить дизайн таблицы (или вспомнить предыдущий результат) и посмотреть, не имеет ли он нулевого ограничения. Если имеет - использовать пустую строку, если не имеет-использовать NULL. Просто и умно.
иногда, если вы работаете с неизвестным и непредсказуемым приложением, вы не можете проверить наличие ограничения из-за различных его форм. Если это так, вы можете использовать упрощенную логику (сделать столбцы Oracle всегда nullable) или проверить, можно ли вставить пустую строку в таблицу MSSQL без ошибок.
Я заметил, что OP упомянул следующее:
"Oracle считает пустую строку такой же, как значение NULL, поэтому, если столбец char определен как NOT NULL, вы не можете вставить пустую строку."
специально вызывая CHAR, а не VARCHAR2. Следовательно, говоря о " пустой строке" длины 0 (ie " ) является спорным. Если он объявил символ как, например, CHAR (5), то просто добавьте пробел в пустую строку, поступающую, Oracle все равно собирается заполнить его. Вы получите строку с 5 пробелами.
теперь, если OP означал VARCHAR2, ну да, это совершенно другой зверь, и да, разница между пустой строкой и NULL становится актуальной.
я объявил v_str_cr_seg,v_str_dr_seg как пустые строки, то есть v_str_dr_seg varchar(50) prettyprint-override"> insert into t_transaction_query_log (log_id, posting_id, fee_id, fee_status, fee_type, pay_mode, accounting_date, policy_id, money_id, finish_time, source_type, fee_amount, cr_seg, dr_seg, product_id) select s_transaction_query_log__lg_id.nextval, tg.je_posting_id, tg.fee_id, tg.fee_status, tg.fee_type, 60, tg.accounting_date, tg.policy_id, tg.currency_id, trunc(sysdate, 'dd'), 2, tg.fee_amount, , , tg.product_id from t_ri_fee_gl tg where tg.posted = 'Y'
что, в свою очередь, приводит к отсутствию ошибки выражения. я пробовал использовать функцию nvl в качестве
но все равно я получаю ту же ошибку
как я могу вставить, даже если v_str_cr_seg и v_str_dr_seg не изменились , то есть пустые строки ''
2 ответа
У меня есть переменная типа StringBuffer, которая имеет символ null, то есть промежуточное значение' \0'. Я могу правильно напечатать переменную с символом null. Но когда я пытаюсь вставить эту переменную в таблицу Oracle, я не могу вставить всю переменную StringBuffer; только часть перед '\0'.
dput (head(dat, 10)) structure(list(DATE = c(14-04-2013 00:02:30, 14-04-2013 00:03:00, 14-04-2013 00:03:30, 14-04-2013 00:04:00, 14-04-2013 00:04:30, 14-04-2013 00:05:00, 14-04-2013 00:05:30, 14-04-2013 00:06:00, 14-04-2013 00:06:30, 14-04-2013 00:07:00), LPAR = c(server1, server1, server1.
Примечание: База данных Oracle в настоящее время обрабатывает символьное значение с длиной нуля как null. Однако это может не сохраниться в будущих выпусках, и Oracle рекомендует не обрабатывать пустые строки так же, как значения null.
Если это оператор insert в середине процедуры PL/SQL, то вы не будете объединять строки. Это скорее будет выглядеть так
Но что-то из вашего вопроса говорит мне, что вы составляете строку, которую хотите execute immediate .
В этом случае вы должны убедиться, что даете цитаты:
Вам нужно избежать одинарной кавычки ( ' ) с двумя кавычками подряд ( '' )
Но если ваши строки уже содержат кавычки вокруг него, если null вы можете захотеть работать с nvl таким образом
Похожие вопросы:
Как добавить / вставить пустую / пустую строку в электронную таблицу google с помощью скрипта приложения? Я пытался: var ss = SpreadsheetApp.create(test); var sheet = ss.getActiveSheet();.
У меня есть следующий код, который привязан к @Html.DropDownListFor : ViewModel public static UserManagementViewModel CreateCompanyMappingViewModel(List<Company> company)
Как оставить пустую строку в GtkGrid Я хочу создать gtkgrid с кнопками, как в Примере: 0 1 2 3 ------------------------------------------ 0 | | button2 | - button1 ------------------------------- 1.
У меня есть переменная типа StringBuffer, которая имеет символ null, то есть промежуточное значение' \0'. Я могу правильно напечатать переменную с символом null. Но когда я пытаюсь вставить эту.
dput (head(dat, 10)) structure(list(DATE = c(14-04-2013 00:02:30, 14-04-2013 00:03:00, 14-04-2013 00:03:30, 14-04-2013 00:04:00, 14-04-2013 00:04:30, 14-04-2013 00:05:00, 14-04-2013 00:05:30.
Я пытаюсь вставить данные с помощью этого оператора SQL в таблицу Oracle, но получаю ошибку отсутствующей правой скобки: insert into new_table T (T.DATE, T.SERVER, T.value1, T.value2) VALUES.
В соответствии с этим постом вставить строку между различными данными я могу вставить пустую строку данных между некоторыми строками в электронной таблице (на основе условия). Я пытаюсь сделать этот.
Я пытаюсь вставить пустую строку в ненулевой столбец в Oracle, но не получается. Вот в чем дело: create table trademark ( name varchar2(100) not null ); insert into trademark (name) values.
Я пишу хранимые процедуры, которые вызываются устаревшей системой. Одно из ограничений прежней системы заключается в том, что в одном наборе результатов, возвращаемом из сохраненного процесса, должна быть хотя бы одна строка. Стандарт заключается в том, чтобы вернуть ноль в первом столбце (да, я знаю!).
Очевидный способ добиться этого - создать временную таблицу, поместить в нее результаты, проверить все строки в временной таблице и вернуть либо результаты из временной таблицы, либо единственный пустой результат.
Другим способом может быть создание EXISTS для того же предложения where, которое находится в главном запросе перед выполнением основного запроса.
Ни один из них не очень удовлетворяет. Может ли кто-нибудь придумать лучший способ. Я размышлял в духе UNION вроде этого (я знаю, это не работает):
Это старый вопрос, но у меня была та же проблема . Решение действительно простое, БЕЗ двойного выбора:
"WITH TIES" вы получаете ВСЕ строки (все имеют 1 как "orderdummy", поэтому все являются связями), или, если результата нет, вы получаете значение по умолчанию.
Боюсь, вариантов очень мало.
Вы всегда должны дотронуться до таблицы дважды, будь то COUNT, EXISTS before, EXISTs в UNION, предложение TOP и т.д.
Решение EXISTS лучше, чем COUNT, потому что оно остановится, когда найдет строку. COUNT будет пересекать все строки, чтобы фактически посчитать их
Это ответ @ swe, только лучше отформатированный.
Вы можете использовать полное внешнее соединение. Что-то с эффектом .
В настоящее время я тестирую производительность по этому сценарию, поэтому не уверен, какое влияние это окажет, но он даст вам пустую строку с заполненной категорией.
Чтобы не дублировать выбранный запрос, как насчет временной таблицы, чтобы сначала сохранить результат запроса? И, основываясь на временной таблице, вернуть строку по умолчанию, если временная таблица пуста, или вернуть временную, если она имеет результат?
Я думаю, вы могли бы попробовать:
Недостатком является то, что вы эффективно выполняете свой запрос дважды, а с другой стороны, вы пропускаете временную таблицу.
SQL оператор INSERT используется для вставки записей в существующую таблицу.
Синтаксис этого оператора следующий:
Создадим тестовую таблицу
Давайте создадим таблицу table1 со столбцами a, b, c в нашей MySQL базе данных:
Запрос на вставку строки
Простой запрос, который вставляет строку со столбцами 111, 222 и 333 выглядит так:
Еще один способ сделать то же самое:
Столбцы, которые вы не перечислите заполняются значениями по умолчанию, которые вы предусматриваете при создании таблицы, даже если это просто NULL.
У таблиц обычно есть поле id с первичным ключом (PRIMARY KEY) таблицы. Если этому полю установлено значение AUTOINCREMENT т.е. оно заполняется автоматически, то в таком случае вы не должны его перечислять в списке столбцов оператора INSERT.
Вставка без перечисления столбцов
Если количество значений, которые мы вставляем = количеству столбцов в таблице, то можно не перечислять столбцы, и наш запрос может выглядеть так:
Этот способ крайне не рекомендуется. Дело в том, что со временем вы можете менять таблицы, например добавлять в них новые столбцы, а это значит, что все запросы записанные таким способом просто перестанут работать и вам придется менять их по всему вашему приложению. Поэтому, навсегда забываем этот способ. Я его привел, только чтобы вы так не делали.
Вставка сразу нескольких строк с помощью INSERT INTO
Если нам нужно вставить несколько строк, то мы просто перечисляем группы значений через запятую выглядит это так:
Таким образом мы вставили 3 строки в нашу таблицу table1. Их может быть и больше. В MySQL четкого предела нет, однако он все таки существует и зависит от параметра max_allowed_packet который ограничивает размер запроса. Если вы установите SET GLOBAL max_allowed_packet=524288000; то размер запроса будет ограничен 500MB но делайте это в очень крайнем случае. Обычно всегда можно найти решение и разделить 1 большой запрос, на несколько более мелких и вставлять например не больше 1000 строк за один цикл.
Как вставить значение из другой таблицы INSERT INTO . SELECT .
Допустим у нас есть еще одна таблица table2 которая по структуре точно такая же как и первая. Нам в таблицу table2 нужно вставить все строки из table1.
Вставляем значения из table1 в таблицу table2:
Если вы делаете не какую-то единичную вставку при переносе данных, а где-то сохраните этот запрос, например в вашем PHP скрипте, то всегда перечисляйте столбцы.
Как не рекомендуется делать (без перечисления столбцов):
Если у вас со временем изменится количество столбцов в таблице, то запрос перестанет работать. При выполнении запроса MySQL в лучшем случае просто будет возвращать ошибку:
Либо еще хуже: значения вставятся не в те столбцы.
Вставка из другой таблицы с условием INSERT INTO . SELECT . WHERE .
А теперь представим, что нам нужно вставить только те строки из table1, у которых столбец "c" равен 333. Тогда наш запрос будет выглядеть так
То есть мы просто вставляем данные в таблицу, которые выбрали из другой таблицы при помощи обычного SELECT запроса
Теперь представим, что у нас в таблице table2 - 4 столбца, а в table1 - 3. При этом четвертый столбец в table2 обязательный. Чтобы выйти из этой ситуации, нужно передать какое-нибудь подходящее значение в этот лишний столбец. У нас чисто абстрактная задача, поэтому давайте передадим туда просто единицу.
Теперь в столбец d у нас записалась единица и проблема решена.
Вставка в определенный раздел INSERT INTO . PARTITION .
Если вам нужно вставить строки в определенный раздел таблицы, то нужно после таблицы указать PARTITION (название раздела), например так:
Вставка в несколько разделов. Первая строка вставляется в раздел p1, а вторая в p2
Вставка строк, некоторые из которых уже существуют в целевой таблице
Существование строк определяется по значению уникальных ключей. В зависимости от ситуации мы можем выбрать разные способы поведения при совпадении значений уникальных столбцов.
Игнорирование INSERT IGNORE INTO
Например если мы вставляем строку с PK = 1, и при этом в таблице уже есть PK = 1 то MySQL выдаст ошибку:
Выполнение запроса на этом прервется, однако нам в некоторых случаях хотелось бы просто вставить данные, игнорируя ошибки. В этом нам поможет INSERT IGNORE INTO:
Просто добавляем IGNORE в наш запрос и ошибки будут игнорироваться
Вставка с заменой существующих значений REPLACE INTO
REPLACE работает также INSERT, но если совпадают уникальные ключи, то старая строка (или строки!) удаляется до вставки новой.
В таком случае наш пример выглядит следующим образом:
Обновление некоторых полей, при существовании строк ON DUPLICATE KEY UPDATE
При совпадении ключей, мы можем также заменить некоторые или все поля в строке.
Наш запрос будет выглядеть так:
В данном примере если у нас какой-то уникальный ключ совпадает, то мы не производим вставку, а обновляем существующую строку или строки путем присваивания столбцу "c" значения, которое у нас перечислено в VALUES.
Иными словами, если ключ совпадает, то мы просто обновим данные столбца "с" а остальные столбцы трогать не будем.
Иногда нам нужно при совпадении ключей обновить все значения. Этом можно сделать просто перечислив все столбцы:
При обновлении столбцов мы также можем использовать разные выражения, например:
Выражения для вставляемых значений в VALUES
При вставке значений, мы можем использовать выражения и даже использовать в своих выражениях значения других столбцов.
Пример использования выражений:
Таким образом мы для формирования столбца "c" использовали столбцы "a" и "b".
Приоритет вставки INSERT LOW_PRIORITY / HIGH_PRIORITY
Установление приоритета нужно для решение проблем с конкурентными вставками. При вставках происходит блокировка строк и если 2 INSERT запроса требуют блокировки одних и тех же строк, для своего выполнения, то иногда может потребоваться повысить или понизить приоритет некоторых запросов, по отношению к другим. Это можно сделать указав приоритет LOW_PRIORITY или HIGH_PRIORITY
Читайте также: