2015-07-12 104 views
1

我收到一个缺少的逗号错误,我似乎无法弄清楚可能是什么原因导致它,任何帮助,将不胜感激。使用Java将记录插入到Oracle数据库中

表创建SQL:

CREATE TABLE APPOINTMENTS (APP_ID NUMBER(38) NOT NULL, I_ID NUMBER(38), DATE_TIME VARCHAR2(50), INSPECTION_TYPE VARCHAR2(30), PRICE VARCHAR2(10), HST VARCHAR2(10), TOTAL VARCHAR2(10), CLIENT_NAME VARCHAR2(40), CLIENT_NUMBER VARCHAR2(15), CLIENT_EXT VARCHAR2(10), CLIENT_EMAIL VARCHAR2(50), CLIENT_NAME2 VARCHAR2(40), CLIENT_NUMBER2 VARCHAR2(15), CLIENT_EXT2 VARCHAR2(10), CLIENT_EMAIL2 VARCHAR2(50), ADDRESS VARCHAR2(100), INTERSECTION VARCHAR2(100), CITY VARCHAR2(40), AGENT_ID NUMBER(38), REF_SOURCE VARCHAR2(30), BUILDING_TYPE VARCHAR2(30), SQUARE_FEET NUMBER(38), LIST_PRICE VARCHAR2(15), LOCKBOX VARCHAR2(40), VACANT VARCHAR2(10), NOTES VARCHAR2(255), BILL_TO VARCHAR2(20), PICTURES_REQUESTED VARCHAR2(10), FLAG VARCHAR2(10), APPROVED VARCHAR2(10), BUILDING_PREMIUM VARCHAR2(10), TRAVEL_PREMIUM VARCHAR2(10), SIZE_PREMIUM VARCHAR2(10), HOLIDAY_PREMIUM VARCHAR2(10), MISC_PREMIUM VARCHAR2(10), INSPECTOR_PAID VARCHAR2(10), COMPANY VARCHAR2(10) NOT NULL, SUGGESTED_RETAIL VARCHAR2(10), SUGGESTED_HST VARCHAR2(10), SUGGESTED_TOTAL VARCHAR2(10), PRIMARY KEY (APP_ID)); 

的Java代码中插入并执行:

dc.query = "INSERT INTO HR.APPOINTMENTS (APP_ID,I_ID, DATE_TIME,INSPECTION_TYPE, PRICE, HST, TOTAL, CLIENT_NAME, CLIENT_NUMBER, CLIENT_EXT, CLIENT_EMAIL,CLIENT_NAME2, " 
       + "CLIENT_NUMBER2, CLIENT_EXT2, CLIENT_EMAIL2, ADDRESS, INTERSECTION, CITY, AGENT_ID, REF_SOURCE, BUILDING_TYPE, SQUARE_FEET, LIST_PRICE, LOCKBOX, VACANT," 
       + "NOTES, BILL_TO, PICTURES_REQUESTED, FLAG, APPROVED, BUILDING_PREMIUM, TRAVEL_PREMIUM, SIZE_PREMIUM, HOLIDAY_PREMIUM, MISC_PREMIUM, INSPECTOR_PAID," 
       + "COMPANY, SUGGESTED_RETAIL, SUGGESTED_HST, SUGGESTED_TOTAL)" 
       + "" 
       + "VALUES (" + hNum + "," + inspector + ",'" + date1 + "','" + inspectionType + "','" + price + "','" + hst + "','" + total + "','" + clientName + "','" + clientNumber + "','" 
       + clientExt + "','" + clientEmail + "','" + clientName2 + "','" + clientNumber2 + "','" + clientExt2 + "','" + clientEmail2 + "','" + address + "','" + cMIntersection 
       + "','" + city + "'," + hNum2 + ",'" + rSource + "','" + bType + "', 1000 ,'" + listPrice + "','" + lockbox + "','" + vacant + "','" + sInformation + "','" + billTo + "','" 
       + pRequested + "','" + flagged + "', 'No', 'No', '0' , '0', '0', '0', '0', 'No','" + company + "','" + suggestedPrice + "','" + suggestedhst + "','" + suggestedTotal + "')"; 
     dc.rset = dc.stmt.executeQuery(dc.query); 
