Node-oracledb 4.0 發布,添加 Oracle 高級隊列 API

←手機掃碼閱讀     admin @ 2019-07-26 , reply:0

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。

詳細內容見發布說明





[admin ]

來源:OsChina
連結:https://www.oschina.net/news/108529/node-oracledb-4-0-released
Node-oracledb 4.0 發布,添加 Oracle 高級隊列 API已經有40次圍觀

http://coctec.com/news/all/show-post-210817.html