เมื่อเร็ว ๆ นี้ฉันได้ทำสิ่งที่มีการนำเข้าแบทช์และชุดการแทรกหลายระเบียนลงในฐานข้อมูล
วิธีแก้ปัญหา: ห่อหุ้มวัตถุรายการรายการในโปรแกรมแล้วแทรกเอนทิตีในการรวบรวมลงในฐานข้อมูล เนื่องจากโครงการใช้ mybatis จึงมีการวางแผนที่จะใช้ฟังก์ชั่น foreach ของ mybatis สำหรับการแทรกแบทช์ ในช่วงเวลานี้ฉันพบข้อผิดพลาด "คำสั่ง SQL ไม่สิ้นสุดอย่างถูกต้อง" และในที่สุดก็แก้ไขและบันทึกไว้สำหรับการตรวจสอบและการเรียนรู้ในอนาคต
ก่อนอื่นฉันอ้างอิงข้อมูลเกี่ยวกับ mybatis 'foreach แทรกออนไลน์ดังนี้:
Foreach ส่วนใหญ่จะใช้ในการสร้างในสภาพมันสามารถวนซ้ำผ่านคอลเลกชันในงบ SQL
แอตทริบิวต์ขององค์ประกอบ foreach ส่วนใหญ่รวมถึงรายการ, ดัชนี, คอลเลกชัน, เปิด, ตัวคั่นและปิด
รายการแสดงถึงนามแฝงเมื่อแต่ละองค์ประกอบในคอลเลกชันซ้ำ ดัชนีระบุชื่อเพื่อแสดงตำแหน่งที่การวนซ้ำแต่ละครั้งถึงระหว่างกระบวนการวนซ้ำ Open แสดงถึงสิ่งที่เริ่มต้นด้วยคำสั่งตัวคั่นแสดงว่าสัญลักษณ์ใดที่ใช้เป็นตัวคั่นระหว่างการวนซ้ำแต่ละครั้งและปิดแสดงถึงสิ่งที่จบลงด้วย สิ่งที่สำคัญที่สุดและผิดพลาดมากที่สุดเมื่อใช้ foreach คือแอตทริบิวต์การรวบรวม คุณลักษณะนี้จะต้องระบุ แต่ในกรณีที่แตกต่างกันค่าของแอตทริบิวต์จะแตกต่างกัน มีสามสถานการณ์หลัก:
1. หากผ่านในพารามิเตอร์เดียวและประเภทพารามิเตอร์คือรายการค่าแอตทริบิวต์การรวบรวมคือรายการ
2. หากส่งผ่านในพารามิเตอร์เดียวและประเภทพารามิเตอร์คืออาร์เรย์ค่าคุณสมบัติของคอลเลกชันคืออาร์เรย์
3. หากมีพารามิเตอร์หลายพารามิเตอร์ที่ผ่านมาเราต้องห่อหุ้มไว้ในแผนที่ แน่นอนพารามิเตอร์เดียวสามารถห่อหุ้มลงในแผนที่
จากนั้นไฟล์ XML ต่อไปนี้ถูกเขียนขึ้นตามสำเนา
ไฟล์ xxxmapper.xml:
<insert id = "addsupcity" parameterType = "java.util.list"> <selectKey keyProperty = "cityid" order = "ก่อน" resulttype = "String"> <! AREA_DESC, SUP_ID, STAT) ค่า <foreach collection = "list" item = "item" index = "index" separator = ","> (#{item.cityId, jdbcType = varchar},#{item.cityCode, jdbcType = varchar},#{item.cityName, jdbcType = varchar},#{รายการ .Areadesc, jdbcType = varchar},#{item.supid, jdbcType = varchar},#{item.stat, jdbcType = varchar}) </foreach> </insert>อย่างไรก็ตามหลังจากทำงานแล้วจะรักษาข้อผิดพลาดในการรายงานและข้อความแสดงข้อผิดพลาดมีดังนี้:
### SQL: แทรกลงใน t_ocl_supcity (city_id, city_code, city_name, พื้นที่ rea_desc, sup_id, stat) ค่า (?,?,?,?,?,?), (?,?
การคัดลอก SQL ออกและรันใน PL/SQL ยังรายงานข้อผิดพลาดเดียวกัน ดังที่เห็นด้านบนคำสั่ง SQL ที่ดำเนินการโดยใช้แบทช์แทรกเทียบเท่ากับ: แทรกลงใน t_ocl_supcity (city_id, city_code, city_name, พื้นที่ rea_desc, sup_id, stat) ค่า (? ไม่มีใครเทียบได้ เมื่อมองย้อนกลับไปที่บทความนั้นฉันพบว่าสิ่งนี้เหมาะสำหรับ MySQL และไม่ใช่สำหรับ Oracle ดังนั้นฉันจึงแก้ไขไฟล์ XML:
<insert id = "addsupcity" parameterType = "java.util.list"> แทรกลงใน t_ocl_supcity (city_id, city_code, city_name, พื้นที่ rea_desc, sup_id, stat) select seq_ocl_supcity.nextval city_id, A.* ทั้งหมด "> เลือก#{item.cityCode, jdbcType = varchar} city_code,#{item.cityname, jdbcType = varchar} city_name,#{item.areadesc, jdbctype = varchar} rea_desc,#{item.supid sup_id,#{item.stat, jdbctype = varchar} statfrom dual </foreach>) a </insert>วิ่งผ่าน
ในเวอร์ชันของ Oracle มีบางสิ่งที่ควรทราบ:
1. ไม่มีค่าใน SQL;
2. (Selece ...... จากคู่);
3. แอตทริบิวต์ของตัวคั่นในแท็ก <foreach> คือ "Union All" และแบบสอบถามจะถูกรวมเข้ากับชุดผลลัพธ์
ด้านบนเป็นวิธีแก้ปัญหาที่รวดเร็วสำหรับข้อผิดพลาดในการแทรกแบทช์ของ Oracle+Mybatis foread forach function ที่แนะนำโดยตัวแก้ไข ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!