+0

如果它不是mysql,您可以删除该标签吗? – sstan

+0

在变量替换后打印出语句。要么答案是显而易见的,要么在你的问题中包含陈述。 –

+1

另外,考虑到因为你没有使用参数绑定,所以如果你的任何变量包含一个单引号作为值的一部分,它会破坏你的SQL。 – sstan

回答

0

这里是一个更通用的方法。您只需要担心下面的Oracle类,并且可能会为Factory方法添加一些新条目,因为我只为您定义了一对。

我也在Row类中编写了PreparedStatement的实际执行代码,但是我从来没有测试过那么多。让我知道它是否适用于您(不要忘记设置您的数据库凭据和东西)...

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.ArrayList; 
import java.util.List; 

public class Oracle { 

     public static void main(String[] args) { 
       Row row = new Row("OWNERNAME", "TABLENAME"); 
       row.setDummyValues(); 

// set your individual column values here as you debug ... 

       System.out.println(row.getPreparedStatement()); 

//    for(Column column : row.getColumns()) { 
//      System.out.println("[" + column.name + "][" + column.type + "][" + column.nullable + "[" + column.value + "]"); 
//    } 

     } 
} 

class Column { 
     int position; 
     String name; 
     String type; 
     boolean nullable; 
     Object value; 

     public Column(ResultSet resultSet) throws SQLException { 
       position = resultSet.getInt("COLUMN_ID"); 
       name= resultSet.getString("COLUMN_NAME"); 
       type= resultSet.getString("DATA_TYPE"); 
       nullable= resultSet.getBoolean("NULLABLE"); 
       value = null; 
     } 
} 

class DummyValueFactory { 

     public static Object createDummyValue(String type, boolean nullable) { 
       Object value = null; 

       if(!nullable) { 
         if(type.contains("CHAR")) { 
           value = "ABC"; 
         } 
         else if(type.contains("NUMBER")) { 
           value = new Integer("123"); 
         } 
         else if(type.contains("TIMESTAMP")) { 
           value = new java.sql.Timestamp(System.currentTimeMillis()); 
         } 
         else { 
           throw new RuntimeException("CANNOT BUILD A DUMMY VALUE FOR " + type); 
         } 
       } 
       return value; 
     } 
} 

class Row { 

     String owner; 
     String table; 
     List<Column> columns = new ArrayList<Column>(); 

     public Row(String ownerName, String tableName) { 
       owner = ownerName; 
       table = tableName; 

       Connection connection = null; 
       Statement statement = null; 
       ResultSet resultSet = null; 

       try { 
         connection = getConnection(); 
         statement = connection.createStatement(); 
         resultSet = statement.executeQuery(getMetaDataQuery()); 
         while(resultSet.next()) { 
           columns.add(new Column(resultSet)); 
         } 
       } 
       catch (ClassNotFoundException e) { 
         e.printStackTrace(); 
       } 
       catch (SQLException e) { 
         e.printStackTrace(); 
       } 
       catch (IOException e) { 
         e.printStackTrace(); 
       } 
       finally { 
         try { 
           if(resultSet != null) { 
             resultSet.close(); 
           } 
           if(statement != null) { 
             statement.close(); 
           } 
           if(connection != null) { 
            connection.close(); 
           } 
         } 
         catch (SQLException e) { 
           statement = null; 
           connection = null; 
         } 
       } 
     } 

     public void setDummyValues() { 
       for(Column column: columns) { 
         column.value = DummyValueFactory.createDummyValue(column.type, column.nullable); 
       } 
     } 

