@@ -956,4 +956,164 @@ describe('4. binding.js', function() {
956
956
}
957
957
} ) ;
958
958
} ) ;
959
+
960
+ describe ( '4.14 binding large number of in and out binds' , function ( ) {
961
+
962
+ let connection = null ;
963
+ const numOutBinds = 500 ;
964
+ const colCnt = 500 ;
965
+ const rowCnt = 100 ;
966
+ const tableNameBinds = 'nodb_large_bind_count_table' ;
967
+ const bindsOutNumber = { type : oracledb . DB_TYPE_NUMBER , dir : oracledb . BIND_OUT } ;
968
+ const bindsInNumber = { type : oracledb . NUMBER } ;
969
+ const createSQlFn = function ( colCnt ) {
970
+ let colNames = 'F1 NUMBER(6,0)' ;
971
+ for ( let i = 2 ; i <= colCnt ; i ++ ) {
972
+ colNames += `, F${ i } NUMBER(6,0)` ;
973
+ }
974
+ return `create table ${ tableNameBinds } ` + `(` + colNames + `)` ;
975
+ } ;
976
+ const sqlCreateQuery = createSQlFn ( colCnt ) ;
977
+ const sqlDrop = testsUtil . sqlDropTable ( tableNameBinds ) ;
978
+ const sqlCreate = testsUtil . sqlCreateTable ( tableNameBinds , sqlCreateQuery ) ;
979
+
980
+ before ( async function ( ) {
981
+ connection = await oracledb . getConnection ( dbConfig ) ;
982
+ await connection . execute ( sqlCreate ) ;
983
+ } ) ;
984
+
985
+ after ( async function ( ) {
986
+ await connection . execute ( sqlDrop ) ;
987
+ await connection . close ( ) ;
988
+ } ) ;
989
+
990
+ it ( '4.14.1 output binds in pl/sql' , async function ( ) {
991
+ const maxValue = 10 ;
992
+ const minValue = 2 ;
993
+ const sql = `
994
+ BEGIN
995
+ ${ Array ( numOutBinds ) . fill ( null ) . map ( ( _ , i ) => `:v_out_${ i } _0 := :a_${ i } + :b_${ i } + :c_${ i } ; ` ) . join ( '\n ' ) }
996
+ END;
997
+ ` ;
998
+ const _genRandNum = function ( ) {
999
+ let rand = Math . random ( ) ;
1000
+ rand = Math . floor ( rand * ( maxValue - minValue ) ) ;
1001
+ rand = rand + minValue ;
1002
+ return rand ;
1003
+ } ;
1004
+ const params = Array ( numOutBinds ) . fill ( null ) . map ( ( _ , i ) => ( { [ `a_${ i } ` ] : _genRandNum ( ) , [ `b_${ i } ` ] : _genRandNum ( ) ,
1005
+ [ `c_${ i } ` ] : _genRandNum ( ) } ) )
1006
+ . reduce ( ( a , x ) => ( { ...a , ...x } ) , { } ) ;
1007
+
1008
+ const bindDefsIn = { } ;
1009
+ const bindDefsOut = { } ;
1010
+ for ( let i = 0 ; i < numOutBinds ; i ++ ) {
1011
+ bindDefsIn [ `a_${ i } ` ] = bindsInNumber ;
1012
+ bindDefsIn [ `b_${ i } ` ] = bindsInNumber ;
1013
+ bindDefsIn [ `c_${ i } ` ] = bindsInNumber ;
1014
+ bindDefsOut [ `v_out_${ i } _0` ] = bindsOutNumber ;
1015
+ }
1016
+ const binds = Object . assign ( bindDefsIn , bindDefsOut ) ;
1017
+ const options = {
1018
+ bindDefs : binds
1019
+ } ;
1020
+
1021
+ let bulkValues = [ ] ;
1022
+ for ( let i = 0 ; i < rowCnt ; i ++ ) {
1023
+ bulkValues . push ( params ) ;
1024
+ }
1025
+ const result = await connection . executeMany ( sql , bulkValues , options ) ;
1026
+ const outParams = { } ;
1027
+ for ( let i = 0 ; i < numOutBinds ; i ++ ) {
1028
+ outParams [ `v_out_${ i } _0` ] = params [ `a_${ i } ` ] + params [ `b_${ i } ` ] + params [ `c_${ i } ` ] ;
1029
+ }
1030
+ for ( let i = 0 ; i < rowCnt ; i ++ ) {
1031
+ assert . deepStrictEqual ( outParams , result . outBinds [ i ] ) ;
1032
+ }
1033
+ } ) ;
1034
+
1035
+ it ( '4.14.2 output binds using bindByPosition in sql with returning clause' , async function ( ) {
1036
+ const numValue = 15 ;
1037
+ const values = Array ( colCnt ) . fill ( numValue ) ;
1038
+ let bindstring = ':1' ;
1039
+ let retClause = 'returning F1' ;
1040
+ let intoClause = ` INTO :${ colCnt + 1 } ` ;
1041
+ let bindDefsIn = [ bindsInNumber ] ;
1042
+ const bindDefsOut = [ bindsOutNumber ] ;
1043
+ const lastOutBindNum = 2 * colCnt ;
1044
+
1045
+ for ( let i = 2 ; i <= colCnt ; i ++ ) {
1046
+ bindstring += `, :${ i } ` ;
1047
+ retClause += `, F${ i } ` ;
1048
+ bindDefsIn . push ( bindsInNumber ) ;
1049
+ bindDefsOut . push ( bindsOutNumber ) ;
1050
+ }
1051
+ for ( let i = colCnt + 2 ; i <= lastOutBindNum ; i ++ ) {
1052
+ intoClause += `, :${ i } ` ;
1053
+ }
1054
+ retClause += intoClause ;
1055
+
1056
+ const binds = bindDefsIn . concat ( bindDefsOut ) ;
1057
+ const options = {
1058
+ bindDefs : binds
1059
+ } ;
1060
+ let bulkValues = [ ] ;
1061
+ for ( let i = 0 ; i < rowCnt ; i ++ ) {
1062
+ bulkValues . push ( values ) ;
1063
+ }
1064
+ let insertSql = ` insert into ${ tableNameBinds } values(` + bindstring + `) ` + retClause ;
1065
+ const result = await connection . executeMany ( insertSql , bulkValues , options ) ;
1066
+
1067
+ const outBinds = result . outBinds ;
1068
+ assert . strictEqual ( result . rowsAffected , bulkValues . length ) ;
1069
+ for ( let i = 0 ; i < outBinds . length ; i ++ ) {
1070
+ for ( let j = 0 ; j < colCnt ; j ++ ) {
1071
+ assert . strictEqual ( outBinds [ i ] [ j ] [ 0 ] , bulkValues [ i ] [ j ] ) ;
1072
+ }
1073
+ }
1074
+ } ) ;
1075
+
1076
+ it ( '4.14.3 output binds using bindByName in sql with returning clause' , async function ( ) {
1077
+ const values = { } ;
1078
+ let bindstring = ':B1' ;
1079
+ let retClause = 'returning F1' ;
1080
+ let intoClause = ' INTO :OB1' ;
1081
+ const bindDefsIn = { } ;
1082
+ const bindDefsOut = { } ;
1083
+ const numValue = 15 ;
1084
+
1085
+ bindDefsIn [ 'B1' ] = bindsInNumber ;
1086
+ bindDefsOut [ 'OB1' ] = bindsOutNumber ;
1087
+ values [ 'B1' ] = numValue ;
1088
+ for ( let i = 2 ; i <= colCnt ; i ++ ) {
1089
+ bindstring += `, :B${ i } ` ;
1090
+ retClause += `, F${ i } ` ;
1091
+ values [ `B${ i } ` ] = numValue ;
1092
+ bindDefsIn [ `B${ i } ` ] = bindsInNumber ;
1093
+ bindDefsOut [ `OB${ i } ` ] = bindsOutNumber ;
1094
+ intoClause += `, :OB${ i } ` ;
1095
+ }
1096
+ // construct out Bind Parameters
1097
+ retClause += intoClause ;
1098
+
1099
+ const binds = Object . assign ( bindDefsIn , bindDefsOut ) ;
1100
+ const options = {
1101
+ bindDefs : binds
1102
+ } ;
1103
+ let bulkValues = [ ] ;
1104
+ for ( let i = 0 ; i < rowCnt ; i ++ ) {
1105
+ bulkValues . push ( values ) ;
1106
+ }
1107
+ let insertSql = ` insert into ${ tableNameBinds } values(` + bindstring + `) ` + retClause ;
1108
+ const result = await connection . executeMany ( insertSql , bulkValues , options ) ;
1109
+
1110
+ const outBinds = result . outBinds ;
1111
+ assert . strictEqual ( result . rowsAffected , bulkValues . length ) ;
1112
+ for ( let i = 0 ; i < outBinds . length ; i ++ ) {
1113
+ for ( let j = 1 ; j <= colCnt ; j ++ ) {
1114
+ assert . strictEqual ( outBinds [ i ] [ `OB${ j } ` ] [ 0 ] , bulkValues [ i ] [ `B${ j } ` ] ) ;
1115
+ }
1116
+ }
1117
+ } ) ;
1118
+ } ) ;
959
1119
} ) ;
0 commit comments