@@ -3416,20 +3416,80 @@ binding can be a very efficient way of transferring small data sets.
3416
3416
Note PL/SQL's ` VARRAY ` and nested table collection types cannot be
3417
3417
bound.
3418
3418
3419
- To bind arrays use the named bind syntax:
3419
+ Given this table and PL/SQL package:
3420
+
3421
+ ` ` ` sql
3422
+ DROP TABLE mytab;
3423
+ CREATE TABLE mytab (id NUMBER , numcol NUMBER );
3424
+
3425
+ CREATE OR REPLACE PACKAGE mypkg IS
3426
+ TYPE numtype IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
3427
+ PROCEDURE myinproc (p_id IN NUMBER , vals IN numtype);
3428
+ PROCEDURE myoutproc (p_id IN NUMBER , vals OUT numtype);
3429
+ END ;
3430
+ /
3431
+
3432
+ CREATE OR REPLACE PACKAGE BODY mypkg IS
3433
+
3434
+ PROCEDURE myinproc (p_id IN NUMBER , vals IN numtype) IS
3435
+ BEGIN
3436
+ FORALL i IN INDICES OF vals
3437
+ INSERT INTO mytab (id, numcol) VALUES (p_id, vals (i));
3438
+ END ;
3439
+
3440
+ PROCEDURE myoutproc (p_id IN NUMBER , vals OUT numtype) IS
3441
+ BEGIN
3442
+ SELECT numcol BULK COLLECT INTO vals FROM mytab WHERE id = p_id ORDER BY 1 ;
3443
+ END ;
3444
+
3445
+ END ;
3446
+ /
3447
+ ` ` `
3448
+
3449
+ To bind an array in node-oracledb using "bind by name" syntax for insertion into ` mytab` use:
3420
3450
3421
3451
` ` ` javascript
3422
3452
connection .execute (
3423
- " BEGIN mypkg.myinproc(:bv ); END;" ,
3453
+ " BEGIN mypkg.myinproc(:id, :vals ); END;" ,
3424
3454
{
3425
- bv: { type: oracledb .NUMBER ,
3426
- dir: oracledb .BIND_IN ,
3427
- val: [1 , 2 , 23 , 4 , 10 ]
3428
- }
3455
+ id: 1234 ,
3456
+ vals: { type: oracledb .NUMBER ,
3457
+ dir: oracledb .BIND_IN ,
3458
+ val: [1 , 2 , 23 , 4 , 10 ]
3459
+ }
3429
3460
}, . . .
3430
3461
` ` `
3431
3462
3432
- Positional bind syntax is not supported in this release.
3463
+ Alternatively, "bind by position" syntax can be used:
3464
+
3465
+ ` ` ` javascript
3466
+ connection .execute (
3467
+ " BEGIN mypkg.myinproc(:id, :vals); END;" ,
3468
+ [
3469
+ 1234 ,
3470
+ { type: oracledb .NUMBER ,
3471
+ dir: oracledb .BIND_IN ,
3472
+ val: [1 , 2 , 23 , 4 , 10 ]
3473
+ }
3474
+ ],
3475
+
3476
+ function (err ) { . . . });
3477
+ ` ` `
3478
+
3479
+ After executing either of these ` mytab` will contain:
3480
+
3481
+ ` ` `
3482
+ ID NUMCOL
3483
+ ---------- ----------
3484
+ 1234 1
3485
+ 1234 2
3486
+ 1234 23
3487
+ 1234 4
3488
+ 1234 10
3489
+ ` ` `
3490
+
3491
+ The [` type` ](#executebindParams) must be set for PL/SQL array binds.
3492
+ It can be set to ` STRING ` or ` NUMBER `
3433
3493
3434
3494
For OUT and IN OUT binds, the [` maxArraySize` ](#executebindParams)
3435
3495
bind property must be set. Its value is the maximum number of
@@ -3453,86 +3513,32 @@ value is not large enough to hold the longest string data item in the
3453
3513
collection a runtime error occurs. To avoid unnecessary memory
3454
3514
allocation, do not let the size be larger than needed.
3455
3515
3456
- See
3457
- [plsqlarray.js](https://github.com/oracle/node-oracledb/tree/master/examples/plsqlarray.js)
3458
- for a full example.
3459
-
3460
- The following example passes an array of values to a PL/SQL procedure
3461
- which inserts them into a table. The procedure is defined as:
3462
-
3463
- ` ` ` sql
3464
- CREATE TABLE mytab (numcol NUMBER );
3465
-
3466
- CREATE OR REPLACE PACKAGE mypkg IS
3467
- TYPE numtype IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
3468
- PROCEDURE myinproc (p IN numtype);
3469
- END ;
3470
- /
3471
-
3472
- CREATE OR REPLACE PACKAGE BODY mypkg IS
3473
- PROCEDURE myinproc (p IN numtype) IS
3474
- BEGIN
3475
- FORALL i IN INDICES OF p
3476
- INSERT INTO mytab (numcol) VALUES (p (i));
3477
- END ;
3478
- END ;
3479
- /
3480
- ` ` `
3481
-
3482
- With this, the following JavaScript will result in ` mytab` containing
3483
- one row per value:
3484
-
3485
- ` ` ` javascript
3486
- connection .execute (
3487
- " BEGIN mypkg.myinproc(:bv); END;" ,
3488
- {
3489
- bv: { type: oracledb .NUMBER ,
3490
- dir: oracledb .BIND_IN ,
3491
- val: [1 , 2 , 23 , 4 , 10 ]
3492
- }
3493
- },
3494
- function (err ) { . . . });
3495
- ` ` `
3496
-
3497
- The next example fetches an array of values from a table:
3516
+ The next example fetches an array of values from a table. First,
3517
+ insert these values:
3498
3518
3499
3519
` ` ` sql
3500
- CREATE TABLE mytab (numcol NUMBER );
3501
- INSERT INTO mytable (numcol) VALUES (10 );
3502
- INSERT INTO mytable (numcol) VALUES (25 );
3503
- INSERT INTO mytable (numcol) VALUES (50 );
3520
+ INSERT INTO mytab (id, numcol) VALUES (99 , 10 );
3521
+ INSERT INTO mytab (id, numcol) VALUES (99 , 25 );
3522
+ INSERT INTO mytab (id, numcol) VALUES (99 , 50 );
3504
3523
COMMIT ;
3505
-
3506
- CREATE OR REPLACE PACKAGE mypkg IS
3507
- TYPE numtype IS TABLE OF NUMBER INDEX BY BINARY_INTEGER ;
3508
- PROCEDURE myoutproc (p OUT numtype);
3509
- END ;
3510
- /
3511
-
3512
- CREATE OR REPLACE PACKAGE BODY mypkg IS
3513
- PROCEDURE myoutproc (p OUT numtype) IS
3514
- BEGIN
3515
- SELECT numcol BULK COLLECT INTO p FROM mytab ORDER BY 1 ;
3516
- END ;
3517
- END ;
3518
- /
3519
3524
` ` `
3520
3525
3521
- With this table and package , the following JavaScript will print
3526
+ With these values , the following node-oracledb code will print
3522
3527
` [ 10 , 25 , 50 ]` .
3523
3528
3524
3529
` ` ` javascript
3525
3530
connection .execute (
3526
- " BEGIN mypkg.myoutproc(:bv ); END;" ,
3531
+ " BEGIN mypkg.myoutproc(:id, :vals ); END;" ,
3527
3532
{
3528
- bv: { type: oracledb .NUMBER ,
3529
- dir: oracledb .BIND_OUT ,
3530
- maxArraySize: 10 // allocate memory to hold 10 numbers
3533
+ id: 99 ,
3534
+ vals: { type: oracledb .NUMBER ,
3535
+ dir: oracledb .BIND_OUT ,
3536
+ maxArraySize: 10 // allocate memory to hold 10 numbers
3531
3537
}
3532
3538
},
3533
3539
function (err , result ) {
3534
3540
if (err) { console .error (err .message ); return ; }
3535
- console .log (result .outBinds .bv );
3541
+ console .log (result .outBinds .vals );
3536
3542
});
3537
3543
` ` `
3538
3544
@@ -3546,6 +3552,11 @@ See [Oracledb Constants](#oracledbconstants) and
3546
3552
[execute(): Bind Parameters](#executebindParams) for more information
3547
3553
about binding.
3548
3554
3555
+ See
3556
+ [plsqlarray.js](https://github.com/oracle/node-oracledb/tree/master/examples/plsqlarray.js)
3557
+ for a runnable example.
3558
+
3559
+
3549
3560
## <a name="transactionmgt"></a> 13. Transaction Management
3550
3561
3551
3562
By default,
0 commit comments