阿八博客
  • 100000+

    文章

  • 23

    评论

  • 20

    友链

  • 最近新加了很多技术文章,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

Node-oracledb 4.0 发布,添加 Oracle 高级队列 API

欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/ws/2019/0726/102372.html
ad-wrap">

node-oracledb 4.0 已经发布,node-oracledb 是甲骨文公司官方发布的 Oracle 的 Node.js 驱动。此版本的新特性主要是包括查询和绑定命名的Oracle类型、Oracle 高级队列 API。具体更新内容如下:

实现重构

虽然模块仍然是调用 Oracle 客户端库的二进制层的 JavaScript 包装器,但是二进制层现在使用 Node.js 的 N-API 接口而不是 NAN。NAN 是起始的Node.js C++ 包装器,用于在更新 V8 引擎时为模块提供可移植性。使用更新的 N-API 接口带来了许多好处:

  • N-API 有自己的 API 版本化方法,允许构建一个 node-oracledb 二进制文件(每个操作系统体系结构),可以使用当前和更高的 Node.js 版本
  • npm 下载包的大小是 node-oracledb 3.1 包的四分之一,因为该包不需要包含每个 Node.js 版本的二进制文件
  • node-oracledb 代码现在是纯 C,而不是 C++,所以 C 编译器需要构建的模块不再需要 C++ 11 的支持,这在一些较旧的环境中构建更容易

支持查询和绑定命名的 Oracle 类型

这使得 Node.js 成为一个很好的使用 SQL 或 PL/SQL 用户定义类型的环境,或者是在处理诸如 Oracle 的空间特性所使用的预先创建的类型时使用的一个很好的环境。

例如,创建一些类型和一个表:

CREATE TYPE dbharvesttype AS VARRAY(10) OF VARCHAR2(20)
/

CREATE TYPE dbfarmtype AS OBJECT (
   farmername     VARCHAR2(20),
   harvest        dbharvesttype)
/

CREATE TABLE farmtab (id NUMBER, farm dbfarmtype);

在 node-oracledb 4.0 中,可以映射 JavaScript 对象以插入列 farm:

// A JavaScript object automatically mapped to the DBFARMTYPE object.
// The case of the properties matters.
const newFarm = {
  FARMERNAME: 'McDonald',
  HARVEST: [ 'corn', 'wheat', 'barley' ]
};
 
await connection.execute(
  `INSERT INTO farmtab (id, farm) VALUES (:id, :f)`,
  { id: 1,
    f: {
      type: 'DBFARMTYPE', // name of the top level DB type, case sensitive
      val: newFarm
    }
  }
);

查询 FARMTAB 返回一个 DbObject,它在 node-oracledb 4.0 中是新的:

const result = await connection.execute(`SELECT farm FROM farmtab WHERE id = 1 `);
 
// a DbObject for the named Oracle type:
const farm = result.rows[0][0];
 
// The whole object:
// [MYUSER.DBFARMTYPE] { FARMERNAME: 'MacDonald', HARVEST: [ 'corn', 'wheat', 'barley' ] }
console.log(farm);
 
// Objects can be stringified:
// {"FARMERNAME":"MacDonald","HARVEST":["corn","wheat","barley"]}
console.log(JSON.stringify(farm));
 
// Iterate over the collection:
console.log(farm.FARMERNAME);        // "MacDonald"
for (const crop of farm.HARVEST) {
  console.log(crop);                 // "corn", "wheat", "barley"
}

Oracle 高级队列(AQ)

Oracle 高级队列是 Oracle 数据库的一个高度可配置和可伸缩的消息传递功能。它具有各种语言的接口,可以在体系结构中集成多个工具来发送和接收消息。node-oracledb 4.0 有一个高级队列 API 支持 RAW 和对象队列,可以发送和接收字符串、缓冲区或对象消息。

例如,如果 RAW 队列在数据库中被配置,则可以发送一个简单的字符串:

const queue = await connection.getQueue('MYQUEUE');
const messageString = 'This is my message';
await queue.enqOne(messageString);
await connection.commit();

如果接收它,另一个应用程序可以执行:

const queue = await connection.getQueue('MYQUEUE');
const msg = await queue.deqOne();
await connection.commit();
console.log(msg.payload.toString());

隐式结果

这使得将查询结果集从 PL/SQL 返回到 node-oracledb 更加容易。对于隐式结果,不需要绑定变量。DBMS_SQL.RETURN_SUPER 结果接口允许通过 node-oracledb 的新结果返回游标。

result = await connection.execute(
  `DECLARE
    c1 SYS_REFCURSOR;
    c2 SYS_REFCURSOR;
  BEGIN
 
    OPEN c1 FOR SELECT city, postal_code FROM locations;
    DBMS_SQL.RETURN_RESULT(c1);
 
    OPEN C2 FOR SELECT employee_id, last_name FROM employees;
    DBMS_SQL.RETURN_RESULT(c2);
 
  END;`,
 
  [],   // no binds needed
 
  { resultSet: true }
);
 
// Iterate over all the ResultSets
for (const rs of result.implicitResults) {
  while ((row = await rs.getRow()))
    console.log(row);
  await rs.close();
}

其他更改

  • 重新编号了 Type 常量和 Oracle 数据库类型常量,以便将来进行绑定增强。确保在应用程序中使用常量名称,而不是它们的值
  • 新的 connection.currentSchema 属性,用于设置 SQL 语句中省略限定符时使用的架构限定符。这是更改会话集 Current_SCHEMA 的一种有效的替代方法
  • 通过 outFormat 设置将查询行输出提取为 JavaScript 对象
  • 引入了新的常量 oracledb.OUT_Format_Array 和 oracledb.OUT_Format_Object,以替换名为 oracledb.ARRAY 和 oracledb.OBJECT 的略带歧义的 oracledb.OBJECT

安装:可以从 npm 安装 node-oracledb 4.0。4.0 版需要 Node.js 8 或更高版本,对于 Node.js 8,最小补丁级别为 8.16,对于 Node.js 10,最小补丁级别为 10.16。

详细内容见发布说明

相关文章