使用DEFINE变量执行SQL查询时出现ORA-00904错误,求原因
ORA-00904: "%s: invalid identifier" 错误排查分析
这个ORA-00904错误我碰到过很多次,结合你的查询代码来看,问题大概率出在DEFINE变量的处理上。先把你的代码贴出来方便定位:
DEFINE MEMBER_NR = 1503530453; DEFINE CARD_TYPE = AA; SELECT * FROM CARDS y JOIN PEOPLE p ON p.INDIVIDUAL_ID = y.INDIVIDUAL_ID WHERE p.NR = &MEMBER_NR AND y.TYPE = &CARD_TYPE ORDER BY y.FROMDATE DESC;
你说错误触发在AND y.TYPE = &CARD_TYPE这一行,常见的原因有这些:
字符串类型变量没加单引号(最可能):你定义
CARD_TYPE = AA的时候,没给字符串值加单引号。Oracle的DEFINE变量替换是直接做文本替换,所以这部分最终会变成y.TYPE = AA——Oracle会把AA当成一个列名来解析,而你的CARDS表显然没有叫AA的列,自然就抛出“无效标识符”的错误了。解决方法很简单,定义变量时给字符串加上单引号:DEFINE CARD_TYPE = 'AA';替换后SQL就会变成
y.TYPE = 'AA',Oracle就能正确识别这是个字符串常量了。列名拼写错误(次要排查点):虽然从错误位置来看这个概率很低,但还是可以确认下
CARDS表中是否真的存在TYPE列,有没有拼写错误(比如是不是应该是CARD_TYPE?)。如果列名本身写错了,也会触发同样的错误,但结合你的错误指向变量替换后的AA,这个情况可以放在最后排查。变量值包含特殊字符(罕见情况):如果你的变量值有空格、特殊符号之类的,可能会导致替换后的SQL语法混乱,但你的
AA是纯字母,这个情况可以直接排除。
内容的提问来源于stack exchange,提问作者Przemysław Etz




