Recientemente, hice un requisito de importación por lotes e insertando múltiples registros en la base de datos.
Solución: Encapsula un objeto de recopilación de listas en el programa y luego inserte las entidades en la colección en la base de datos. Debido a que el proyecto usa MyBatis, se planea usar la función foreach de MyBatis para la inserción por lotes. Durante este período, encontré el error "El comando SQL no terminó correctamente", y finalmente lo resolví y lo grabé para una futura revisión y aprendizaje.
Primero, hizo referencia a la información sobre el inserto de MyBatis foreach en línea, como sigue:
Foreach se usa principalmente en la construcción en condiciones, puede iterar sobre una colección en declaraciones SQL.
Los atributos del elemento foreach incluyen principalmente elemento, índice, colección, abierto, separador y cierre.
El elemento representa el alias cuando se itera cada elemento en la colección. El índice especifica un nombre para representar la posición a la que se alcanza cada iteración durante el proceso de iteración. Open representa lo que comienza con la declaración, el separador representa qué símbolos se usan como separadores entre cada iteración, y Close representa lo que termina. Lo más crítico y propenso a los errores al usar ForEach es el atributo de colección. Este atributo debe especificarse, pero en diferentes casos, el valor del atributo es diferente. Hay tres situaciones principales:
1. Si el pasado en un solo parámetro y el tipo de parámetro es una lista, el valor del atributo de colección es la lista
2. Si el pasado en un solo parámetro y el tipo de parámetro es una matriz, el valor de la propiedad de la colección es una matriz
3. Si se pasan múltiples parámetros, necesitamos encapsularlos en un mapa. Por supuesto, un solo parámetro también se puede encapsular en un mapa.
Luego, el siguiente archivo XML se escribió de acuerdo con la copia.
xxxmapper.xml archivo:
<insert id="addSupCity" parameterType="java.util.List"><selectKey keyProperty="cityId" order="BEFORE" resultType="String"><![CDATA[SELECT SEQ_OCL_SUPCITY.NEXTVAL FROM dual]]></selectKey>INSERT INTO T_OCL_SUPCITY(CITY_ID,CITY_CODE, CITY_NAME, Área_desc, sup_id, stat) valores <foreach colección = "list" item = "item" index = "index" separator = ","> (#{item.cityID, jdbctype = varchar},#{item.citycode, jdbctype = varchar},#{item.cityName, jdbctype = varchar},#{item .AReadesc, jdbctype = varchar},#{item.supid, jdbctype = varchar},#{item.stat, jdbctype = varchar}) </borach> </sert>Sin embargo, después de ejecutar, sigue informando errores, y el mensaje de error es el siguiente:
### sql: inserte en t_ocl_supcity (City_id, City_Code, City_Name, Area_Desc, SUP_ID, STAT) Valores (?,?,?,?,?,?), (?,?,?,?,?) ### causa: java.sql.sqlsyntaxerrorexception: Ora- 00933: el comando sql no final did did did no fin finl no fin finl no fin finly no fin find the sql no find the sql no find the sql no find the sql no find the sql comande no find the sql no find the sql comando no el comando sql no final no el comando sql no final.
Copiar SQL en funcionamiento en PL/SQL también informa el mismo error. Como se puede ver anteriormente, las declaraciones SQL ejecutadas usando el inserto por lotes son equivalentes a: insertar en t_ocl_supcity (City_id, City_Code, City_Name, Area_Desc, Sup_id, Stat) Values (?,?,?,?), (?,?,?,?,?), Y en Oracle Insert en XXX Valores (xxx, xxx), ((xxx), (xxx), xxx, xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx es xxx, es xxx, xxx es xxx, xxx es xxx es xxx, es xxx) incomparable. Mirando hacia atrás en ese artículo, descubrí que esto es adecuado para MySQL y no para Oracle, así que modifiqué el archivo XML:
<insert id = "addsupcity" parametertype = "java.util.list"> Insertar en t_ocl_supcity (city_id, city_code, city_name, área_desc, sup_id, stat) seleccione SEQ_OCL_SUPCITY.NEXTVAL City_id, A.*de (<<Roach Collection = "item item =" item "Índice" Índice "Índice". #{item.citycode, jdbctype = varchar} city_code,#{item.cityName, jdbctype = varchar} city_name,#{item.areadesc, jdbctype = varchar} área_desc,#{item.supid, jdbctype = varchar} Sup_id,#{item.stat, jdbctype = varchar} statFrom dual </foreach>) a </sert>Pasar por.
En la versión de Oracle, hay algunas cosas a tener en cuenta:
1. No hay valores en SQL;
2. (Selece ...... de Dual);
3. El atributo del separador en la etiqueta <Boreach> es "Union All", y la consulta se fusionará en el conjunto de resultados.
Lo anterior es una solución rápida para el error de inserción por lotes de Oracle+MyBatis foreach Insertar la función introducida por el editor. Espero que te sea útil. Si tiene alguna pregunta, déjame un mensaje y el editor le responderá a tiempo. ¡Muchas gracias por su apoyo al sitio web de Wulin.com!