博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nodejs操作Oracle数据库
阅读量:2058 次
发布时间:2019-04-29

本文共 3121 字,大约阅读时间需要 10 分钟。

环境准备

引入oracledb包

oracledb是Oracle为nodejs提供的操作Oracle数据库的工具包,npm安装即可。

npm install oracledb

安装Oracle instantclient

nodejs操作Oracle数据库,需要有Oracle instantclient支持,实际操作数据库的是Oracle instantclient,而oracledb只是在和Oracle instantclient交互。

Oracle instantclient的安装步骤如下:

  1. 选择合适的版本下载,下载地址:https://www.oracle.com/database/technologies/instant-client/downloads.html
  2. 下载后解压放置到某路径下
  3. 系统环境变量Path中增加instantclient目录的路径,例:D:\application\instantclient\instantclient_18_5
  4. 重启电脑

操作数据库

初始化数据库连接

初始化单连接

import oracledb from 'oracledb'// If specified as oracledb.OUT_FORMAT_OBJECT, each row is fetched as a JavaScript object. oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT// 将数值类型转为字符处理,避免数值过长,精度丢失oracledb.fetchAsString = [ oracledb.NUMBER ]let connection = await oracledb.getConnection({
user: 'user', password: 'password', connectString: '127.0.0.1:1521/test'});

初始化连接池

连接池初始化后,使用方式与上面的单连接是一样的

import oracledb from 'oracledb'// If specified as oracledb.OUT_FORMAT_OBJECT, each row is fetched as a JavaScript object. oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT// 将数值类型转为字符处理,避免数值过长,精度丢失oracledb.fetchAsString = [ oracledb.NUMBER ]// 可初始化多个连接池,通过poolAlias获取await oracledb.createPool({
_enableStats: true, user: 'user', password: 'password', connectString: '127.0.0.1:1521/test_a', poolAlias: 'pool_a'})let connectionA = await oracledb.getPool('pool_a').getConnection()await oracledb.createPool({
_enableStats: true, user: 'user', password: 'password', connectString: '127.0.0.1:1521/test_b', poolAlias: 'pool_b'})let connectionB = await oracledb.getPool('pool_b').getConnection()

执行sql语句

查询

const result = await connection.execute(    'select * from tb_test')// result.rows中便是查询的结果,row中的字段名与查询的字段名对应result.rows.forEach(row => {
console.log(`${
row.FIELD_A}, ${
row.FIELD_B}`)})

修改

const result = await connection.execute(    `update tb_test t set t.field_a = :data where t.id = :id`,    ['test', '12345'],  // bind value)// result.rowsAffected是本次操作影响的行数if (result.rowsAffected == 1) {
console.log('success')} else {
console.error('更新数据时异常')}

插入和删除写法和修改一致,不再赘述

执行后返回的result数据结构

interface Result
{
implicitResults?: (T[] | ResultSet
)[]; readonly lastRowid?: string; metaData?: Metadata
[]; outBinds?: T; resultSet?: ResultSet
; rows?: T[]; rowsAffected?: number;}

流式查询数据

oracledb支持流式查询数据,普通方式查询数据,会将所有数据一次性全部获取到缓存中,而如果数据量过大,操作响应时间非常长,而且可能导致内存溢出,这种情况就适合用流式查询。

流式查询时每次只会获取fetchArraySize设置的数量的数据进行处理,可避免内存溢出,同时数据库压力也小。

// 流式获取所有数据let stream = connection.queryStream(    `SELECT * from tb_test`,    [],  // bind value    {
fetchArraySize: 10000 } //每次预取长度,默认100,这里设置增大以提升性能);// 绑定异常回调事件stream.on('error', function (error) {
throw new Error(error)});// 绑定元数据回调事件// 元素据可获取表字段信息等数据库表描述信息,查询操作开始会触发一次stream.on('metadata', function (metadata) {
console.log(`tb_test表字段总数: ${
metadata.length}`);});// 绑定行数据回调事件// 每次获取到数据都会触发该事件,数据的长度和fetchArraySize设置的一致stream.on('data', function (data) {
console.log(data.length)});// 绑定获取结束回调事件stream.on('end', function () {
});

转载地址:http://fvtlf.baihongyu.com/

你可能感兴趣的文章
【托业】【新东方托业全真模拟】TEST07~08-----P5~6
查看>>
solver及其配置
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java集合框架知识梳理
查看>>
笔试题(一)—— java基础
查看>>
Redis学习笔记(二)— 在linux下搭建redis服务器
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>
Intellij IDEA使用(五)—— Intellij IDEA在使用中的一些其他常用功能或常用配置收集
查看>>
Intellij IDEA使用(六)—— 使用Intellij IDEA创建Java项目并配置jar包
查看>>
Eclipse使用(十)—— 使用Eclipse创建简单的Maven Java项目
查看>>
Eclipse使用(十一)—— 使用Eclipse创建简单的Maven JavaWeb项目
查看>>
Intellij IDEA使用(十三)—— 在Intellij IDEA中配置Maven
查看>>
面试题 —— 关于main方法的十个面试题
查看>>
集成测试(一)—— 使用PHP页面请求Spring项目的Java接口数据
查看>>
使用Maven构建的简单的单模块SSM项目
查看>>
Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
查看>>