1. //导入oracledb模块 //基于版本@3.0.1 安装指令npm install oracledb
  2. //node访问oracleDB需要搭建访问环境,否则无法正常访问
  3. //创建Oracle对象
  4. let oracledb = null;
  5.  
  6. //引用通用方法模块
  7. let common = require("./commonHelper");
  8.  
  9. try{
  10. oracledb = require('oracledb');
  11. }
  12. catch (e) {
  13. console.log("oracledb声明错误原因:"+ e.message);
  14. }
  15.  
  16. //引用配置参数模块
  17. let configFile = require("./config");
  18.  
  19. //默认config对象
  20. let config=configFile.oracle_config;
  21.  
  22. let oracle={};
  23.  
  24. //配置存储过程是的输出输入,与参数类型
  25. oracle.db=oracledb;
  26.  
  27. let connection = null;
  28. async function initConnection()
  29. {
  30. if(connection == null)
  31. {
  32. connection = await oracledb.getConnection(config);//初始化数据库连接
  33. }
  34. }
  35. /**
  36. * 初始化连接参数
  37. * @param {string} user 用户名
  38. * @param {string} password 密码
  39. * @param {string} connectString 数据库连接字符串
  40. */
  41. oracle.initConfig=function(user,password,connectString){
  42. config.user=user;
  43. config.password=password;
  44. config.connectString=connectString;
  45. connection = null;
  46. }
  47.  
  48. //统计行号
  49. let rowCount = 0;
  50. /**
  51. * 执行sql文本(带params参数),由于要使用逐条读取所以只能通过回调返回数据
  52. * @param {string} sqlText 执行的sql语句
  53. * @param {JSON} params sql语句中的参数
  54. * @param {JSON} isToJson 每行都被提取为JavaScript对象
  55. * @param {function} func 回调函数 逐行读取数据返回
  56. */
  57. oracle.queryWithParams= async function(sqlText,params,isToJson,func){
  58. try {
  59. let options = {resultSet: true, outFormat: oracledb.ARRAY};
  60. if (isToJson) {
  61. options = {resultSet: true, outFormat: oracledb.OBJECT};
  62. }
  63. //获取连接池内的连接
  64. oracledb.getConnection(config,
  65. function (err, connection) {
  66. //判断是否存在异常信息,是释放数据库连接与返回错误信息
  67. if (executeErr(err,connection,func)) {
  68. return;
  69. }
  70. connection.execute(sqlText, params, options, async function (err, result) {
  71. //判断是否存在异常信息,是释放数据库连接与返回错误信息
  72. if (executeErr(err,connection,func)) {
  73. return;
  74. }
  75. rowCount = 0;//初始化统计行号
  76. fetchOneRowFromRS(connection, result.resultSet, func);
  77. })
  78. });
  79. }
  80. catch (err) {
  81. console.log(err)
  82. return {state:false,data:err.message};//返回错误信息
  83. }
  84.  
  85. };
  86. //递归读取结果集的数据
  87. function fetchOneRowFromRS(connection, resultSet,func) {
  88. resultSet.getRow( // get one row
  89. async function (err, row) {
  90. if (err) {
  91. console.error(err.message);
  92. await doClose(connection, resultSet); // 发生异常错误的时候关闭数据库连接
  93. } else if (!row) { // 无数据的时候,关闭数据库连接
  94. await doClose(connection, resultSet);
  95. } else {
  96. rowCount++;
  97. common.consoleLog ("fetchOneRowFromRS(): row " + rowCount);
  98. common.consoleLog (row);
  99. func({state:true,data:row});//返回行数据
  100. fetchOneRowFromRS(connection, resultSet,func);
  101. }
  102. });
  103. }
  104.  
  105. /**
  106. * 执行sql文本(带params参数)
  107. * @param {string} sqlText 执行的sql语句
  108. * @param {JSON} params sql语句中的参数
  109. * @param {JSON} isToJson 每行都被提取为JavaScript对象
  110. */
  111. oracle.queryByParams=async function(sqlText,params,isToJson){
  112. try {
  113. let options = { outFormat: oracledb.ARRAY };
  114. if(isToJson)
  115. {
  116. options ={outFormat: oracledb.OBJECT };
  117. }
  118. await initConnection();//初始化连接
  119. let result = await connection.execute(sqlText,params,options);
  120. return {state:true,data:result};//返回查询的结果数据
  121. }
  122. catch (err) {
  123. await doReconnection(err.message);
  124. return {state:false,data:err.message};//返回错误信息
  125. }
  126. };
  127.  
  128. /**
  129. * 执行存储过程文本(带params参数)
  130. * @param {string} sqlText 执行的存储过程
  131. * @param {JSON} params sql语句中的参数
  132. * let params = {
  133. p1: 'Chris', // Bind type is determined from the data. Default direction is BIND_IN
  134. p2: 'Jones',
  135. ret: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 40 }
  136. };
  137. * 查询结果的常量outFormat选项oracledb.ARRAY 4001 将每行作为列值数组获取,oracledb.OBJECT 4002 将每行作为对象获取
  138. */
  139. oracle.executePro=async function(sqlText,params){
  140. try {
  141. await initConnection();//初始化连接
  142. let result = await connection.execute(sqlText,params,{outFormat: oracledb.ARRAY });
  143. return {state:true,data:result};//返回存储过程执行结果数据
  144. }catch (err) {
  145. await doReconnection(err.message);
  146. return {state:false,data:err.message};//返回错误信息
  147. }
  148. };
  149.  
  150. /**
  151. * 执行一条数据插入,修改,删除,存储过程文本(带params参数)
  152. * @param {string} sqlText 执行的存储过程
  153. * "INSERT INTO test VALUES (:id, :nm)",
  154. * @param {JSON} params sql语句中的参数
  155. * 写法一:{ id : {val: 1 }, nm : {val: 'Chris'} }
  156. * 写法二:[1, 'Chris']
  157. */
  158. oracle.execute=async function(sqlText,params){
  159. try {
  160. await initConnection();//初始化连接
  161. let result = await connection.execute(sqlText,params,{ autoCommit: true});
  162. return {state:true,data:result};//返回执行结果数据
  163. }catch (err) {
  164. await doReconnection(err.message);
  165. return {state:false,data:err.message};//返回错误信息
  166. }
  167. };
  168.  
  169. /**
  170. * 执行多条数据插入,修改,删除,存储过程,文本(带params参数)
  171. * @param {string} sqlText 执行的存储过程
  172. * let sql = "INSERT INTO em_tab VALUES (:a, :b)";
  173. * @param {JSON} params sql语句中的参数
  174. * 写法一:let params = [
  175. { a: 1, b: "Test 1 (One)" },
  176. { a: 2, b: "Test 2 (Two)" },
  177. { a: 3, b: "Test 3 (Three)" },
  178. { a: 4 },
  179. { a: 5, b: "Test 5 (Five)" }
  180. ];
  181. * 写法二:let params = [
  182. [1, "Test 1 (One)"],
  183. [2, "Test 2 (Two)"],
  184. [3, "Test 3 (Three)"],
  185. [4, null],
  186. [5, "Test 5 (Five)"]
  187. ];
  188. * @param {JSON} options sql语句中的参数
  189. * 写法一: let options = {
  190. autoCommit: true,//必须有这个自动提交参数
  191. bindDefs:
  192. [ { type: oracledb.NUMBER },
  193. { type: oracledb.STRING, maxSize: 15 }
  194. ] };
  195. 写法二:
  196. let options = {
  197. autoCommit: true,//必须有这个自动提交参数
  198. bindDefs: {
  199. a: { type: oracledb.NUMBER },
  200. b: { type: oracledb.STRING, maxSize: 15 }
  201. } };
  202. */
  203. oracle.executeMany=async function(sqlText,params, options){
  204. options = Object.assign({},options,{autoCommit: true});//默认配置执行语句自动提交
  205. try {
  206. await initConnection();//初始化连接
  207. let result = await connection.executeMany(sqlText,params,options);
  208. return {state:true,data:result};//返回执行结果数据
  209. }catch (err) {
  210. await doReconnection(err.message);
  211. return {state:false,data:err.message};//返回错误信息
  212. }
  213. };
  214.  
  215. //执行SQL语句错误回调函数释放数据库连接
  216. function executeErr(err,connection,func) {
  217. if (err) {
  218. console.error(err.message);
  219. doRelease_async(connection);//释放数据库连接
  220. func({state:false,data:err.message});//返回错误信息
  221. return true;
  222. }
  223. return false;
  224. }
  225. //关闭当前数据库连接
  226. oracle.doClose =async function () {
  227. if(connection)
  228. {
  229. try {
  230. await connection.close();
  231. }
  232. catch (err) {
  233. console.error(err.message);
  234. }
  235. }
  236. }
  237.  
  238. //关闭数据库连接
  239. function doRelease_async(connection) {
  240. if(connection)
  241. {
  242. connection.close(
  243. function(err) {
  244. if (err) { console.error(err.message); }
  245. });
  246. }
  247. }
  248.  
  249. //重新连接数据库
  250. async function doReconnection(message) {
  251. //释放连接,重新连接oracle
  252. if(message.search("not connected to ORACLE")>=0 || message.search("invalid connection")>=0)
  253. {
  254. connection = null;//重新初始化oracle连接
  255. }
  256. }
  257.  
  258. //关闭结果集在关闭数据库连接
  259. async function doClose(connection, resultSet) {
  260. try {
  261. if(resultSet)
  262. {
  263. await resultSet.close();//释放读取流
  264. }
  265. if(connection)
  266. {
  267. await connection.close();//释放连接,将连接放回池中
  268. }
  269. }
  270. catch (err) {
  271. console.error(err.message);
  272. }
  273. }
  274.  
  275. module.exports=oracle;

