为啥我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效

     2023-03-27     256

关键词:

【中文标题】为啥我会收到:[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 将不会神奇地为您填写 custIDsaleID(等等...)。因此,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

【讨论】:

为啥我会收到“Microsoft][ODBC Text Driver] '(unknown)' is not a valid path”?

】为啥我会收到“Microsoft][ODBCTextDriver]\\\'(unknown)\\\'isnotavalidpath”?【英文标题】:WhyamIgetting"Microsoft][ODBCTextDriver]\'(unknown)\'isnotavalidpath"?为什么我会收到“Microsoft][ODBCTextDriver]\'(unknown)\'isnotavalidpath”?【 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?

】为啥我会收到“找不到数据源名称且未指定默认驱动程序”,我该如何解决?【英文标题】:WhyamIgetting"Datasourcenamenotfoundandnodefaultdriverspecified"andhowdoIfixit?为什么我会收到“找不到数据源名称且未指定默认驱动程序”,... 查看详情

使用 PHP 和 ODBC_RESULT,为啥我会丢失第 4 位小数

】使用PHP和ODBC_RESULT,为啥我会丢失第4位小数【英文标题】:UsingPHP&ODBC_RESULT,WhyamIlosingthe4thdecimalplace使用PHP和ODBC_RESULT,为什么我会丢失第4位小数【发布时间】:2014-04-1119:50:27【问题描述】:我希望这是一个简单的问题。如... 查看详情

为啥我会收到 ConcurrentModificationException?

】为啥我会收到ConcurrentModificationException?【英文标题】:WhydoIgetaConcurrentModificationException?为什么我会收到ConcurrentModificationException?【发布时间】:2017-06-0821:14:41【问题描述】:为什么我会在代码中的指定位置收到ConcurrentModificat... 查看详情

为啥我会收到 CancelledKeyException?

】为啥我会收到CancelledKeyException?【英文标题】:WhydoIgetaCancelledKeyException?为什么我会收到CancelledKeyException?【发布时间】:2016-08-2101:45:06【问题描述】:为什么我会收到CanceledKeyException的错误消息?谁能帮帮我吗?客户端哪部... 查看详情

为啥我会收到此错误

】为啥我会收到此错误【英文标题】:whyi\'mgettingthiserror为什么我会收到此错误【发布时间】:2018-06-2201:33:52【问题描述】:importtkinterasTkfromtkinterimportttkimportmathasmwin=Tk.Tk()win.title("PropellerInputs")inputFrame=ttk.LabelFrame(win,text="Input")inpu... 查看详情

为啥我会收到 AlreadyExistsError?

】为啥我会收到AlreadyExistsError?【英文标题】:WhyamIreceiveAlreadyExistsError?为什么我会收到AlreadyExistsError?【发布时间】:2019-05-2818:52:08【问题描述】:当我通过keras训练我的二进制分类时,我收到了这个错误:AlreadyExistsError:Resourc... 查看详情

为啥我会收到堆栈溢出错误?

】为啥我会收到堆栈溢出错误?【英文标题】:WhyamIgettingtheStackOverflowerror?为什么我会收到堆栈溢出错误?【发布时间】:2019-01-0905:35:03【问题描述】:我收到StackOverflow错误,但我似乎不知道出了什么问题。这是Database类帮助我... 查看详情

access数据库通过odbc导出到oracle的两个小问题ora-24801ora-01401

 问题描述:从access通过odbc导出到oracle出现 ora-24801 非法值错误 与 Ora-01401值过大的错误问题分析:access里面的字段类型为“备注”,导入到oracle会自动转成clob类型,可能会出现一些奇怪错误解决方法:... 查看详情

为啥我会收到错误消息?

】为啥我会收到错误消息?【英文标题】:WhyamIgettinganerrorforthis?为什么我会收到错误消息?【发布时间】:2009-05-1502:06:32【问题描述】:为什么会出现这些错误?alttexthttp://img39.imageshack.us/img39/2203/help.tif上面写着:错误:对成员... 查看详情

为啥我会收到以下代码的异常?

】为啥我会收到以下代码的异常?【英文标题】:WhyamIgettinganexceptionwiththefollowingcode?为什么我会收到以下代码的异常?【发布时间】:2011-05-0518:02:23【问题描述】:我在接口中定义了一个属性:BooleanIsBusyget;在类中实现为:private... 查看详情

为啥我会收到序列化错误?

】为啥我会收到序列化错误?【英文标题】:WhyamIgettingaserializationerror?为什么我会收到序列化错误?【发布时间】:2011-03-3120:31:45【问题描述】:我有以下代码:classProgramstaticvoidMain(string[]args)stringxml=@"<ArrayOfUserSetting><UserS... 查看详情