Oracle: Inserting data using a database link

database-linkoracle

I am trying to use a SELECT query to populate a table in DB2 using a database link to DB1. I am using Oracle SQL Developer on a Windows 7 VM. I connect to DB2, and run the following query.

INSERT INTO DB_NAME.TABLE_NAME (SELECT * FROM DB_NAME.TABLE_NAME@LINK_TO_DB1);

Every time, no matter what, I get the following error:

ORA-12154: TNS:could not resolve the connect identifier specified
12154. 00000 -  "TNS:could not resolve the connect identifier specified"
*Cause:    A connection to a database or other service was requested using
           a connect identifier, and the connect identifier specified could not
           be resolved into a connect descriptor using one of the naming methods
           configured. For example, if the type of connect identifier used was a
           net service name then the net service name could not be found in a
           naming method repository, or the repository could not be
           located or reached.
*Action:   
           - If you are using local naming (TNSNAMES.ORA file):
           - Make sure that "TNSNAMES" is listed as one of the values of the
           NAMES.DIRECTORY_PATH parameter in the Oracle Net profile
           (SQLNET.ORA)
           - Verify that a TNSNAMES.ORA file exists and is in the proper
           directory and is accessible.
           - Check that the net service name used as the connect identifier
           exists in the TNSNAMES.ORA file.
           - Make sure there are no syntax errors anywhere in the TNSNAMES.ORA
           file.  Look for unmatched parentheses or stray characters. Errors
           in a TNSNAMES.ORA file may make it unusable.
           - If you are using directory naming:
           - Verify that "LDAP" is listed as one of the values of the
           NAMES.DIRETORY_PATH parameter in the Oracle Net profile
           (SQLNET.ORA).
           - Verify that the LDAP directory server is up and that it is
           accessible.
           - Verify that the net service name or database name used as the
           connect identifier is configured in the directory.
           - Verify that the default context being used is correct by
           specifying a fully qualified net service name or a full LDAP DN
           as the connect identifier
           - If you are using easy connect naming:
           - Verify that "EZCONNECT" is listed as one of the values of the
           NAMES.DIRETORY_PATH parameter in the Oracle Net profile
           (SQLNET.ORA).
           - Make sure the host, port and service name specified
           are correct.
           - Try enclosing the connect identifier in quote marks.
Error at Line: 1 Column: 30

I've been googling and attempting different solutions for 2 days with no luck. I've done all of the following:

  • Set PATH environment variable to C:\Oracle\instantclient_11_2
  • Set ORACLE_HOME environment variable to C:\Oracle\instantclient_11_2
  • Set TNS_ADMIN environment variable to C:\Oracle\instantclient_11_2\network\admin
  • Created a tnsnames.ora file with the correct connection information in C:\Oracle\instantclient_11_2\network\admin
  • Set the Tnsnames Directory field in SQL Developer (Tools > Preferences > Database > Advanced) to C:\Oracle\instantclient_11_2\network\admin

I am at a loss as to why these database links aren't working. Does anyone have any advice?

Best Answer

If you want to have a database link on DB1 that points to DB2, DB1 would need to be able to resolve whatever TNS alias you specify in the database link definition. Assuming that you are using tnsnames.ora files everywhere for TNS name resolution, that would mean that the tnsnames.ora file on DB1 would need to have an entry that points to DB2. The TNS alias you specify in your CREATE DATABASE LINK statement would need to reference that TNS alias (which could be different than the alias for DB2 that you have created on your local machine). If you have limited access to the machine where DB1 resides, you would most likely need the DBA for DB1 to ensure that the TNS alias gets created appropriately.