Почему я получаю: [Oracle] [ODBC] [Ora] ORA-00904: неверный идентификатор - PullRequest
0 голосов
/ 17 апреля 2011

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 TABLE

        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)            
   );       

Ответы [ 3 ]

6 голосов
/ 17 апреля 2011

Ваш код не делает то, что вы думаете. Посмотрите на это:

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-инъекцией (просто подумайте о значениях, которые клиент может передать, чтобы перехватить ваш SQL через поле custID). Лучше использовать параметры для 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();
5 голосов
/ 17 апреля 2011

Я бы рекомендовал не использовать скриплеты в ваших JSP. Изучай JSTL так быстро, как сможешь.

Ответ кажется довольно очевидным: все ваши параметры - это строки, но в схеме Oracle есть несколько типов данных и чисел. Вы должны преобразовать в правильный тип, когда вставляете.

Этот код запрашивает атаку SQL-инъекцией. Вы не делаете никакой привязки или проверки перед ВСТАВКОЙ. Вы не можете быть менее безопасным, чем это. Я надеюсь, что вы не собираетесь использовать этот сайт для чего-либо в Интернете.

Лучший подход - вынуть код сценария из JSP, использовать только JSTL для его написания и ввести сервлет и некоторые другие уровни, помогающие связывать, проверять, защищать и т. Д.

2 голосов
/ 17 апреля 2011

Я думаю, что в SQL-запросе вы ввели пробел между клиентами, DOB.

клиент. DOB = DOB2

...