@@ -424,6 +424,50 @@ func writeQuotedIdentifier(builder *strings.Builder, identifier string) {
424
424
builder .WriteByte ('"' )
425
425
}
426
426
427
+ // writeTableRecordCollectionDecl writes the PL/SQL declarations needed to
428
+ // define a custom record type and a collection of that record type,
429
+ // based on the schema of the given table.
430
+ //
431
+ // Specifically, it generates:
432
+ // - A RECORD type (`t_record`) with fields corresponding to the table's columns.
433
+ // - A nested TABLE type (`t_records`) of `t_record`.
434
+ //
435
+ // The declarations are written into the provided strings.Builder in the
436
+ // correct PL/SQL syntax, so they can be used as part of a larger PL/SQL block.
437
+ //
438
+ // Example output:
439
+ //
440
+ // TYPE t_record IS RECORD (
441
+ // "id" "users"."id"%TYPE,
442
+ // "created_at" "users"."created_at"%TYPE,
443
+ // ...
444
+ // );
445
+ // TYPE t_records IS TABLE OF t_record;
446
+ //
447
+ // Parameters:
448
+ // - plsqlBuilder: The builder to write the PL/SQL code into.
449
+ // - dbNames: The slice containing the column names.
450
+ // - table: The table name
451
+ func writeTableRecordCollectionDecl (plsqlBuilder * strings.Builder , dbNames []string , table string ) {
452
+ // Declare a record where each element has the same structure as a row from the given table
453
+ plsqlBuilder .WriteString (" TYPE t_record IS RECORD (\n " )
454
+ for i , field := range dbNames {
455
+ if i > 0 {
456
+ plsqlBuilder .WriteString (",\n " )
457
+ }
458
+ plsqlBuilder .WriteString (" " )
459
+ writeQuotedIdentifier (plsqlBuilder , field )
460
+ plsqlBuilder .WriteString (" " )
461
+ writeQuotedIdentifier (plsqlBuilder , table )
462
+ plsqlBuilder .WriteString ("." )
463
+ writeQuotedIdentifier (plsqlBuilder , field )
464
+ plsqlBuilder .WriteString ("%TYPE" )
465
+ }
466
+ plsqlBuilder .WriteString ("\n " )
467
+ plsqlBuilder .WriteString (" );\n " )
468
+ plsqlBuilder .WriteString (" TYPE t_records IS TABLE OF t_record;\n " )
469
+ }
470
+
427
471
// Helper function to check if a value represents NULL
428
472
func isNullValue (value interface {}) bool {
429
473
if value == nil {
0 commit comments