node-oracledb/test/dbObject8.js

190 lines
5.4 KiB
JavaScript

/* Copyright (c) 2021, 2023, Oracle and/or its affiliates. */
/******************************************************************************
*
* This software is dual-licensed to you under the Universal Permissive License
* (UPL) 1.0 as shown at https://oss.oracle.com/licenses/upl and Apache License
* 2.0 as shown at https://www.apache.org/licenses/LICENSE-2.0. You may choose
* either license.
*
* If you elect to accept the software under the Apache License, Version 2.0,
* the following applies:
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* NAME
* 207. dbObject8.js
*
* DESCRIPTION
* The test of examples/selectobject.js.
*
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const assert = require('assert');
const dbConfig = require('./dbconfig.js');
const testsUtil = require('./testsUtil.js');
describe('207. dbObject8.js', () => {
let conn;
const TYPE1 = 'NODB_HARVEST_T';
const TYPE2 = 'NODB_FARM_T';
const TABLE = 'NODB_TAB_FARM';
before(async () => {
conn = await oracledb.getConnection(dbConfig);
let sql = `CREATE OR REPLACE TYPE ${TYPE1} AS VARRAY(10) OF VARCHAR2(20)`;
await conn.execute(sql);
sql =
`CREATE OR REPLACE TYPE ${TYPE2} AS OBJECT (
farmername VARCHAR2(20),
harvest ${TYPE1}
)`;
await conn.execute(sql);
sql =
`CREATE TABLE ${TABLE} (
id NUMBER,
farm ${TYPE2}
)`;
const plsql = testsUtil.sqlCreateTable(TABLE, sql);
await conn.execute(plsql);
}); // before()
after(async () => {
let sql = `DROP TABLE ${TABLE} PURGE`;
await conn.execute(sql);
sql = `DROP TYPE ${TYPE2} FORCE`;
await conn.execute(sql);
sql = `DROP TYPE ${TYPE1} FORCE`;
await conn.execute(sql);
await conn.close();
}); // after()
it('207.1 examples/selectobject.js', async () => {
const FarmType = await conn.getDbObjectClass(TYPE2);
// Farm Type
assert.strictEqual(FarmType.prototype.name, TYPE2);
assert.strictEqual(FarmType.prototype.isCollection, false);
// Nested type
assert.strictEqual(
FarmType.prototype.attributes.HARVEST.typeClass.prototype.name,
TYPE1
);
assert.strictEqual(
FarmType.prototype.attributes.HARVEST.typeClass.prototype.isCollection,
true
);
// Insert Method 1: pass a JavaScript object to the constructor
const crops = [];
crops[0] = ['Apples', 'Pears', 'Peaches'];
const farm1 = new FarmType(
{
FARMERNAME: 'MacDonald',
HARVEST: crops[0]
}
);
await conn.execute(
`INSERT INTO ${TABLE} (id, farm) VALUES (:id, :f)`,
{id: 1, f: farm1}
);
// Insert Method 2: set each attribute individually
// A nested type
const HarvestType = FarmType.prototype.attributes.HARVEST.typeClass;
const farm2 = new FarmType();
farm2.FARMERNAME = 'Giles';
farm2.HARVEST = new HarvestType(['carrots', 'peas']);
farm2.HARVEST.trim(1); // whoops! no peas
farm2.HARVEST.append('tomatoes'); // extend the collection
// console.log(farm2.HARVEST.getValues());
crops[1] = farm2.HARVEST.getValues();
assert.deepStrictEqual(crops[1], [ 'carrots', 'tomatoes' ]);
await conn.execute(
`INSERT INTO ${TABLE} (id, farm) VALUES (:id, :f)`,
{ id: 2, f: farm2 }
);
//
// Insert Method 3: use the prototype object for the bind 'type',
// and supply a JavaScript object directly for the 'val'
//
crops[2] = [ 'pepper', 'cinnamon', 'nutmeg' ];
await conn.execute(
`INSERT INTO ${TABLE} (id, farm) VALUES (:id, :f)`,
{ id: 3,
f: {
type: FarmType, // pass the prototype object
val: { // a JavaScript object that maps to the DB object
FARMERNAME: 'Smith',
HARVEST: crops[2]
}
}
}
);
//
// Insert Method 4: use the Oracle type name.
// Note: use a fully qualified type name when possible.
//
crops[3] = ['flowers', 'seedlings' ];
await conn.execute(
`INSERT INTO ${TABLE} (id, farm) VALUES (:id, :f)`,
{ id: 4,
f: {
type: TYPE2, // the name of the database type, case sensitive
val: { // a JavaScript object that maps to the DB object
FARMERNAME: 'Boy',
HARVEST: crops[3]
}
}
}
);
// Querying
const result = await conn.execute(
`SELECT id, farm FROM ${TABLE}`,
[],
{ outFormat: oracledb.OUT_FORMAT_OBJECT }
);
const names = ['MacDonald', 'Giles', 'Smith', 'Boy'];
let i = 0;
for (const row of result.rows) {
const farm = row.FARM; // a DbObject for the named Oracle type
assert.strictEqual(farm.FARMERNAME, names[i]);
const harvests = farm.HARVEST.getValues();
assert.deepStrictEqual(harvests, crops[i]);
i++;
}
}); // 207.1
});