Вставлено 0 строк - Как я могу это исправить? - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь вставить несколько строк в таблицу SQL, Oracle, хотя SQL Developer v3.0.04

База данных была настроена Uni, поэтому я не знаю, какая это версия.

после просмотра он-лайн я пришел с приведенным ниже кодом, но он не вставит никаких данных.Я проверил вставку только с одной строкой, и это нормально.Чего мне не хватает?

Insert all 
  Into Patient Values
    ('101', '1 house', Null, 'Kingston', 'Surrey', 'KT1 1XX', '10/jan/1980', 'm', 01452987456)
  Into Patient Values
    ('102', '2 egg rd', 'vail', 'guildford', 'Surrey', 'GU1 1LL', '05/dec/1985', 'm', 01452987456)
  Into Patient Values
    ('103', '6 station rd', Null, 'guildford', 'Surrey', 'GU1 2XX', '15/may/1990', 'f', 01452987456)

Select * from Patient;

Ответы [ 2 ]

6 голосов
/ 09 марта 2012

INSERT ALL имеет два различных использования.Одним из них является вставка различных подмножеств выбранных столбцов в таблицу.Другой состоит в том, чтобы направить ряды в разные по определенным критериям.В обоих случаях данные поступают из предложения SELECT, а не из VALUES. См. Примеры в документации .

Обычно вы просто пишете несколько операторов INSERT, потенциально в одном блоке PL / SQL.Что-то вроде

begin
  Insert Into Patient Values
    ('101', '1 house', Null, 'Kingston', 'Surrey', 'KT1 1XX', '10/jan/1980', 'm', 01452987456);
  Insert Into Patient Values
    ('102', '2 egg rd', 'vail', 'guildford', 'Surrey', 'GU1 1LL', '05/dec/1985', 'm', 01452987456);
  Insert Into Patient Values
    ('103', '6 station rd', Null, 'guildford', 'Surrey', 'GU1 2XX', '15/may/1990', 'f', 01452987456);
end;
/

Если вы действительно хотите сделать это в одном операторе SQL, вы можете сделать INSERT ... SELECT, но это, как правило, будет более сложным, чем использование трех отдельных операторов.

insert into patient
  select *
    from (select '101' id, '1 house' addr, null col1, 'Kingston' city, ...
            from dual
          union all
          select '102', '2 egg rd', 'vail', 'guildford', 'Surrey', 'GU1 1LL', '05/dec/1985', 'm', 01452987456
            from dual
          union all
          select '103', '6 station rd', Null, 'guildford', 'Surrey', 'GU1 2XX', '15/may/1990', 'f', 01452987456
            from dual)

Я бы также предостерег вас от использования правильных типов данных и указания имен столбцов в вашем операторе INSERT.Я предполагаю, например, что первый столбец таблицы Patient является своего рода PatientID, который определяется как NUMBER.Если это так, вы действительно хотите вставить число, а не строку символов.Точно так же седьмой столбец со значениями, такими как «15 / май / 1990», вероятно, определен как DATE в таблице.Если это так, ваш INSERT должен вставить DATE не символьную строку, либо явно вызвав TO_DATE с определенной маской формата, либо используя формат даты ANSI, то есть date '1980-01-10'.И если вы хотите, чтобы последний столбец сохранил ведущий 0, вам нужно убедиться, что столбец в базе данных определен как VARCHAR2 и что вы вставляете символьную строку вместо числа.

1 голос
/ 09 марта 2012

Интересно. Можно использовать insert all для вставки нескольких строк при попытке. Не то, чтобы я рекомендовал делать это над предлагаемыми решениями Джастина.

Синтаксическая диаграмма для вставки из нескольких таблиц указывает, что подзапрос всегда требуется. Однако вам не нужно использовать какие-либо результаты подзапроса:

SQL> drop table t;

Table dropped.

SQL> create table t (c1 number, c2 varchar2(10));

Table created.

SQL> insert all into t (c1, c2) values (1, 'one')
  2      into t (c1, c2) values (2, 'two')
  3  select * from dual;

2 rows created.

SQL> select * from t;

        C1 C2
---------- ----------
         1 one
         2 two

Два into ... values(...) приведут к вставке двух строк на строку в подзапросе:

SQL> insert all into t (c1, c2) values (1, 'one')
  2      into t (c1, c2) values (2, 'two')
  3  select * from dual
  4  connect by level <= 10;

20 rows created.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...