【问题标题】:ORA-00947: Not enough values. Can anyone give me solution plzORA-00947: 值不足。谁能给我解决方案lz
【发布时间】:2021-07-12 10:39:03
【问题描述】:
insert into challen_header 
values('CH9001',019001,TO_DATE('DD-MM-YYYY','12-12-95','Y'));

insert into challen_header 
values('CH865',016865,TO_DATE('DD-MM-YYYY','12-11-95','Y'));

insert into challen_header 
values('CH3965',019001,TO_DATE('DD-MM-YYYY','12-10-95','Y'));

select * from challen_header;

我收到此错误:

从第 1 行开始的错误在命令中

插入 challen_header 值('CH9001',019001,TO_DATE('DD-MM-YYYY','12-12-95','Y'))
命令行错误:1 列:13
错误报告
SQL 错误:ORA-00947:值不足
00947. 00000 - “没有足够的值”

有人对此有解决方案吗?我正在使用 SQL Developer。

表结构:

CREATE TABLE Challen_header
(
    challen_no varchar2(6) primary key,
    s_order_no varchar2(6),
    foreign key(s_order_no) references sales_order(s_order_no),
    Challen_date date not null,
    billed_yn char default 'N' check(billed_yn = 'Y' or billed_yn = 'N')
);

这是我要创建的表。

【问题讨论】:

  • 始终在INSERT 语句中明确列出目标列!那么造成这种情况的原因就很明显了……
  • 是语法 TO_DATE('DD-MM-YYYY','12-12-95','Y') 对吗?
  • 请张贴表结构
  • TO_DATE 是错误的。您应该首先显示日期字符串,例如 '12-12-95' - 然后当您在输入中使用两位数年份时,不要告诉 Oracle 格式是 'DD-MM-YYYY' 来欺骗 Oracle细绳。您可能想要“DD-MM-RR”。那么 - TO_DATE 末尾的“Y”是什么?那应该是另一列的值吗?你把它显示在TO_DATE 里面,这是没有意义的。
  • 所以 - 好的;从TO_DATE 中取出“Y”和“N”,并修复TO_DATE。那么,您确定这些日期是 DAY-MONTH,而不是 MONTH-DAY?你有 12 月 12 日、11 月 12 日、10 月 12 日吗?不是 12 月 12 日、12 月 11 日、12 月 10 日 - 在您的示例中?

标签: sql oracle oracle11g


【解决方案1】:

试试这个: 插入 challen_header 值('CH9001','019001',TO_DATE('DD-MM-YYYY','12-12-1995','Y'))

【讨论】:

    【解决方案2】:

    请将您的插入查询更新为 -

    INSERT INTO challen_header(challen_no, s_order_no, Challen_date, billed_yn) 
                        VALUES('CH9001', '019001', TO_DATE('12-12-1995', 'DD-MM-YYYY', 'Y'));
    

    【讨论】:

    • 不 - 还有第四列,即 OP 帖子中的“Y”(他放错地方了)。
    【解决方案3】:

    我建议你做的更仔细,更有条理。这么说,我的意思是:

    • 名称限制;否则,他们将获得 Oracle 的 默认 名称(例如 SYS_C007618,它什么都不告诉你)
    • 如果您决定使用轮廓约束,则将它们全部放在create table 脚本的末尾。否则,如果你“混合”列和约束,你很容易混淆,第一眼看不出哪个是哪个
    • 始终命名您正在插入(或更新或选择)的所有列。否则,您不知道您实际将哪个值插入到哪一列中)
    • 注意数据类型
      • 如果要插入字符串,请将它们括在单引号中
      • 如果要插入日期,请​​使用
        • 日期文字(始终采用date 'yyyy-mm-dd' 格式),或
        • 正确的TO_DATE函数;不要编造自己的语法

    这是我的建议,看看我是如何做到的,并尝试遵循它。

    主表优先(仅必要的列):

    SQL> create table sales_order
      2    (s_order_no varchar2(6) constraint pk_sal_ord primary key);
    
    Table created.
    
    SQL> insert into sales_order (s_order_no) values ('019001');
    
    1 row created.
    
    SQL>
    

    现在,明细表:

    SQL> create table challen_header
      2    (challen_no    varchar2(6)      constraint pk_chall_head primary key,
      3     s_order_no    varchar2(6)      constraint fk_chall_head_order references sales_order(s_order_no),
      4     challen_date  date             not null,
      5     billed_yn     char default 'N' constraint ch_chall_head check(billed_yn in ('Y', 'N'))
      6    );
    
    Table created.
    
    SQL> insert into challen_header
      2    (challen_no, s_order_no, challen_date, billed_yn)
      3     values('CH9001',
      4            '019001',           --> enclose it into single quotes
      5            date '1995-12-12',  --> date literal, always YYYY-MM-DD
      6            'Y'
      7           );
    
    1 row created.
    
    SQL>
    

    【讨论】:

    • 非常感谢。
    【解决方案4】:

    表格中有四列。您在INSERT 中省略了列列表,然后错误地在VALUE 子句中给出了太少的值。然后,在插入日期常量时,使用日期文字。不必改用字符串,用TO_DATE进行转换。

    insert into challen_header 
      (challen_no, s_order_no, challen_date, billed_yn)
    values
      ('CH865', 016865, DATE '1995-11-12' 'Y');
                        ^---------------^  this is a date literal
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-16
      • 1970-01-01
      • 2012-04-30
      • 2020-01-25
      • 1970-01-01
      • 2019-01-27
      相关资源
      最近更新 更多