Nodejs OracleDB详细解读
//导入oracledb模块 //基于版本@3.0.1 安装指令npm install oracledb //node访问oracleDB需要搭建访问环境,否则无法正常访问 //创建Oracle对象 let oracledb = null; //引用通用方法模块 let common = require("./commonHelper"); try{ oracledb = require('oracledb'); } catch (e) { console.log("oracledb声明错误原因:"+ e.message); } //引用配置参数模块 let configFile = require("./config"); //默认config对象 let config=configFile.oracle_config; let oracle={}; //配置存储过程是的输出输入,与参数类型 oracle.db=oracledb; let connection = null; async function initConnection() { if(connection == null) { connection = await oracledb.getConnection(config);//初始化数据库连接 } } /** * 初始化连接参数 * @param {string} user 用户名 * @param {string} password 密码 * @param {string} connectString 数据库连接字符串 */ oracle.initConfig=function(user,password,connectString){ config.user=user; config.password=password; config.connectString=connectString; connection = null; } //统计行号 let rowCount = 0; /** * 执行sql文本(带params参数),由于要使用逐条读取所以只能通过回调返回数据 * @param {string} sqlText 执行的sql语句 * @param {JSON} params sql语句中的参数 * @param {JSON} isToJson 每行都被提取为JavaScript对象 * @param {function} func 回调函数 逐行读取数据返回 */ oracle.queryWithParams= async function(sqlText,params,isToJson,func){ try { let options = {resultSet: true, outFormat: oracledb.ARRAY}; if (isToJson) { options = {resultSet: true, outFormat: oracledb.OBJECT}; } //获取连接池内的连接 oracledb.getConnection(config, function (err, connection) { //判断是否存在异常信息,是释放数据库连接与返回错误信息 if (executeErr(err,connection,func)) { return; } connection.execute(sqlText, params, options, async function (err, result) { //判断是否存在异常信息,是释放数据库连接与返回错误信息 if (executeErr(err,connection,func)) { return; } rowCount = 0;//初始化统计行号 fetchOneRowFromRS(connection, result.resultSet, func); }) }); } catch (err) { console.log(err) return {state:false,data:err.message};//返回错误信息 } }; //递归读取结果集的数据 function fetchOneRowFromRS(connection, resultSet,func) { resultSet.getRow( // get one row async function (err, row) { if (err) { console.error(err.message); await doClose(connection, resultSet); // 发生异常错误的时候关闭数据库连接 } else if (!row) { // 无数据的时候,关闭数据库连接 await doClose(connection, resultSet); } else { rowCount++; common.consoleLog ("fetchOneRowFromRS(): row " + rowCount); common.consoleLog (row); func({state:true,data:row});//返回行数据 fetchOneRowFromRS(connection, resultSet,func); } }); } /** * 执行sql文本(带params参数) * @param {string} sqlText 执行的sql语句 * @param {JSON} params sql语句中的参数 * @param {JSON} isToJson 每行都被提取为JavaScript对象 */ oracle.queryByParams=async function(sqlText,params,isToJson){ try { let options = { outFormat: oracledb.ARRAY }; if(isToJson) { options ={outFormat: oracledb.OBJECT }; } await initConnection();//初始化连接 let result = await connection.execute(sqlText,params,options); return {state:true,data:result};//返回查询的结果数据 } catch (err) { await doReconnection(err.message); return {state:false,data:err.message};//返回错误信息 } }; /** * 执行存储过程文本(带params参数) * @param {string} sqlText 执行的存储过程 * @param {JSON} params sql语句中的参数 * let params = { p1: 'Chris', // Bind type is determined from the data. Default direction is BIND_IN p2: 'Jones', ret: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 40 } }; * 查询结果的常量outFormat选项oracledb.ARRAY 4001 将每行作为列值数组获取,oracledb.OBJECT 4002 将每行作为对象获取 */ oracle.executePro=async function(sqlText,params){ try { await initConnection();//初始化连接 let result = await connection.execute(sqlText,params,{outFormat: oracledb.ARRAY }); return {state:true,data:result};//返回存储过程执行结果数据 }catch (err) { await doReconnection(err.message); return {state:false,data:err.message};//返回错误信息 } }; /** * 执行一条数据插入,修改,删除,存储过程文本(带params参数) * @param {string} sqlText 执行的存储过程 * "INSERT INTO test VALUES (:id, :nm)", * @param {JSON} params sql语句中的参数 * 写法一:{ id : {val: 1 }, nm : {val: 'Chris'} } * 写法二:[1, 'Chris'] */ oracle.execute=async function(sqlText,params){ try { await initConnection();//初始化连接 let result = await connection.execute(sqlText,params,{ autoCommit: true}); return {state:true,data:result};//返回执行结果数据 }catch (err) { await doReconnection(err.message); return {state:false,data:err.message};//返回错误信息 } }; /** * 执行多条数据插入,修改,删除,存储过程,文本(带params参数) * @param {string} sqlText 执行的存储过程 * let sql = "INSERT INTO em_tab VALUES (:a, :b)"; * @param {JSON} params sql语句中的参数 * 写法一:let params = [ { a: 1, b: "Test 1 (One)" }, { a: 2, b: "Test 2 (Two)" }, { a: 3, b: "Test 3 (Three)" }, { a: 4 }, { a: 5, b: "Test 5 (Five)" } ]; * 写法二:let params = [ [1, "Test 1 (One)"], [2, "Test 2 (Two)"], [3, "Test 3 (Three)"], [4, null], [5, "Test 5 (Five)"] ]; * @param {JSON} options sql语句中的参数 * 写法一: let options = { autoCommit: true,//必须有这个自动提交参数 bindDefs: [ { type: oracledb.NUMBER }, { type: oracledb.STRING, maxSize: 15 } ] }; 写法二: let options = { autoCommit: true,//必须有这个自动提交参数 bindDefs: { a: { type: oracledb.NUMBER }, b: { type: oracledb.STRING, maxSize: 15 } } }; */ oracle.executeMany=async function(sqlText,params, options){ options = Object.assign({},options,{autoCommit: true});//默认配置执行语句自动提交 try { await initConnection();//初始化连接 let result = await connection.executeMany(sqlText,params,options); return {state:true,data:result};//返回执行结果数据 }catch (err) { await doReconnection(err.message); return {state:false,data:err.message};//返回错误信息 } }; //执行SQL语句错误回调函数释放数据库连接 function executeErr(err,connection,func) { if (err) { console.error(err.message); doRelease_async(connection);//释放数据库连接 func({state:false,data:err.message});//返回错误信息 return true; } return false; } //关闭当前数据库连接 oracle.doClose =async function () { if(connection) { try { await connection.close(); } catch (err) { console.error(err.message); } } } //关闭数据库连接 function doRelease_async(connection) { if(connection) { connection.close( function(err) { if (err) { console.error(err.message); } }); } } //重新连接数据库 async function doReconnection(message) { //释放连接,重新连接oracle if(message.search("not connected to ORACLE")>=0 || message.search("invalid connection")>=0) { connection = null;//重新初始化oracle连接 } } //关闭结果集在关闭数据库连接 async function doClose(connection, resultSet) { try { if(resultSet) { await resultSet.close();//释放读取流 } if(connection) { await connection.close();//释放连接,将连接放回池中 } } catch (err) { console.error(err.message); } } module.exports=oracle;
Nodejs OracleDB详细解读的更多相关文章
- Nodejs MSSQL详细解读
MSSQL 是Nodejs用于连接Microsoft SQL Server 的插件. 安装方法 npm install mssql 配置Config const config = { user: '. ...
- MemCache超详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- MemCache超详细解读 图
http://www.cnblogs.com/xrq730/p/4948707.html MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...
- rpm软件包管理的详细解读
CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- Android BLE蓝牙详细解读
代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...
- 为你详细解读HTTP请求头的具体含意
当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...
- 详细解读Volley(三)—— ImageLoader & NetworkImageView
ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...
- 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块
详细解读Python的web.py框架下的application.py模块 这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...
随机推荐
- SQL Sever 2008 R2版本添加Northwin数据库错误解决
一.环境: OS: Windows 7 ProfessionalSQL Server 2008 R2 二.示例数据库Northwind下载(mdf) Northwind 三.附加数据库: 打开Micr ...
- Java基础5:抽象类和接口
本文主要介绍了抽象类和接口的特性和使用方法. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.g ...
- PC逆向之代码还原技术,第五讲汇编中乘法的代码还原
目录 PC逆向之代码还原技术,第五讲汇编中乘法的代码还原 一丶简介乘法指令 1.乘法指令 2.代码还原注意问题 二丶乘法的汇编代码产生的格式 1.高级代码观看 2.乘法的汇编代码还原. 三丶乘法总结 ...
- git版本控制工具的使用
目录 git版本管理工具使用 一丶Git的下载与安装 1.windows下的git的下载与安装 2.linux下的git安装 二丶常用命令 三丶Git仓库 1.配置仓库信息 2.仓库的创建于管理 四丶 ...
- JDK源码分析(10)之 Hashtable 相关
本文的目的并不是让你对Hashtable更加了解,然后灵活运用:因为Hashtable的一个历史遗留的类,目前并不建议使用,所以本文主要和HashMap对比,感受同样功能的不同实现,知道什么是好的代码 ...
- springboot情操陶冶-web配置(一)
承接前文springboot情操陶冶-@SpringBootApplication注解解析,在前文讲解的基础上依次看下web方面的相关配置 环境包依赖 在pom.xml文件中引入web依赖,炒鸡简单, ...
- win10连接无线网,开启移动热点,手机连接它手机一直显示获取ip地址中。
*必须要有无线网卡才能设置WIFI首先打开电脑,选中“计算机”或者“我的电脑”,右击进入“管理”选项“.打开“计算机管理”窗口之后,在左栏菜单选项中找到“服务和应用程序”下的“服务”选项,如图点击进入 ...
- [前端]css前端样式的模块化
css样式文件结构( 模块划分的单入口 ) common|_ _ _ _ _ _reset.css|_ _ _ _ _ _common.css 公用样式 libs|_ _ _ _ _ _bootstr ...
- Java Socket网络编程学习笔记(一)
0.前言 其实大概半年前就已经看过网络编程Socket的知识了(传统IO),但是因为长时间的不使用导致忘的一干二净,最近正好准备校招,又重新看了网络编程这一章, 是传统IO(BIO)相关的内容,故在此 ...
- 免费开源ERP Odoo实施指南 连载二:POSTGRESQL概述
PostgreSQL是Odoo支持的数据库.PostgreSQL是起源于大学的一个历史很长的开源数据库系统.包括美国航天局NASA.德国证券交易中心.中国的平安.腾讯的微信支付.阿里巴巴的阿里云都在用 ...