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的源码, ...
随机推荐
- Config非对称加解密
对称加密和非对称加密区别1. 对称加密对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密.对称加密只有一个秘钥,作为私钥. 常见的对称加密算法:DES,AES,3DES等等. 2. 非对称加密 ...
- 设计模式总结篇系列:组合模式(Composite)
在探讨Java组合模式之前,先要明白几个概念的区别:继承.组合和聚合. 继承是is-a的关系.组合和聚合有点像,有些书上没有作区分,都称之为has-a,有些书上对其进行了较为严格区分,组合是conta ...
- Disconf源码分析之启动过程分析下(2)
接上文,下面是第二次扫描的XML配置. <bean id="disconfMgrBean2" class="com.baidu.disconf.client.Dis ...
- [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的 ...
- 痞子衡嵌入式:PCM编码与Waveform音频文件(.wav)格式详解
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是PCM编码及Waveform音频文件格式. 嵌入式里有时候也会和音频打交道,比如最近特别火的智能音箱产品,离不开前端的音频信号采集.降噪 ...
- Redis Codis 部署安装
背景 关于Redis的高可用除了只身的Sentinel和Cluster之外,还有一个用的比较多的是Codis,由于公司的Redis大部分都使用Codis,本文就针对Codis进行相关的安装部署进行说明 ...
- C# asp.net mvc 通过 HttpClient 访问 Web_API
//MVC 具体方法 //API地址 通过 WebConfig配置 private static string apiAdds = ConfigurationManager.AppSettings[& ...
- 【学习笔记】非监督学习-k-means
目录 k-means k-means API k-means对Instacart Market用户聚类 Kmeans性能评估指标 Kmeans性能评估指标API Kmeans总结 无监督学习,顾名思义 ...
- 谷歌AI涉足艺术、太空、外科手术,再强调AI七原则
谷歌AI涉足艺术.太空.外科手术,再强调AI七原则 https://mp.weixin.qq.com/s/MJG_SvKCEBKRvL3IWpL0bA 9月18日上午,Google在上海的2018世界 ...
- 跨平台 webapp 开发技术之 Hybrid App
前所知的 APP 开发模式有三种: 基于操作系统运行的 APP -> Native App,侧重于原生开发,用户体验好,需要安装才会升级 基于浏览器运行的 APP -> Web App,侧 ...