Skip to content

Commit a07f5da

Browse files
committed
Add tests for INSERT ALL
1 parent b8dda9a commit a07f5da

File tree

3 files changed

+310
-1
lines changed

3 files changed

+310
-1
lines changed

test/insertAll.js

Lines changed: 303 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,303 @@
1+
/* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. */
2+
3+
/******************************************************************************
4+
*
5+
* You may not use the identified files except in compliance with the Apache
6+
* License, Version 2.0 (the "License.")
7+
*
8+
* You may obtain a copy of the License at
9+
* http://www.apache.org/licenses/LICENSE-2.0.
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
*
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*
18+
* The node-oracledb test suite uses 'mocha', 'should' and 'async'.
19+
* See LICENSE.md for relevant licenses.
20+
*
21+
* NAME
22+
* 158. insertAll.js
23+
*
24+
* DESCRIPTION
25+
* Test INSERT ALL statements. It originates from issue 780.
26+
* https://github.com/oracle/node-oracledb/issues/780
27+
*
28+
*****************************************************************************/
29+
'use strict';
30+
31+
var oracledb = require('oracledb');
32+
var should = require('should');
33+
var async = require('async');
34+
var dbConfig = require('./dbconfig.js');
35+
36+
describe('158. insertAll.js', function() {
37+
38+
var conn;
39+
40+
before(function(done) {
41+
oracledb.getConnection(
42+
dbConfig,
43+
function(err, connection) {
44+
should.not.exist(err);
45+
conn = connection;
46+
done();
47+
}
48+
);
49+
});
50+
51+
after(function(done) {
52+
conn.close(function(err) {
53+
should.not.exist(err);
54+
done();
55+
});
56+
});
57+
58+
it('158.1 original case from the issue', function(done) {
59+
60+
var dataLength = 35000;
61+
var doCreate = function(cb) {
62+
var proc = "BEGIN \n" +
63+
" DECLARE \n" +
64+
" e_table_missing EXCEPTION; \n" +
65+
" PRAGMA EXCEPTION_INIT(e_table_missing, -00942); \n" +
66+
" BEGIN \n" +
67+
" EXECUTE IMMEDIATE('DROP TABLE nodb_tab_insertall PURGE'); \n" +
68+
" EXCEPTION \n" +
69+
" WHEN e_table_missing \n" +
70+
" THEN NULL; \n" +
71+
" END; \n" +
72+
" EXECUTE IMMEDIATE (' \n" +
73+
" CREATE TABLE nodb_tab_insertall ( \n" +
74+
" code NUMBER, \n" +
75+
" val CLOB \n" +
76+
" ) \n" +
77+
" '); \n" +
78+
"END; ";
79+
conn.execute(
80+
proc,
81+
function(err) {
82+
should.not.exist(err);
83+
cb();
84+
}
85+
);
86+
};
87+
88+
var doDrop = function(cb) {
89+
var sql = "DROP TABLE nodb_tab_insertall PURGE";
90+
conn.execute(
91+
sql,
92+
function(err) {
93+
should.not.exist(err);
94+
cb();
95+
}
96+
);
97+
};
98+
99+
var doInsert = function(cb) {
100+
var myval = 'a'.repeat(dataLength);
101+
var sql = "INSERT ALL INTO nodb_tab_insertall \n" +
102+
" WITH nt AS (SELECT 1, :C FROM DUAL) \n" +
103+
" SELECT * FROM nt";
104+
conn.execute(
105+
sql,
106+
{ c: { val: myval, type: oracledb.CLOB } },
107+
function(err, result) {
108+
should.not.exist(err);
109+
(result.rowsAffected).should.be.exactly(1);
110+
cb();
111+
}
112+
);
113+
};
114+
115+
var doQuery = function(cb) {
116+
var sql = "select dbms_lob.getlength(val) from nodb_tab_insertall";
117+
conn.execute(
118+
sql,
119+
function(err, result) {
120+
should.not.exist(err);
121+
var buf = result.rows[0][0];
122+
should.strictEqual(buf, dataLength);
123+
cb();
124+
}
125+
);
126+
};
127+
128+
async.series([
129+
doCreate,
130+
doInsert,
131+
doQuery,
132+
doDrop
133+
], done);
134+
135+
}); // 158.1
136+
137+
it('158.2 inserts into one table', function(done) {
138+
async.series([
139+
makeTab1,
140+
function dotest(cb) {
141+
var sql = "INSERT ALL \n" +
142+
" INTO nodb_tab_ia1 (id, content) VALUES (100, :a) \n" +
143+
" INTO nodb_tab_ia1 (id, content) VALUES (200, :b) \n" +
144+
" INTO nodb_tab_ia1 (id, content) VALUES (300, :c) \n"+
145+
"SELECT * FROM DUAL";
146+
conn.execute(
147+
sql,
148+
['Changjie', 'Shelly', 'Chris'],
149+
function(err, result) {
150+
should.not.exist(err);
151+
should.strictEqual(result.rowsAffected, 3);
152+
cb();
153+
}
154+
);
155+
},
156+
function doverify(cb) {
157+
var sql = "select content from nodb_tab_ia1 order by id";
158+
conn.execute(
159+
sql,
160+
function(err, result) {
161+
should.not.exist(err);
162+
should.deepEqual(
163+
result.rows,
164+
[ [ 'Changjie' ], [ 'Shelly' ], [ 'Chris' ] ]
165+
);
166+
cb();
167+
}
168+
);
169+
},
170+
dropTab1
171+
], done);
172+
}); // 158.2
173+
174+
it('158.3 inserts into multiple tables', function(done) {
175+
async.series([
176+
makeTab1,
177+
makeTab2,
178+
function dotest(cb) {
179+
var sql = "INSERT ALL \n" +
180+
" INTO nodb_tab_ia1 (id, content) VALUES (100, :a) \n" +
181+
" INTO nodb_tab_ia1 (id, content) VALUES (200, :b) \n" +
182+
" INTO nodb_tab_ia2 (id, content) VALUES (300, :c) \n"+
183+
"SELECT * FROM DUAL";
184+
conn.execute(
185+
sql,
186+
['Redwood city', 'Sydney', 'Shenzhen'],
187+
function(err, result) {
188+
should.not.exist(err);
189+
should.strictEqual(result.rowsAffected, 3);
190+
cb();
191+
}
192+
);
193+
},
194+
function doverify1(cb) {
195+
var sql = "select content from nodb_tab_ia1 order by id";
196+
conn.execute(
197+
sql,
198+
function(err, result) {
199+
should.not.exist(err);
200+
should.deepEqual(
201+
result.rows,
202+
[ [ 'Redwood city' ], [ 'Sydney' ]]
203+
);
204+
cb();
205+
}
206+
);
207+
},
208+
function doverify2(cb) {
209+
var sql = "select content from nodb_tab_ia2 order by id";
210+
conn.execute(
211+
sql,
212+
function(err, result) {
213+
should.not.exist(err);
214+
should.deepEqual(
215+
result.rows,
216+
[ [ 'Shenzhen' ]]
217+
);
218+
cb();
219+
}
220+
);
221+
},
222+
dropTab1,
223+
dropTab2
224+
], done);
225+
}); // 158.3
226+
227+
var makeTab1 = function(cb) {
228+
var proc = "BEGIN \n" +
229+
" DECLARE \n" +
230+
" e_table_missing EXCEPTION; \n" +
231+
" PRAGMA EXCEPTION_INIT(e_table_missing, -00942); \n" +
232+
" BEGIN \n" +
233+
" EXECUTE IMMEDIATE('DROP TABLE nodb_tab_ia1 PURGE'); \n" +
234+
" EXCEPTION \n" +
235+
" WHEN e_table_missing \n" +
236+
" THEN NULL; \n" +
237+
" END; \n" +
238+
" EXECUTE IMMEDIATE (' \n" +
239+
" CREATE TABLE nodb_tab_ia1 ( \n" +
240+
" id NUMBER, \n" +
241+
" content VARCHAR2(100) \n" +
242+
" ) \n" +
243+
" '); \n" +
244+
"END; ";
245+
conn.execute(
246+
proc,
247+
function(err) {
248+
should.not.exist(err);
249+
cb();
250+
}
251+
);
252+
}; // makeTab1
253+
254+
var dropTab1 = function(cb) {
255+
var sql = "DROP TABLE nodb_tab_ia1 PURGE";
256+
conn.execute(
257+
sql,
258+
function(err) {
259+
should.not.exist(err);
260+
cb();
261+
}
262+
);
263+
};
264+
265+
var makeTab2 = function(cb) {
266+
var proc = "BEGIN \n" +
267+
" DECLARE \n" +
268+
" e_table_missing EXCEPTION; \n" +
269+
" PRAGMA EXCEPTION_INIT(e_table_missing, -00942); \n" +
270+
" BEGIN \n" +
271+
" EXECUTE IMMEDIATE('DROP TABLE nodb_tab_ia2 PURGE'); \n" +
272+
" EXCEPTION \n" +
273+
" WHEN e_table_missing \n" +
274+
" THEN NULL; \n" +
275+
" END; \n" +
276+
" EXECUTE IMMEDIATE (' \n" +
277+
" CREATE TABLE nodb_tab_ia2 ( \n" +
278+
" id NUMBER, \n" +
279+
" content VARCHAR2(50) " +
280+
" ) \n" +
281+
" '); \n" +
282+
"END; ";
283+
conn.execute(
284+
proc,
285+
function(err) {
286+
should.not.exist(err);
287+
cb();
288+
}
289+
);
290+
};
291+
292+
var dropTab2 = function(cb) {
293+
var sql = "DROP TABLE nodb_tab_ia2 PURGE";
294+
conn.execute(
295+
sql,
296+
function(err) {
297+
should.not.exist(err);
298+
cb();
299+
}
300+
);
301+
};
302+
303+
});

test/list.txt

100644100755
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4071,3 +4071,8 @@ Overview of node-oracledb functional tests
40714071
157.6 shows 12c new way to limit the number of records fetched by queries
40724072
157.7 oracledb.maxRows > 0 && oracledb.maxRows < totalAmount
40734073
157.8 oracledb.maxRows > 0, execute() with maxRows=0
4074+
4075+
158. insertAll.js
4076+
158.1 original case from the issue
4077+
158.2 inserts into one table
4078+
158.3 inserts into multiple tables

test/opts/mocha.opts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,5 @@ test/fetchArraySize6.js
181181
test/fetchArraySize7.js
182182
test/fetchArraySize8.js
183183
test/fetchArraySize9.js
184-
test/maxRows.js
184+
test/maxRows.js
185+
test/insertAll.js

0 commit comments

Comments
 (0)