为啥我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效
Posted
技术标签:
【中文标题】为啥我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效【英文标题】:Why am I getting: [Oracle][ODBC][Ora]ORA-00904: invalid identifier为什么我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效 【发布时间】:2011-04-17 16:26:14 【问题描述】:当我清楚地识别出变量时,Oracle 一直给我一个无效标识符错误。
//get parameters from the request
String custID=request.getParameter("cust_ID");
String saleID=request.getParameter("sale_ID");
String firstName=request.getParameter("first_Name");
String mInitial=request.getParameter("mI");
String lastName=request.getParameter("last_Name");
String streetName=request.getParameter("street");
String city=request.getParameter("city");
String state=request.getParameter("state");
String zipCode=request.getParameter("zip_Code");
String DOB2=request.getParameter("DOB");
String agentID=request.getParameter("agent_ID");
String homePhone=request.getParameter("home_Phone");
String cellPhone=request.getParameter("cell_Phone");
String profession=request.getParameter("profession");
String employer=request.getParameter("employer");
String referrer=request.getParameter("referrer");
query =
"UPDATE customer"
+ " SET customer.cust_ID=custID, customer.sale_ID=saleID, customer.first_Name=firstName, customer.mI=mInitial, customer.last_Name=lastName, customer.street_Name=streetName, customer.city=city, customer.state=state, customer.zip_Code=zipCode,customer. DOB=DOB2, customer.agent_ID=agentID, customer.home_Phone=homePhone, customer.cell_Phone=cellPhone, customer.profession=profession, customer.employer=employer, customer.referrer=referrer"
+ " WHERE customer.cust_ID=custID " ;
preparedStatement = conn.prepareStatement(query);
preparedStatement.executeUpdate();
SQL 表
CREATE TABLE customer
(cust_ID NUMBER NOT NULL,
sale_ID NUMBER NOT NULL,
first_NameVARCHAR2(30) NOT NULL,
mI VARCHAR2(2) ,
last_Name VARCHAR2(50) NOT NULL,
street_Name VARCHAR2(50) ,
city VARCHAR2(30) NOT NULL,
state VARCHAR2(50) NOT NULL,
zip_Code VARCHAR2(5) NOT NULL,
DOB DATE ,
agent_ID NUMBER ,
home_Phone VARCHAR2(12) UNIQUE,
cell_Phone VARCHAR2(12) UNIQUE,
profession VARCHAR2(30) ,
employer VARCHAR2(30) ,
referrer VARCHAR2(30)
);
【问题讨论】:
【参考方案1】:您的代码没有按照您的想法执行。看看这个:
query =
"UPDATE customer"
+ " SET customer.cust_ID=custID, customer.sale_ID=saleID, customer.first_Name=firstName, customer.mI=mInitial, customer.last_Name=lastName, customer.street_Name=streetName, customer.city=city, customer.state=state, customer.zip_Code=zipCode,customer. DOB=DOB2, customer.agent_ID=agentID, customer.home_Phone=homePhone, customer.cell_Phone=cellPhone, customer.profession=profession, customer.employer=employer, customer.referrer=referrer"
+ " WHERE customer.cust_ID=custID "
此时query
的内容正是将发送到数据库的内容。在将查询发送到数据库之前,JSP 将不会神奇地为您填写 custID
、saleID
(等等...)。因此,Oracle 不知道custID
是什么(它肯定不是customer
表中其他列的名称)。因此,您会收到无效标识符错误。
我认为你试图这样做:
query =
"UPDATE customer"
+ " SET customer.cust_ID=" + custID + ", customer.sale_ID=" + saleID + ...
就像 duffymo 提到的那样,这会导致严重的 SQL 注入问题(想想客户端可以提交的值,以便通过 custID
字段劫持您的 SQL)。更好的方法是在PreparedStatement
上使用参数:
query =
"UPDATE customer"
+ " SET customer.cust_ID=?, customer.sale_ID=? ...";
PreparedStatement statement = conn.prepareStatement(query);
statement.setString(1, custID);
statement.setString(2, saleID);
statement.executeUpdate();
【讨论】:
【参考方案2】:我建议不要在您的 JSP 中使用脚本。尽快学习 JSTL。
答案似乎很明显:您的参数都是字符串,但 Oracle 架构有一些数据和数字类型。插入时必须转换为正确的类型。
此代码请求 SQL 注入攻击。在 INSERT 之前不进行任何绑定或验证。你不可能比这更不安全。我希望您不打算将此网站用于网络上的任何内容。
更好的方法是从 JSP 中取出 scriptlet 代码,仅使用 JSTL 来编写它,并引入一个 servlet 和一些其他层来帮助绑定、验证、安全等。
【讨论】:
感谢大家的反馈。我正在重写这个并将发布一个新问题。提出上述建议后,我仍然收到错误消息。我认为这与我的 SQL 语句本身有关,因为我有另一个页面与上面的页面完全相同(使用准备好的语句等),但使用的是 SQL INSERT 语句。过去 2 天我一直在为这个项目工作,我的代码刚刚变得循环!【参考方案3】:我认为在 sql 查询中,您在 customer,DOB 之间输入了空格。
客户。出生日期=出生日期2
【讨论】:
以上是关于为啥我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效的主要内容,如果未能解决你的问题,请参考以下文章
Access数据库通过ODBC导出到Oracle的两个小问题ora-24801Ora-01401
无法连接SQLState = 08004 [Oracle] [ODBC] [Ora] ORA-12154:TNS:无法解析ms odbc管理员中指定的连接标识符
ODBC连接到多个Oracle服务器(Listener.ora配置。)