     public List<Column> getColumns() { 
       return columns; 
     } 

     public Column getColumn(String columnName) { 
       Column foundColumn = null; 

       for(Column column: columns) { 
         if(column.name.equals(columnName)) { 
           foundColumn = column; 
           break; 
         } 
       } 
       return foundColumn; 
     } 

     public boolean setColumn(String columnName, Object value) { 
       boolean result = false; 
       for(Column column: columns) { 
         if(column.name.equals(columnName)) { 
           column.value = value; 
           result = true; 
           break; 
         } 
       } 
       return result; 
     } 

     private final String getMetaDataQuery() { 
       String SQLString = "SELECT COLUMN_ID,\n"; 
         SQLString += "  COLUMN_NAME,\n"; 
         SQLString += "  DATA_TYPE,\n"; 
         SQLString += "  NULLABLE\n"; 
         SQLString += "FROM ALL_TAB_COLUMNS\n"; 
         SQLString += "WHERE OWNER = '" + owner + "'\n"; 
         SQLString += " AND TABLE_NAME = '" + table + "'\n"; 
         SQLString += "ORDER BY COLUMN_ID"; 

      return SQLString; 
     } 

     public String getPreparedStatement() { 
       int counter = 0; 
       String SQLString = "INSERT INTO " + owner + "." + table + "(\n"; 
      for(Column column : columns) { 
       if(counter++ > 0) { 
         SQLString += ", "; 
       } 
       SQLString += "\t" + column.name + "\n"; 
      } 
     SQLString += ") VALUES (\n"; 
     counter = 0; 
     for(int index = 0; index < columns.size(); index++) { 
       if(counter++ > 0) { 
         SQLString += ", "; 
       } 
       SQLString += "\t?\n"; 
     } 
       SQLString += ")"; 
       return SQLString; 
     } 

     public void executeInsert() { 
       Connection connection = null; 
       PreparedStatement preparedStatement = null; 

       String SQLString = getPreparedStatement(); 
      try { 
         connection = getConnection(); 
         preparedStatement = connection.prepareStatement(SQLString); 
         for(int index = 0; index < columns.size(); index++) { 
          preparedStatement.setObject(index, columns.get(index).value); 
         } 
         preparedStatement.executeUpdate(); 
       } 
      catch (SQLException e) { 
         e.printStackTrace(); 
       } 
      catch (ClassNotFoundException e) { 
         e.printStackTrace(); 
       } 
      catch (IOException e) { 
         e.printStackTrace(); 
       } 
      finally { 
       try { 
        if(preparedStatement != null) { 
             preparedStatement.close(); 
           } 
        if(connection != null) { 
             connection.close(); 
           } 
       } 
       catch (SQLException e) { 
           preparedStatement = null; 
           connection = null; 
       } 
      } 
     } 

     private static final Connection getConnection() throws ClassNotFoundException, SQLException, IOException { 
       String user = "username"; 
       String password = "password"; 
       String server = "server"; 
       int port = 1234; 
       String sid = "database"; 

       Connection connection = null; 
       String url = "jdbc:oracle:thin:@" + server + ":" + port + ":" + sid; 
       Class.forName("oracle.jdbc.driver.OracleDriver"); 
       java.util.Properties info = new java.util.Properties(); 
       info.put ("user", user); 
       info.put ("password", password); 
       info.put ("useFetchSizeWithLongColumn", "true"); 
       connection = DriverManager.getConnection(url, info); 
       return connection; 
     } 
} 
+2

这就是为了让一些数据插入到sql表中而写的很多代码。 –

+0

理想情况下,这将成为一般工作类的一部分...例如,一个名为Row的类包含一个ArrayList或Column类,然后它可以用于许多不同的表格 – Constantin

+0

您可以使用Oracle元数据来定义您的类型和columnNames,然后设置你的值,如:Row.setValue(columnName,value) – Constantin

相关问题