当单个列包含更多字符时,插入到不在oracle中工作



我创建了一个表作为:

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中那些长文本的最佳数据类型是什么?

1968-12-08是字符串,您需要在表中插入日期。

无论何时使用日期,都需要将字符串转换为日期。

有两种方法可以将字符串转换为日期。

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

干杯!!

BIRTHDATE是一个DATE,而不是varacar,因此需要将其转换为:

to_date('1968-12-08', 'yyyy-mm-dd')

很明显,你不能指望把300个字符长的东西放进接受100个字符的东西里,是吗?

但是,这不是你的问题。日期为。第4列为birthdate,其数据类型为date,但您正在其中插入一个字符串,因为'1968-12-08'是一个字符串。您应该使用日期文字,即date '1968-12-08'

哦,是的,回到你最初的问题(尽管在这种情况下是错误的(:长文本的最佳数据类型。您可以创建一个数据类型为VARCHAR2(4000)的列,它很乐意接受您使用的"长"字符串。或者,您甚至可以选择一个CLOB,它最多可接受4 GB的字符;我想对你来说已经绰绰有余了。

最后,您的查询:

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行中的日期文字以及第5行中的substr函数(将字符串长度限制为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>

在这种情况下,我建议简单地将NOTES列变大:

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

dbfiddle here

如果您需要比此更大的数据,可以使用CLOB数据类型。

最新更新