я получил ошибку ORA-01747 при вставке данных в таблицу

#oracle #dml #ora-01747

Вопрос:

у меня возникли проблемы при вставке данных с помощью этого запроса :

 INSERT ALL 
   INTO obat ('id_obat','nama_obat','tanggal_kadarluarsa','stock','harga') 
   VALUES (1, 'Indomethacin', '2023-09-01', 50, 3000)
   SELECT * FROM dual;
 

это запрос к таблице :

 CREATE TABLE obat (
    id_obat             INTEGER NOT NULL,
    nama_obat           VARCHAR2(255) NOT NULL,
    tanggal_kadarluarsa DATE NOT NULL,
    stock               INTEGER NOT NULL,
    harga               NUMBER(20, 2) NOT NULL,
    CONSTRAINT obat_pk PRIMARY KEY ( id_obat )
);
 

что-то не так с моим кодом?

Ответ №1:

Одинарные кавычки предназначены для строковых литералов; идентификаторы (например, имена столбцов) должны быть в двойных кавычках, но только в том случае, если они были созданы как идентификаторы в кавычках, и тогда регистр имени должен точно соответствовать имени словаря данных. Ваши идентификаторы не указаны в инструкции create, поэтому вы можете просто сделать:

 INSERT ALL 
   INTO obat (id_obat,nama_obat,tanggal_kadarluarsa,stock,harga) 
   VALUES (1, 'Indomethacin', DATE '2023-09-01', 50, 3000)
   SELECT * FROM dual;
 

Если вы действительно хотите процитировать их, вам нужно будет это сделать (включая имя таблицы для демонстрации, поскольку применяются те же правила).:

 INSERT ALL 
   INTO "OBAT" ("ID_OBAT","NAMA_OBAT","TANGGAL_KADARLUARSA","STOCK,HARGA") 
   VALUES (1, 'Indomethacin', DATE '2023-09-01', 50, 3000)
   SELECT * FROM dual;
 

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

Вы можете прочитать больше об идентификаторах в кавычках и без кавычек в документации.

С помощью одной строки , которая вам на самом деле не нужна ALL , вы также можете сделать:

 INSERT INTO obat (id_obat,nama_obat,tanggal_kadarluarsa,stock,harga) 
VALUES (1, 'Indomethacin', DATE '2023-09-01', 50, 3000)
 

Обратите внимание, что я добавил DATE ключевое слово в эти инструкции; '2023-09-01' это не дата, это строковый литерал, поэтому вы полагаетесь на то, что Oracle неявно преобразует его в фактическую дату на основе настроек NLS вашего текущего сеанса. С DATE '2023-09-01' этим теперь буквальное значение даты. Опять же, в документации есть еще кое-что.

Комментарии:

1. Спасибо, теперь я все понял.