当前位置: 首页 > 工具软件 > node-oracledb > 使用案例 >

node 连接 oracle 数据库

况安然
2023-12-01

场景

因项目ERP中需要做一个维修计划表,ERP中功能已经实现完成,但报表实现比较困难,所以采用node+vue做一个网页,提供打印报表功能。又因为ERP使用的是oracle数据库,所以有此文章

代码

前提安装oracledb npm install oracledb

let oracle = require('oracledb');
oracle.autoCommit = true;//设置自动提交
//oracledb.outFormat = oracledb.OBJECT;//设置以json数组方式输出
try {
    oracle.initOracleClient({libDir: 'C:\\instantclient_12_2'});
    //oracle.initOracleClient({configDir: 'E:\\oracle\\instantclient_12_1'});
 	} catch (err) {
    console.error('Whoops!');
    console.error(err);
    process.exit(1);
  }//指定oracle客户端配置文件位置,主要是找对应的oci.dll

const base = (sql,sql_data,callback) =>{
	//创建数据库连接
	let config = {
		user:'ifsapp',
		password:'ifsapp',
		connectString:'172.16.66.224:1521/prod'
	}
	debugger
	//处理数据库请求
	oracle.getConnection(config,function(err,connection){
		if(err){
			console.log(err.message);
			doRelease(connection);
			return;
		}else{
			connection.execute(sql,sql_data,function(err,result){
				if(err){
					console.log(err)
					doRelease(connection);
					return;
				}else{
					oracle.autoCommit = true;
					 callback(result);
					 doRelease(connection);
				}
			})
		}
	})
}
// 关闭连接
function doRelease(connection)
{
  connection.close(
    function(err) {
      if (err) {
        console.error(err.message);
      }
    });
};

module.exports = base;
module.exports = (app) => {
	const base = require('../oracle_connect.js')
	
	app.post('/successFile',(req,res)=>{
		function up_file(sql,sql_data){
			base(sql,sql_data,(result)=>{
				res.send(result);
			})
		}
		let sql = ' BEGIN Doc_Title_API.Create_Doc_For_App_01 (:file_path,:lu,:key_no,:doc_class,:file_name,:kk); END;'
		let the_data = req.body;
		if(the_data.lu == 'SubContract'){
			let key_no = 'SUB_CON_NO='+the_data.sub_con_n+'^';
			let sql_data =  ['',the_data.lu,key_no,the_data.doc_class,the_data.file_name,''];
			up_file(sql,sql_data);
		}else if(the_data.lu == 'SubConCallOff'){
			let key_no = 'CALL_OFF_SEQ='+the_data.key_no1+'^'+'SUB_CON_NO='+the_data.sub_con_no+'^';
			let sql_data =  ['',the_data.lu,key_no,the_data.doc_class,the_data.file_name,''];
			up_file(sql,sql_data);
		}
	})
	
	// 查询每日车次对应的工作内容
	app.post('/car',(req,res)=>{
		let data = req.body;
		let sql = 'select distinct key_car_no from C_SHI_END_PLAN_WORK where substr(key_date,1,6) = :title';
		let sql_data = [data.title];
		base(sql,sql_data,(result)=>{
			let cars = result.rows;/* [ [ '101' ], [ '102' ]] */ //如果第三行代码不屏蔽 输出 [ {wo_no:'101'},{wo_no:'102'} ]
			get_arr2(data.title,cars,(get_data)=>{
				//console.log(get_data);
				res.send(get_data);
			});
		})
	})
}  						  						 						  

今天又遇到了问题 “Error: DPI-1047: Cannot locate a 64-bit Oracle Client library: "The specified module could not be found”
百度了半天没找到怎么解决,最后只能查看官方文档
node-oracledb官方文档
发现是因为我使用了可选的Oracle配置文件,如tnsnames.ora、sqlnet.ora,所以在编写node程序时需要指定Oracle配置文件,指定方式

let oracle = require('oracledb');
try {
    //oracle.initOracleClient({libDir: 'C:\\instantclient_12_2'});
    oracle.initOracleClient({configDir: 'E:\\oracle\\instantclient_12_1'});
 	} catch (err) {
    console.error('Whoops!');
    console.error(err);
    process.exit(1);
  }

代码更改后问题解决

 类似资料: