博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nodejs oracledb详细解读
阅读量:6618 次
发布时间:2019-06-25

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

node 连接 oracledb 代码模块。

具体配置连接数据库方式,请看oracledb原文地址:

windows的环境搭建:,Linux也需要配置,Linux的配置具体百度一下,网上很多。

//导入oracledb模块 //基于版本@3.0.1  安装指令npm install oracledb//node访问oracleDB需要搭建访问环境,否则无法正常访问//创建Oracle对象let oracledb  = null;//引用配置参数模块let configFile = require("./config");//引用通用方法模块let common = require("./commonHelper");try{    oracledb = require('oracledb');}catch (err) {    console.log("oracledb声明错误原因:"+ err.message);}//默认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);//配置默认连接池,配置过就无需再继续配置    }}(async ()=>{    //是否初始化数据库连接    if(configFile.init_oracle)    {        await initConnection();    }})();/** * 初始化连接参数 * @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,sqlText);        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,sqlText);        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,sqlText);        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,sqlText);        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,sqlText) {    let time=new Date().Format("HH:mm:ss");    common.writeLog("oracle_connection",time  + common.partition +sqlText+ common.partition + message);    console.log(message);    //释放连接,重新连接oracle    if(message.search("not connected to ORACLE")>=0 || message.search("invalid connection")>=0 || message.search("未连接到 ORACLE") >=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;

 

转载于:https://www.cnblogs.com/caiyt/p/10929146.html

你可能感兴趣的文章
空间域图像增强c语言,OpenCV 图像增强(空间域)
查看>>
android 窗口分割线,android RecyclerView 万能分隔线
查看>>
电脑android模拟器下载地址,仙域奇缘电脑版怎么下载 安卓模拟器电脑版下载地址...
查看>>
Android WebView 总结,android webview总结
查看>>
android mac 照片恢复,相片恢复?误删的手机照片简单的找回方法来了!
查看>>
html中的text标签怎么设置自动换行,innerHTML中标签可以换行的方法汇总
查看>>
html5性能在线测试,HTML5性能测试
查看>>
美团Android三面,美团面经后端一面挂,安卓三面(实习)
查看>>
android环境搭建注意事项,android studio教程及android环境搭建
查看>>
html很炫的按钮效果图,6种非常炫酷的CSS3按钮边框动画特效
查看>>
gitbook生成html文档,在线帮助文档编辑器gitbook
查看>>
grunt html模块化管理插件,js模块化开发—Gruntfile.js详解
查看>>
chrome html 播放avi,how to embed an .AVI in html?
查看>>
Linux系统中三类重要文件的作用与区别
查看>>
【人生感悟】此一时也,彼一时
查看>>
关于对象和对象引用的关系
查看>>
网站群2
查看>>
WeakHashMap的实现原理
查看>>
VS2010问题记录
查看>>
64位Win8添加Oracle ODBC驱动时提示"无法加载ORACLE In OraDb11g_Home1 ODBC驱动程序的安装例程,因为存在系统错误代码193"?...
查看>>