【问题标题】:ORA-12514 error while using node oracle-db npm packagae使用节点 oracle-db npm 包时出现 ORA-12514 错误
【发布时间】:2017-05-31 14:30:17
【问题描述】:

目前,我正在做一个需要在oracle 中完成后端的项目。我使用给定的link 并在我的mac 上使用npm 安装了node-oracledb。我的文件内容如下

var oracledb = require('oracledb');

oracledb.getConnection(
{
user          : 'username',
password      : 'password',
connectString : 'username/password//hostname:port/sid'
function(err, connection)
{
if (err) {
  console.error(err.message);
  return;
}else{
    connection.execute(
  "SELECT * from TableName",
  function(err, result)
  {
    if (err) { console.error(err); return; }
    console.log(result.rows);
  });
 }
});

当我运行 node filename.js 时出现以下错误

ORA-12154: TNS:could not resolve the connect identifier specified

我使用的节点版本是v7.0.0,npm 版本是v3.10.8。我的 oracle 数据库也是云上的 11g 实例。有人可以让我知道我做错了什么吗?

【问题讨论】:

  • 我知道这个问题已经解决了,但我也面临着类似的问题。我遵循了 node-oracledb 中提到的方向。我已经安装了 instantclient basic 和 sdk 并设置了它们的路径。一旦我安装 oracle 11g express,我就会收到错误 oracledb module cannot be found。当我卸载 11g express 时,我收到错误 ORA-12541: TNS:no listener。您能否指导我如何安装 11g 以及我的连接字符串是什么?

标签: javascript node.js oracle oracle11g npm


【解决方案1】:

看起来你的 connectString 是错误的,根据 Docs 它只是主机名:端口/sid

var oracledb = require('oracledb');

oracledb.getConnection(
  {
    user          : "hr",
    password      : "welcome",
    connectString : "hostname:port/sid"
  })
  .then(function(conn) {
    return conn.execute(
      "SELECT department_id, department_name " +
        "FROM departments " +
        "WHERE manager_id < :id",
      [110]  // bind value for :id
    )
      .then(function(result) {
        console.log(result.rows);
        return conn.close();
      })
      .catch(function(err) {
        console.error(err);
        return conn.close();
      });
  })
  .catch(function(err) {
    console.error(err);
  });

编辑:

至少在 2019 年 7 月(可能在 7 月之前的某个时间)connectString : "hostname:port/sid" 不再适用于 oracledb 打印错误: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 相反,如发现 here 您可以将 connectString 设置为 (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = YOUR_HOST)(PORT = YOUR_PORT))(CONNECT_DATA =(SID= YOUR_SID))) 使用 SID 连接到数据库。

因此,更新后的getConnection(关于问题)将是:

oracledb.getConnection(
 {
   user          : "hr",
   password      : "welcome",
   connectString : "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = port))(CONNECT_DATA =(SID= sid)))"
 })

【讨论】:

  • 从技术上讲,斜杠后面的连接字符串位是“服务名称”,而不是 SID。此处提供了完整的 Easy Connect 语法:docs.oracle.com/database/122/NETAG/… 使用服务名称可以让 Oracle Network 在将应用程序连接到正在运行的实例方面发挥更大的作用。服务名称是很久以前引入的(版本 8?)并已成为标准。
  • 我知道这个问题已经解决了,但我也面临着类似的问题。我遵循了 node-oracledb 中提到的方向。我已经安装了 Instantclient basic 和 sdk 并设置了它们的路径。一旦我安装 oracle 11g express 我得到错误 oracledb 模块找不到。当我卸载 11g express 时,我收到错误 ORA-12541: TNS:no listener。您能否指导我如何安装 11g 以及我的连接字符串是什么?
猜你喜欢
  • 2014-06-23
  • 2013-09-20
  • 1970-01-01
  • 2018-04-18
  • 2017-12-14
  • 2011-12-29
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多