NodeJs + OracleDB +加载sql文件
问题很简单,我不能使用oracledb连接器加载一个sql文件。 看起来它并不是一句话就多了。
任何想法如何加载一个SQL文件?
var oracledb = require('oracledb'); var fs = require('fs'); fs.readFile("test.sql", function(err, data) { if (err) { throw err; } connect(data.toString()); }); function connect(sql) { oracledb.getConnection({ user: "****", password: "***", connectString: "****" }, function(err, connection) { if (err) { console.error(err.message); return; } connection.execute( sql, [], function(err, result) { if (err) { console.error(err.message); doRelease(connection); return; } console.log(result.metaData); console.log(result.rows); doRelease(connection); }); }); } function doRelease(connection) { connection.release( function(err) { if (err) { console.error(err.message); } }); }
它会抛出一个错误:
ORA-00911:无效的字符
SQL在这里:
select * from DEFECTO; select * from ESQUEMA;
在意识到connection.execute()方法不喜欢的分号之前,经过很长一段时间的争斗。 只要你的SQL语句不能以一个结束,从一个文件中读取就行。
那么,我find了一个解决多个sql语句,只是使用exec:
exec('echo exit | sqlplus -S ****/***@//****:1521/**** @sqlfile.sql', ["bash"], function(error, stdout, stderr) { callback(); } );
如您所见,node-oracledb的connection.execute()方法只执行一条语句。 这与其他语言相同。 不要把你的SQL语句放在一个SQL * Plus文件中,而应该把它们作为一个string数组放在一个.js文件中。 然后处理数组的每个元素。 这将使您更好地控制事务和error handling。