@@ -311,7 +311,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
311311 sanitizeCreateValuesForBulkArrays (db .Statement , & createValues )
312312
313313 stmt := db .Statement
314- schema := stmt .Schema
314+ sch := stmt .Schema
315315
316316 onConflict , ok := onConflictClause .Expression .(clause.OnConflict )
317317 if ! ok {
@@ -322,10 +322,10 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
322322 // Determine conflict columns (use primary key if not specified)
323323 conflictColumns := onConflict .Columns
324324 if len (conflictColumns ) == 0 {
325- if schema == nil || len (schema .PrimaryFields ) == 0 {
325+ if sch == nil || len (sch .PrimaryFields ) == 0 {
326326 return
327327 }
328- for _ , primaryField := range schema .PrimaryFields {
328+ for _ , primaryField := range sch .PrimaryFields {
329329 conflictColumns = append (conflictColumns , clause.Column {Name : primaryField .DBName })
330330 }
331331 }
@@ -340,7 +340,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
340340 var filteredConflictColumns []clause.Column
341341 for _ , conflictCol := range conflictColumns {
342342 field := stmt .Schema .LookUpField (conflictCol .Name )
343- if valuesColumnMap [strings .ToUpper (conflictCol .Name )] && fieldCanConflict (field , schema ) {
343+ if valuesColumnMap [strings .ToUpper (conflictCol .Name )] && fieldCanConflict (field , sch ) {
344344 filteredConflictColumns = append (filteredConflictColumns , conflictCol )
345345 }
346346 }
@@ -358,7 +358,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
358358
359359 // Start PL/SQL block
360360 plsqlBuilder .WriteString ("DECLARE\n " )
361- writeTableRecordCollectionDecl (db , & plsqlBuilder , stmt .Schema . DBNames , stmt .Table )
361+ writeTableRecordCollectionDecl (db , & plsqlBuilder , getCreatableFields ( stmt .Schema ) , stmt .Table )
362362 plsqlBuilder .WriteString (" l_affected_records t_records;\n " )
363363
364364 // Create array types and variables for each column
@@ -457,9 +457,9 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
457457 }
458458
459459 isAutoIncrement := false
460- if schema .PrioritizedPrimaryField != nil &&
461- schema .PrioritizedPrimaryField .AutoIncrement &&
462- strings .EqualFold (schema .PrioritizedPrimaryField .DBName , column .Name ) {
460+ if sch .PrioritizedPrimaryField != nil &&
461+ sch .PrioritizedPrimaryField .AutoIncrement &&
462+ strings .EqualFold (sch .PrioritizedPrimaryField .DBName , column .Name ) {
463463 isAutoIncrement = true
464464 } else if stmt .Schema .LookUpField (column .Name ).AutoIncrement {
465465 isAutoIncrement = true
@@ -563,7 +563,8 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
563563
564564 // Add RETURNING clause with BULK COLLECT INTO
565565 plsqlBuilder .WriteString (" RETURNING " )
566- allColumns := getAllTableColumns (schema )
566+ allColumns := getMergableFields (sch )
567+
567568 for i , column := range allColumns {
568569 if i > 0 {
569570 plsqlBuilder .WriteString (", " )
@@ -576,7 +577,7 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
576577 outParamIndex := len (stmt .Vars )
577578 for rowIdx := 0 ; rowIdx < len (createValues .Values ); rowIdx ++ {
578579 for _ , column := range allColumns {
579- if field := findFieldByDBName (schema , column ); field != nil {
580+ if field := findFieldByDBName (sch , column ); field != nil {
580581 if isJSONField (field ) {
581582 if isRawMessageField (field ) {
582583 // Column is a BLOB, return raw bytes; no JSON_SERIALIZE
@@ -638,13 +639,13 @@ func buildBulkMergePLSQL(db *gorm.DB, createValues clause.Values, onConflictClau
638639// Build PL/SQL block for bulk INSERT only (no conflict handling)
639640func buildBulkInsertOnlyPLSQL (db * gorm.DB , createValues clause.Values , bindMap plsqlBindVariableMap ) {
640641 stmt := db .Statement
641- schema := stmt .Schema
642+ sch := stmt .Schema
642643
643644 var plsqlBuilder strings.Builder
644645
645646 // Start PL/SQL block
646647 plsqlBuilder .WriteString ("DECLARE\n " )
647- writeTableRecordCollectionDecl (db , & plsqlBuilder , stmt .Schema . DBNames , stmt .Table )
648+ writeTableRecordCollectionDecl (db , & plsqlBuilder , getCreatableFields ( stmt .Schema ) , stmt .Table )
648649 plsqlBuilder .WriteString (" l_inserted_records t_records;\n " )
649650
650651 // Create array types and variables for each column
@@ -694,7 +695,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values, bindMap p
694695
695696 // Add RETURNING clause with BULK COLLECT INTO
696697 plsqlBuilder .WriteString (" RETURNING " )
697- allColumns := getAllTableColumns ( schema )
698+ allColumns := getCreatableFields ( sch )
698699 for i , column := range allColumns {
699700 if i > 0 {
700701 plsqlBuilder .WriteString (", " )
@@ -711,7 +712,7 @@ func buildBulkInsertOnlyPLSQL(db *gorm.DB, createValues clause.Values, bindMap p
711712 db .QuoteTo (& columnBuilder , column )
712713 quotedColumn := columnBuilder .String ()
713714
714- if field := findFieldByDBName (schema , column ); field != nil {
715+ if field := findFieldByDBName (sch , column ); field != nil {
715716 if isJSONField (field ) {
716717 if isRawMessageField (field ) {
717718 // Column is a BLOB, return raw bytes; no JSON_SERIALIZE
@@ -959,7 +960,7 @@ func getBulkReturningValues(db *gorm.DB, rowCount int) {
959960 }
960961
961962 // Get all table columns
962- allColumns := getAllTableColumns ( db .Statement .Schema )
963+ allColumns := db .Statement .Schema . DBNames
963964
964965 // Find the actual starting index of OUT parameters
965966 actualStartIndex := - 1
0 commit comments