Nodejs OracleDB详细解读的更多相关文章

  1. Nodejs MSSQL详细解读

    MSSQL 是Nodejs用于连接Microsoft SQL Server 的插件. 安装方法 npm install mssql 配置Config const config = { user: '. ...

  2. MemCache超详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  3. MemCache超详细解读 图

    http://www.cnblogs.com/xrq730/p/4948707.html   MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...

  4. rpm软件包管理的详细解读

    CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...

  5. MemCache详细解读

    MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...

  6. Android BLE蓝牙详细解读

    代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...

  7. 为你详细解读HTTP请求头的具体含意

    当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...

  8. 详细解读Volley(三)—— ImageLoader & NetworkImageView

    ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...

  9. 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块

    详细解读Python的web.py框架下的application.py模块   这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...

随机推荐

  1. Vimtutor(中文版)学习笔记各章小结

    在Bash中直接输入 vimtutor 打开新世界!通常阅读完需要25-30分钟不等,像玩游戏一样学会vim,然后爱不释手 里面设置了很多例子通过实践操作来学,这里仅把vimtutor上的每一章小结记 ...

  2. Linux基础知识第六讲,远程管理ssh操作

    目录 Linux基础知识第六讲,远程管理ssh操作 一丶什么是SSH 1.什么是SSH 2.了解域名跟端口 二丶SSH命令以及远程连接linux进行维护 1.ssh命令格式 2.scp远程终端拷贝文件 ...

  3. 【MongoDB】使用MongoVUE看不到插入的数据

    问题描述 明明在命令行中,输入mongodb的插入数据的命令,并且插入数据显示成功,却在MongoVUE可视化工具中,看不到插入的数据? mongodb使用版本为(3.4.6) mongoVUE使用版 ...

  4. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Bo ...

  5. SpringBoot基础系列-SpringBoot配置

    原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9990680.html SpringBoot基础系列-SpringBoot配置 概述 属性 ...

  6. 服务注册中心之ZooKeeper系列(一)

    一.服务注册中心介绍 分布式服务框架部署在多台不同的机器上.例如服务A是订单相关的处理服务,服务B是订单的客户的相关信息服务.此时有个需求需要在服务A中获取订单客户的信息.如下图: 此时就面临以下几个 ...

  7. PhpStorm 安装ApiDebugger

    ApiDebugger,是一个开源的接口调试IntelliJ IDEA插件,具有与IDEA一致的界面,无需切换程序即可完成网络API请求,让你的code更加沉浸式. 安装 File->Setti ...

  8. 学JAVA第九天,for循环算质数及for遍历数组的方法。

    昨天终于收到了评论,老开心了!!! 算质数之前是我最怕的一件事,以前上学不好好学,之前学C#的时候也没好好研究, 直到今天老师逼我要用JAVA算质数,硬着头皮琢磨老半天才琢磨透,现在看来也挺简单的. ...

  9. 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY

    摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...

  10. ARM与FPGA通过spi通信设计2.spi master的实现

    这里主要放两个代码第一个是正常的不使用状态机的SPI主机代码:第二个是状态机SPI代码 1.不使用状态机:特权同学<深入浅出玩转FPGA>中DIY数码相框部分代码: /////////// ...