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;
您可以使用 NOLOGGING 和 PARALLEL 来提高性能。
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 当 UPDATE 返回 BULK COLLECT INTO 用户创建的 TYPE TABLE 时出现“没有足够的值”