2015-04-15 12 views
12

ho scaricato SQLPLUS da Oracle:errore SQLPLUS: ORA-12504: TNS: l'ascoltatore non è stato dato il SERVICE_NAME in CONNECT_DATA

http://www.oracle.com/technetwork/topics/winx64soft-089540.html

base Lite e SQL * Plus

Poi ho sparato SQL * Plus:

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. 

e ha cercato di connettersi a un database:

connect user\[email protected] 

e ha ricevuto il messaggio di errore:

ERROR: 
ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA 

Che cosa mi manca?

Ho eseguito il domande suggerite da Jakub, ho ottenuto

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> 
+0

Le entrate tns sono state immesse nel file tnsnames.Ora? – anudeepks

+0

Non ho un file tsnames.ora. Sto tentando di connettermi usando un indirizzo IP (avrei dovuto dirlo, mi dispiace!) – gbritton

+0

Il database si trova nella tua macchina (Windows) o su un server? (probabilmente linux, aix ....)? – anudeepks

risposta

9

Ti manca il nome del servizio:

SQL> connect username/[email protected]:port/SERVICENAME 

EDIT

Se è possibile connettersi al database da altro computer provare a correre lì:

select sys_context('USERENV','SERVICE_NAME') from dual 

e

select sys_context('USERENV','SID') from dual 
+0

OK! Ora, come posso scoprire il servicename per un server Oracle a un dato indirizzo IP? – gbritton

+0

Controllare il file listener.ora sul server del database. http://docs.oracle.com/cd/E11882_01/network.112/e10835/listener.htm#NETRF008 –

+0

Non ho il permesso di accedere al server, solo un ID utente in grado di leggere alcune tabelle di cui ho bisogno. Tuttavia, ho accesso a un server che può accedere utilizzando un alias. quindi connetti user \ pass @ alias funziona OK. Immagino che non ci sia modo di scoprire il servicename da una connessione aperta, comunque. Ora mi chiedo se è sufficiente copiare tsnames.ora, listener.ora. file sqlnet.ora sul mio pc. Se l'avessi fatto, dove li avrei messi? – gbritton

0

Solo una piccola osservazione: si mantiene citano conn usr \ passano, e questo è un errore di battitura, giusto? Perché dovrebbe essere conn ustr/pass. O è diverso su un sistema operativo basato su Unix?

Inoltre, solo per essere sicuri: se si utilizzano nomi tns, la stringa di accesso sarà diversa da quando si utilizza il metodo di accesso con cui si è iniziato questo argomento.

tnsnames.ora deve essere in $ ORACLE_HOME $ \ network \ admin. Questa è la casa di Oracle sulla macchina da cui stai cercando di connettersi, quindi nel tuo caso il tuo PC. Se hai più oracle_homes e desideri utilizzare solo un tnsnames.ora, puoi impostare la variabile di ambiente tns_admin (ad es. Impostare TNS_ADMIN = c: \ oracle \ tns) e inserire tnsnames.ora in quella directory.

Il metodo di accesso originale (usr/[email protected]: port/servicename) dovrebbe sempre funzionare. Finora penso che tu abbia tutte le informazioni, tranne il numero di porta, che sono sicuro che il tuo DBA sarà in grado di darti. Se questo metodo continua a non funzionare, l'indirizzo IP del server non è disponibile dal client, oppure è un problema del firewall (blocco di una determinata porta) o qualcos'altro non (direttamente) correlato a Oracle o SQL * Plus.

hth! Cordiali saluti, Remco

+0

Non ho oracle installato sulla mia macchina. Ho solo l'eseguibile sqlplus. Nient'altro. OTOH Credo che un firewall possa essere d'intralcio. – gbritton

7

Mi sono imbattuto nello stesso identico problema in circostanze identiche. Non ho il file tnsnames.ora e volevo usare SQL * Plus con il formato Easy Connection Identifier nella riga di comando. Ho risolto questo problema come segue.

Il SQL*Plus® User's Guide and Reference dà un esempio:

sqlplus [email protected]\"sales-server:1521/sales.us.acme.com\"

prestare attenzione a due punti importanti:

  1. L'identificativo di connessione è citato. Sono disponibili due opzioni:
    1. È possibile utilizzare il comando SQL * Plus CONNECT e semplicemente passare la stringa citata.
    2. Se si desidera specificare i parametri di connessione sulla riga di comando, è necessario aggiungere barre retroverse come scudi prima delle virgolette. Indica alla bash di passare le citazioni in SQL * Plus.
  2. Il nome del servizio deve essere specificato nel modulo FQDN come configurato dal DBA.

Ho trovato queste buone domande per rilevare il nome del servizio tramite connessione esistente: 1, 2. Prova questa query per esempio:

SELECT value FROM V$SYSTEM_PARAMETER WHERE UPPER(name) = 'SERVICE_NAMES' 
Problemi correlati