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的源码, ...
随机推荐
- Vimtutor(中文版)学习笔记各章小结
在Bash中直接输入 vimtutor 打开新世界!通常阅读完需要25-30分钟不等,像玩游戏一样学会vim,然后爱不释手 里面设置了很多例子通过实践操作来学,这里仅把vimtutor上的每一章小结记 ...
- Linux基础知识第六讲,远程管理ssh操作
目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...
- 【MongoDB】使用MongoVUE看不到插入的数据
问题描述 明明在命令行中,输入mongodb的插入数据的命令,并且插入数据显示成功,却在MongoVUE可视化工具中,看不到插入的数据? mongodb使用版本为(3.4.6) mongoVUE使用版 ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Bo ...
- SpringBoot基础系列-SpringBoot配置
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9990680.html SpringBoot基础系列-SpringBoot配置 概述 属性 ...
- 服务注册中心之ZooKeeper系列(一)
一.服务注册中心介绍 分布式服务框架部署在多台不同的机器上.例如服务A是订单相关的处理服务,服务B是订单的客户的相关信息服务.此时有个需求需要在服务A中获取订单客户的信息.如下图: 此时就面临以下几个 ...
- PhpStorm 安装ApiDebugger
ApiDebugger,是一个开源的接口调试IntelliJ IDEA插件,具有与IDEA一致的界面,无需切换程序即可完成网络API请求,让你的code更加沉浸式. 安装 File->Setti ...
- 学JAVA第九天,for循环算质数及for遍历数组的方法。
昨天终于收到了评论,老开心了!!! 算质数之前是我最怕的一件事,以前上学不好好学,之前学C#的时候也没好好研究, 直到今天老师逼我要用JAVA算质数,硬着头皮琢磨老半天才琢磨透,现在看来也挺简单的. ...
- 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY
摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...
- ARM与FPGA通过spi通信设计2.spi master的实现
这里主要放两个代码第一个是正常的不使用状态机的SPI主机代码:第二个是状态机SPI代码 1.不使用状态机:特权同学<深入浅出玩转FPGA>中DIY数码相框部分代码: /////////// ...