ORA-00947 - 没有足够的值: 发生在一个服务器上但不在另一个服务器上

Posted

技术标签:

【中文标题】ORA-00947 - 没有足够的值: 发生在一个服务器上但不在另一个服务器上【英文标题】:ORA-00947 - not enough values: Occurs in one server but not another 【发布时间】:2015-10-07 05:54:53 【问题描述】:

我正在处理一个必须向现有表添加一列的项目。 是这样的:

旧的 TBL 布局

OldTbl(
  column1 number(1) not null,
  column2 number(1) not null 
);

创建新 TBL 的 SQL

create table NewTbl(
  column1 number(1) not null,
  column2 number(1) not null,
  **column3 number(1)**
);

当我尝试通过下面的 SQL 插入数据时, 在一台oracle服务器上,成功执行, 但在另一台 oracle 服务器上,我收到“ORA-00947 错误:没有足够的值”

insert into NewTbl select
column1,
column2
from OldTbl;

是否有任何oracle选项可能导致oracle出现这种差异?

【问题讨论】:

newtbl 有三列,但您只提供其中两列的值。请阅读手册以了解insert 语句的正确语法。 【参考方案1】:

ORA-00947: 值不足

这是您收到的错误,这意味着您的表实际上包含的列数比您在 INSERT 中指定的要多。

也许,您没有在任一服务器中添加该列。

INSERT 还有一个不同的语法,更易读。在这里,您还提到了列名。因此,当发出这样的 SQL 时,除非错过了 NOT NULL 列,否则 INSERT 仍然有效,在错过的列中更新了 null

INSERT INTO TABLE1
(COLUMN1,
 COLUMN2)
SELECT
COLUMN1,
 COLUMN2
 FROM
 TABLE2

【讨论】:

非常感谢。当我尝试同时指定 select 和 into 列时,它起作用了。【参考方案2】:
insert into NewTbl select
column1,
column2
from OldTbl;

上面的查询是错误的,因为你的新表有三列,但是你的选择只列出了两列。如果列的数量和顺序相同,那么您可以实现它。

如果列数列顺序不同,则必须以正确的顺序明确列出列名。

我更喜欢CTAS(create table as select) 这里,它会比插入更快。

CREATE TABLE new_tbl AS
SELECT column1, column2, 1 FROM old_tbl;

您可以使用 NOLOGGINGPARALLEL 来提高性能。

CREATE TABLE new_tbl NOLOGGING PARALLEL 4 AS
SELECT column1, column2, 1 FROM old_tbl;

这将创建一个包含 3 列的新表,前两列将包含旧表中的数据,第三列将所有行的值为 1。您可以根据自己的选择为第三列保留任何值。我将其保留为 1,因为您希望将第三列作为数据类型 NUMBER(1)。

【讨论】:

非常感谢!下次我会尝试使用CATS。

以上是关于ORA-00947 - 没有足够的值: 发生在一个服务器上但不在另一个服务器上的主要内容,如果未能解决你的问题,请参考以下文章

SQL 错误:ORA-00947:没有足够的值 - 尝试使用默认值

Oracle 选择变量,错误 ORA-00947 没有足够的值

ORA-00947: 将值放入过程中的类型时没有足够的值

ORA-00947 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”

向Oracle数据库插入数据时提示 ora-00947: 没有足够的值

向oracle数据库中添加数据时提示ORA-00947: 没有足够的值