node-oracledb/test/dbObject7.js

147 lines
4.5 KiB
JavaScript

/* Copyright (c) 2019, 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
* 206. dbObject7.js
*
* DESCRIPTION
* Test DB Object data bind OUT and IN OUT.
*
*****************************************************************************/
'use strict';
const oracledb = require('oracledb');
const assert = require('assert');
const dbConfig = require('./dbconfig.js');
const testsUtil = require('./testsUtil.js');
describe('206. dbObject7.js', () => {
let conn;
const TYPE = 'NODB_PERSON_T';
before(async () => {
conn = await oracledb.getConnection(dbConfig);
const sql =
`CREATE OR REPLACE TYPE ${TYPE} AS OBJECT (
id NUMBER,
name VARCHAR2(30)
);`;
await conn.execute(sql);
}); // before()
after(async () => {
const sql = `DROP TYPE ${TYPE} FORCE`;
await conn.execute(sql);
await conn.close();
}); // after()
it('206.1 OUT bind DB Object', async () => {
const PROC = 'nodb_proc_test2061';
let plsql = `
CREATE OR REPLACE PROCEDURE ${PROC}
(a OUT ${TYPE}) AS
BEGIN
a := ${TYPE} (101, 'Christopher Jones');
END;
`;
await conn.execute(plsql);
const CLS = await conn.getDbObjectClass(TYPE);
plsql = `BEGIN ${PROC}( :out ); END;`;
const bindVar = { out: { type: CLS, dir: oracledb.BIND_OUT } };
const result = await conn.execute(plsql, bindVar);
const outData = result.outBinds.out;
assert.strictEqual(outData['ID'], 101);
assert.strictEqual(outData['NAME'], 'Christopher Jones');
const sql = `DROP PROCEDURE ${PROC}`;
await conn.execute(sql);
}); // 206.1
it('206.2 IN OUT bind DB Object', async () => {
const TABLE = 'nodb_tab_test2062';
let sql = `
CREATE TABLE ${TABLE} (
num NUMBER,
person ${TYPE}
)
`;
let plsql = testsUtil.sqlCreateTable(TABLE, sql);
await conn.execute(plsql);
sql = `INSERT INTO ${TABLE} VALUES (:1, :2)`;
const objData1 = {
ID: 201,
NAME: 'John Smith'
};
const CLS = await conn.getDbObjectClass(TYPE);
let testObj = new CLS(objData1);
const seqOne = 1;
let result = await conn.execute(sql, [seqOne, testObj]);
assert.strictEqual(result.rowsAffected, 1);
const PROC = 'nodb_proc_test2062';
plsql = `
CREATE OR REPLACE PROCEDURE ${PROC}
(i IN NUMBER, a IN OUT ${TYPE}) AS
BEGIN
INSERT INTO ${TABLE} (num, person) VALUES (i, a);
SELECT person INTO a FROM ${TABLE} WHERE num = ${seqOne};
END;
`;
await conn.execute(plsql);
const objData2 = {
ID: 101,
NAME: 'Changjie Lin'
};
testObj = new CLS(objData2);
const seqTwo = 23;
plsql = `BEGIN ${PROC} (:i, :a); END;`;
const bindVar = {
i: seqTwo,
a: { type: CLS, dir: oracledb.BIND_INOUT, val: testObj }
};
result = await conn.execute(plsql, bindVar);
// Verify the OUT-bind value of the IN-OUT-bind variable
assert.strictEqual(result.outBinds.a.ID, objData1.ID);
assert.strictEqual(result.outBinds.a['NAME'], objData1.NAME);
sql = `SELECT * FROM ${TABLE} WHERE NUM = ${seqTwo}`;
result = await conn.execute(sql);
// Verify the IN-bind value of the IN-OUT-bind variable
assert.strictEqual(result.rows[0][0], seqTwo);
assert.strictEqual(result.rows[0][1]['ID'], objData2.ID);
assert.strictEqual(result.rows[0][1]['NAME'], objData2.NAME);
sql = `DROP PROCEDURE ${PROC}`;
await conn.execute(sql);
sql = `DROP TABLE ${TABLE} PURGE`;
await conn.execute(sql);
}); // 206.2
});