如消息所述,错误的直接原因是您的值太多;也就是说,您的values
子句中的元素多于列。最好明确列出列名以避免将来出现问题和混淆,所以你真的在这样做:
insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate,'YYYY/MM/DD:HH:MI:SSAM')
... sp 你有四列,但有五个值。您正在尝试将当前日期/时间作为字符串插入,因此您需要使用该to_char()
函数:
insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',
to_char(sysdate,'YYYY/MM/DD:HH:MI:SSAM'))
但是将日期(或任何其他结构化数据,例如数字)存储为字符串是一种不好的做法。如文档所述:
Oracle 数据库处理的每个值都有一个数据类型。值的数据类型将一组固定的属性与该值相关联。这些属性导致 Oracle 将一种数据类型的值与另一种数据类型的值区别对待。例如,您可以添加 NUMBER 数据类型的值,但不能添加 RAW 数据类型的值。
如果使用字符串,则可以放入无效值。如果使用正确的DATE
数据类型,则不会意外放入无效或混乱的值。Oracle 还能够优化列的使用,并且能够安全有效地比较值。尽管您使用的格式比某些格式要好,但使用字符串比较您仍然无法轻松比较两个值以查看哪个更早,因此您无法正确按date_time
列排序。
假设您插入了两行带有值2013/11/15:09:00:00AM
和2013/11/15:08:00:00PM
- 哪个更早?您需要查看 AM/PM 标记才能意识到第一个更早;使用字符串比较你会弄错,因为8
会在9
. 使用HH24
代替HH
并AM
避免这种情况,但仍然比真实日期效率低。
如果您需要存储带有时间组件的日期,您可以使用DATE
数据类型,它的精度可以精确到秒;或者如果您也需要小数秒,那么您可以使用TIMESTAMP
. 那么你的表格和插入将是:
create table HR (type varchar2 (20), raised_by number (6),
complaint varchar2 (500), date_time date);
insert into HR (type, raised_by, complaint, date_time)
values ('request',6785,'good morning',sysdate);
作为查询的一部分,您仍然可以获取所需格式的值以用于显示目的:
select type, raised_by, complaint,
to_char(date_time, 'YYYY/MM/DD:HH:MI:SSAM') as date_time
from HR
order by date_time;
TYPE RAISED_BY COMPLAINT DATE_TIME
-------------------- ---------- -------------------- ---------------------
request 6785 good morning 2013/11/15:08:44:35AM
仅将日期视为字符串以进行显示。