SQLPLUS错误:ORA-12504:TNS监听程序在CONNECT_DATA中没有给出SERVICE_NAME。
SQLPLUS错误:ORA-12504:TNS监听程序在CONNECT_DATA中没有给出SERVICE_NAME。
我从Oracle下载了SQLPLUS:\nhttp://www.oracle.com/technetwork/topics/winx64soft-089540.html\n选择了Basic Lite和SQL*Plus\n然后我启动了SQL*Plus:\n
c:\Program Files\Oracle\instantclient_12_1>sqlplus /nolog SQL*Plus: Release 12.1.0.2.0 Production on Wed Apr 15 15:25:36 2015 Copyright (c) 1982, 2014, Oracle. All rights reserved.
\n并尝试连接到数据库:\n
connect user\password@hostname
\n但收到了错误信息:\n
ERROR: ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
\n我错过了什么?\n我运行了Jakub建议的查询,我得到了\n
SQL> select sys_context('USERENV','SERVICE_NAME') from dual; SYS_CONTEXT('USERENV','SERVICE_NAME') -------------------------------------------------------------------------------- SYS$USERS SQL> select sys_context('USERENV','SID') from dual; SYS_CONTEXT('USERENV','SID') -------------------------------------------------------------------------------- 877 SQL>
在命令行中使用Easy Connection Identifier格式进行SQL*Plus连接时,我遇到了完全相同的问题。我没有tnsnames.ora文件,并且想要使用SQL*Plus。我通过以下方法解决了这个问题。
SQL*Plus User's Guide and Reference提供了一个例子:
sqlplus hr@\"sales-server:1521/sales.us.acme.com\"
请注意两个重要点:
- 连接标识符需要加引号。有两个选项:
- 可以使用SQL*Plus CONNECT命令,然后传递带引号的字符串。
- 如果要在命令行上指定连接参数,则必须在引号前添加反斜杠。这样可以告诉bash将引号传递给SQL*Plus。
- 服务名必须以FQDN形式指定,这是由DBA配置的。
我发现了一些好问题,可以通过现有连接来检测服务名:1,2。例如,尝试运行以下查询:
SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES'
当运行sqlplus --help
时,连接标识符不显示引号... 非常感谢!
这对我也起作用了!谢谢!我在bash中使用了这个命令:sqlplus 'system@"//localhost:1521/xe"'
该问题的出现原因是在使用SQL*Plus的Easy Connection Identifier格式进行命令行连接时,没有给出SERVICE_NAME。解决方法是在连接标识符中使用引号,并确保以FQDN形式指定服务名。还可以通过查询V$SYSTEM_PARAMETER视图来检测服务名。