ORA-00947 - недостаточно значений: происходит на одном сервере, но не на другом

Я работаю над проектом, который должен добавить один столбец к существующей таблице. Это так:

СТАРЫЙ Макет TBL

OldTbl(
  column1 number(1) not null,
  column2 number(1) not null 
);

SQL для создания нового TBL

create table NewTbl(
  column1 number(1) not null,
  column2 number(1) not null,
  **column3 number(1)**
);

Когда я пытаюсь вставить данные с помощью SQL ниже, на одном сервере Oracle, он был успешно выполнен, но на другом сервере Oracle, я получил "Ошибка ORA-00947: недостаточно значений"

insert into NewTbl select
column1,
column2
from OldTbl;

Есть ли какой-нибудь вариант оракула, может вызвать такую ​​разницу в оракуле?

2 ответа

Решение

ORA-00947: недостаточно значений

это ошибка, которую вы получили, что означает, что ваша таблица на самом деле имеет больше столбцов, чем вы указали в INSERT,

Возможно, вы не добавили столбец ни на одном из серверов.

Существует также другой синтаксис для INSERT, который является более читабельным. Здесь вы также упоминаете имена столбцов. Таким образом, когда такой SQL выдается, если NOT NULL столбец пропущен, INSERT все еще работаю, имея null обновлено в пропущенных столбцах.

INSERT INTO TABLE1
(COLUMN1,
 COLUMN2)
SELECT
COLUMN1,
 COLUMN2
 FROM
 TABLE2
insert into NewTbl select
column1,
column2
from OldTbl;

Вышеприведенный запрос неверен, потому что ваша новая таблица имеет три столбца, однако, ваш выбор имеет только два столбца в списке. Если бы число и порядок столбцов были одинаковыми, то вы могли бы достичь этого.

Если количество столбцов и порядок столбцов различны, необходимо явно перечислить имена столбцов в правильном порядке.

Я бы предпочел CTAS(создать таблицу как select), это было бы быстрее, чем вставка.

CREATE TABLE new_tbl AS
SELECT column1, column2, 1 FROM old_tbl;

Вы можете использовать NOLOGGING и PARALLEL для увеличения производительности.

CREATE TABLE new_tbl NOLOGGING PARALLEL 4 AS
SELECT column1, column2, 1 FROM old_tbl;

Это создаст новую таблицу с 3 столбцами, первые два столбца будут иметь данные из старой таблицы, а третий столбец будет иметь значение 1 для всех строк. Вы можете сохранить любое значение для третьего столбца по вашему выбору. Я сохранил его как 1, потому что вы хотели третий столбец как тип данных NUMBER(1).

Другие вопросы по тегам