为什么我不能使用 SQLcl 通过 jdbc 连接

Why can't I connect via jdbc using SQLcl

我可以使用 SQLDeveloper 连接到远程数据库。

我正尝试从命令行使用 sqlcl 连接到同一个数据库,但出现错误。

这是我的命令 运行:

/bin/sql username/pass@delphix-vdb-n-1.va2.b2c.nike.com:1521/vdbsl14 

我也试过:

/bin/sql username/pass@//delphix.......etc.

这是我收到的错误:

SQLcl: Release 4.2.0.16.131.1023 RC on Wed Jun 15 11:36:33 2016

Copyright (c) 1982, 2016, Oracle.  All rights reserved.

  USER          = username
  URL           = jdbc:oracle:thin:@delphix-vdb-n-1.va2.b2c.nike.com:1521/vdbsl14
  Error Message = Listener refused the connection with the following error:
ORA-12514, TNS:listener does not currently know of service requested in connect descriptor
Username? (RETRYING) ('username/*********@delphix-vdb-n-1.va2.b2c.nike.com:1521/vdbsl14'?) 

同样在 SQLDeveloper 中,我只是在 "custom jdbc url" 下输入以下内容,它连接没有任何问题,所以我希望我可以使用相同的 URL 通过命令行连接,但到目前为止,它不工作:

jdbc:oracle:thin:@delphix-vdb-n-1.va2.b2c.nike.com:1521:vdbsl4

看起来你的 SID 和服务名称不一样。在 SQL Developer 中,您似乎正在使用 SID - 至少在您显示的自定义 JDBC URL 中 - 如 :vdbsl4.

中的冒号所示

您的 SQLcl URL 正在使用服务名称,如 /vdbsl14 中的斜线所示。使用 SID 代替(即将 / 更改为 :) URL 应该可以工作,因为它使用的是 JDBC:

sqlcl username/pass@delphix-vdb-n-1.va2.b2c.nike.com:1521:vdbsl14

或者(在我看来最好是)找出您的服务名称实际是什么。如果您对数据库有足够的权限,您可以从 SQL Devleoper 执行 show parameters service_names,或者如果您以 DBA 身份访问服务器,您可以执行 lsnrctl services,甚至查看 tnsnames.ora 如果定义了显示服务名称的 TNS 别名。 (listener.ora 不太可能提供帮助,但可以提供提示,或者如果您幸运的话,可以显示默认服务名称)。

您可以在 JDBC URL 中使用该服务名称,如 /service_name

您还可以使用来自 SQLcl(或 SQL*Plus)的 TNS 别名。您可能已经有 tnsnames.ora 个可用;如果没有,您可以从您的服务器复制它,或创建您自己的。可以引用SID或者服务名。

您甚至可以将完整的 TNS 描述传递给 SQL*Plus(不确定 SQLcl),但这有点令人不快。如果你不 have/want a tnsnames.ora 你可以使用 'easy connect' 语法,这与你使用的 SQLcl 相同 - 但是 has 是服务名称,它不允许 SID。