Вставить в не работает в оракуле, когда один столбец имеет больше символов - PullRequest
0 голосов
/ 03 ноября 2019

Я создал таблицу как:

CREATE TABLE SHOP.EMPLOYEES
(
    EMPLOYEEID NUMBER(11)         NOT NULL,
    LASTNAME   VARCHAR2(255 BYTE) DEFAULT NULL,
    FIRSTNAME  VARCHAR2(255 BYTE) DEFAULT NULL,
    BIRTHDATE  DATE               DEFAULT NULL,
    PHOTO      VARCHAR2(255 BYTE) DEFAULT NULL,
    NOTES      VARCHAR2(100 BYTE) DEFAULT NULL
)

У меня есть столбец notes, который содержит более 100 символов. Итак, я попытался:

INSERT INTO shop.employees (EmployeeID, LastName, FirstName, BirthDate, Photo, Notes) 
VALUES (1, 'Davolio', 'Nancy', '1968-12-08', 'EmpID1.pic', 'Education includes a BA in psychology from Colorado State University. She also completed (The Art of the Cold Call). Nancy is a member of Toastmasters International.')

Но яПолучение ошибки:

Ошибка в строке 1
ORA-01861: литерал не соответствует строке формата

Какой тип данных может быть лучшим для этого длинного текста вOracle?

Ответы [ 4 ]

3 голосов
/ 03 ноября 2019

1968-12-08 является строкой, и вам нужно вставить дату в вашу таблицу.

Преобразование строки в дату необходимо при любом использовании даты.

Существует два способа преобразования вашей даты. строка на сегодняшний день.

  1. DATE '1968-12-08'
  2. TO_DATE('1968-12-08', 'YYYY-MM-DD')

Ура !!

1 голос
/ 03 ноября 2019

BIRTHDATE - это ДАТА, а не варачар, поэтому вам нужно преобразовать ее:

to_date('1968-12-08', 'yyyy-mm-dd')
0 голосов
/ 03 ноября 2019

В этом случае я предлагаю просто увеличить столбец NOTES:

ALTER TABLE SHOP.EMPLOYEES
  MODIFY (NOTES VARCHAR2(4000));

dbfiddle здесь

Если вам нужно нечто большее, чем это, вы можете использоватьCLOB тип данных.

0 голосов
/ 03 ноября 2019

Очевидно, что вы не можете рассчитывать на то, чтобы поместить что-то до 300 символов в то, что принимает 100 символов, не так ли?

Но это не ваша проблема. ДатаЧетвёртый столбец - birthdate, его тип данных - date, но вы вставляете в него строку , потому что '1968-12-08' - это строка. Вместо этого вы должны были использовать литерал даты, то есть date '1968-12-08'.

О, да - вернемся к исходному вопросу (хотя и неправильному в этом контексте): лучший тип данных для длинного текста . Вы можете создать столбец с типом данных VARCHAR2(4000), и он с радостью примет ту «длинную» строку, которую вы использовали. Или вы можете даже выбрать CLOB, который принимает до 4 гига символов;я полагаю, этого более чем достаточно.

Наконец, ваш запрос:

SQL> CREATE TABLE EMPLOYEES
  2  (
  3    EMPLOYEEID  NUMBER(11)                        NOT NULL,
  4    LASTNAME    VARCHAR2(255 BYTE)                DEFAULT NULL,
  5    FIRSTNAME   VARCHAR2(255 BYTE)                DEFAULT NULL,
  6    BIRTHDATE   DATE                              DEFAULT NULL,
  7    PHOTO       VARCHAR2(255 BYTE)                DEFAULT NULL,
  8    NOTES       VARCHAR2(100 BYTE)                DEFAULT null
  9  );

Table created.

Обратите внимание на литерал даты в строке № 4, а также функцию substr в строке № 5 (которая ограничивает длину строкидо 100).

SQL> INSERT INTO employees
  2    (EmployeeID, LastName, FirstName, BirthDate, Photo, Notes)
  3  VALUES
  4    (1, 'Davolio', 'Nancy', date '1968-12-08', 'EmpID1.pic',
  5     substr('Education includes a BA in psychology from Colorado State University. She also completed (The Art of the Cold Call). Nancy is a member
 of Toastmasters International.', 1, 100))
  6  ;

1 row created.

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