【问题标题】:Why am I getting an "invalid identifier" oracle error running this code?为什么我在运行此代码时收到“无效标识符”oracle 错误?
【发布时间】:2019-10-28 07:57:11
【问题描述】:

我正在尝试运行以下代码,但我收到 cb.state 的无效标识符错误,我不明白为什么?

INSERT INTO DWCUST (DWCUSTID, DWSOURCEIDBRIS, DWSOURCEIDMELB, FIRSTNAME, SURNAME, GENDER, PHONE, POSTCODE, CITY, STATE, CUSTCATNAME)
SELECT dwcustSeq.nextval, cb.custid, cm.custid, cb.fname, cb.sname, cb.gender, 
        cb.phone, cb.postcode, cb.city, cb.state, cc.custcatname
   FROM a2custbris cb
NATURAL JOIN a2custcategory cc
NATURAL JOIN a2custmelb cm
  WHERE cb.rowid NOT IN ( SELECT source_rowid FROM A2ERROREVENT );

如果有帮助的话,state 和 cb.state 在 Oracle 中是蓝色文本,我不知道为什么。

预期结果:

没有错误,行添加到 dwcust

实际结果:

SQL 错误: ORA-00904:“cb.state”:标识符无效 00904. 00000 - "%s: 无效标识符"

非常感谢任何帮助!

【问题讨论】:

  • 您使用什么工具来运行此语句?像 Oracle SQL Developer 这样的 IDE? state 是 Oracle 中的关键字,SQL Developer 会将其突出显示为关键字(它不是保留字,因此可以将其用作列名)。有趣的是 ORA-00904 消息的 "cb.state" 小写,如果它是普通语句中的普通列,则消息将是 ORA-00904: "CB"."STATE": invalid identifier 00904. 00000 - "%s: invalid identifier" 。所以我认为你没有告诉我们一些重要的事情。
  • 我发现了这个:stackoverflow.com/questions/20242329/… 如果您尝试应用第二个答案(获得最多票数)...也许会有所帮助...

标签: sql oracle sql-insert


【解决方案1】:

表示别名为cb (a2custbris) 的表不包含名称为state 的列。

如果您在表格中看到它,请注意字母大小写。如果它被创建为将列名括在双引号中(您会看到它们不是大写,这是默认设置),那么您每次引用该列时都必须使用相同的字母大小写,例如

select cb."state"
from a2custbris cb

[编辑:关于无效号码]

这就是你正在做的:

INSERT INTO DWCUST (DWCUSTID,         --> dwcustseq.nextval
                    DWSOURCEIDBRIS,   --> cb.custid
                    DWSOURCEIDMELB,   --> null
                    FIRSTNAME,        --> cb.fname
                    SURNAME,          --> cb.sname
                    GENDER,           --> upper(cb.gender)
                    PHONE,            --> cb.phone
                    POSTCODE,         --> cb.postcode
                    CITY,             --> cb.city
                    STATE,            --> cb.state
                    CUSTCATNAME)      --> cc.custcatname

注意前 3 列:那些对我来说看起来很可疑:

INSERT INTO DWCUST (DWCUSTID,         --> dwcustseq.nextval
                    DWSOURCEIDBRIS,   --> cb.custid
                    DWSOURCEIDMELB,   --> null

一切都匹配,但那 3 个不匹配。 cb.custid不应该进入dwcustid吗?

【讨论】:

  • 即使我使用双引号也不起作用。状态确实存在于 a2custbris 中。 cb 上有一条红线,上面写着“CB 与连接图的其余部分断开连接”。这可能是它不起作用的原因吗?
  • 你能发布表格描述吗?我不知道“CB 与连接图的其余部分断开连接”是什么意思,我从未在 Oracle 中看到过这样的消息。
  • 我不知道你所说的表描述是什么意思,但这里是它的 sql: CREATE TABLE A2CUSTBRIS ( CUSTID NUMBER(, 0) NOT NULL , FNAME VARCHAR2(30 BYTE) , SNAME VARCHAR2(30 BYTE) , GENDER VARCHAR2(10 BYTE) , PHONE VARCHAR2(20 BYTE) , STREET_ADDRESS VARCHAR2(50 BYTE) , POSTCODE NUMBER(4, 0) , CITY VARCHAR2(50 BYTE) , State VARCHAR2(10 BYTE) , CUSTCATCODE NUMBER(, 0) )
  • 是的,这是表格描述,谢谢。没什么奇怪的 - 至少,不是 STATE 列。尝试重写它,以避免 NATURAL JOIN 并在某些列上实际 join 那些表(我不知道它们是哪些)。
  • 好吧,我似乎已经解决了收到此错误的问题。但现在我得到了一个不同的错误。你介意我打扰你吗?
猜你喜欢
  • 2021-07-08
  • 1970-01-01
  • 2021-03-21
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 2015-09-06
  • 2010-09-15
相关资源
最近更新 更多